gpt4 book ai didi

sql - 将逻辑运算符与其他中缀运算符区分开来

转载 作者:行者123 更新时间:2023-12-04 21:22:46 24 4
gpt4 key购买 nike

我正在尝试解析 SQL 搜索条件,但无法让解析器将逻辑(ANDOR)与其他中缀运算符区分开来。我将它们解析为不同的节点(也许这很难做到),但简化了评估阶段。这是相关的代码片段(如有必要,我可以包含更多)。

let opp = OperatorPrecedenceParser<_,_,_>()
let scalarExpr = opp.ExpressionParser
opp.TermParser <- constant <|> id <|> between lparen rparen scalarExpr <|> scalarExpr

//infix operators added here

let comparison = //(e.g., 1 < 2)
let compareExpr = pipe3 scalarExpr compareOp scalarExpr (fun l op r -> Comparison(op, l, r))
between lparen rparen compareExpr <|> compareExpr

let andTerm = pstringCI "and" .>> ws
let orTerm = pstringCI "or" .>> ws

let searchCondition, searchConditionRef = createParserForwardedToRef()
searchConditionRef :=
[ comparison
pipe3 searchCondition andTerm searchCondition (fun l _ r -> And(l, r))
pipe3 searchCondition orTerm searchCondition (fun l _ r -> Or(l, r))
between lparen rparen searchCondition ]
|> choice

let filter : Parser<_,unit> = ws >>. searchCondition .>> eof

"1 = 1" 正确解析为 Comparison (Eq,Constant (Int32 1),Constant (Int32 1))

但是一旦我尝试使用逻辑运算符加入两个比较,例如 "1 = 1 or 2 = 2",它就无法解析

Error in Ln: 1 Col: 7
1 = 1 or 2 = 2
         ^
Expecting: end of input or infix operator
: 7

我希望它在错误之前将 1 解析为标量表达式,并在遇到 回溯时意识到它不是中缀运算符,返回 1 作为完整的标量,并识别它正在解析由逻辑运算符 or 连接的条件的左侧。

相反,它似乎继续假设 1 开始一个更复杂的标量表达式,可能涉及中缀运算符。

是代码有问题,还是将AND/OR解析为中缀运算符的解决方案(使用相同的OperatorPrecedenceParser) ?我不想走那条路,所以我希望我在某个地方犯了一个简单的错误。

complete code是要点。

最佳答案

我认为最终您会发现您需要将 andor 视为具有优先规则的中缀运算符,因为这正是它们的本质,也是大多数原因包括 fparsec 和 fsyacc 在内的解析器具有处理它们的特殊功能(即通过优先级和关联性规则解决歧义)。

您已经找到一个突出显示这一点的案例,但请考虑另一个案例:

1 = 1 or 2 = 2 and 3 =3

应该解析为 (1 = 1 or 2 = 2) and 3 = 3 还是 1 = 1 or (2 = 2 and 3 = 3)

关于sql - 将逻辑运算符与其他中缀运算符区分开来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9215975/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com