在我们的项目中,我们手动从表达式中消除了左递归。这通过以下方式工作:
我们创建了一种通用形式的表达式,由术语解析器参数化:
expressionGen :: MParser (Expr LocInfo) -> MParser (Expr LocInfo)
expressionGen term = buildExpressionParser precedenceTable term <?> "expression"
where precedenceTable = -- unary, binary expressions
我们有一个普通的术语解析器,以及一个没有递归规则的术语解析器。有了它,我们可以解析(多个)下标运算符:
term :: MParser (Expr LocInfo)
term = do indBase <- termNoArray
indexes <- many $ (brackets expression >>= return)
return -- semantics
<?> "term"
termNoArray :: MParser (Expr LocInfo)
termNoArray = -- normal terms
最后,我们有一个最顶层的表达式解析器:expression = expressionGen term