интерпритатор математических выражений

  • Автор темы Norfonzor
  • Дата начала
N

needDrivers

Сделал свой калькулятор, правда моя задача не требовала подстановки переменных значений и автору темы он не подойдёт, но если постараться, то переделать его можно.



Чтобы не переделывать таблицы синтаксического анализа можно схитрить.
Функцией лексического анализатора в случае, когда возвращается T_NUM (число), вместо конкретного значения возвращать код для интерпретатора "положить значение в стек" (push число). В бинарном виде например команда push будет обозначаться 01.
Тогда лексический анализатор должен вернуть T_NUM и значение в 9 байт (первый 01 остальные само число (double), которое он должен положить в стек).
Так же поступать с переменными x и у. Только уже возвращать не 9 байт, а например 1 байт (просто команда для интерпретатора) pushx и pushy - 02 и 03 соответственно.
В тех местах, где у меня обрабатываются операторы сложения, умножения и т.д. Там просто в байт код добавлять одно-байтовые команды для интерпретатора (add - сложение, sub - вычитаение и т.п.) 04 и 05.

На выходе должен получиться байт код примерно такой:
Код:
для такого выражения: 100 + 200 - x
байт код: 01 [8 байт число] 01 [8 байт число] 04 02 05 00

Алгоритм интерпретатора такой:

Код:
цикл {
инструкция = Берём следующий байт байт-кода
Если (инструкция)
01: положить в стек следующие 8 байт
02: положить в стек значение параметра x
03: положить в стек значение параметра y
04: сложить два верхних значения в стеке и заменить их одним
05: вычесть из одного верхнего значения в стеке другое и заменить их одним
и т.д.
00: выйти из цикла
}

результат = верхнее значение в стеке
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!