5

私はParsecでパーサーを書いています。E -> E + E のような左再帰生成は LL パーサーでは簡単に記述できないため、Parsec はbuildExpressionParser、中置演算子、後置演算子、および前置演算子をサポートする を提供します。しかし、添え字演算子はどうでしょうか?

E -> E [E] はどのように実装されますか? 2 番目の式を使用せずに閉じ括弧を使用できれば、 の Infix テーブル エントリでそれをエミュレートできますbuildExpressionParser。考え?

編集:私の文法で最もうまくいく可能性が高い左再帰除去のアルゴリズムがあることを知っています。簡単なもの、またはよく抽象化されたもの ( などbuildExpressionParser) を探しています。それ以外の場合は、Happy を使用します。

4

2 に答える 2

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

于 2013-07-28T18:24:41.790 に答える