Creazione lentamente del linguaggio di programmazione; Come unire questi 2 metodi?

1

Sto lentamente creando un semplice linguaggio di programmazione (un po 'come Lua).

L'interprete ha 2 metodi importanti, exec e evaluate .
exec legge i token 1 per 1 e fa cose come dice come creare nuove variabili, ecc.

evaluate fondamentalmente interpreta un po 'diversamente.
Comprende == , nuovi numeri ( 5.3 ), +-*/^% e nuove stringhe con "" .
Comprende anche le variabili e ne utilizza il valore.
Alla fine di evaluate , restituisce un valore per exec da utilizzare.

Un buco di design gigantesco in questo interprete è il fatto che non puoi creare nuove stringhe in exec senza creare una variabile.

Significato:

string a = "some string";
a.someStringMethod();

Funziona, ma questo:

"some string".someStringMethod();

no.
Questo significa anche che gli array multidimensionali non funzionano, anche se prevedo di usare . invece di [ e ] .

Se continui a non capire come l'interprete in questo momento è la pagina GitHub su di esso:
link

Quindi la domanda generale è: come potrei unire questi due metodi?

    
posta Midnightas 10.08.2016 - 09:14
fonte

1 risposta

3

Prima di tutto, i tuoi parser non gestiscono tutti i token, ma piuttosto saltano su un numero arbitrario di token fino a quando non riconoscono qualcosa.

Qualsiasi parser che abbia mai visto o scritto fa qualcosa con ogni token , anche se è molto semplice come spingere il token su uno stack appropriato. La gestione di ciascun token è molto importante per quanto riguarda la capacità di un parser di comprendere e riconoscere la sintassi del linguaggio e, in altre parole, di comprendere lo stato sintattico dell'input in qualsiasi punto dell'accettazione dei token.

A meno che tu non abbia intenzione di sviluppare la tua metodologia di parser, ti suggerirei di adottare uno di quelli comuni. Ci sono molte cose che potresti prendere in considerazione. Innanzitutto, dovresti definire una specifica per la sintassi della tua lingua. Un buon approccio è usare una grammatica (ad es. EBNF ). Successivamente, considera alcune tecnologie ben comprese, come ad esempio:

  • Recursive Decent . Come suggerito dal nome, utilizza un algoritmo ricorsivo per gestire la complessità di espressioni arbitrarie. È possibile creare un parser decente ricorsivo che rifletta quasi direttamente la grammatica della lingua, che è piuttosto accurata. Si scrive un insieme di routine ricorsive in cui ogni funzione ricorsiva riflette una regola di produzione nella grammatica. Tale parser non è necessariamente il più efficiente, specialmente per l'analisi delle espressioni, perché espande lo sforzo ripetutamente guardando gli stessi token attraverso gli occhi di diversi livelli della grammatica; tuttavia è facile da scrivere, facile da capire e funziona. Può integrare perfettamente l'analisi delle istruzioni (if, while, for, function, let, with, ecc.) Con l'espressione parsing (a + b * c [d]), che può sembrare altrimenti che richiede parser completamente diversi.

  • Utilizza un generatore di parser come ANTLR . Questa è una sofisticata catena di strumenti che supporta grammatiche complesse. Si inserisce una grammatica e si apre un po 'di codice per analizzare la lingua. Voilà!

Esistono anche una miriade di altre tecniche, ad esempio Precedenza dell'operatore .

    
risposta data 10.08.2016 - 23:32
fonte

Leggi altre domande sui tag