Espressioni di espressione sull'interprete personalizzato

-1

Attualmente sto sviluppando il mio (tipo di) linguaggio di programmazione.
Attualmente è simile a questo:

asdf = 2;
print(asdf);

E

print(2);

E sorprendentemente, funziona. (Entrambi output 2 )
Tuttavia, il problema è che non posso farlo:

print(sqrt(25));

Anche io non posso farlo:

asdf = sqrt(25);
print(asdf);

Il mio grande problema è che non posso usare le funzioni in argomenti e dichiarazioni variabili.
Come potrei implementarlo?
(Darò il codice per l'interprete se necessario)

    
posta Midnightas 10.05.2016 - 17:35
fonte

2 risposte

1

Devi prima valutare la funzione interiore, prendere il suo risultato e alimentarlo nella tua funzione esterna.

Nella maggior parte degli interpreti, questo è tipicamente fatto spingendo la funzione esterna (e le sue parentesi) su una pila. Quindi valuta la funzione interiore, ottieni la risposta, apri la funzione esterna, passa la risposta dalla funzione interna e valuta la funzione esterna.

    
risposta data 10.05.2016 - 18:07
fonte
0

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.

    
risposta data 10.05.2016 - 18:34
fonte

Leggi altre domande sui tag