2013-01-31 98 views
1

我用ANTLR 4一样, '在输入端没有可行的替代方案':ANTLR 4:语法错误和

import org.antlr.v4.runtime.ANTLRInputStream; 
import org.antlr.v4.runtime.CharStream; 
import org.antlr.v4.runtime.CommonTokenStream; 
import org.antlr.v4.runtime.TokenStream; 

public class Builder 
{ 
    public static void main(String[] args) 
    { 
     CharStream input = new ANTLRInputStream("ON M1==2 && M3 == 5 && (M2 > 1 || M5 <= 5.0) " 
               + "DO P5:42 P4:10"); 
     ExprLexer lexer = new ExprLexer(input); 
     TokenStream tokens = new CommonTokenStream(lexer); 
     ExprParser parser = new ExprParser(tokens); 
     ExprParser.ExpressionContext uu = parser.expression(); 
     for (int i = 0; i < uu.getChildCount(); ++i) 
      System.out.println(uu.getChild(i)); 
    } 
} 

而下面的语法:

grammar Expr; 
options 
{ 
    // antlr will generate java lexer and parser 
    language = Java; 

} 
WS  : [ \t\r\n]+ -> skip ; 
OP  : '&&' | '||'; 
COMP : '==' | '<' | '>' | '<=' | '>=' | '!='; 
INT  : [0-9]+; 
REAL : INT '.' INT | INT; 

ACTION : 'P' INT ':' INT; 
MEASURE : 'M' INT; 

// ***************** parser rules: 
cond  : MEASURE COMP REAL; 
condexpr : '(' condexpr ')' | cond OP condexpr | cond; 
actionexpr : ACTION actionexpr | ACTION; 
expression : 'ON' condexpr 'DO' actionexpr; 

我有以下的输出:

line 1:7 no viable alternative at input 'M1==2' 
ON 
[29] 
DO 
[31] 

我想我的语法错误,但我没有看到它。 你有想法吗?

对您的帮助, 提前致谢。

回答

8

您的INT规则应该是fragment规则。因此,M1==2的表达式正如您所期望的那样被标记为[MEASURE,COMP,INT]而不是[MEASURE,COMP,REAL]。

fragment INT : [0-9]+; 
+0

完美,没有更多的错误。 – GlinesMome

+0

辉煌。 “片段”关键字需求的一个很好的例子。这对于AntrWorks来说是一个很好的补充,可以指出何时突出显示图形输出中的错误。 –

+0

Mr.Sam,抱歉打扰你,但你能看看我的问题在这里写在unicode规则名称(规则名称不规则正文),谢谢=)http://stackoverflow.com/questions/ 30614712 /写一个文法规则名称,在支持unicode的ANTLR-4 –