假设我正在使用ruby方法定义:
def print_greeting(greeting = "hi")
end
lexer的工作是维持状态并发出相关令牌,还是相对愚蠢?请注意,在上面的示例中,greeting
param的默认值为"hi"
。在不同的上下文中,greeting = "hi"
是变量赋值,将greeting
设置为"hi"
。词法分析器应该发出诸如IDENTIFIER EQUALS STRING
之类的通用标记,还是应该具有上下文感知并发出类似PARAM_NAME EQUALS STRING
的内容?
答案 0 :(得分:4)
我倾向于尽可能使词法分析器变得愚蠢,因此它会释放IDENTIFIER EQUALS STRING
个令牌。在词法分析时,(大部分时间......)没有关于令牌应该代表什么的信息。在词法分析器中具有这样的语法规则仅使用(非常)复杂的语法规则来对其进行轮询。这就是解析器的一部分。
答案 1 :(得分:2)
我认为lexer应该是“哑巴”,在你的情况下应该返回这样的东西:DEF IDENTIFIER OPEN_PARENTHESIS IDENTIFIER EQUALS STRING CLOSE_PARENTHESIS END。 解析器应该进行验证 - 为什么要分担责任。
答案 2 :(得分:1)
不要使用ruby,但要使用编译器&编程语言设计。
这两种方法都有效,但在现实生活中,使用变量,参数和保留字的通用标识符会更容易(“哑巴勒克斯”或“哑式扫描仪”)。
稍后,您可以将这些通用标识符“转换”为其他标记。有时在解析器中。
有时,词法分析器/扫描程序有一个代码部分,而不是解析器,它允许执行几个“语义”操作,将一般标识符转换为关键字,变量,类型标识符等等。您的词法分析器规则会检测通用标识符标记,但会将另一个标记返回给解析器。
另一个类似的常见情况是,当你有一个表达式或语言使用“+”和“ - ”表示二元运算符和一元符号运算符。
答案 3 :(得分:1)
词法分析和解析之间的区别是任意的。在许多情况下,您根本不需要单独的步骤。也就是说,由于性能通常是最重要的问题(否则解析将主要是微不足道的任务),那么您需要决定并且可能测量词汇分析期间的额外处理是否合理。没有一般的答案。