Comprensione dei lexer scritti a mano

2

Creerò un compilatore per C (C99; possiedo il PDF standard), scritto in C (vai alla figura) e analizzerò come funzionano i compilatori su Wikipedia mi ha detto molto. Tuttavia, dopo aver letto i lexers mi ha confuso. La pagina di Wikipedia afferma che:

the GNU Compiler Collection (gcc) uses hand-written lexers

Ho provato a cercare su google cosa sia un lexer scritto a mano e non ho creato nulla se non "creare un diagramma di flusso che descrive come dovrebbe funzionare", tuttavia, non è così che dovrebbe essere fatto tutto lo sviluppo del software?

Quindi la mia domanda è: "Cos'è un lexer scritto a mano?"

    
posta Cole Johnson 28.06.2012 - 00:31
fonte

5 risposte

6

Un lexer scritto a mano è un lexer che è stato scritto (e messo a punto) da una persona reale, invece di essere generato automaticamente da una definizione formale da uno strumento come LEX.

Non sono così difficili da creare, TBH. Creare un parser è molto più complicato, ma ogni programmatore con un background decente nella teoria coinvolta dovrebbe essere in grado di scrivere un lexer a mano in un paio d'ore, in cima.

    
risposta data 28.06.2012 - 00:34
fonte
8

È un lexer scritto da un umano invece che generato da una serie di espressioni regolari, come quelle solitamente espresse in lex (un generatore di lexer).

    
risposta data 28.06.2012 - 00:33
fonte
2

Come altri hanno già detto, l'articolo è in contrasto con un lexer generato da un programma come Flex.

Ciò che le altre risposte non hanno menzionato è che un lexer è fondamentalmente una macchina a stati finiti . Che è un elemento fondamentale nella teoria dei compli. Se impari come funzionano le macchine di stato, noterai molte, molte applicazioni che puoi applicarle, una delle quali è un lexer. O anche un parser!

    
risposta data 28.06.2012 - 03:44
fonte
1

L'unica ragione per usare i lexer scritti a mano (e, più importante, i parser) nei compilatori di produzione è in messaggi di errore migliori e più intelligenti e recupero degli errori. Era necessario tornare indietro negli anni '80, ma ora è praticamente inutile, con tutte quelle tecniche di parsing nuove e brillanti (che non si troveranno nel tutto obsoleto, ma per qualche motivo sconosciuto ancora venerato Libro del Drago).

Ti consiglierei di omettere lo stadio di lexing e usare una delle tecniche di parsing senza lexer. Packrat potrebbe essere sufficiente, funziona molto bene con una sintassi C, ed è estremamente flessibile, puoi combinare una logica di analisi dichiarativa di alto livello con ricette imperative di basso livello per il recupero dagli errori e dare messaggi di errore completi e utili.

In breve: non ha senso seguire le pratiche obsolete di GCC, Clang e simili, e faresti meglio a evitare di leggere il Libro del Drago.

    
risposta data 28.06.2012 - 10:03
fonte
0

Spesso programmi come flex o bisonti vengono usati per generare automaticamente il codice per il lexer dalla grammatica della lingua. Nel caso scritto a mano, questi non sono stati utilizzati e sono stati tutti scritti manualmente.

    
risposta data 28.06.2012 - 00:35
fonte

Leggi altre domande sui tag