- 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/
前缀表达式 前缀表达式又称波兰式,前缀表达式的运算符位于操作数之前。 例如: ( 3 + 4 ) × 5 − 6 (3+4)×5-6(3+4)×5−6 对应的前缀表达式就是 - × + 3 4 5 6
众所周知: ((.).(.)) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c 我可以像这样使用这个复合运算符前缀样式: ((.).(.)) f g 但看起
换句话说,我可以使用什么语法(如果有)来代替 XXX在过滤器的以下实现中: filter' :: (a -> Bool) -> [a] -> [a] filter' _ [] = [] fil
在 R 中,每当两个包定义相同的函数时,很容易指定使用哪个包 pkg::foo .但是当冲突的函数是中缀运算符时你怎么办,即使用 %% 定义? 例如,ggplot2和 crayon定义 %+% .有没
关于代码的简短介绍:我必须创建一个类来计算前缀、后缀或中缀表达式。它必须判断是否是pre/post/infix并将其转换为后缀,例如从'/x7'转换的代码中的prefixTOpostfix()(其他已
前缀表达式(波兰表达式) 前缀表达式又称波兰表达式,前缀表达式的运算符位于操作符之前,如(3+4)*5-6对应的前缀表达式就是- * + 3 4 5 6 前缀表达式的计算机求
我需要使用 VBA 对数学表达式进行标记。我有一个可行的解决方案,但正在寻找一种更有效的方法(可能是 RegExp)。 我当前的解决方案: Function TokeniseTheString(str
我正在编写一个包含如下函数的包: "%IN%" 0 当我 Build & Reload 包时(我使用 RStudio),这个函数不可用,与包中定义的所有其他函数相反。 我如何使它工作? 最佳答案 解
我一直在用 Java 开发表达式求值器,出于沮丧,我也来这里询问。到目前为止,我至少重写了 15 次,但每次都无济于事。 基本上我需要在前缀、中缀或后缀中获取一个字符串并将其计算为整数。该表达式可以使
C++ 中的运算符通常被认为是函数/方法的替代语法,尤其是在重载的上下文中。如果是这样,下面的两个表达式应该是同义词: std::cout & __out, char __c) operator& _
我是一名优秀的程序员,十分优秀!