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

2023-12-30

我正在尝试解析由二元运算符组成的表达式+, 一元运算符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),
]

Running

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

给出了我所期望的

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

但是,如果没有括号

expression.parseString('a + not b')

我只得到第一个令牌:

['a']

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

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


In S3 NOT is higher that AND:

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

(from S3 亚马逊网站 https://docs.aws.amazon.com/AmazonS3/latest/dev/s3-glacier-select-sql-reference-operators.html).

在那张桌子上NOT is above AND.

所以你的代码应该是:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解析具有二元和一元运算符、保留字且不带括号的表达式 的相关文章

随机推荐