解析包含二元和一元运算符、保留字且不带括号的表达式
Parse expression with binary and unary operators, reserved words, and without parentheses
我正在尝试解析由二元运算符 +
、一元运算符 not
和标识符组成的表达式,标识符可以是任何非 not
[= 的字母字符串18=]
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),
]
运行
expression.parseString('a + (not b)')
符合我的预期
[['a', '+', ['not', 'b']]]
但是,没有括号
expression.parseString('a + not b')
我只得到第一个令牌:
['a']
如何定义语言以在没有括号的情况下正常工作?
(在实际情况下有更多的运算符和保留字:这是向解析 S3 Select 语言迈出的一步)
在 S3 中 NOT
比 AND
:
更高
Operator Precedence
The following table shows the operators' precedence in decreasing order.
(来自 S3 amazon site)。
因为 table NOT
是 以上 AND
.
所以你的代码应该是:
identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
(CaselessKeyword('not'), 1, opAssoc.RIGHT),
('+', 2, opAssoc.LEFT),
])
BTW - 如果“NOT
被列为低于二进制 +
”,则 a + not b
不是有效表达式。 +
需要两个运算符:一个是 a
,但 not b
不是有效的操作数。
BTW2(来自评论):
请不要在同一个表达式中混用算术运算符 +
和逻辑运算符 NOT
。 1 + not 2
不是有效的表达式。
每种语言都决定如何解析这些奇怪的表达式。
我正在尝试解析由二元运算符 +
、一元运算符 not
和标识符组成的表达式,标识符可以是任何非 not
[= 的字母字符串18=]
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),
]
运行
expression.parseString('a + (not b)')
符合我的预期
[['a', '+', ['not', 'b']]]
但是,没有括号
expression.parseString('a + not b')
我只得到第一个令牌:
['a']
如何定义语言以在没有括号的情况下正常工作?
(在实际情况下有更多的运算符和保留字:这是向解析 S3 Select 语言迈出的一步)
在 S3 中 NOT
比 AND
:
Operator Precedence The following table shows the operators' precedence in decreasing order.
(来自 S3 amazon site)。
因为 table NOT
是 以上 AND
.
所以你的代码应该是:
identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
(CaselessKeyword('not'), 1, opAssoc.RIGHT),
('+', 2, opAssoc.LEFT),
])
BTW - 如果“NOT
被列为低于二进制 +
”,则 a + not b
不是有效表达式。 +
需要两个运算符:一个是 a
,但 not b
不是有效的操作数。
BTW2(来自评论):
请不要在同一个表达式中混用算术运算符 +
和逻辑运算符 NOT
。 1 + not 2
不是有效的表达式。
每种语言都决定如何解析这些奇怪的表达式。