在词法分析器中定义<LINE-START>和<LINE-END>

Sof*_*mur 5 compiler-construction ocaml lex lexer

我正在尝试实现一个尝试符合此规范子集的前端.

似乎很多事情都在参考文献中明确定义,除了<LINE-START>和之外<LINE-END>,它们经常被使用.

这是一个引用:"为了便于说明,能够明确地引用紧接在逻辑行开始之前的点和紧接在逻辑行的最后行终止符之前的点是很方便的.这是使用<LINE-START>并且<LINE-END>作为VBA语法的终端符号.A <LINE-START>被定义为紧接在每个逻辑行之前,a <LINE-END>被定义为替换<line-terminator>每个逻辑行的末尾:"

这里有些例子:

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
Run Code Online (Sandbox Code Playgroud)

有谁知道在哪里以及如何定义<LINE-START><LINE-END>

Chr*_*ton 1

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

还有另一种可能。这些术语的使用方式与 BOF/EOF 类似。这表明它们是状态,独立于所使用的代币系统。如果是这种情况,当适当的条件成立时,您将需要将它们定义为解析器的一部分。该定义取决于几个因素 - 文件中的位置;前一个、当前以及可能的下一个标记。(例如,起始行是文档从结束行状态前进后需要进入的状态,但如果也是 EOF,则不是)。这些规则必须从给出的(片断的)定义和适当的假设中得出。

这不是一个完整的答案,但考虑到这一点的规范的模糊性,以及这些标记的多种用途?/状态?我发现很难给出更完整的答案。HTH。