假设我正在词法分析一个ruby方法定义:
def print_greeting(greeting = "hi")
endlexer的工作是维护状态并发出相关的令牌,还是应该相对愚蠢一些?请注意,在上面的示例中,greeting参数的默认值为"hi"。在不同的上下文中,greeting = "hi"是将greeting设置为"hi"的变量赋值。lexer应该发出诸如IDENTIFIER EQUALS STRING之类的泛型标记,还是应该是上下文感知的,并发出类似于PARAM_NAME EQUALS STRING的东西
发布于 2011-06-15 22:40:41
我倾向于尽可能地让lexer变得愚蠢,并因此让它发出IDENTIFIER EQUALS STRING标记。在词法分析时,有(大多数时间..)没有关于令牌应该表示什么的信息。在词法分析器中有这样的语法规则只会用(非常)复杂的语法规则来轮询它。这就是解析器的一部分。
发布于 2011-06-15 22:43:15
我认为lexer应该是“哑巴”的,在你的例子中应该返回类似这样的东西: DEF IDENTIFIER OPEN_PARENTHESIS IDENTIFIER等于STRING CLOSE_PARENTHESIS END。解析器应该做验证--为什么要拆分责任。
发布于 2011-06-15 23:27:09
不要使用ruby,但要使用编译器和编程语言设计。
这两种方法都有效,但在现实生活中,使用变量、参数和保留字的通用标识符更容易("dumb lexer“或"dumb scanner")。
稍后,您可以将这些通用标识符“转换”到其他令牌中。有时在你的解析器中。
有时,词法分析器/扫描器有一个代码段,而不是解析器,它允许执行几个“语义”操作,包括将通用标识符转换为关键字、变量、类型标识符等等。您的词法分析器规则检测到一个通用标识符令牌,但向解析器返回另一个令牌。
另一种类似的常见情况是,当您的表达式或语言使用"+“和"-”表示二元运算符和一元符号运算符时。
https://stackoverflow.com/questions/6359427
复制相似问题