我理解在理论上分离解析器规则和词法分析器规则的理论,但ANTLR中这两个语句之间的实际差异是什么:
my_rule: ... ;
MY_RULE: ... ;
它们会导致不同的AST树吗?性能不同?潜在的含糊之处?
答案 0 :(得分:25)
Jen写道:
...... ANTLR中这两个陈述之间的实际差异是什么......
MY_RULE
将用于标记您的输入源。它代表了您语言的基本构建块。
my_rule
,它由零个或多个其他解析器规则或词法分析器生成的标记组成。
这就是区别。
Jen写道:
它们会导致不同的AST树吗?性能不同? ...
解析器使用词法分析器生成的标记构建AST,因此问题对我来说毫无意义。词法分析器仅仅为解析器“提供”一维标记流。
答案 1 :(得分:3)
这篇文章可能会有所帮助:
词法分析器负责第一步,仅 工作是 从文本创建“令牌流”。它不负责 了解您语言的语义,它仅对 了解您语言的语法。
例如,语法是标识符只能使用的规则 字符,数字和下划线-只要不以 一个号码。词法分析器的职责是了解此规则。 在这种情况下,词法分析器将接受字符序列 “ asd_123”,但拒绝字符“ 12dsadsa”(假设 不是此文字有效的另一条规则)。看到有效时 文本示例,它可能会向令牌流中发送令牌,例如 IDENTIFIER(asd_123)。
请注意,我说的“标识符”是事物的通用术语 如变量名,函数名,名称空间名等。 会理解上下文的东西 出现标识符,以便随后进一步指定该令牌 作为某物的名字。
(旁注:令牌只是赋予元素的唯一名称 令牌流。词位是令牌与之匹配的文本。 我将lexeme写在令牌旁边的括号中。例如, NUMBER(123)。在这种情况下,这是一个数字标记,其词素为 '123'。但是,对于某些标记(例如运算符),我省略了lexeme 因为它是多余的。例如,我会为 分号标记,而不是SEMICOLON(;))。