代码之家  ›  专栏  ›  技术社区  ›  Tony the Pony

ANTLR中解析器规则和lexer规则的实际区别?

  •  18
  • Tony the Pony  · 技术社区  · 14 年前

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

    my_rule: ... ;
    
    MY_RULE: ... ;
    

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

    2 回复  |  直到 8 年前
        1
  •  26
  •   Bart Kiers    14 年前

    詹写道 :

    ... 这两种说法在安特尔的实际区别是什么。。。

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

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

    这就是区别。

    詹写道 :

    它们会产生不同的AST树吗?不同的表现?...

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

        2
  •  3
  •   Greenonline    6 年前

    这篇文章可能会有帮助:

    雷克萨斯负责第一步 只有 工作就是 从文本创建“令牌流”。它不负责 理解你的语言的语义,它只对 理解你的语言的语法。

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

    注意我说的“标识符”是事物的一般术语 像变量名、函数名、命名空间名等 会让你明白 出现标识符,这样它将进一步指定该令牌 作为某事物的名字。

    (sidenote:令牌只是给定给 令牌流。词素是匹配标记的文本。 我把词素写在标记旁边的括号里。例如, 号码(123)。在本例中,这是一个数字标记,其词素为 “123”。但是,对于一些标记,比如运算符,我省略了lexem 因为它是多余的。例如,我会为 分号标记,而不是分号(;)。

    ANTLR - WHEN TO USE PARSER RULES VS LEXER RULES?