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

4
假设我正在分析 Ruby 的方法定义:
def print_greeting(greeting = "hi")  
end

词法分析器的职责是维护状态并发出相关令牌,还是应该相对简单?请注意,在上面的示例中,greeting 参数具有默认值 "hi"。在不同的上下文中,greeting = "hi" 是变量赋值,它将 greeting 设置为 "hi"。词法分析器是否应该发出通用标记,例如 IDENTIFIER EQUALS STRING,还是应该具有上下文感知能力,并发出像 PARAM_NAME EQUALS STRING 这样的标记?

4个回答

5

我倾向于尽可能将词法分析器设计得愚蠢,因此会使其发出 IDENTIFIER EQUALS STRING 令牌。在词法分析时,通常没有关于令牌应该代表什么的信息(大多数情况下..)。在词法分析器中添加此类语法规则只会使其混杂着(非常)复杂的语法规则。而这是解析器的部分。


1
没有上下文敏感性,你怎么能实现这样的语法,比如 new Map<String, Array<String>>() - Flosculus

3
我认为词法分析器应该是“愚蠢的”,在您的情况下应该返回类似于这样的内容:DEF IDENTIFIER OPEN_PARENTHESIS IDENTIFIER EQUALS STRING CLOSE_PARENTHESIS END。 解析器应该进行验证 - 为什么要拆分责任。

2

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


1

不使用Ruby,但是使用编译器和编程语言设计。

两种方法都可以,但在现实生活中,对于变量、参数和保留字使用通用标识符更容易(“愚蠢的词法分析器”或“愚蠢的扫描器”)。

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

有时,词法分析器/扫描器具有代码部分,而不是解析器,允许进行多个“语义”操作,包括将通用标识符转换为关键字、变量、类型标识符等。您的词法分析器规则检测到通用标识符令牌,但返回另一个令牌给解析器。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接