Antlr4 编写lexer与解析器规则的指南

Antlr4 编写lexer与解析器规则的指南,antlr4,Antlr4,有人能帮助我理解在Lexer和Parser级别编写的规则的行为吗 basicInterfaceType : ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet') ; 当作为ctx.basicInterfaceType().getText()访问时,上面的解析器规则返回了预期值TenGigabitEthernet,而当作为ctx.BASIC\u INTF\u TYPE().getText()访

有人能帮助我理解在Lexer和Parser级别编写的规则的行为吗

basicInterfaceType 
    : ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet')
;
当作为
ctx.basicInterfaceType().getText()
访问时,上面的解析器规则返回了预期值
TenGigabitEthernet
,而当作为
ctx.BASIC\u INTF\u TYPE().getText()访问时,下面的规则返回了
null
,返回位置为
BASIC\u INTF\u TYPE()

是否有类似于在解析器中放置太多关键字替代项这样的指导方针?
null
返回对于上述lexer规则如何有效?

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

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

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


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

我从未在适当的位置使用过这两个标记。你的回答引导我对伪令牌有更多的了解,谢谢!!!我从未在适当的地方使用过这两种方法。你的回答引导我对伪令牌有更多的了解,谢谢!!!
BASIC_INTF_TYPE
    : ('Port-channel' | 'fortyGigE' | 'TenGigabitEthernet' | 'GigabitEthernet')
;