7

我正在尝试使用 antlr 来解析日志文件。因为我只对部分日志感兴趣,所以我只想写一个部分解析器来处理重要的部分。

例如:我想解析段:

[ 123 begin ]

所以我写了语法:

log :   
    '[' INT 'begin' ']'
    ;


INT : '0'..'9'+
    ;


NEWLINE
    : '\r'? '\n'
    ;

WS
    : (' '|'\t')+ {skip();}
    ;

但是该段可能出现在一行的中间,例如:

 111 [ 123 begin ] 222

根据讨论: 简单的ANTLR语法有什么问题? 我知道为什么我的语法无法处理上述语句。

我想知道,有没有办法让antlr忽略任何错误,继续处理剩余的文本?

感谢您的任何建议!莱昂

4

1 回答 1

7

由于'['在 之外的某些情况下也可能会被跳过[ 123 begin ],因此无法在词法分析器中处理此问题。您必须创建一个与要跳过的令牌匹配的解析器规则(请参阅noise规则)。

如果没有其他词法分析器规则匹配,您还需要创建一个匹配任何字符的贯穿规则ANY(请参阅规则)。

快速演示:

grammar T;

parse
    : ( log {System.out.println("log=" + $log.text);}
      | noise
      )*
      EOF
    ;

log : OBRACK INT BEGIN CBRACK
    ;

noise
    : ~OBRACK                  // any token except '['
    | OBRACK ~INT              // a '[' followed by any token except an INT
    | OBRACK INT ~BEGIN        // a '[', an INT and any token except an BEGIN
    | OBRACK INT BEGIN ~CBRACK // a '[', an INT, a BEGIN and any token except ']'
    ;

BEGIN   : 'begin';
OBRACK  : '[';
CBRACK  : ']';
INT     : '0'..'9'+;
NEWLINE : '\r'? '\n';
WS      : (' '|'\t')+ {skip();};
ANY     : .;
于 2012-11-04T18:35:17.333 回答