2017-08-27 5 views
3

FParsecのOperatorPrecedenceParserを使用して、特にマッピングフェーズでオペレータを解析する際に、エラーを生成する必要があります。次のコードがあるとします:FParsecのOperatorPrecedenceParserでエラーを生成する

let pOperatorExpr : ExpressionParser = 
    let opp = new OperatorPrecedenceParser<MyType, unit, unit>() 
    let arithmeticOperator a b -> 
     if someOperation a b then 
      // Fatal error! Abort! 
     else foobar a b 

    opp.AddOperator(InfixOperator("+", spaces, 1, Associativity.Left, arithmeticOperator) 
    opp.ExpressionParser 

その特定の位置でエラーを生成するにはどうすればよいですか?

答えて

2

オペレータのマッピング機能でエラーをトリガする直接的なサポートはありません。

OPP referenceの「文字列解析後のその他の用途」のセクションでは、バイナリ演算子の正確なテキスト位置を取得する方法の例を見つけることができます。タームパーサに結果の値にテキストの位置を含めることもできます。場所を取得したら、ASTに「エラーノード」を作成し、後で手動でエラーを生成することができます。

+0

この戦略の問題点は、既存のアーキテクチャーにうまく統合できないということです。私の計画は、解析時にエラーが検出された場合にASTを構築することではありませんが、オペレータの_both_私はマッピングフェーズでエラーを生成することはできません... –

+1

エラーが検出されたときに正確に何をしたいですか?すべての解析を取り消したい場合は、例外を使用することができます。バックトラッキングを許可する場合は、エラーASTノードを作成し、そのようなエラーノードを式パーサでチェックし、必要に応じて適切なFParsecエラーを生成します(エラーノードが最終的なASTに終わらないようにする)。 –

+0

私の元のアイデアは致命的なエラーに "返信"するだけでした。この場合、一度実行されたパーサーは失敗を返してしまいました。あなたが示唆している方法を使用して、私は確かに有効なノードまたはエラーを含むアドホックなデータ構造を構築することができます。合理的だと思う:私はできるだけ早くそれを試してみる –

関連する問題