【问题标题】:Define <LINE-START> and <LINE-END> in a lexer在词法分析器中定义 <LINE-START> 和 <LINE-END>
【发布时间】:2012-08-03 02:17:49
【问题描述】:

我正在尝试实现一个尝试符合this specification 子集的前端。

似乎很多东西都在参考中明确定义了,除了&lt;LINE-START&gt;&lt;LINE-END&gt;,它们仍然经常使用。

这是一个引文:“为了便于说明,能够方便地明确引用紧接在逻辑行开头之前的点和紧接在逻辑行的最终行终止符之前的点。这个使用&lt;LINE-START&gt;&lt;LINE-END&gt; 作为VBA 语法的终端符号来完成。&lt;LINE-START&gt; 被定义为紧接在每个逻辑行之前,&lt;LINE-END&gt; 被定义为替换每个逻辑行末尾的&lt;line-terminator&gt; :"

这里有一些例子:

line-terminator = (%x000D %x000A) / %x000D / %x000A / %x2028 / %x2029
line-continuation = *WSC underscore *WSC line-terminator
WS = 1*(WSC / line-continuation)

EOL = [WS] LINE-END
logical-line = LINE-START *extended-line LINE-END

if-statement = LINE-START “If” boolean-expression “Then” EOL
               statement-block
               *[else-if-block]
               [else-block]
               LINE-START ((“End” “If”) / “EndIf”)

else-if-block = LINE-START “ElseIf” boolean-expression “Then” EOL
                LINE-START statement-block

else-block = LINE-START “Else” statement-block

有谁知道在哪里以及如何定义&lt;LINE-START&gt;&lt;LINE-END&gt;

【问题讨论】:

  • 欢迎使用基于真实文档的您自己的词法分析器和解析器。实施此类设备所需的大部分精力是由于规范缺乏精确性造成的,其次是实际实施与指定的任何差异,您可以通过反复试验来发现和修复。

标签: compiler-construction ocaml lex lexer


【解决方案1】:

鉴于文档中描述的多种语言,我希望行开始和行结束的定义成为表 3.2.2 逻辑行语法的一部分,如果它们是(如文档其他地方所建议的)标记。正如您所说,它们的定义不是很清楚。

还有另一种可能。这些术语的使用方式类似于 BOF/EOF。这表明它们是状态,独立于使用的令牌系统。如果是这种情况,当适当的条件成立时,您需要将它们定义为解析器的一部分。定义将取决于几个因素 - 文件中的位置;上一个、当前以及可能是下一个令牌。 (例如,Start Line 是从 End Line 状态推进后文档需要进入的状态,但如果也是 EOF 则不是)。这些规则必须从给定的(不完整的)定义和适当的假设中推导出来。

这不是一个完整的答案,但鉴于规范在这一点上的模糊性,以及这些标记的多种用法?/状态?我发现很难看到如何给出更完整的答案。 HTH。

【讨论】:

    【解决方案2】:

    在 VBA 中,您可以编写该命令

    Dim from
    Dim to
    FakeTest from, to
    

    LINE-START 是指行的开头,但在行的第一个单词之前,而不是最开始的行。

    另外,LINE-END 指的是行尾,但不是这样,因为您可以在行尾之前添加空格和制表符。

    注意,VBA 中的空格被识别为有效的分隔符,以区分两个单词,尤其是在调用方法时:

    CallMethod param1, param2, _
               param3
    

    如果有结果,VBA 不允许插入括号,如您在该示例中所见:

    result = CallAMethod(param1, param2)
    

    此外,您无需添加分号或冒号来分隔语句。

    我说:空格和制表是语言语法的一部分。在其他编程语言中并非如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 2020-04-25
      • 2017-12-16
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-16
      • 2014-04-30
      相关资源
      最近更新 更多