Hallo zusammen,
ich habe mir nach einer Einarbeitung in Antlr folgende Grammatik geschrieben:
Diese soll Polynome in mehreren Variablen ermöglichen, wobei der führende Term kein Vorzeichen haben muss. Beispiele:
Ich lasse mir die Grammatik also von Antlr übersetzen und nutze die erstellte
und
. Bis auf eine werden folgende Eingaben werden nun auch akzeptiert:
Der Fehler scheint aufzutauchen, wenn ich eine Zahl, die kein Komma beinhaltet, verwende. Kann mir jemand von euch auf die Sprünge helfen, woran es hier liegt?
Gruß, Skrodde
ich habe mir nach einer Einarbeitung in Antlr folgende Grammatik geschrieben:
Code:
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();}
;
Code:
1337; X^42; Y^1337-42X; +42HalloWelt^1337
Code:
FunctionLexer.java
Code:
FunctionParser.java
Java:
public static void main(String[] args) throws Exception {
System.out.println(parserTest("X"));
System.out.println(parserTest("+X"));
System.out.println(parserTest("-X"));
System.out.println(parserTest("HalloWelt+42,13X^13-X^2"));
System.out.println(parserTest("42,1337"));
System.out.println(parserTest("X+42+X")); //<-- Hier gibt es einen Fehler
}
private static List<List<Object>> parserTest(String input) throws RecognitionException {
ANTLRStringStream in = new ANTLRStringStream(input);
FunctionLexer lexer = new FunctionLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
FunctionParser parser = new FunctionParser(tokens);
return parser.parseFunction();
}
Gruß, Skrodde
Zuletzt bearbeitet: