解析器规则不会为无效输入产生错误
Parser rule does not produce an error for invalid input
我发现了一个奇怪的解析器行为,无法向我解释。如果我做错了什么,也许你们有人可以给我提示。
我有以下语法文件:
grammar test;
/*
* Parser Rules
*/
unary_expr
: unary_operator IDENTIFIER;
unary_operator
: PLUS PLUS;
/*
* Lexer Rules
*/
IDENTIFIER: [a-zA-Z]+;
PLUS: '+';
NEWLINE
: ( '\r'? '\n' | '\r' )+ -> skip;
当我用
测试这个语法时
++abc++def
词法分析器将正确检测所有标记
Tokens:
[@0,0:0='+',<2>,1:0]
[@1,1:1='+',<2>,1:1]
[@2,2:4='abc',<1>,1:2]
[@3,5:5='+',<2>,1:5]
[@4,6:6='+',<2>,1:6]
[@5,7:9='def',<1>,1:7]
[@6,12:11='<EOF>',<-1>,2:0]
但是解析树肯定不会覆盖所有检测到的标记!
Parse Tree:
unary_expr (
unary_operator (
"+"
"+"
)
"abc"
)
我做错了什么?
如果您告诉 ANTLR 匹配解析器规则 unary_expr
使用的任何标记,那么这正是 ANTLR 所做的。
如果你想强制 ANTLR 使用 all 标记,在解析器规则的末尾添加 EOF
标记:
unary_expr
: unary_operator IDENTIFIER EOF
;
现在您将看到预期的错误:
我发现了一个奇怪的解析器行为,无法向我解释。如果我做错了什么,也许你们有人可以给我提示。
我有以下语法文件:
grammar test;
/*
* Parser Rules
*/
unary_expr
: unary_operator IDENTIFIER;
unary_operator
: PLUS PLUS;
/*
* Lexer Rules
*/
IDENTIFIER: [a-zA-Z]+;
PLUS: '+';
NEWLINE
: ( '\r'? '\n' | '\r' )+ -> skip;
当我用
测试这个语法时++abc++def
词法分析器将正确检测所有标记
Tokens:
[@0,0:0='+',<2>,1:0]
[@1,1:1='+',<2>,1:1]
[@2,2:4='abc',<1>,1:2]
[@3,5:5='+',<2>,1:5]
[@4,6:6='+',<2>,1:6]
[@5,7:9='def',<1>,1:7]
[@6,12:11='<EOF>',<-1>,2:0]
但是解析树肯定不会覆盖所有检测到的标记!
Parse Tree:
unary_expr (
unary_operator (
"+"
"+"
)
"abc"
)
我做错了什么?
如果您告诉 ANTLR 匹配解析器规则 unary_expr
使用的任何标记,那么这正是 ANTLR 所做的。
如果你想强制 ANTLR 使用 all 标记,在解析器规则的末尾添加 EOF
标记:
unary_expr
: unary_operator IDENTIFIER EOF
;
现在您将看到预期的错误: