第1行:0要求(...)+循环与输入中的任何内容都不匹配< E O F. >
我的文件calc.g
grammar calc;
options {
language = Java;
}
rule: statement+;
statement
: expr NEWLINE
| ID '=' expr NEWLINE
| NEWLINE
;
NEWLINE : '\r'? '\n'
;
expr
: multExpression ('+' multExpression |'-' multExpression)*
;
multExpression
: a1=atom ('*' a2=atom | '/' a2=atom)*
;
atom
: ID
| INT
| '(' expr ')'
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
INT : ('1'..'9') ('0'..'9')*
;
这是我的主要内容:
ANTLRReaderStream input = new ANTLRReaderStream();
calcLexer lexer = new calcLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
calcParser parser = new calcParser(tokens);
parser.rule();
答案 0 :(得分:0)
看起来你的输入是空的:解析器会立即遇到EOF
(文件结束),它至少需要一个statement
。
尝试这样的事情:
ANTLRStringStream input = new ANTLRStringStream("2*42\n");
calcLexer lexer = new calcLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
calcParser parser = new calcParser(tokens);
parser.rule();
正如280Z28在我的回答中的评论中提到的那样,你应该通过在解析器的入口点末尾添加EOF
来强制解析器使用整个输入:
rule: statement+ EOF;
如果您想允许空字符串也是有效输入,请将+
更改为*
;
rule: statement* EOF;
答案 1 :(得分:-1)
我没有测试它,但认为你必须在你的语法中添加默认的EOF标记:
rule: statement+ EOF!;
您的解析器似乎识别出整个输入,但最后有一个EOF,但您没有将相应的规则添加到您的语法中。