Зараз я впроваджую оцінювач виразів (однорядкові вирази, як формули) на основі наступного:
- введений вираз є токенізованим для розділення буквальних булевих, цілих чисел, десяткових знаків, рядків, функцій, ідентифікаторів (змінних)
- Я реалізував алгоритм Shunting-ярда (злегка модифікований для обробки функцій зі змінною кількістю аргументів), щоб позбутися дужок і замовити операторів з гідним пріоритетом у постфікс-порядку
- мій маневровий двір просто створює (змодельовану) чергу з лексем (за допомогою масиву моя мовою Powerbuilder Classic може визначати об'єкти, але мати лише динамічні масиви як власне сховище - не справжній список, ні словник), який я оцінюю послідовно простий автомат
Мій оцінювач працює непогано, але мені все одно не вистачає if()
і мені цікаво, як діяти далі.
З моїм маневровим оцінкою на постфіксах та на основі стека, якщо я додаю if()
як іншу функцію з істинними та хибними частинами, одиниця if(true, msgbox("ok"), msgbox("not ok"))
покаже обидва повідомлення, тоді як я хотів би показати лише одне. Це тому, що коли мені потрібно оцінити функцію, всі її аргументи вже були оцінені та розміщені у стеці.
Не могли б ви дати мені якийсь спосіб здійснити if()
ледачий спосіб?
Я хоч і оброблю їх як своєрідний макрос, але на ранній стадії ще не маю оцінку стану. Можливо, мені потрібно використовувати інший тип структури, крім черги, щоб окремо зберегти умову та істинні / хибні вирази? Наразі вираз проаналізовано перед оцінкою, але я також планую зберігати проміжне представлення як вид попередньо складеного виразу для подальшої оцінки.
Редагувати : після деяких проблем, я думаю, що я міг би створити дерево зображення мого виразу (AST замість лінійного потоку токенів), з якого я міг легко ігнорувати ту чи іншу гілку мого if()
.