2012-07-31 2 views
0

Java를 사용하여 여러 변수에서 다항 함수를 구문 분석하기 위해 Antlr 문법을 연구하고 있습니다. 법적 입력 예는Java에서 생성 된 Antlr Parser : 모든 입력을 읽을 수 없습니다.

42; X; +42X; Y^42; 1337HelloWorld; 13,37X^42; 

는 다음 문법 경고 또는 오류없이 컴파일 않을 수 있습니다

grammar Function; 

parseFunction returns [java.util.List<java.util.List<Object>> list] : 
    { list = new java.util.ArrayList(); }            (f=functionPart { list.add($f.list); })+ 
| { list = new java.util.ArrayList(); } (fb=functionBegin) { list.add($fb.list); } (f=functionPart { list.add($f.list); })* 
; 

functionBegin returns [java.util.List<Object> list]: 
m=NUMBER v=VARIABLE e=exponent { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add($v.text); list.add($e.value); } 
| m=NUMBER v=VARIABLE   { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); list.add($v.text); } 
| v=VARIABLE e=exponent   { list = new java.util.ArrayList(); list.add("+"); list.add("1");  list.add($v.text); list.add($e.value); } 
| v=VARIABLE     { list = new java.util.ArrayList(); list.add("+"); list.add("1");  list.add($v.text); } 
| m=NUMBER      { list = new java.util.ArrayList(); list.add("+"); list.add($m.text); } 
; 

functionPart returns [java.util.List<Object> list] :  
s=SIGN m=NUMBER v=VARIABLE e=exponent { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add($v.text); list.add($e.value); } 
| s=SIGN m=NUMBER v=VARIABLE   { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); list.add($v.text); } 
| s=SIGN v=VARIABLE e=exponent   { list = new java.util.ArrayList(); list.add($s.text); list.add("1");  list.add($v.text); list.add($e.value); } 
| s=SIGN v=VARIABLE      { list = new java.util.ArrayList(); list.add($s.text); list.add("1");  list.add($v.text); } 
| s=SIGN m=NUMBER      { list = new java.util.ArrayList(); list.add($s.text); list.add($m.text); } 
; 

exponent returns [int value]: ('^' n=INTEGER) { $value = 1; if ($n != null && $n.text.length() > 0) $value = Integer.parseInt($n.text); } 
; 

VARIABLE : ('a'..'z'|'A'..'Z')+ 
; 

INTEGER : ('0'..'9')+ 
; 

NUMBER : ('0'..'9')+ (','('0'..'9')+)? 
; 

SIGN : ('+'|'-') 
; 

WS : (' ' | '\t' | '\r'| '\n')+ {skip();} 
; 

이 문법, 컴파일 및 대부분의 입력 값을 허용 않습니다 자바에서 사용합니다. 분명히 유효한 모든 입력 값이 허용되는 것은 아닙니다. 즉시 숫자 (입력 "42"에서 오류) 오류가 발생합니다 입력

+42; 42; 42X^1337; 

처럼, 팝업이나 쉼표를 사용하지 않는 같이

line 1:1 no viable alternative at input '+' 

오류가 나는 경우 슬로우되지 않는 입력을 수정하십시오

+42,0; 42,0; 42,0X^1337 

아무도 왜, 어떻게 고칠 수 있습니까?

답변

2

가장 긴 경기를 승리로 첫 번째 렉서 규칙, 따라서 42INTEGER이며, 쉼표 부분이있을 때 NUMBERINTEGER보다 더 긴 일치가있는 경우 사실 NUMBER에만, 즉 일치합니다.

는 파서 규칙

number : NUMBER | INTEGER ; 

추가 및 다른 파서 규칙에서 그 대신 NUMBER를 사용하여 고정 될 수있다.

+0

그 일을했습니다. 고마워요! – Skrodde

관련 문제