我正在编写一个 ANTLR 语法来解析日志文件,但遇到了一个问题。我简化了语法以重现问题,如下所示:
stmt1:
'[ ' elapse ': ' stmt2
;
stmt2:
'[xxx'
;
stmt3:
': [yyy'
;
elapse :
FLOAT;
FLOAT
: ('0'..'9')+ '.' ('0'..'9')*
;
当我使用以下字符串测试语法时:
[ 98.9: [xxx
我得到了错误:
E:\work\antlr\output\__Test___input.txt line 1:9 mismatched character 'x' expecting 'y'
E:\work\antlr\output\__Test___input.txt line 1:10 no viable alternative at character 'x'
E:\work\antlr\output\__Test___input.txt line 1:11 no viable alternative at character 'x'
E:\work\antlr\output\__Test___input.txt line 1:12 mismatched input '<EOF>' expecting ': '
但是如果我删除 ruel 'stmt3',同样的字符串会被接受。
我不确定发生了什么...
感谢您的任何建议!
莱昂
感谢巴特的帮助。我试图纠正语法。我认为,基线,我必须消除所有标记的歧义。我添加了 WS 令牌以简化规则。
stmt1:
'[' elapse ':' stmt2
;
stmt2:
'[' 'xxx'
;
stmt3:
':' '[' 'yyy'
;
elapse :
FLOAT;
FLOAT
: ('0'..'9')+ '.' ('0'..'9')*
;
WS : (' ' |'\t' |'\n' |'\r' )+ {skip();} ;