ANTLR中解析器规则和词法分析器规则之间的实际区别?

时间:2010-11-28 16:30:39

标签: parsing antlr lexical-analysis

我理解在理论上分离解析器规则和词法分析器规则的理论,但ANTLR中这两个语句之间的实际差异是什么:

my_rule: ... ;

MY_RULE: ... ;

它们会导致不同的AST树吗?性能不同?潜在的含糊之处?

2 个答案:

答案 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(;))。

来自ANTLR - WHEN TO USE PARSER RULES VS LEXER RULES?