繁体   English   中英

这是词法分析员的工作吗?

[英]Is this the job of the lexer?

假设我正在使用ruby方法定义:

def print_greeting(greeting = "hi")  
end

是lexer的工作是维持状态并发出相关的令牌,还是相对愚蠢? 请注意,在上面的示例中, greeting param的默认值为"hi" 在不同的上下文中, greeting = "hi"是可变赋值,其将greeting设置为"hi" 词法分析器应该发出通用标记,例如IDENTIFIER EQUALS STRING ,还是应该是上下文感知并发出类似PARAM_NAME EQUALS STRING

我倾向于尽可能使词法分析器变得愚蠢,因此它会释放出IDENTIFIER EQUALS STRING标记。 在词法分析时,(大部分时间......)没有关于令牌应该代表什么的信息。 在词法分析器中具有这样的语法规则仅使用(非常)复杂的语法规则来对其进行轮询。 这就是解析器的一部分。

我认为lexer应该是“哑巴”,在你的情况下应该返回这样的东西:DEF IDENTIFIER OPEN_PARENTHESIS IDENTIFIER EQUALS STRING CLOSE_PARENTHESIS END。 解析器应该进行验证 - 为什么要分担责任。

不要使用ruby,但要使用编译器和编程语言设计。

两种方法都有效,但在现实生活中,使用变量,参数和保留字的通用标识符更容易(“哑巴勒克斯”或“哑式扫描仪”)。

稍后,您可以将这些通用标识符“转换”为其他标记。 有时在你的解析器中。

有时,词法分析器/扫描程序有一个代码段, 而不是解析器 ,它允许执行几个“语义”操作,将一般标识符转换为关键字,变量,类型标识符等等。 您的词法分析器规则会检测通用标识符标记,但会将另一个标记返回给解析器。

另一个类似的常见情况是,当你有一个表达式或语言使用“+”和“ - ”表示二元运算符和一元符号运算符。

词法分析和解析之间的区别是任意的。 在许多情况下,您根本不需要单独的步骤。 也就是说,由于性能通常是最重要的问题(否则解析将主要是微不足道的任务),那么您需要决定并且可能测量词汇分析期间的额外处理是否合理。 没有一般的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM