diff --git a/cpp/ql/src/experimental/parsing/glr.qll b/cpp/ql/src/experimental/parsing/glr.qll index 39ce4243a7a..f3cef9977d8 100644 --- a/cpp/ql/src/experimental/parsing/glr.qll +++ b/cpp/ql/src/experimental/parsing/glr.qll @@ -426,11 +426,16 @@ module GLR { result = "There are " + sr + " shift/reduce conflicts and " + rr + " reduce/reduce conflicts." ) } + + // This should be empty + predicate debugStates(State state1, Symbol s) { + count(state1.getTransition(s))>1 + } } // Just some debugging information needed to quickeval predicates in modules -string test_input(int i) { result = "I+I".charAt(i) } +string test_input(int i) { result = "I+I-I".charAt(i) } -string test_grammar() { result = ["G -> E", "E -> E + E", "E -> I"] } +string test_grammar() { result = ["G -> E", "E -> E + I", "E -> E - I", "E -> I"] } module DebugContext = GLR::GLRparser; diff --git a/cpp/ql/src/experimental/parsing/test4.ql b/cpp/ql/src/experimental/parsing/test4.ql new file mode 100644 index 00000000000..9d34e88c1c1 --- /dev/null +++ b/cpp/ql/src/experimental/parsing/test4.ql @@ -0,0 +1,17 @@ +import glr + +string grammar4() { + result = ["G -> E", "E -> E + I", "E -> E - I", "E -> I"] +} + +string input4(int i) { result = "I+I-I".charAt(i) } + +module Test4 = GLR::GLRparser; + +query string conflicts() { result = GLR::conflicts() } + +query int syntax_error() { result = Test4::syntax_error_position() } + +from Test4::ParseNode parent, int i, Test4::ParseNode child +where Test4::tree(parent,i,child) +select parent, i, child