2013-01-31 2 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, REAL] 대신 [MEASURE, COMP, INT]로 토큰 화됩니다.

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

완벽하고 오류는 없습니다. – GlinesMome

+0

Brilliant. 'fragment' 키워드에 대한 좋은 예입니다. 이것은 AntrWorks가 그래픽 출력의 오류를 강조 표시 할 때 큰 도움이 될 것입니다. –

+0

안녕하세요 Mr.Sam, 귀찮게해서 죄송합니다. 유니 코드 (규칙 이름이 아닌 규칙 본문)와 감사 =) http://stackoverflow.com/questions/에서 규칙 이름을 작성하는 것과 관련하여 여기 내 문제를 살펴 보시기 바랍니다. 30614712/write-a-grammar-rule-in-unicode-antlr-4 –