Attualmente sto implementando un valutatore di espressioni (espressioni a riga singola, come formule) basato su quanto segue:
- l'espressione inserita viene tokenizzata per separare letterali booleani, numeri interi, decimali, stringhe, funzioni, identificatori (variabili)
- Ho implementato l'algoritmo Shunting-yard (leggermente modificato per gestire le funzioni con un numero variabile di argomenti) per sbarazzarsi della parentesi e ordinare agli operatori con una discreta precedenza in un ordine postfisso
- il mio shunting-yard produce semplicemente una coda (simulata) di token (tramite un array, il mio linguaggio Powerbuilder Classic può definire oggetti, ma ha solo array dinamici come memoria nativa - non un vero elenco, nessun dizionario) che valuto sequenzialmente con un semplice stack machine
Il mio valutatore funziona bene, ma mi manca ancora un if()
e mi chiedo come procedere.
Con la mia valutazione postfissa e basata sullo stack di shunt, se aggiungo if()
come un'altra funzione con parti vere e false, un singolo if(true, msgbox("ok"), msgbox("not ok"))
mostrerà entrambi i messaggi mentre vorrei mostrarne solo uno. Questo perché quando devo valutare una funzione, tutti i suoi argomenti sono già stati valutati e messi in pila.
Potresti darmi un modo per implementare if()
in modo pigro?
Ho pensato di elaborarli come una specie di macro, ma all'inizio non ho ancora la valutazione delle condizioni. Forse ho bisogno di usare un altro tipo di struttura che una coda per mantenere separatamente la condizione e le espressioni vero / falso? Per ora l'espressione viene analizzata prima della valutazione, ma ho anche in programma di memorizzare la rappresentazione intermedia come tipo di espressione precompilata per la valutazione futura.
Modifica : dopo alcune considerazioni sul problema, penso di poter costruire una rappresentazione ad albero della mia espressione (un AST invece di un flusso di token lineare), dal quale potrei facilmente ignorare uno o un altro ramo del mio if()
.