2013-06-25 23 views
4

我在Parsec中编写解析器。像E - > E + E这样的左递归生成不能在LL语法分析器中轻松编写,所以Parsec提供了buildExpressionParser,它支持中缀,后缀和前缀运算符。但是下标操作符呢?如何在Parsec中实现下标运算符?

E - > E [E]如何实施? 如果我可以在不消耗第二个表达式的情况下使用右括号,那么我可以用buildExpressionParser的Infix表条目来模拟它。思考?

编辑:我知道有一个左递归消除算法很可能适用于我的语法。我正在寻找一些简单或抽象的(如buildExpressionParser)。否则我只会用Happy。

+1

我会建议不要使用为此高兴或基本上任何理由。快乐回避了Haskell的抽象力。 – luqui

+0

只要用'buildExpressionParser'作为'Postfix'。 – luqui

+0

postfix如何帮助?与我可以匹配右括号,但没有办法匹配开幕... – BruceBerry

回答

1

在我们的项目中,我们手动从表达式中消除了左递归。这种工作方式如下:

我们创建的表达式的一般形式,即由项解析器参数:

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