Antlr 跳过未编写语法的输入

Antlr 跳过未编写语法的输入,antlr,antlr3,abstract-syntax-tree,antlr4,Antlr,Antlr3,Abstract Syntax Tree,Antlr4,我已经在下面的代码片段中编写了语法来解析“接口”块(一个块由!\n限定) ! interface FastEthernet 1/0 no ip address shutdown ! ip route 0.0.0.0 ! router bgp 10 <skipped...> ! router ospf 1 <skipped...> ! interface Vlan 100 ip address 192.168.20.1 no

我已经在下面的代码片段中编写了语法来解析“接口”块(一个块由
!\n
限定)

!
interface FastEthernet 1/0
    no ip address
    shutdown
!
ip route 0.0.0.0
!
router bgp 10
    <skipped...>
!
router ospf 1
    <skipped...>
!
interface Vlan 100
    ip address 192.168.20.1
    no shutdown
!
!
接口快速以太网1/0
没有ip地址
关闭
!
ip路由0.0.0.0
!
路由器BGP10
!
路由器ospf 1
!
接口Vlan 100
ip地址192.168.20.1
激活端口
!


我没有为“ip路由”或“路由器bgp”或“路由器ospf”块编写语法,但它(以及类似的块)很容易出现在输入中。我如何跳过“不需要的”而只处理“预期的”块?我是ANTLR的新手,但在过去的几周里已经学会了为类似的东西写语法。我已经开始使用ANTLRv3.5,v4将是新版本。

您可以像使用多行注释一样执行此操作。当您遇到您不感兴趣的块开始时,跳过以下任何标记,直到看到新的块开始。进行下一次检查,依此类推。为了在解析器中而不是在lexer中使用这个循环,您仍然需要为任何输入标记使用lexer标记,否则lexer将抱怨。然而,多行注释通常是按照lexer规则编写的,因此,如果您想以类似的方式编写,那么您必须在lexer级别定义“有趣”的块,而这并不是正确的位置。

您可以像使用多行注释一样执行此操作。当您遇到您不感兴趣的块开始时,跳过以下任何标记,直到看到新的块开始。进行下一次检查,依此类推。为了在解析器中而不是在lexer中使用这个循环,您仍然需要为任何输入标记使用lexer标记,否则lexer将抱怨。然而,多行注释通常是按照lexer规则编写的,因此,如果您想类似地这样做,那么问题是您必须在lexer级别定义“有趣”的块,而这并不是正确的位置