【发布时间】:2020-11-06 05:25:09
【问题描述】:
在浏览了该站点的几个 pyparsing 示例和帖子之后,我设法编写了代码,可以完全按照我想要的方式解析表达式。但现在我对如何评估它感到困惑,因此在这里寻求您的帮助。
所以当我给出这个字符串时:“(Number(3) > Number(5)) AND (Time(IST) [[[['Number', [3]], '>', ['Number', [5]]], 'AND', [['Time', ['IST']], '
Number 是一个自定义函数,它接受 int 输入并返回 int。 Time 是一个自定义函数,它接受字符串输入并以 int 形式返回当前系统时间。 像这样,我将有许多自定义函数,它们将接受一些输入和返回值。
那么有人可以帮我评估解析后的输出,所以最后我应该得到一个 True 或 False 作为最终结果吗?
这是我的 python 脚本的副本:
from pyparsing import (
CaselessKeyword,Suppress,Word,alphas,alphanums,nums,Optional,Group,oneOf,Forward,infixNotation,
opAssoc,dblQuotedString,delimitedList,Combine,Literal,QuotedString,ParserElement,Keyword,
OneOrMore,pyparsing_common as ppc,
)
ParserElement.enablePackrat()
LPAR, RPAR = map(Suppress, "()")
expr = Forward()
alps = Word(alphas, alphanums)
def stat_function(name):
return (
Group(CaselessKeyword(name) + Group(LPAR + delimitedList(expr) + RPAR)) |
Group(CaselessKeyword(name) + Group(LPAR + delimitedList(alps) + RPAR))
)
timeFunc = stat_function("Time")
dateFunc = stat_function("Date")
numFunc = stat_function("Number")
funcCall = timeFunc | dateFunc | numFunc
Compop = oneOf("< = > >= <= != <>")
multOp = oneOf("* /")
addOp = oneOf("+ -")
logicalOp = oneOf("and or AND OR")
numericLiteral = ppc.number
operand = numericLiteral | funcCall | alps
arithExpr = infixNotation(
operand, [(multOp, 2, opAssoc.LEFT),
(addOp, 2, opAssoc.LEFT),
(Compop, 2, opAssoc.LEFT),
(logicalOp, 2, opAssoc.LEFT),
]
)
expr <<= arithExpr
s1 = "(Number(3) > Number(5)) AND (Time(IST) < Number(1030))"
result = expr.parseString(s1)
print(result)
【问题讨论】: