解析包含二元和一元运算符、保留字且不带括号的表达式

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 中 NOTAND:

更高

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(来自评论): 请不要在同一个表达式中混用算术运算符 + 和逻辑运算符 NOT1 + not 2 不是有效的表达式。 每种语言都决定如何解析这些奇怪的表达式。