Fix parsing of And chains in BoolFormula
authorDmitry Ivanov <ethercrow@gmail.com>
Thu, 23 Feb 2017 23:02:23 +0000 (18:02 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 23 Feb 2017 23:57:17 +0000 (18:57 -0500)
Parse `foo, bar, baz` into `And [foo, bar, baz]`
instead of `And [foo, And [bar, baz]]`.

Fixes #11024.

Test Plan: read and think

Reviewers: austin, bgamari, mpickering

Reviewed By: bgamari, mpickering

Subscribers: ezyang, thomie, alanz

Differential Revision: https://phabricator.haskell.org/D3139

compiler/parser/Parser.y

index 175cfbb..fcc3707 100644 (file)
@@ -2959,9 +2959,13 @@ name_boolformula :: { LBooleanFormula (Located RdrName) }
                               >> return (sLL $1 $> (Or [$1,$3])) }
 
 name_boolformula_and :: { LBooleanFormula (Located RdrName) }
-        : name_boolformula_atom                             { $1 }
-        | name_boolformula_atom ',' name_boolformula_and
-                  {% aa $1 (AnnComma,$2) >> return (sLL $1 $> (And [$1,$3])) }
+        : name_boolformula_and_list
+                  { sLL (head $1) (last $1) (And ($1)) }
+
+name_boolformula_and_list :: { [LBooleanFormula (Located RdrName)] }
+        : name_boolformula_atom                               { [$1] }
+        | name_boolformula_atom ',' name_boolformula_and_list
+            {% aa $1 (AnnComma, $2) >> return ($1 : $3) }
 
 name_boolformula_atom :: { LBooleanFormula (Located RdrName) }
         : '(' name_boolformula ')'  {% ams (sLL $1 $> (Parens $2)) [mop $1,mcp $3] }