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

6 Мар 2022 в 19:53
198 +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 Апр 2024 в 19:11
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир