我试图使用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忽略任何错误,并继续处理剩余的文本?
谢谢你的建议!莱昂
因为'['在某些情况下也可能会跳过[ 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)