StackOverflowError during analysis of large expression
Spoofax 2.1.0
Related to https://yellowgrass.org/issue/Spoofax/163A large expression such as
val = 0 OR val = 1 OR val = 2 .... OR val = 10000
generates the following exception (max JVM stack size = 16MB):Submitted by Oskar van Rest on 5 April 2017 at 02:27java.lang.StackOverflowError at pgql_lang.trans.lifted2145.invoke(lifted2145.java:38) at org.strategoxt.lang.SRTS_all.map(SRTS_all.java:60) at org.strategoxt.lang.SRTS_all.invoke(SRTS_all.java:21) at pgql_lang.trans.origin_track_forced_1_0.invoke(origin_track_forced_1_0.java:36) at pgql_lang.trans.lifted2144.invoke(lifted2144.java:38) at org.strategoxt.stratego_lib.preserve_annos_1_0.invoke(preserve_annos_1_0.java:29) at pgql_lang.trans.nabl_collect_1_4.invoke(nabl_collect_1_4.java:149) at pgql_lang.trans.nabl_siblings_0_4.invoke(nabl_siblings_0_4.java:55) at pgql_lang.trans.lifted2145.invoke(lifted2145.java:44) at org.strategoxt.lang.SRTS_all.map(SRTS_all.java:60) at org.strategoxt.lang.SRTS_all.invoke(SRTS_all.java:21) at pgql_lang.trans.origin_track_forced_1_0.invoke(origin_track_forced_1_0.java:36) at pgql_lang.trans.lifted2144.invoke(lifted2144.java:38) at org.strategoxt.stratego_lib.preserve_annos_1_0.invoke(preserve_annos_1_0.java:29) at pgql_lang.trans.nabl_collect_1_4.invoke(nabl_collect_1_4.java:149) at pgql_lang.trans.nabl_siblings_0_4.invoke(nabl_siblings_0_4.java:55)
Issue Log
This is due to the recursive nature of Stratego, and in particular the task and fact collection of NaBL. The only thing you can do is increase the stack size.
I think you’re right that this is not a Spoofax issue since you can’t really implement an expression tree without using recursion.
Even Java’s compiler throws an exception if you make the expression long enough:java.lang.StackOverflowError at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at com.sun.tools.javac.tree.TreeScanner.visitBinary(TreeScanner.java:244) at com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:1785) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at com.sun.tools.javac.tree.TreeScanner.visitBinary(TreeScanner.java:244) at com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:1785) at com.sun.tools.javac.tree.TreeScanner.scan(TreeScanner.java:49) at com.sun.tools.javac.tree.TreeScanner.visitBinary(TreeScanner.java:244) at com.sun.tools.javac.tree.JCTree$JCBinary.accept(JCTree.java:1785)
Closing this issue but keeping issue https://yellowgrass.org/issue/Spoofax/163 open since for parsing of literals in SDF or doing String manipulation in Stratego you really want to avoid using recursion (same for operating on general lists).
For string manipulation, you probably want Java methods manipulating strings instead of Stratego strategies manipulating ATerm lists of characters.
Log in to post comments