2017-08-27 18 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

我最初的想法是“回复”一个致命错误,在这种情况下,解析器一旦运行就会返回失败。使用你建议的策略,我确实可以构建一个特殊的数据结构,它包含一个有效的节点或一个错误。看起来很合理:我会尽快尝试 –