2017-08-27 21 views
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 

我應該怎麼做才能在該特定位置生成錯誤?

回答

2

在運營商的映射功能中沒有直接支持觸發錯誤的情況。

OPP reference的「更多使用後字符串分析器」部分中,您可以找到一個示例,瞭解如何獲取二元運算符的精確文本位置。您也可以讓您的詞語解析器在其結果值中包含文本位置。一旦你有了位置,你可以在你的AST中構建一個「錯誤節點」,然後手動生成一個錯誤。

+0

這個策略的問題是,它並沒有很好地融入到我現有的體系結構中:如果在分析時檢測到錯誤,我的計劃是不建立AST,但錯誤只能在操作符_both_之後檢測到雙方進行解析,然後檢查,並在其中檢查:我無法在映射階段生成錯誤... –

+1

檢測到錯誤時,您希望發生什麼?如果你想取消所有的解析,你可以使用一個異常。如果你想允許回溯,你可以創建一個錯誤的AST節點,然後讓你的表達式解析器檢查這樣一個錯誤節點,並在必要時生成一個合適的FParsec錯誤(這樣錯誤節點就不會在最終的AST中結束)。 –

+0

我最初的想法是「回覆」一個致命錯誤,在這種情況下,解析器一旦運行就會返回失敗。使用你建議的策略,我確實可以構建一個特殊的數據結構,它包含一個有效的節點或一個錯誤。看起來很合理:我會盡快嘗試 –