Sto scrivendo un linguaggio specifico del dominio interpretato per la mia applicazione. Ogni istruzione viene analizzata ed eseguita non appena l'analizzatore lessicale decide che viene raggiunta la fine dell'istruzione. Gestisce un token alla volta e fa chiamate ricorsive per valutare le espressioni e ridurre lo stack di token corrente.
È intuitivo che il parser verifichi innanzitutto gli errori di sintassi prima di interpretare ed eseguire effettivamente il codice, ma stavo pensando che potrebbe essere un altro modo di gestirlo.
Cosa succede se la sintassi è stata verificata appena prima che il codice in questione debba essere eseguito? Ciò significa che in realtà il flag di codice per la sintassi non valida non si verificherà fino a quando non verrà effettivamente raggiunto il codice problematico. Questo significa anche che se il codice è difettoso, ma non dovrebbe essere eseguito, possiamo generare avvisi non fatali invece di errori per notificare il programmatore, ma lasciare che il codice venga eseguito comunque.
Prendi ad esempio questo codice:
1. new $a = 2
2. new $b = 3
3.
4. while ($a < 10) {
5. $a += 3
6. $b += 2
7.
8. if ($b < 5) {
9. $b =
10. }
11. }
12.
13. printout($a)
14. printout($b)
Mentre una riga viene digitata dopo l'altra, l'interprete standard eseguirà le prime due righe, ma l'errore verrebbe generato sulla riga 9, poiché nessun valore viene assegnato a $b
e il processo terminerà a causa di un errore fatale.
Questo approccio emette:
SyntaxError at line 9: $b = ; - Expression expected
Process terminated with exit code 1
Se il parser verifica la sintassi di una riga alla volta, espressione $b < 5
non valuta mai true
e il codice errato non viene mai eseguito. La sua sintassi è ancora controllata e genera un flag di avviso.
Questo approccio emette:
SyntaxWarning at line 9: $b = ; - Expression expected
SyntaxWarning at line 9: $b = ; - Expression expected
SyntaxWarning at line 9: $b = ; - Expression expected
11
9
Se il codice difettoso deve essere eseguito, SyntaxErrors verrà generato in modo incondizionato. L'unica differenza sarebbe quando il codice non viene eseguito. La lingua è scritta per la generazione di grafica / software di manipolazione.
Devo includere gli avvertimenti sulla sintassi nel mio interprete o devo lasciare che il codice difettoso termini sempre l'esecuzione? Quali fattori dovrebbero influenzare questa decisione?