ANTLR中解析规则和词法规则的实际区别是什么?

31

我理解在理论上分离解析器规则和词法规则的理论,但是在ANTLR中这两个语句之间有哪些实际区别:

my_rule: ... ;

MY_RULE: ... ;

它们会导致不同的 AST 树吗?不同的性能?潜在的歧义?

2个回答

30

... 在ANTLR中,这两个语句有什么实际区别...

MY_RULE用于标记化您的输入源代码。它代表了您的语言的基本构建块。

my_rule从解析器中调用,由零个或多个其他解析器规则或由词法分析器生成的标记组成。

这就是它们之间的区别。

它们会导致不同的AST树吗?不同的性能呢?...

解析器使用词法分析器生成的标记构建AST树,因此这些问题对我来说没有意义。词法分析器仅向解析器提供一维标记流。


就性能而言,我理解这个问题是关于写哪种更好:my_rule : 'a'?'b'; 还是 MY_TOKEN : 'ab' | 'b';。两者都匹配相同的内容,但速度如何呢?直觉上,我会认为后者会稍微快一些,但我可能错了。 - Michal Bida

12

这篇文章可能会有所帮助:

词法分析器是第一步, 它的唯一作用是从文本中创建一个 "token 流". 它不负责理解你的语言的语义, 只关心你的语言的语法.

例如, 语法规则是标识符只能使用字符、数字和下划线 - 只要它不以数字开头. 词法分析器的职责就是理解这个规则. 在这种情况下, 词法分析器将接受字符序列 "asd_123" 但拒绝字符 "12dsadsa" (假设在其中这个文本不是有效的另一个规则). 当看到有效的文本示例时, 它可以向 token 流发出令牌, 如 IDENTIFIER(asd_123).

请注意, 我说的是 "标识符", 这是变量名、函数名、命名空间名等东西的通用术语. 解析器将理解标识符出现的上下文, 以便进一步指定该令牌为某个特定东西的名称。

(旁注: 令牌只是赋予令牌流元素的独特名称. 词素是与令牌匹配的文本. 我在令牌旁边用括号写出了词素. 例如, NUMBER(123). 在这种情况下, 这是一个带有词素 123 的 NUMBER 令牌).

'123'。但是有些标记,例如运算符,我会省略词元,因为这是多余的。例如,我会为分号标记写SEMICOLON,而不是SEMICOLON(;)。

来自ANTLR - 何时使用解析器规则与词法分析器规则?


1
谢谢你的发帖,Dave。这个链接非常有帮助! - Jason_L

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