In our project, we manually removed left recursion from the expressions. This works as follows:
We have created a general expression form, which is parameterized by the term parser:
expressionGen :: MParser (Expr LocInfo) -> MParser (Expr LocInfo) expressionGen term = buildExpressionParser precedenceTable term <?> "expression" where precedenceTable = -- unary, binary expressions
We have a normal parser, and the parser has no recursive rules. At the same time, we can analyze (several) indices:
term :: MParser (Expr LocInfo) term = do indBase <- termNoArray indexes <- many $ (brackets expression >>= return) return -- semantics <?> "term" termNoArray :: MParser (Expr LocInfo) termNoArray = -- normal terms
Finally, we have the topmost parser for expressions: expression = expressionGen term
source share