Le lingue moderne usano ancora i generatori di parser?

38

Stavo facendo ricerche sulla suite del compilatore gcc su wikipedia qui , quando è arrivato:

GCC started out using LALR parsers generated with Bison, but gradually switched to hand-written recursive-descent parsers; for C++ in 2004, and for C and Objective-C in 2006. Currently all front ends use hand-written recursive-descent parsers

Quindi con quell'ultima frase, (e per quanto mi fido di Wikipedia) posso sicuramente dirlo "C (gcc), C ++ (g ++), Objective-C, Objective-C ++, Fortran (gfortran), Java (gcj), Ada (GNAT), Go (gccgo), Pascal (gpc), ... Mercurio, Modula -2, Modula-3, PL / I, D (gdc) e VHDL (ghdl) "sono tutti front-end che non usano più un generatore di parser. Cioè, usano tutti parser scritti a mano.

La mia domanda allora è, questa pratica è onnipresente? In particolare, sto cercando risposte esatte a "l'implementazione standard / ufficiale di x ha un parser scritto a mano" per x in [Python, Swift, Ruby, Java, Scala, ML, Haskell]? (In realtà, anche qui sono benvenute le informazioni su qualsiasi altra lingua.) Sono sicuro di trovarlo da solo dopo molte ricerche. Ma sono anche sicuro che questo sia facilmente comprensibile dalla comunità. Grazie!

    
posta eatonphil 17.07.2014 - 19:41
fonte

2 risposte

33

AFAIK, GCC usa in particolare parser scritti a mano per migliorare la diagnostica degli errori sintattici (cioè dare messaggi umani significativi su errori di sintassi).

La teoria dell'analisi (e i generatori di analisi che discendono da esso) riguarda principalmente il riconoscimento e l'analisi di una frase di inserimento corretta . Ma ci aspettiamo dai compilatori che forniscano un messaggio di errore significativo (e che siano in grado di analizzare in modo significativo il resto dell'input dopo l'errore sintattico), per alcuni input non corretti.

Inoltre, i vecchi linguaggi precedenti - come C11 o C ++ 11- (che sono concettualmente vecchi, anche se la loro ultima revisione ha solo tre anni) non sono del tutto privi di contesto. Gestire la sensibilità del contesto in grammatiche per i generatori di parser (ad esempio bison o anche menhir ) è noiosamente difficile.

    
risposta data 17.07.2014 - 21:15
fonte
7

I generatori di parser e i motori di parser sono piuttosto generici. Il vantaggio della generalità è che costruire rapidamente un parser accurato e renderlo funzionale è facile, nello schema generale delle cose.

Il parser engine stesso soffre di prestazioni elevate a causa della sua generalità. Qualsiasi codice scritto a mano sarà sempre significativamente più veloce dei motori parser basati su tabella.

La seconda area in cui i generatori / motori di parser hanno difficoltà è che tutti i linguaggi di programmazione reali sono sensibili al contesto, spesso in modo abbastanza sottile. Le lingue LR sono prive di contesto, il che significa che ci sono molte sottigliezze sul posizionamento e sull'ambiente che sono impossibili da trasmettere correttamente nella sintassi. Le grammatiche attribuite tentano di affrontare le regole linguistiche di base come "declare prima dell'uso", ecc. Il cablaggio di questa sensibilità al contesto in codice scritto a mano è semplice.

    
risposta data 17.07.2014 - 20:15
fonte

Leggi altre domande sui tag