rascal - UnsupportedOperationException when I try translate a expression -
i defined syntax language of expressions, it's more complex, simplified put here, , defined functions translate expressions java (i'm not using java syntax, translate strings). defined constants in syntax (i don't know if it's correct name this) calls "maxint" , "minint", , functions calls translateexp translate each expression defined in syntax string. expressions try translate works, when "maxint" or "minint" appears in expression don't work , throws unsupportedoperationexception , don't know why, example "maxint - 1". knows why , can me? problem throws unsupportedoperationexception when try translate expression have more 1 plus (+) or minus (-), "1+1+1", again, knows why?
my module syntax , functions:
module expsyntax import string; import parsetree; layout whitespaces = [\t\n\ \r\f]*; lexical ident = [a-z a-z 0-9 _] !<< [a-z a-z][a-z a-z 0-9 _]* !>> [a-z a-z 0-9 _] \ keywords; lexical integer_literal = [0-9]+; keyword keywords = "maxint" | "minint"; start syntax expression = expressions_primary | expressions_arithmetical; syntax expressions_primary = data: ident+ id | bracket expr_bracketed: "(" expression e ")" ; syntax expressions_arithmetical = integer_lit | left addition: expression e1 "+" expression e2 | left difference: expression e1 "-" expression e2 ; syntax integer_lit = integer_literal il | max_int: "maxint" | min_int: "minint" ; public str translate(str txt) = translateexp(parse(#expression, txt)); public str translateexp((expression) `<integer_literal i>`) = "<i>"; public str translateexp((expression) `maxint`) = "java.lang.integer.max_value"; public str translateexp((expression) `minint`) = "java.lang.integer.min_value"; public str translateexp((expression) `<expression e1>+<expression e2>`) = "<translateexp(e1)> + <translateexp(e2)>"; public str translateexp((expression) `<expression e1>-<expression e2>`) = "<translateexp(e1)> - <translateexp(e2)>"; public str translateexp((expression) `<ident id>`) = "<id>"; public str translateexp((expression) `(<expression e>)`) = "(<translateexp(e)>)"; this happens:
rascal>import expsyntax; ok rascal>translate("(test + 1) - test2"); str: "(test + 1) - test2" rascal>translate("maxint - 1"); java.lang.unsupportedoperationexception(internal error) @ $shell$(|main://$shell$|) java.lang.unsupportedoperationexception @ org.rascalmpl.ast.expression.getkeywordarguments(expression.java:214) @ org.rascalmpl.interpreter.matching.nodepattern.<init>(nodepattern.java:84) @ org.rascalmpl.semantics.dynamic.tree$amb.buildmatcher(tree.java:351) @ org.rascalmpl.ast.abstractast.getmatcher(abstractast.java:173) @ org.rascalmpl.interpreter.result.rascalfunction.prepareformals(rascalfunction.java:503) @ org.rascalmpl.interpreter.result.rascalfunction.call(rascalfunction.java:365) @ org.rascalmpl.interpreter.result.overloadedfunction.callwith(overloadedfunction.java:327) @ org.rascalmpl.interpreter.result.overloadedfunction.call(overloadedfunction.java:305) @ org.rascalmpl.semantics.dynamic.expression$callortree.interpret(expression.java:486) @ org.rascalmpl.semantics.dynamic.statement$expression.interpret(statement.java:355) @ org.rascalmpl.semantics.dynamic.statement$return.interpret(statement.java:773) @ org.rascalmpl.interpreter.result.rascalfunction.runbody(rascalfunction.java:467) @ org.rascalmpl.interpreter.result.rascalfunction.call(rascalfunction.java:413) @ org.rascalmpl.interpreter.result.overloadedfunction.callwith(overloadedfunction.java:327) @ org.rascalmpl.interpreter.result.overloadedfunction.call(overloadedfunction.java:305) @ org.rascalmpl.semantics.dynamic.expression$callortree.interpret(expression.java:486) @ org.rascalmpl.semantics.dynamic.statement$expression.interpret(statement.java:355) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:936) @ org.rascalmpl.semantics.dynamic.command$statement.interpret(command.java:115) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:1147) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:1107) @ org.rascalmpl.eclipse.console.rascalscriptinterpreter.execcommand(rascalscriptinterpreter.java:446) @ org.rascalmpl.eclipse.console.rascalscriptinterpreter.run(rascalscriptinterpreter.java:239) @ org.eclipse.core.internal.jobs.worker.run(worker.java:53) rascal>translate("1+1+1"); java.lang.unsupportedoperationexception(internal error) @ $shell$(|main://$shell$|) java.lang.unsupportedoperationexception @ org.rascalmpl.ast.expression.getkeywordarguments(expression.java:214) @ org.rascalmpl.interpreter.matching.nodepattern.<init>(nodepattern.java:84) @ org.rascalmpl.semantics.dynamic.tree$amb.buildmatcher(tree.java:351) @ org.rascalmpl.ast.abstractast.getmatcher(abstractast.java:173) @ org.rascalmpl.interpreter.result.rascalfunction.prepareformals(rascalfunction.java:503) @ org.rascalmpl.interpreter.result.rascalfunction.call(rascalfunction.java:365) @ org.rascalmpl.interpreter.result.overloadedfunction.callwith(overloadedfunction.java:327) @ org.rascalmpl.interpreter.result.overloadedfunction.call(overloadedfunction.java:305) @ org.rascalmpl.semantics.dynamic.expression$callortree.interpret(expression.java:486) @ org.rascalmpl.semantics.dynamic.statement$expression.interpret(statement.java:355) @ org.rascalmpl.semantics.dynamic.statement$return.interpret(statement.java:773) @ org.rascalmpl.interpreter.result.rascalfunction.runbody(rascalfunction.java:467) @ org.rascalmpl.interpreter.result.rascalfunction.call(rascalfunction.java:413) @ org.rascalmpl.interpreter.result.overloadedfunction.callwith(overloadedfunction.java:327) @ org.rascalmpl.interpreter.result.overloadedfunction.call(overloadedfunction.java:305) @ org.rascalmpl.semantics.dynamic.expression$callortree.interpret(expression.java:486) @ org.rascalmpl.semantics.dynamic.statement$expression.interpret(statement.java:355) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:936) @ org.rascalmpl.semantics.dynamic.command$statement.interpret(command.java:115) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:1147) @ org.rascalmpl.interpreter.evaluator.eval(evaluator.java:1107) @ org.rascalmpl.eclipse.console.rascalscriptinterpreter.execcommand(rascalscriptinterpreter.java:446) @ org.rascalmpl.eclipse.console.rascalscriptinterpreter.run(rascalscriptinterpreter.java:239) @ org.eclipse.core.internal.jobs.worker.run(worker.java:53)
the error message bug, since should report more clear, appears there still ambiguity in syntax definition. run-time trying build pattern matcher tree$amb (org.rascalmpl.semantics.dynamic.tree$amb.buildmatcher) did not implement , not implement.
from looking @ definition (i did not try it), seems cause rule:
lexical ident = [a-z a-z 0-9 _] !<< [a-z a-z][a-z a-z 0-9 _]* !>> [a-z a-z 0-9 _] \ keywords; because !>> , \ bind stronger juxtapositioning, \ keyword reservation applied tail of ident , not whole. please add brackets (a sequence operator) disambiguate:
lexical ident = [a-z a-z 0-9 _] !<< ([a-z a-z][a-z a-z 0-9 _]*) !>> [a-z a-z 0-9 _] \ keywords; this should step further.
then expression grammar still ambiguous , can simplified this:
start syntax expression = data: ident+ id | integer: integer_lit | bracket bracketed: "(" expression e ")" > left ( addition: expression e1 "+" expression e2 | difference: expression e1 "-" expression e2 ) ; syntax integer_lit = integer_literal il | max_int: "maxint" | min_int: "minint" ; short explanation: left works on directly recursive non-terminals. since defined expressions_arithmatical in terms of expression there no direct recursion. next support indirect recursion, grammar unnecessary.
also, added + , - mutually left recursive putting them in group, otherwise 1+1-1 have remained ambiguous.
Comments
Post a Comment