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