我理解在理论上分离解析器规则和词法规则的理论,但是在ANTLR中这两个语句之间有哪些实际区别:
my_rule: ... ;
MY_RULE: ... ;
它们会导致不同的 AST 树吗?不同的性能?潜在的歧义?
我理解在理论上分离解析器规则和词法规则的理论,但是在ANTLR中这两个语句之间有哪些实际区别:
my_rule: ... ;
MY_RULE: ... ;
它们会导致不同的 AST 树吗?不同的性能?潜在的歧义?
... 在ANTLR中,这两个语句有什么实际区别...
MY_RULE
用于标记化您的输入源代码。它代表了您的语言的基本构建块。
my_rule
从解析器中调用,由零个或多个其他解析器规则或由词法分析器生成的标记组成。
这就是它们之间的区别。
它们会导致不同的AST树吗?不同的性能呢?...
解析器使用词法分析器生成的标记构建AST树,因此这些问题对我来说没有意义。词法分析器仅向解析器提供一维标记流。
这篇文章可能会有所帮助:
'123'。但是有些标记,例如运算符,我会省略词元,因为这是多余的。例如,我会为分号标记写SEMICOLON,而不是SEMICOLON(;)。词法分析器是第一步, 它的唯一作用是从文本中创建一个 "token 流". 它不负责理解你的语言的语义, 只关心你的语言的语法.
例如, 语法规则是标识符只能使用字符、数字和下划线 - 只要它不以数字开头. 词法分析器的职责就是理解这个规则. 在这种情况下, 词法分析器将接受字符序列 "asd_123" 但拒绝字符 "12dsadsa" (假设在其中这个文本不是有效的另一个规则). 当看到有效的文本示例时, 它可以向 token 流发出令牌, 如 IDENTIFIER(asd_123).
请注意, 我说的是 "标识符", 这是变量名、函数名、命名空间名等东西的通用术语. 解析器将理解标识符出现的上下文, 以便进一步指定该令牌为某个特定东西的名称。
(旁注: 令牌只是赋予令牌流元素的独特名称. 词素是与令牌匹配的文本. 我在令牌旁边用括号写出了词素. 例如, NUMBER(123). 在这种情况下, 这是一个带有词素 123 的 NUMBER 令牌).
my_rule : 'a'?'b';
还是MY_TOKEN : 'ab' | 'b';
。两者都匹配相同的内容,但速度如何呢?直觉上,我会认为后者会稍微快一些,但我可能错了。 - Michal Bida