Как парсить код, разделенный на токены? Я пишу свой язык программирования, и дошёл до момента, когда нужно писать парсер. я пробовал разные способы, гуглил, но ничего не вышло. Каждый токен - список: ['type', 'value'] Пример желаемой работы(токены упрощены и написаны только их значения):tns = [(, 5, +, 5, *, 5, ), /, 10] print(Parser.parse(tns)) Желаемый вывод:[[+, 5], [*, 5], [+, 5], [/, 10]] Был бы очень благодарен за ответ!

6 Мар 2022 в 19:53
169 +1
0
Ответы
1

Для парсинга кода, разделенного на токены, можно воспользоваться алгоритмом с обратной польской записью (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]]. Не забудьте модифицировать код парсера в соответствии с вашим форматом токенов.

16 Апр в 19:11
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 211 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир