Attualmente sto implementando un valutatore di espressioni (espressioni a linea singola, come le formule) in base a quanto segue:
- l'espressione inserita viene tokenizzata per separare booleani letterali, 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 delle parentesi e ordinare agli operatori una precedenza decente in un ordine postfixed
- il mio shunting-yard produce semplicemente una coda (simulata) di token (per mezzo di un array, il mio linguaggio Powerbuilder Classic può definire oggetti, ma ha solo array dinamici come memoria nativa - non vero elenco, nessun dizionario) che valuto sequenzialmente con una semplice macchina stack
Il mio valutatore funziona correttamente, ma mi manca ancora if()
e mi chiedo come procedere.
Con il mio shunting-yard valutazione postfixed e stack based, se aggiungo if()
come un'altra funzione con parti true e false, un singolo if(true, msgbox("ok"), msgbox("not ok"))
mostrerà entrambi i messaggi mentre vorrei mostrarne solo uno. Questo perché quando ho bisogno di valutare una funzione, tutti i suoi argomenti sono già stati valutati e messi nello stack.
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 valutato la condizione. Forse ho bisogno di usare un altro tipo di struttura rispetto a una coda per tenere separatamente la condizione e le espressioni vero / falso? Per ora l'espressione viene analizzata prima della valutazione, ma ho anche intenzione di memorizzare la rappresentazione intermedia come tipo di espressione precompilata per la valutazione futura.
Modifica : dopo un po 'sul problema, penso che potrei costruire una rappresentazione ad albero della mia espressione (un AST invece di un flusso di token lineare), da cui potrei facilmente ignorare l'uno o l'altro ramo del mio if()
.