我可以使用antlr来解析部分数据吗?

Leo*_*hen 7 antlr

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

例如:我想解析该段:

[ 123 begin ]
Run Code Online (Sandbox Code Playgroud)

所以我写了语法:

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


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


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

WS
    : (' '|'\t')+ {skip();}
    ;
Run Code Online (Sandbox Code Playgroud)

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

 111 [ 123 begin ] 222
Run Code Online (Sandbox Code Playgroud)

根据讨论: 简单的ANTLR语法有什么问题? 我知道为什么我的语法不能处理上述陈述.

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

谢谢你的建议!莱昂

Bar*_*ers 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     : .;
Run Code Online (Sandbox Code Playgroud)