提问人:lamg 提问时间:9/19/2023 更新时间:9/19/2023 访问量:16
如何使用 FParsec 解析 SQL 运算符
How to parse SQL operators using FParsec
问:
我正在解析 SQL 表达式,并且一直在看这个例子。到目前为止,我专注于布尔运算符,如 、 、 和 。前四个似乎很容易实现,但是我不确定该怎么做:AND
OR
NOT
IN
NOT IN
NOT IN
type BinaryExpr = {left: SqlExpr; right: SqlExpr}
and SqlExpr =
And of BinaryExpr
| Or of BinaryExpr
| Not of SqlExpr
| In of BinaryExpr
| NotIn of BinaryExpr
| Identifier of string
let parser =
let opp = OperatorPrecedenceParser<SqlExpr, unit, unit>()
let ws = spaces
let ws1 = nextCharSatisfiesNot isLetter >>. ws
let expr = opp.ExpressionParser
opp.TermParser <- identifier <|> expr
let buildAnd x y = And { left = x; right = y }
let buildOr x y = Or { left = x; right = y }
let buildIn x y = In { left = x; right = y }
let buildNotIn x y = NotIn { left = x; right = y }
opp.AddOperator(InfixOperator("OR", ws1, 1, Associativity.Left, buildOr))
opp.AddOperator(InfixOperator("AND", ws1, 2, Associativity.Left, buildAnd))
opp.AddOperator(PrefixOperator("NOT", ws1, 3, false, Not))
opp.AddOperator(InfixOperator("IN", ws1, 4, Associativity.None, buildIn))
opp.AddOperator(InfixOperator("NOT IN", ws1, 4, Associativity.None, buildNotIn))
ws >>. expr .>> eof
我想要的是:
- 处理“NOT”和“IN”之间的多个空格
- 将“NOT IN”解析为二进制运算符
目前我在第一点上失败了。
我假设它在语义上是一个二元运算符,因此我创建了类型变体。NOT IN
NotIn
答: 暂无答案
评论