繁体   English   中英

ANTLR4 Lexer 不喜欢 Cisco ACE

[英]ANTLR4 Lexer doesn't like Cisco ACE

所以,我试着解析这样的东西。

permit 16 any eq 30 www any eq 80 established log-input

我瞄准的解析树看起来像这样。 来自测试台的实际 output

如您所见,16 是我的问题。 我嵌套了规则,但它不喜欢它。

相关部分...

ace  : remarks? action source destination ops;
action: ( P | D ) PROTO ;
P : 'permit' ;
D : 'deny' ;
NUMBER : [0-9]+ ;
PROTO : 'ip'
      | 'tcp'
      | 'udp'
      | 'eigrp'
      | 'icmp'
      | NUMBER
      ;
ID : [a-zA-Z-]+ ;

如果 Number 是 1st,我得到 RED 16,如果 PROTO 是 1st,那么下游的所有端口都变成 RED。

我知道它只是按顺序运行我的 LEX 规则,而且它们是模棱两可的。 PROTO 可以匹配任何数字,NUMBER 也可以。

但是我试图通过嵌套它们和片段来解决这个问题,但无济于事。

ace  : remarks? action source destination ops;
action: ( P | D ) ;
P : 'permit' PROTO;
D : 'deny' PROTO;
NUMBER : [0-9]+ ;
fragment PROTO : 'ip'
      | 'tcp'
      | 'udp'
      | 'eigrp'
      | 'icmp'
      | NUMBER
      ;
ID : [a-zA-Z-]+ ;

一旦我这样做,我的“包罗万象”的 ID 就开始吞噬一切,它仍然在树上,但我所有的令牌类型都变成了 ID。

我已经环顾这个论坛和漱口器好几个小时了,但我还没有找到解决这个问题的任何方法,但奇怪的是,我想要的行为在同一语法的其他地方也有效。

destination : address ports? ;
address : ADDRESS ADDRESS | HST ADDRESS | ANY ;
ADDRESS : QUAD DOT QUAD DOT QUAD DOT QUAD ;
fragment QUAD : TWO LO5 LO5 | TWO LO4 DIG | ONE DIG DIG | DIG DIG | DIG ;
fragment DOT : '.' ;
fragment ONE : [1] ;
fragment TWO : [2] ;
fragment LO4 : [0-4] ;
fragment LO5 : [0-5] ;
fragment DIG : [0-9] ;

这就像冠军一样,只抓取 IP 和主机地址而不会失败。 当然是“端口”? 部分仍然是垃圾。 但是使用相同的设置,似乎无法获取 PORT/PROTOCOL。

我遗漏了一些基本的东西,并且在重新排列这个东西太久之后......我想知道我是否应该尝试获取这种特定的令牌 ID,并在后期处理它(也就是稍后与听众一起处理)或者是否我的树应该包含适当的标记标签。

** 从技术上讲,按数字寻址的协议应小于 256,因此它们是我定义的 QUAD,但我无法正常工作...

想法? 建议? 我有树,所以谁在乎那个地方是不是数字? 我知道父母是行动,所以右边的树是一个数字,以后应该验证为小于 256? 我假设歧义正在扼杀它,如果我可以重新设计这个东西以某种方式消除所有歧义?

(顺便说一句,我是一个自学成才的新手,所以试着和我说话,就像我没有接受过计算机科学的大学教育,我从未读过龙书,我已经用 ANTLR 编程了 4 天......因为那就是你在和谁说话。)

我知道这是一个旧线程。 但希望这对某人有帮助。 实际上,您可以使用捕获所有令牌来解析大多数值,然后在您的访问者/侦听器代码中将其转换为更具体的值(枚举、常量等)。 这是对我有用的语法的精简示例

基本语法:


    lexer grammar Base ;
    
    fragment LOWERCASE  : [a-z];
    fragment UPPERCASE  : [A-Z];
    fragment NUMBER     : [0-9]+;
    fragment WORD       : (LOWERCASE | UPPERCASE | NUMBER | '-' | '_' | '/')+;
    fragment NEWLINE    : '\r' '\n'
        | '\n'
        | '\r';
    
    fragment OBJECT_DESCRIPTION     : ' description';CRLF
        : NEWLINE ;
    
    VALUE
        : (WORD | '.')+ ;
    
    WHITESPACE
        : ' '   -> skip ;
    
    IGNORE
        : .     -> skip ;
    

访问规则语法:


    grammar AccessList;
    
    import Base;
    
    //access-list acl-1 extended permit udp | object network-object-1 eq 123 (source)| 1.1.1.1 ne www (destination)|
    
    accessLists             : (accessListDestination)+;
    accessListDestination   : accessListSource accessListTarget (' rule-id' aclId = VALUE)?;
    accessListSource        : accessListProtocol accessListTarget;
    accessListTarget: (
            ({_input.LT(1).getText().matches("object|object-group")}? objectType = VALUE objectName = VALUE)
            |({_input.LT(1).getText().matches("host")}? host=VALUE ip=VALUE) | ip = VALUE 
        ) accessListPorts?;
    accessListPorts         : (accessListPort | accessListPortRange);
    accessListPortRange     : VALUE startPort=VALUE endPort=VALUE;
    accessListPort          : operatorOrObjectType=VALUE portOrPortGroup=VALUE;
    
    accessListProtocol:
        ACCESS_LIST_KEY name = VALUE accessListType = ACCESS_LIST_TYPE action = VALUE protocol = VALUE accessListInterface?;
    
    accessListInterface: 'ifc' accessListInterfaceName=VALUE;
    
    fragment ACCESS_LIST    : 'access-list';
    fragment EXTENDED       : 'extended';
    fragment ADVANCED       : 'advanced';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM