Mic*_*mza 5 python parsing pyparsing amazon-s3-select
我正在尝试解析由二元运算符+
、一元运算符not
和标识符组成的表达式,这些标识符可以是任何非字母字符串not
from pyparsing import (
CaselessKeyword,
Combine,
Word,
alphas,
opAssoc,
infixNotation,
)
identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
('+', 2, opAssoc.LEFT),
(CaselessKeyword('not'), 1, opAssoc.RIGHT),
]
Run Code Online (Sandbox Code Playgroud)
跑步
expression.parseString('a + (not b)')
Run Code Online (Sandbox Code Playgroud)
给出了我的期望
[['a', '+', ['not', 'b']]]
Run Code Online (Sandbox Code Playgroud)
但是,没有括号
expression.parseString('a + not b')
Run Code Online (Sandbox Code Playgroud)
我只得到第一个令牌:
['a']
Run Code Online (Sandbox Code Playgroud)
我如何定义语言以在没有括号的情况下按照我的意愿工作?
(在实际情况中,有更多的运算符和保留字:这是解析 S3 Select 语言的一步)
在S3中NOT
是更高的是AND
:
运算符优先级 下表按降序显示运算符的优先级。
(来自S3 亚马逊网站)。
在该表NOT
是上面 AND
。
所以你的代码应该是:
identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
(CaselessKeyword('not'), 1, opAssoc.RIGHT),
('+', 2, opAssoc.LEFT),
])
Run Code Online (Sandbox Code Playgroud)
顺便说一句 - 如果“NOT
被列为低于二进制+
”,a + not b
则不是有效的表达式。+
需要两个运算符:一个是a
,但not b
不是有效的操作数。
BTW2(来自评论):请不要在同一个表达式中混用+
哪个是算术运算符,NOT
哪个是逻辑运算符。1 + not 2
不是有效的表达式。每种语言都决定如何解析这种奇怪的表达式。