JSGLR2: Stratego mix-syntax is not handled correctly
Parsing a
Syntax-Boxmixed syntax file with JSGLR2 gives a result that does not fit the syntax rules. This bug is in the way of using JSGLR2 instrj. Using JSGLR2 would allowstrjto generate code that gives better stack traces.Steps to reproduce
Setup
Download strategoxt-distrib and extract to some directory
$dir(or on Mac use homebrew-metaborg to install the latest strategoxt). Also download PrettyPrintRules.str AND PrettyPrintRules.meta.Also get something set up for parsing a file with JSGLR2 (there’s no
mainaround in the JSGLR2 code AFAIK).Commands
To get the pretty-printed AST as JSGLR1 parses the file, or the second command if installed with homebrew:
java -cp $dir/share/strategoxt/strategoxt/strategoxt.jar run org.strategoxt.tools.parse-stratego-io -i PrettyPrintRules.str -I $dir/share/strategoxt/gpp/sdf --assimilation off | java -cp $dir/share/strategoxt/strategoxt/strategoxt.jar run org.strategoxt.stratego-aterm.io-pp-aterm > jsglr1.atermparse-stratego -i PrettyPrintRules.str -I /usr/local/share/strategoxt/gpp/sdf --assimilation off | pp-aterm > jsglr1.atermNow use whatever method you have handy to parse the same file with JSGLR2 (parse table is
$dir/share/strategoxt/gpp/sdf/Stratego-Box.tbl), and usepp-atermagain for the pretty-printingjava -cp $dir/share/strategoxt/strategoxt/strategoxt.jar run org.strategoxt.stratego-aterm.io-pp-aterm` to pretty-print the AST to a file `jsglr2.atermResulting diff
See also the conclusion below the diff.
$ diff jsglr1.aterm jsglr2.aterm 192,201c192,197 < , Conc( < Conc( < [ S(FromTerm(Var("f"))) < , S("\"(\"") < , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) < ] < , FromTerm(Var("children")) < ) < , [S("\")\"")] < ) --- > , [ S(FromTerm(Var("f"))) > , S("\"(\"") > , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) > , Var("children") > , S("\")\"") > ] 237,248c233,235 < , Conc( < Conc( < [ H( < [SOpt(HS(), "0")] < , [S(FromTerm(Var("f"))), S("\"(\"")] < ) < , H( < [SOpt(HS(), "1")] < , [S("\" \""), FromTerm(App(CallNoArgs(SVar("s")), Var("x")))] < ) < ] < , FromTerm(Var("children")) --- > , [ H( > [SOpt(HS(), "0")] > , [S(FromTerm(Var("f"))), S("\"(\"")] 250,251c237,243 < , [S("\")\"")] < ) --- > , H( > [SOpt(HS(), "1")] > , [S("\" \""), FromTerm(App(CallNoArgs(SVar("s")), Var("x")))] > ) > , Var("children") > , S("\")\"") > ] 353,361c345,349 < , Conc( < Conc( < [ FromTerm(App(CallNoArgs(SVar("before")), NoAnnoList(Tuple([])))) < , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) < ] < , FromTerm(Var("tail")) < ) < , [FromTerm(App(CallNoArgs(SVar("after")), NoAnnoList(Tuple([]))))] < ) --- > , [ FromTerm(App(CallNoArgs(SVar("before")), NoAnnoList(Tuple([])))) > , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) > , Var("tail") > , FromTerm(App(CallNoArgs(SVar("after")), NoAnnoList(Tuple([])))) > ] 392,399c380,383 < , Conc( < Conc( < [ H( < [SOpt(HS(), "1")] < , [ FromTerm(App(CallNoArgs(SVar("before")), NoAnnoList(Tuple([])))) < , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) < ] < ) --- > , [ H( > [SOpt(HS(), "1")] > , [ FromTerm(App(CallNoArgs(SVar("before")), NoAnnoList(Tuple([])))) > , FromTerm(App(CallNoArgs(SVar("s")), Var("x"))) 401d384 < , FromTerm(Var("tail")) 403,404c386,388 < , [FromTerm(App(CallNoArgs(SVar("after")), NoAnnoList(Tuple([]))))] < ) --- > , Var("tail") > , FromTerm(App(CallNoArgs(SVar("after")), NoAnnoList(Tuple([])))) > ]Conclusion
The JSGLR1 version is slightly more complex because of the
Submitted by Jeff Smits on 17 June 2018 at 12:12Conc, and I can’t find where they come from, but that’s not the problem. The problem is JSGLR1 producesFromTerm(Var("children"))as expected, where JSGLR2 produces justVar("children"). JSGLR2 is wrong here. This happens four times in total, two times for variablechildren, two times for variabletail. These are variables that are in mix syntax patterns. Try comparing the input stratego file with the mix syntax rules, we should get the wrappingFromTerm.
Issue Log
Related to imploding list productions that also have constructors defined. Fixes in:
Fixed in recent developments of JSGLR2. Part of the imploding implementation was actually lacking support for mix-syntax, causing weird and unpredictable behavior.
Log in to post comments