在 FParsec 的 OperatorPrecedenceParser 中生成错误
Generating errors in FParsec's OperatorPrecedenceParser
我需要在使用 FParsec 的 OperatorPrecedenceParsers 解析运算符时产生错误,特别是在映射阶段。假设我有以下代码:
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
我应该怎么做才能在那个特定位置产生错误?
运算符的映射函数不直接支持触发错误。
在 OPP reference 的 "More uses of the after‐string‐parser" 部分中,您可以找到有关如何获取二进制运算符的精确文本位置的示例。您还可以让您的术语解析器在其结果值中包含文本位置。一旦你有了这些位置,你就可以在你的 AST 中构建一个 "error node",然后稍后手动生成一个错误。
我需要在使用 FParsec 的 OperatorPrecedenceParsers 解析运算符时产生错误,特别是在映射阶段。假设我有以下代码:
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
我应该怎么做才能在那个特定位置产生错误?
运算符的映射函数不直接支持触发错误。
在 OPP reference 的 "More uses of the after‐string‐parser" 部分中,您可以找到有关如何获取二进制运算符的精确文本位置的示例。您还可以让您的术语解析器在其结果值中包含文本位置。一旦你有了这些位置,你就可以在你的 AST 中构建一个 "error node",然后稍后手动生成一个错误。