В настоящее время я использую Python 3 для разбора языка программирования, который я делаю.Мне интересно, как я могу сделать цикл правила синтаксического анализа.
Это может быть неясно, поэтому вот пример.
У меня есть код:
def c_parse():
def p_program(p):
"program : actions"
p[0] = ("PROGRAM", p[1])
def p_actions(p):
"""actions : action
| actions action"""
if len(p) == 3:
p[0] = ("ACTIONS", p[1], p[2])
elif len(p) == 2:
p[0] = ("ACTION", p[1])
def p_action(p):
"""action : function_call ';'
| variable_dec ';'
| if_statement ';'"""
p[0] = ("ACTION_STATEMENT", p[1])
...
Учитываявход:
x = "HELLO WORLD";
print(x);
print(x);
Это выводит этот AST:
('PROGRAM', ('ACTIONS', ('ACTIONS', ('ACTION', ('ACTION_STATEMENT',
('VARIABLE_DEC', ... ))),
('ACTION_STATEMENT', ('FUNCTION_CALL', ... ))), ('ACTION_STATEMENT',
('FUNCTION_CALL', ... ))))
Обратите внимание, что ACTIONS и ACTION_STATEMENT очень грязные.Это происходит из-за рекурсивного правила, определенного в функции p_actions ().Есть ли способ, где я мог бы просто получить хороший и чистый AST, как это:
(PROGRAM, (ACTION, (VARIABLE_DEC, ... )), (ACTION, (FUNCTION_CALL, ... )),
(ACTION, (FUNCTION_CALL, ...)))
Другими словами, могу ли я сделать так, чтобы функция p_actions () могла анализировать бесконечное количество узлов ACTION, не используярекурсии?Это возможно?
Кстати, я на macOS, если это имеет значение.