ANTLR:循环与输入中的任何内容都不匹配

时间:2014-03-13 10:21:52

标签: eclipse antlr

抱歉我的英语!我有问题,面对这样的问题,给出决定:

  

第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();      

2 个答案:

答案 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,但您没有将相应的规则添加到您的语法中。