Galkov, подскажи пожалуйста, а каким образом была решена проблема преждевременного добавления операционных кодов? Например, есть выражение 2/(2+%1). Пусть %1 = 2 (компилятор об этом не знает). Очевидно, что результат = 0.5. Если не возвращать из каждой функции levelX структуру, в которой хранится либо промежуточный код, либо константа, (потому что это вариант, требующий значительной переделки алгоритма компиляции) то получается такая последовательность действий компилятора:
1. Получаем число 2 в функции оператора /
2. Входим в скобки.
3. Получаем число 2 в функции оператора +
4. Получаем переменную %1.
5. Функция оператора + видит, что выражение не вычислить на месте и последовательно пишет в код 2, %1 и операцию сложения.
6. Выходим из скобок.
7. Функция оператора / видит, что выражение в скобках не вычислилось на месте, и пишет свой аргумент в код, затем операцию деления.
Итого, получим такую цепочку: 2, %1, +, 2, /. Выполнив ее, получаем (2+2)/2 = 2.
Как решена такая проблема в FastMathParse?
Разработчик
Ответов: 4698
Рейтинг: 426
|
|||
карма: 10 |
|