编写词法分析器解析器规则的指南

时间:2013-07-24 13:53:03

标签: antlr4

任何人都可以帮助我理解在Lexer Vs Parser级别编写的规则的行为吗?

basicInterfaceType 
    : ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet')
;

当以TenGigabitEthernet访问时,上述解析器规则返回了预期值ctx.basicInterfaceType().getText(),而以null访问时,以下规则返回ctx.BASIC_INTF_TYPE().getText(),返回nullBASIC_INTF_TYPE()

BASIC_INTF_TYPE
    : ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet')
;

是否有类似put-too-many-keyword-alternatives-at-parser的指南? null返回如何对上述词法分析器规则有效?

1 个答案:

答案 0 :(得分:1)

getText()返回null时,通常意味着未使用您查询的子规则或令牌(在输入中未找到)。可能在第二种情况下,它被匹配为不同的令牌。词法分析器的顺序很重要;当它无法决定匹配哪个标记时,它会与语法文件中首先出现的标记一起使用。解析器规则更灵活 - 您定义的规则可以匹配包含指定文本的任何令牌。

我假设你没有同时定义这两个,我当然可以看到令人困惑的结果。您的解析器规则定义了伪令牌,这些伪令牌出现在其他词法分析器规则之前,因此可能会阻止您的令牌规则能够匹配。