gpt4 book ai didi

python - pyparsing 中调试中缀语法的问题

转载 作者:行者123 更新时间:2023-12-01 08:45:22 25 4
gpt4 key购买 nike

我编写此脚本是为了使用类似于序言的语法来解析语句,将连接词视为具有优先级的运算符:

import pyparsing as pyp

alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet = alphabet + alphabet.upper()

symbol = pyp.Word(alphabet)

predicate = symbol + "(" + pyp.ZeroOrMore(symbol + ",") + symbol + ")"

parenthetic = pyp.Forward()

pyp_formula = pyp.infixNotation((predicate | parenthetic),
[
(pyp.oneOf('~'), 1, pyp.opAssoc.RIGHT),
(pyp.oneOf(','), 2, pyp.opAssoc.LEFT),
(pyp.oneOf(';'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('::'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('->'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf(':-'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('--'), 1, pyp.opAssoc.LEFT),
(pyp.oneOf('.'), 1, pyp.opAssoc.LEFT),
])

parenthetic << "(" + pyp_formula + ")"

当我运行时

parse = pyp_formula.parseString('d(A, D), e(D) :- f(A), g(D); h(D).')

parse_list = formula_parse.asList()

print(parse_list)

我发现“d(A, D), e(D)”甚至没有被分成两个谓词,而“f(A), g(D); h(D)”被视为单个终端在非终端内。

[[[['d', '(', 'A', ',', 'D', ')', ',', 'e', '(', 'D', ')'],
':-', [['f', '(', 'A', ')', ',', 'g', '(', 'D', ')'],
';', 'h', '(', 'D', ')']], '.']]

我尝试了几种替代方法,但似乎无法获得正确的解析。

欢迎任何帮助!

最佳答案

无需定义括号infixNotation 会为您完成此操作。如果您pyp.Group您的谓词表达式,那么符号和符号参数将为您分组。 pyparsing 还具有 delimitedList 帮助器作为 expr, expr, expr 的快捷方式:使用 pyp.delimitedList(expr)。默认分隔符是“,”,但您可以定义其他分隔符。最后,对于这么长的运算符列表,您可能会遇到任何重要解析的性能问题 - 添加对 ParserElement.enablePackrat() 的调用以打开内部解析缓存。

以下是经过这些更改后您的代码的外观:

import pyparsing as pyp
pyp.ParserElement.enablePackrat()

alphabet = "abcdefghijklmnopqrstuvwxyz"
alphabet = alphabet + alphabet.upper()

symbol = pyp.Word(alphabet)

predicate = pyp.Group(symbol + "(" + pyp.delimitedList(symbol) + ")")

pyp_formula = pyp.infixNotation(predicate,
[
(pyp.oneOf('~'), 1, pyp.opAssoc.RIGHT),
(pyp.oneOf(','), 2, pyp.opAssoc.LEFT),
(pyp.oneOf(';'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('::'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('->'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf(':-'), 2, pyp.opAssoc.LEFT),
(pyp.oneOf('--'), 1, pyp.opAssoc.LEFT),
(pyp.oneOf('.'), 1, pyp.opAssoc.LEFT),
])

pyp_formula.runTests(
'''
d(A, D) -> h(D).
d(A, D), e(D) :- f(A), g(D); h(D).
'''
)

结果:

d(A, D) -> h(D).
[[[['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']], '.']]
[0]:
[[['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']], '.']
[0]:
[['d', '(', 'A', 'D', ')'], '->', ['h', '(', 'D', ')']]
[0]:
['d', '(', 'A', 'D', ')']
[1]:
->
[2]:
['h', '(', 'D', ')']
[1]:
.


d(A, D), e(D) :- f(A), g(D); h(D).
[[[[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]], '.']]
[0]:
[[[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]], '.']
[0]:
[[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']], ':-', [[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]]
[0]:
[['d', '(', 'A', 'D', ')'], ',', ['e', '(', 'D', ')']]
[0]:
['d', '(', 'A', 'D', ')']
[1]:
,
[2]:
['e', '(', 'D', ')']
[1]:
:-
[2]:
[[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']], ';', ['h', '(', 'D', ')']]
[0]:
[['f', '(', 'A', ')'], ',', ['g', '(', 'D', ')']]
[0]:
['f', '(', 'A', ')']
[1]:
,
[2]:
['g', '(', 'D', ')']
[1]:
;
[2]:
['h', '(', 'D', ')']
[1]:
.

关于python - pyparsing 中调试中缀语法的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53328371/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com