【问题标题】:Practical difference between parser rules and lexer rules in ANTLR?ANTLR 中解析器规则和词法分析器规则之间的实际区别?
【发布时间】:2010-11-28 16:30:38
【问题描述】:

我理解理论上分离解析器规则和词法分析器规则背后的理论,但是这两个语句在 ANTLR 中的实际区别是什么:

my_rule: ... ;

MY_RULE: ... ;

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

【问题讨论】:

    标签: parsing antlr lexical-analysis


    【解决方案1】:

    ... ANTLR 中这两个语句之间的实际区别是什么...

    MY_RULE 将用于标记您的输入源。它代表了您的语言的基本组成部分。

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

    这就是区别。

    它们会产生不同的 AST 树吗?性能不同? ...

    解析器使用词法分析器生成的标记来构建 AST,所以这些问题(对我来说)毫无意义。词法分析器只是向解析器“提供”一维标记流。

    【讨论】:

    • 性能方面,我从某种意义上理解了这些问题,如果写得更好:my_rule : 'a'?'b'; 或 MY_TOKEN : 'ab' | 'b';。两者匹配相同,但有多快?直觉上我希望后者会快一点,但我可能错了。
    【解决方案2】:

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

    词法分析器负责第一步,它的唯一工作是 从文本创建一个“令牌流”。它不负责 理解你的语言的语义,它只对 了解您的语言的语法。

    例如,语法是标识符只能使用的规则 字符、数字和下划线 - 只要不是以 一个号码。词法分析器的责任是理解这条规则。 在这种情况下,词法分析器将接受字符序列 “asd_123”但拒绝字符“12dsadsa”(假设有 不是此文本有效的另一条规则)。当看到有效 文本示例,它可能会在令牌流中发出令牌,例如 标识符(asd_123)。

    请注意,我说的是“标识符”,这是事物的总称 像变量名、函数名、命名空间名等。解析器 将是能够理解上下文的事物 标识符出现,因此它将进一步指定该令牌 作为某事物的名称。

    (旁注:token 只是赋予元素的唯一名称 令牌流。词位是与标记匹配的文本。 我将词位写在标记旁边的括号中。例如, 号码(123)。在这种情况下,这是一个 NUMBER 标记,其词位为 '123'。但是,对于某些标记,例如运算符,我省略了词素 因为它是多余的。例如,我会为 分号标记,而不是 SEMICOLON( ; ))。

    来自ANTLR - When to use Parser Rules vs Lexer Rules?

    【讨论】:

    • 感谢您发布戴夫。这个链接非常有用!
    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 2014-03-25
    • 2014-06-29
    • 1970-01-01
    • 2020-09-14
    相关资源
    最近更新 更多