Как парсить код, разделенный на токены? Я пишу свой язык программирования, и дошёл до момента, когда нужно писать парсер. я пробовал разные способы, гуглил, но ничего не вышло. Каждый токен - список: ['type', 'value'] Пример желаемой работы(токены упрощены и написаны только их значения):tns = [(, 5, +, 5, *, 5, ), /, 10] print(Parser.parse(tns)) Желаемый вывод:[[+, 5], [*, 5], [+, 5], [/, 10]] Был бы очень благодарен за ответ!
Для парсинга кода, разделенного на токены, можно воспользоваться алгоритмом с обратной польской записью (Reverse Polish Notation, RPN) или использовать метод рекурсивного спуска (recursive descent).
В вашем случае, когда каждый токен представлен списком ['type', 'value'], вы можете написать парсер следующим образом:
class Parser: @staticmethod def parse(tns): stack = [] operators = set(['+', '-', '*', '/']) for token in tns: if token[0] == 'number': stack.append(token[1]) elif token[0] == 'operator': operand2 = stack.pop() operand1 = stack.pop() stack.append([token[1], operand1, operand2]) return stack
Данный код будет работать для списка токенов, где каждый токен представлен в виде ['type', 'value']. Ваш желаемый вывод будет представлен в виде списка списков, где каждый вложенный список представляет операцию и ее операнды.
Вызов Parser.parse(tns) с вашим примером токенов должен вернуть желаемый вывод [[+, 5], [*, 5], [+, 5], [/, 10]]. Не забудьте модифицировать код парсера в соответствии с вашим форматом токенов.
Для парсинга кода, разделенного на токены, можно воспользоваться алгоритмом с обратной польской записью (Reverse Polish Notation, RPN) или использовать метод рекурсивного спуска (recursive descent).
В вашем случае, когда каждый токен представлен списком ['type', 'value'], вы можете написать парсер следующим образом:
class Parser:@staticmethod
def parse(tns):
stack = []
operators = set(['+', '-', '*', '/'])
for token in tns:
if token[0] == 'number':
stack.append(token[1])
elif token[0] == 'operator':
operand2 = stack.pop()
operand1 = stack.pop()
stack.append([token[1], operand1, operand2])
return stack
Данный код будет работать для списка токенов, где каждый токен представлен в виде ['type', 'value']. Ваш желаемый вывод будет представлен в виде списка списков, где каждый вложенный список представляет операцию и ее операнды.
Вызов Parser.parse(tns) с вашим примером токенов должен вернуть желаемый вывод [[+, 5], [*, 5], [+, 5], [/, 10]]. Не забудьте модифицировать код парсера в соответствии с вашим форматом токенов.