5

我正在尝试解析由二元运算符+、一元运算符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),
]

跑步

expression.parseString('a + (not b)')

给出了我的期望

[['a', '+', ['not', 'b']]]

但是,如果没有括号

expression.parseString('a + not b')

我只得到第一个令牌:

['a']

如何在没有括号的情况下定义语言以按照我的意愿工作?

(实际情况下有更多的运算符和保留字:这是向解析 S3 Select 语言迈出的一步)

4

1 回答 1

5

在S3NOT高于AND

运算符优先级 下表按降序显示运算符的优先级。

(来自S3 亚马逊网站)。

NOT上面 那个表AND

所以你的代码应该是:

identifier = Combine(~CaselessKeyword('not') + Word(alphas))
expression = infixNotation(identifier, [
    (CaselessKeyword('not'), 1, opAssoc.RIGHT),
    ('+', 2, opAssoc.LEFT),
])

顺便说一句 - 如果“NOT被列为低于二进制+”,a + not b则不是有效的表达式。+需要两个运算符:一个是a,但not b不是有效的操作数。

BTW2(来自评论):请不要在同一个表达式中混合+哪个是算术运算符和NOT哪个是逻辑运算符。1 + not 2不是一个有效的表达式。每种语言都决定如何解析这些奇怪的表达式。

于 2020-08-31T08:00:24.790 回答