Ton*_*ony 18 parsing antlr lexical-analysis
我理解在理论上分离解析器规则和词法分析器规则背后的理论,但在ANTLR中这两个语句之间的实际差异是什么:
my_rule: ... ;
MY_RULE: ... ;
Run Code Online (Sandbox Code Playgroud)
它们会导致不同的AST树吗?性能不同?潜在的含糊之处?
Bar*_*ers 26
Jen写道:
...... ANTLR中这两个陈述之间的实际差异是什么......
MY_RULE将用于标记您的输入源.它代表了您语言的基本构建块.
my_rule 从解析器调用,它由零个或多个其他解析器规则或词法分析器生成的标记组成.
这就是区别.
Jen写道:
它们会导致不同的AST树吗?性能不同?...
解析器使用词法分析器生成的标记构建AST,因此问题对我来说没有意义(对我而言).词法分析器仅仅为解析器"提供"一维标记流.
小智 7
这篇文章可能会有所帮助:
词法分析器负责第一步,它唯一的工作是从文本创建“令牌流”。它不负责理解您的语言的语义,它只对理解您的语言的语法感兴趣。
例如,语法规则是标识符只能使用字符、数字和下划线——只要它不以数字开头。词法分析器的责任是理解这条规则。在这种情况下,词法分析器将接受字符序列“asd_123”但拒绝字符“12dsadsa”(假设没有其他规则使该文本有效)。当看到有效文本示例时,它可能会向令牌流中发出一个令牌,例如 IDENTIFIER(asd_123)。
请注意,我说的“标识符”是变量名称、函数名称、命名空间名称等的通用术语。解析器将理解该标识符出现的上下文,以便它进一步指定那个标记是某个东西的名字。
(旁注:令牌只是赋予令牌流元素的唯一名称。词素是与令牌匹配的文本。我将词素写在令牌旁边的括号中。例如,NUMBER(123)。在这种情况下,这是一个 NUMBER 标记,词位为“123”。但是,对于某些标记,例如运算符,我省略了词位,因为它是多余的。例如,我会为分号标记编写 SEMICOLON,而不是 SEMICOLON( ;))。