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
その特定の位置でエラーを生成するにはどうすればよいですか?
この戦略の問題点は、既存のアーキテクチャーにうまく統合できないということです。私の計画は、解析時にエラーが検出された場合にASTを構築することではありませんが、オペレータの_both_私はマッピングフェーズでエラーを生成することはできません... –
エラーが検出されたときに正確に何をしたいですか?すべての解析を取り消したい場合は、例外を使用することができます。バックトラッキングを許可する場合は、エラーASTノードを作成し、そのようなエラーノードを式パーサでチェックし、必要に応じて適切なFParsecエラーを生成します(エラーノードが最終的なASTに終わらないようにする)。 –
私の元のアイデアは致命的なエラーに "返信"するだけでした。この場合、一度実行されたパーサーは失敗を返してしまいました。あなたが示唆している方法を使用して、私は確かに有効なノードまたはエラーを含むアドホックなデータ構造を構築することができます。合理的だと思う:私はできるだけ早くそれを試してみる –