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
아무도 왜, 어떻게 고칠 수 있습니까?
그 일을했습니다. 고마워요! – Skrodde