3
我需要在使用FParsec的OperatorPrecedenceParsers解析運算符時產生錯誤,特別是在映射階段。假設我有以下代碼:在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中結束)。 –
我最初的想法是「回覆」一個致命錯誤,在這種情況下,解析器一旦運行就會返回失敗。使用你建議的策略,我確實可以構建一個特殊的數據結構,它包含一個有效的節點或一個錯誤。看起來很合理:我會盡快嘗試 –