dollar
@dollar
Делай добро и бросай его в воду.

Есть ли известный алгоритм, который разбирает выражения на сложных языках типа JS и C?

Для примера возьмём только JavaScript и C++, потому что синтаксис похож.
Я знаю, что в общем случае делается так:
1) Строка с выражением токенизируется, то есть разбивается на последовательные куски, где точно известно, что каждый токен из себя представляет - число, скобку, оператор, литерал и т.д.
2) Порядок токенов меняется в соответствии с польской нотацией. Это такая своеобразная сортировка, чтобы последовательность вычислений совпадала с порядком токенов в массиве.
3) Собственно подсчет, где переменные заменяются их значениями, функции вызываются по именам и т.д.

Проблема в том, что польская нотация слишком простая. Она учитывает только операции с двумя параметрами. И она не учитывает унарные операторы, то есть выражение 1+ +1 уже будет ошибочным. А также не учитывает сложные операторы типа A ? B : C. Не поддерживаются функции с произвольным количеством параметров, например Math.max(a, b, c, d, и т.д.).

Есть ли более универсальный алгоритм?
  • Вопрос задан
  • 137 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Польская нотация учитывает всё, что угодно. В смысле, что напишешь, то и будет.
унарные операторы? Делай две операции - UNARY_MINUS, MINUS. 1 1 UNARY_MINUS MINUS == 2
Сложные операторы? A B C TERNARY (не лениво? ну можно и лениво сделать)
Функции? a b c d 4 max call. Здесь a, b, c, d, 4, max - аргументы, они все ложатся в стек. Интерпретатор видит call, достает из стека функцию (max), понимает, что это функция с переменным числом аргументов, достает это число (4), достает остальные аргументы по количеству, вызывает функцию max(a b c d).
В Полизе могут быть инструкции, управляющие потоком выполнения 1234 JUMP - переводит курсор на адрес 1234.
Всё зависит от твоей извращенности, короче.
Чтобы не быть голословным, вот мой пет-проект, там вычисление как раз на Полизе реализовано.

У польской нотации есть минусы - сложно анализировать программу, вычислять типы. Сложно оптимизировать. Для этого лучше подходят AST.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы