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

Popular posts from this blog

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -

python 3.x - Mapping specific letters onto a list of words -