在词法分析器</line-end> </line-start>中定义<line-start>和<line-end>

时间:2012-08-03 02:17:50

标签: compiler-construction ocaml lex lexer

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

除了<LINE-START><LINE-END>之外,参考中似乎已经清楚地定义了许多内容,但这些内容经常被使用。

这是一个引用:“为了便于说明,能够明确地引用紧接在逻辑行开始之前的点和紧接在逻辑行的最后行终止符之前的点是很方便的。使用<LINE-START><LINE-END>作为VBA语法的终端符号来完成。<LINE-START>被定义为紧接在每个逻辑行之前,<LINE-END>被定义为替换{{} 1}}在每条逻辑行的末尾:“

以下是一些例子:

<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 <LINE-START>的位置和方式?

2 个答案:

答案 0 :(得分:1)

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

还有另一种可能性。这些术语的使用方式表明与BOF / EOF的类比。这表明它们是状态,独立于所使用的令牌系统。如果是这种情况,您需要在适当的条件成立时将它们定义为解析器的一部分。定义取决于几个因素 - 文件中的位置;前一个,当前的,可能是下一个令牌。 (例如,“起始线”是文档在从“结束线”状态前进后需要放入的状态,但如果也是EOF则不是)。这些规则必须来自给定的(零碎)定义,并来自适当的假设。

这不是一个完整的答案,但考虑到关于这一点的规范的模糊性,以及这些令牌的多次使用?/状态?我发现很难看出如何给出更完整的答案。 HTH。

答案 1 :(得分:0)

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

Dim from
Dim to
FakeTest from, to

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

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

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

CallMethod param1, param2, _
           param3

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

result = CallAMethod(param1, param2)

此外,您不需要在单独的陈述中添加分号或冒号。

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