Perché GCC è passato da Bison a un parser di discesa ricorsivo per C ++ e C?


10

C'è stato un cambio di lingua che lo ha richiesto o qualche motivo pratico per cui Bison non era più appropriato o ottimale?

Ho visto su Wikipedia che sono passati, facendo riferimento alle note di rilascio di GCC 3.4 e GCC 4.1 .

Queste note sulla versione indicano:

Un parser C ++ di origine ricorsiva scritto a mano ha sostituito il parser C ++ derivato da YACC dalle versioni precedenti di GCC. Il nuovo parser contiene un'infrastruttura molto migliorata necessaria per un migliore analisi dei codici sorgente C ++, gestione delle estensioni e separazione netta (ove possibile) tra analisi semantiche appropriate e analisi. Il nuovo parser corregge molti bug trovati nel vecchio parser.

E:

Il vecchio parser C e Objective-C basato su Bison è stato sostituito da un nuovo parser di discesa ricorsiva scritto a mano più veloce

Quello che vorrei sapere è quali problemi reali stavano avendo e perché era impossibile / poco pratico da risolvere usando Bison


1
alla fine tutti i parser diventeranno homebrewn dopo sufficienti modifiche quando il generatore di parser non sarà in grado di gestire i requisiti
maniaco del cricchetto

1
Condividere la tua ricerca aiuta tutti . Raccontaci cosa hai provato e perché non ha soddisfatto le tue esigenze. Ciò dimostra che hai impiegato del tempo per cercare di aiutarti, ci salva dal ribadire risposte ovvie e, soprattutto, ti aiuta a ottenere una risposta più specifica e pertinente. Vedi anche Come chiedere
moscerino

1
@gnat Ho ampliato la mia domanda
neelsg,

1
Il C ++ è un linguaggio straordinariamente complesso da analizzare rispetto alla maggior parte degli altri linguaggi di programmazione. La mia sensazione è che un parser generico non possa supportare alcune ottimizzazioni che un parser preparato in casa potrebbe usare.

Risposte:


16

GCC è passato all'analisi scritta a mano perché i messaggi di errore sono più significativi quando si utilizzano tecniche di discesa ricorsiva, come ho spiegato qui .

Inoltre, C ++ sta diventando un linguaggio (sintatticamente) così complesso da analizzare che non vale la pena usare i generatori di parser.

Alla fine, la maggior parte del lavoro di un vero compilatore non sta analizzando, sta ottimizzando. I passaggi di ottimizzazione di fascia media GCC sono molto più complessi della sua analisi.

(A proposito, puoi personalizzare GCC, ad esempio con plugin o usando MELT , ma non puoi davvero estendere la sintassi della lingua che sta accettando, tranne aggiungendo attributi e pragmi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.