Resolve shift/reduce conflict of 'def' vs '|'
This was an important conflict. In the following expression:
def a: 0; . | a
Bison needs to decide between these two equally valid
parses:
(def a: 0; .) | a
def a: 0; (. | a)
For jq we want the second one, because the first results in
"a/0 is not defined". In the current parser the first parse
is a reduce and the second parse is a shift. Since Bison
prefers to shift in shift/reduce conflicts, we accidentally
got the correct behavior.
This commit adds a precedence level FUNCDEF which is lower
precedence than '|', meaning we explicitly choose the
correct parse.
Of course many unit tests already cover this case, but I
added one specifically for it.
This commit is contained in:
1 parent
1628bbf95f
commit
66ef8e2c24
4 files changed
+825
-834
No files matched your search
@@ -553,6 +553,11 @@ def f(a;b;c;d;e;f): [a+1,b,c,d,e,f]; f(.[0];.[1];.[0];.[0];.[0];.[0])
|
||||
[1,2]
|
||||
[2,2,1,1,1,1]
|
||||
|
||||
# Test precedence of 'def' vs '|'
|
||||
def a: 0; . | a
|
||||
null
|
||||
0
|
||||
|
||||
# Many arguments
|
||||
def f(a;b;c;d;e;f;g;h;i;j): [j,i,h,g,f,e,d,c,b,a]; f(.[0];.[1];.[2];.[3];.[4];.[5];.[6];.[7];.[8];.[9])
|
||||
[0,1,2,3,4,5,6,7,8,9]
|
||||
|
||||
Reference in new issue
Block a user