asdf = sqrt(25);
Questa parte è una delle più utili, in quanto è possibile riscrivere la maggior parte del codice come assegnazioni di risultati di funzioni a variabili.
Ad esempio:
print(sqrt(25));
può essere riscritto come:
tmp0 = sqrt(25);
print(tmp0);
Utilizzando questo metodo puoi gestire facilmente anche le chiamate annidate:
print(sqrt(pow(5, 2));
viene riscritto come:
tmp0 = pow(5, 2);
tmp1 = sqrt(pow0);
print(tmp1);
e così via.
Non so come si è stato implementato interprete, ma uno degli approcci più semplici è quello di tokenize prima il vostro input (cioè trasformare un testo di partenza in una sequenza di lessemi - simboli di base che rappresentano le diverse parti della grammatica del linguaggio) e quindi attraversa quella sequenza.
Ricorda che puoi eseguire diversi passaggi sulla sequenza dei lessemi, in ogni passaggio producendo sequenze gradualmente più semplici finché non hai qualcosa su cui puoi facilmente lavorare.
Esempio:
print(sqrt(25));
può essere tokenizzato nella seguente sequenza:
"print"
"("
"sqrt"
"("
"25"
")"
")"
";"
Quando attraversi la sequenza, cerchi modelli (ad esempio identifier "("
) e intraprendi azioni quando trovi una corrispondenza.
Ad esempio, la corrispondenza di identifier "("
attiva una chiamata nidificata nell'interprete dell'interprete per riscrivere la sequenza se l'analizzatore trova le chiamate nidificate.
Quindi, lo riscriverai in una sequenza modificata che potrebbe apparire come questa:
"tmp0"
"="
"sqrt"
"("
"25"
")"
";"
"print"
"("
"tmp0"
")"
";"
Per semplificare la riscrittura, puoi operare su due sequenze: una sequenza di input non elaborata e una nuova per il programma riscritto.
Usando questo metodo riscrivi e riscrivi fino a quando non arrivi a qualcosa di abbastanza semplice da eseguire.
Questo, da un livello molto alto, è fondamentalmente ciò che accade con la maggior parte dei linguaggi di programmazione.
Ti consiglio di leggere la programmazione del linguaggio di programmazione, i lexer, i parser e l'analisi del codice sorgente.
Ti suggerirei anche di provare a scrivere una semplice DSL prima di iniziare un compito molto più complesso di implementazione di un linguaggio generico.
Imparare più di un linguaggio di programmazione aiuta anche quando vuoi progettare il tuo.