Im new to Parsers и у меня проблема с моим парсером, особенно когда я называю себя, чтобы анализировать тело функции.Python Parser Recursion Infinite Reference
Когда он находит другую функцию, просто стал сумасшедшим и грязным.
В основном, при анализе этого кода
fn test (a, b, c):
fn test2 (c, b, a):
print("Hello world")
end
end
Он начинает указывать объект сам по себе, а не подфункции:
>>> print(ast[0].value.body[9])
<ast.VariableAST object at 0x7f6285540710>
>>> print(ast[0].value.body[9].value.body[9])
<ast.VariableAST object at 0x7f6285540710>
Это основной код парсера:
# Parser Loop
def Parser(tokenList):
global tokens
global size
tokens = tokenList
size = len(tokens)
ast = []
while i < size:
ast.append(MainParser())
return ast
# The Main Parser
def MainParser():
global i
if tokens[i] == 'fn':
i += 1
node = FunctionParser()
else:
node = tokens[i]
i += 1
return node
# Parse a function
def FunctionParser():
global i
checkEnd("function")
if tokens[i][0].isalpha():
node = VariableAST()
node.name = tokens[i]
i += 1
node.value = FunctionBodyParser()
elif tokens[i] == '(':
node = FunctionBodyParser()
else:
syntaxError("Expecting '(' or function name")
return node
# Parse a function body
def FunctionBodyParser():
global i
i += 1
node = FunctionAST()
while True:
checkEnd("function")
if tokens[i][0].isalpha():
node.args.append(tokens[i])
i += 1
elif tokens[i] == ',':
i += 1
elif tokens[i] == ')':
break
else:
syntaxError("Expecting ')' or ',' in function declaration")
i += 1
checkEnd("function")
if tokens[i] != ':' and tokens[i] != '{':
syntaxError("Expecting '{' or ':'")
begin = tokens[i]
while True:
checkEnd("function")
if begin == ':' and tokens[i] == 'end':
break
elif begin == '{' and tokens[i] == '}':
break
else:
node.body.append(MainParser())
i += 1
return node
Редактировать: Я забыл упомянуть, что это прототип для версии C. Im избегая вещей, связанных с ориентацией объектов и некоторыми хорошими pratices в python, чтобы упростить перенос кода на C позже.
Прежде чем идти дальше, и независимо от того, собираетесь ли вы использовать библиотеку синтаксического анализа или писать с нуля, напишите BNF языка, который вы планируете анализировать. Создайте серию тестовых примеров от очень простых до сложных и убедитесь, что BNF описывает их правильно. Это будет служить дорожной картой при реализации вашего синтаксического анализатора и поможет вам узнать, когда вы закончите (или, по крайней мере, готовы к дальнейшему расширению языка). – PaulMcG