Compiler construction 定义<;在线启动>;及<;线端>;在lexer中

Compiler construction 定义<;在线启动>;及<;线端>;在lexer中,compiler-construction,ocaml,lex,lexer,Compiler Construction,Ocaml,Lex,Lexer,我正在尝试实现一个前端,它试图符合一个子集 除了经常使用的和之外,参考文献中似乎明确定义了许多内容 以下是一段引文:“为了便于规范,可以明确地引用紧接逻辑线开始之前的点和紧接逻辑线最终行终止符之前的点。这是使用和作为VBA语法的终端符号来实现的。将定义为紧跟在每个逻辑行之前,将定义为替换每个逻辑行末尾的: 以下是一些例子: line-terminator = (%x000D %x000A) / %x000D / %x000A / %x2028 / %x2029 line-continuation

我正在尝试实现一个前端,它试图符合一个子集

除了经常使用的
之外,参考文献中似乎明确定义了许多内容

以下是一段引文:“为了便于规范,可以明确地引用紧接逻辑线开始之前的点和紧接逻辑线最终行终止符之前的点。这是使用
作为VBA语法的终端符号来实现的。将
定义为紧跟在每个逻辑行之前,将
定义为替换每个逻辑行末尾的

以下是一些例子:

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

有人知道在哪里以及如何定义
吗?

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

还有一种可能性。这些术语的使用方式与BOF/EOF类似。这表明它们是状态,独立于使用的令牌系统。如果是这种情况,则需要在适当的条件成立时将它们定义为解析器的一部分。定义将取决于多个因素-在文件;上一个标记、当前标记,可能还有下一个标记。(例如,开始行是文档从结束行状态前进后需要进入的状态,但如果也是EOF,则不是)。这些规则必须从给定的(不完整的)定义和适当的假设中派生出来

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

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

Dim from
Dim to
FakeTest from, to
LINE-START指的是一行的开头,但在第一行的第一个字之前,而不是最开始的一行

此外,LINE-END指的是行尾,但并非如此,因为您可以在行尾之前添加空格和制表符

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

CallMethod param1, param2, _
           param3
如果有结果,VBA不允许插入括号,如该示例中所示:

result = CallAMethod(param1, param2)
此外,您不需要在单独的语句中添加分号或冒号


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

欢迎根据真实文档滚动您自己的词法分析器和解析器。实现此类设备的大部分精力都是由于缺乏精确的规范,其次是在重定义方面的差异所有的实现与指定的内容相比,您可以通过尝试和错误来发现和修复这些内容。