私は最初のパーサーをコーディングしています。それはF#であり、FParsecで使用しています。FParsec括弧付きの解析式
私のパーサが正しいtrue and false
、(true and false or true)
、true
、(((true and false or true)))
など、のようなものを解析します。
ただし、(true and false) or true
のような場合は解析されません。テキストの途中にかっこがあると失敗します。
どうすれば解決できますか?
サンプルコード:
let private infixOperator (opp: OperatorPrecedenceParser<_,_,_>) op prec map =
opp.AddOperator(InfixOperator (op, ws, prec, Associativity.Left, map))
let private oppLogic = new OperatorPrecedenceParser<_,_,_>()
infixOperator oppLogic "is" 1 (fun x y -> Comparison (x, Equal, y))
infixOperator oppLogic "isnt" 1 (fun x y -> Comparison (x, NotEqual, y))
infixOperator oppLogic "or" 2 (fun x y -> Logic (x, Or, y))
infixOperator oppLogic "and" 3 (fun x y -> Logic (x, And, y))
let private exprParserLogic = oppLogic.ExpressionParser
let private betweenParentheses p =
between (str "(") (str ")") p
oppLogic.TermParser <- choice [
betweenParentheses exprParserLogic
pboolean
]
let pexpression =
choice [
attempt <| betweenParentheses exprParserLogic
exprParserLogic
]
let private pline =
ws
>>. pexpression
.>> eof
あなたはうってつけです。 – Gabriel