Formalizzato, la tua domanda è: data una grammatica G che analizza una lingua L (G) e una grammatica estesa G 'che analizza una lingua estesa L (G') dove L (G) è un sottoinsieme di L (G ') ), come si può dimostrare che qualsiasi programma nella lingua L (G) produce lo stesso albero di analisi con la grammatica G e G '?
Questo è il problema di inclusione linguistica ed è indecidibile per grammatiche senza contesto. È anche indecidibile se un CFG è ambiguo , ad es. se lo stesso programma può essere analizzato in due modi diversi sotto la grammatica G.
Tuttavia, questi problemi possono essere decidibili per i sottogruppi CFG effettivamente utilizzati dalla maggior parte dei linguaggi di programmazione, come LALR. Può anche essere decidibile se la differenza tra G e G 'ha una struttura specifica. Sfortunatamente non ho familiarità con la teoria necessaria.
Invece, ci sono due modi pratici per controllare la compatibilità di tali cambiamenti di sintassi.
In primo luogo, potrebbe esserci un corpus di programmi esistenti, inclusi molti casi limite. Usando un parser basato su una grammatica che può analizzare tutti i CFG (come i parser GLR o Earley), questi parser possono segnalare se i programmi di quel corpus avevano un'analisi ambigua.
L'approccio più comune è chiedere ad altre persone se possono individuare eventuali problemi.
In questo caso particolare c'è una chiara argomentazione che tale sintassi non sarebbe ambigua. ( public
è una parola chiave, ergo non può esserci alcun metodo o costruttore chiamato public()
. Introdurre una tale sintassi non introdurrebbe quindi ambiguità.) Uno strumento può o non può essere in grado di fare quella connessione. Un uomo esperto sicuramente di noi.
Naturalmente la compatibilità sintattica è il problema facile. Molto più difficile è mantenere la semantica compatibile, che è un problema molto più difficile anche per gli esseri umani e non può essere definitivamente controllato automaticamente dagli strumenti. Per cominciare, la maggior parte dei linguaggi di programmazione non ha nemmeno una semantica formale che potrebbe essere l'oggetto di una dimostrazione. Di nuovo, chiedere a molti umani esperti è l'unico approccio praticabile. Se un problema viene trascurato (accade abbastanza spesso), allora questo è un bug che deve essere risolto successivamente.