【发布时间】:2010-11-28 16:30:38
【问题描述】:
我理解理论上分离解析器规则和词法分析器规则背后的理论,但是这两个语句在 ANTLR 中的实际区别是什么:
my_rule: ... ;
MY_RULE: ... ;
它们会产生不同的 AST 树吗?性能不同?潜在的歧义?
【问题讨论】:
标签: parsing antlr lexical-analysis
我理解理论上分离解析器规则和词法分析器规则背后的理论,但是这两个语句在 ANTLR 中的实际区别是什么:
my_rule: ... ;
MY_RULE: ... ;
它们会产生不同的 AST 树吗?性能不同?潜在的歧义?
【问题讨论】:
标签: parsing antlr lexical-analysis
... ANTLR 中这两个语句之间的实际区别是什么...
MY_RULE 将用于标记您的输入源。它代表了您的语言的基本组成部分。
my_rule 从解析器中调用,它由零个或多个其他解析器规则或词法分析器生成的标记组成。
这就是区别。
它们会产生不同的 AST 树吗?性能不同? ...
解析器使用词法分析器生成的标记来构建 AST,所以这些问题(对我来说)毫无意义。词法分析器只是向解析器“提供”一维标记流。
【讨论】:
my_rule : 'a'?'b'; 或 MY_TOKEN : 'ab' | 'b';。两者匹配相同,但有多快?直觉上我希望后者会快一点,但我可能错了。
这篇文章可能会有所帮助:
词法分析器负责第一步,它的唯一工作是 从文本创建一个“令牌流”。它不负责 理解你的语言的语义,它只对 了解您的语言的语法。
例如,语法是标识符只能使用的规则 字符、数字和下划线 - 只要不是以 一个号码。词法分析器的责任是理解这条规则。 在这种情况下,词法分析器将接受字符序列 “asd_123”但拒绝字符“12dsadsa”(假设有 不是此文本有效的另一条规则)。当看到有效 文本示例,它可能会在令牌流中发出令牌,例如 标识符(asd_123)。
请注意,我说的是“标识符”,这是事物的总称 像变量名、函数名、命名空间名等。解析器 将是能够理解上下文的事物 标识符出现,因此它将进一步指定该令牌 作为某事物的名称。
(旁注:token 只是赋予元素的唯一名称 令牌流。词位是与标记匹配的文本。 我将词位写在标记旁边的括号中。例如, 号码(123)。在这种情况下,这是一个 NUMBER 标记,其词位为 '123'。但是,对于某些标记,例如运算符,我省略了词素 因为它是多余的。例如,我会为 分号标记,而不是 SEMICOLON( ; ))。
【讨论】: