Нет необходимости определять parenthetic
, infixNotation
делает это за вас. И если вы pyp.Group
ваше predicate
выражение, то символ и его аргументы будут сгруппированы для вас. У 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]:
.