Chiarimento su Grammars, Lexers e Parser

7

Informazioni di background ( Può saltare ): sto lavorando su un'attività che ci è stata assegnata a uni in cui dobbiamo progettare una grammatica per una DSL che siamo stati fornito di. La grammatica deve essere in BNF o EBNF. Oltre ad altre cose, stiamo valutando le regole lessicali nella grammatica e le regole di analisi, ad esempio se le regole sono adatte al sottoinsieme della lingua, quanto sono complete queste regole, quanto sono chiare le regole ect.

Quello che non capisco è se queste regole sono trattate in una grammatica definita in BNF (è un nuovo argomento per noi).

La domanda : una grammatica per una determinata lingua che è stata definita in BNF o EBNF contiene / fornisce regole per Analisi lessicale e / o Analisi ? ( o devi specificarli altrove-dove? )

Inoltre quale sarebbe considerata una regola lessicale? E quale sarebbe considerata una regola di analisi?

    
posta The_Neo 07.01.2014 - 18:12
fonte

3 risposte

7

Sì, una grammatica BNF contiene tutte le regole necessarie per l'analisi e l'analisi lessicale. La differenza tra i due è un po 'sfocata. Un buon esempio di una regola lessicale in EBNF potrebbe essere:

number = [ "-" ], digit, { digit } ;
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;

Solitamente i lexer possono essere implementati usando un codice relativamente semplice. Puoi cercare una stringa per lo spazio successivo, quindi vedere se il tuo risultato inizia con un "-" facoltativo, contiene almeno una cifra dopo di esso e contiene successivamente solo cifre. Le Lexer erano quasi sempre un passo separato, ma al giorno d'oggi sono solitamente raggruppate insieme al parser. Da qui la confusione.

Una regola parser userebbe number non-terminal per fare qualcosa di più grande, come la seguente espressione di addizione.

add = number, "+", number

Anche se sono mescolati nello stesso file, il tuo professore vorrà vedere ancora una chiara distinzione tra regole "lexer" e regole "parser". Ad esempio, non fai questo:

add = {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }, "+",
      {"0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" }

Non solo è soggetto a errori, è difficile da leggere e difficile da implementare.

    
risposta data 07.01.2014 - 19:52
fonte
4

La grammatica per l'analisi lessicale è tipicamente specificata tramite espressioni regolari (specialmente per progetti di tipo universitario). Accetta un linguaggio normale

Un parser di solito accetta un linguaggio context-free, che può essere specificato tramite BNF.

La distinzione tra parser e scanner (o analizzatore lessicale) è alquanto artificiale, ma semplifica la scrittura dei parser.

Vedi link

    
risposta data 07.01.2014 - 19:57
fonte
1

La risposta alla tua domanda è certamente Sì, entrambe le regole di parsing e lexing possono essere specificate usando un EBNF (che è in realtà solo una forma più compatta di un BNF). Tuttavia, nei compilatori di qualità di produzione la parte successiva della risposta è diversa.

La maggior parte delle lingue ha una grammatica senza contesto e si conforma a un insieme di regole da fare con lookahead e backtracking. Le grammatiche più comuni sono LL (1) e LR (1). Le grammatiche LL (1) consentono una semplice grammatica discendente ricorsiva, spesso codificata a mano, mentre LR (1) di solito significa un generatore di parser come YACC. Questa parte della grammatica scende a token (terminali) ma non inferiore.

I simboli sono solitamente definiti separatamente usando una grammatica ancora più semplice, come una grammatica dell'operatore. [Puoi trovare questi termini per definizioni migliori di quelle che posso dare qui.] Il lexer che legge questi simboli è in genere responsabile della maggior parte delle prestazioni del compilatore, quindi, secondo la mia esperienza, è sempre codificato a mano. LEX è clunky (e solo C) e regex è troppo lento.

Il punto è capire che le regole di analisi guidano la tecnologia necessaria per il parser e le regole di lexing idem per il tuo lexer. La chiara distinzione tra loro è se si applicano all'uso di token (terminali) o alla loro costruzione.

Questo potrebbe non aiutare i tuoi progressi accademici, ma è importante se vai oltre i progetti di giocattoli.

    
risposta data 19.02.2014 - 10:42
fonte

Leggi altre domande sui tag