【发布时间】:2013-05-22 14:21:16
【问题描述】:
我正在尝试使用 PyParsing 在 Python 中解析类似 CLIPS 的语法。
我遇到问题的代码是:
import pyparsing as pp
...some pyparsing tokens definitions...
INTEGER_EXPRESSION = EXPRESSION
RULE_NAME = SYMBOL
RULE_PROPERTY = OB + pp.Literal('salience') + INTEGER_EXPRESSION + CB
DECLARATION = OB + pp.Literal('declare') + pp.OneOrMore(RULE_PROPERTY) + CB
ACTION = EXPRESSION
CONNECTED_CONSTRAINT = pp.Forward()
TERM = CONSTANT | SINGLEFIELD_VARIABLE | MULTIFIELD_VARIABLE | pp.Literal(':') + FUNCTION_CALL | pp.Literal('=') + FUNCTION_CALL
SINGLE_CONSTRAINT = TERM | pp.Literal('~') + TERM
CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | SINGLE_CONSTRAINT + pp.Literal('&') + CONNECTED_CONSTRAINT
CONSTRAINT = pp.Literal('?') | pp.Literal('$?') | CONNECTED_CONSTRAINT
ORDERED_PATTERN_CE = OB + SYMBOL + pp.ZeroOrMore(CONSTRAINT) + CB
PATTERN_CE = ORDERED_PATTERN_CE
CONDITIONAL_ELEMENT = PATTERN_CE
DEFRULE_CONSTRUCT = OB + pp.Literal('defrule') + RULE_NAME + pp.Optional(COMMENT) + pp.Optional(DECLARATION) + pp.ZeroOrMore(CONDITIONAL_ELEMENT) + pp.Literal('=>') + pp.ZeroOrMore(ACTION) + CB
语法的某些部分的定义因为太长而省略了。
问题是解释器给了我这个奇怪的错误:
语法警告:无法将类型元素与 ParserElement 组合 CONNECTED_CONSTRAINT
我注意到,如果我写:
CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT
代替:
CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | SINGLE_CONSTRAINT + pp.Literal('&') + CONNECTED_CONSTRAINT
它可以正常工作。
但是,即使我这样写:
CONNECTED_CONSTRAINT << SINGLE_CONSTRAINT | pp.Literal('test')
它不起作用。
所以我认为问题在于有一个由“|”给出的 OR符号,在用 pp.Forward() 声明的标记中。
你能帮帮我吗?
谢谢。
【问题讨论】:
-
问题解决了!这里有解释:pythonhosted.org/pyparsing/…
标签: python recursion grammar pyparsing