- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试解析 SQL 搜索条件,但无法让解析器将逻辑(AND
、OR
)与其他中缀运算符区分开来。我将它们解析为不同的节点(也许这很难做到),但简化了评估阶段。这是相关的代码片段(如有必要,我可以包含更多)。
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是要点。
最佳答案
我认为最终您会发现您需要将 and
和 or
视为具有优先规则的中缀运算符,因为这正是它们的本质,也是大多数原因包括 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/
我是一名优秀的程序员,十分优秀!