• Non ci sono risultati.

Struttura generica di un parser generator Coco/R

Capitolo 6: Parser generator Coco/R

6.3 Struttura generica di un parser generator Coco/R

Gli elementi basilari di Coco/R [41] sono identificatori, numeri, stringhe e costanti, definiti come segue:

Ident = letter { letter | digit } . number = digit { digit } .

string = ‘ “ ‘{ anyButQuote } ‘ “ ’ . char = ‘\’ ‘ anyButApostrophe ‘\’ ‘ .

Le lettere maiuscole sono distinte dalle lettere minuscole. Le stringhe non devono estendersi attraverso linee multiple. Sia le stringhe che le costanti possono contenere le seguenti sequenze:

\\ backslash \r carriage return \f form feed

\” quote \n new line \a bell

\0 null character \t horizontal tab \b backspace

\’ apostrophe \v vertical tab \uxxxx hex char value Le seguenti parole sono parole chiave per Coco/R:

Capitolo 6 - Parser generator Coco/R

ANY CONTEXT IGNORE PRAGMAS

CHARACTERS END IGNORECASE PRODUCTIONS

COMMENTS FROM Out SYNC

COMPILER IF WEAK

TO TOKENS

I commenti sono racchiusi tra /* e */ se sono distribuiti su più linee altrimenti si può mettere il solo simbolo // all’inizio del commento, se questo è distribuito su un’unica linea.

6.3.1 Struttura del compilatore Coco1/R

Questa sezione si occupa del compilatore Coco1/R, usato come linguaggio di input per Coco/R. La descrizione del compilatore consiste in un insieme di regole grammaticali che descrivono la struttura lessicale e sintattica di un linguaggio.

La struttura di un compilatore Coco1/R è data dalla forma seguente: Coco1 = [Imports] “COMPILER” ident [GlobalFieldsAndMethods] ScannerSpecification ParserSpecification “END” ident ‘.’ .

dove il nome dopo la parola chiave COMPILER è il nome della grammatica e allo stesso modo viene riscritto dopo la parola chiave END. Il nome della

Capitolo 6 - Parser generator Coco/R

grammatica denota anche il simbolo non terminale iniziale (start symbol). La specifica del parser, parte principale per la descrizione del compilatore, può contenere una produzione per questo simbolo, le produzioni e la grammatica attributata, che specificano la sintassi del linguaggio per l’analisi e la relativa traduzione [41,42].

6.3.2 Le produzioni

Le produzioni specificano la struttura sintattica dei simboli non terminali. Esse consistono in una parte sinistra e una parte destra separate da uno stesso simbolo. La parte sinistra specifica l’insieme dei non terminali con i suoi attributi formali e le variabili locali della produzione, la parte destra consiste in espressioni che specificano la struttura dei non terminali così come la sua traduzione nella forma di attributi e azioni semantiche [41,42].

Le produzioni possono essere date in qualsiasi ordine e, al loro interno, si possono fare riferimenti espliciti ai non terminali. Per ogni non terminale ci deve essere esattamente una produzione. In particolare, ci deve essere una produzione per il nome della grammatica, che è il simbolo di partenza della grammatica medesima [41].

6.3.3 Le azioni semantiche

Un’azione semantica è una parte del codice scritta nel linguaggio di Coco/R. È eseguita dal parser generator nella posizione in cui è stata specificata nella grammatica. Le azioni semantiche sono semplicemente

Capitolo 6 - Parser generator Coco/R

copiate dal parser generator non controllato da Coco/R. Inoltre, un’azione semantica può anche contenere dichiarazioni di variabili locali. Ogni produzione ha il proprio insieme di variabili locali, che è mantenuto nelle produzioni ricorsive. L’azione semantica facoltativa sulla parte sinistra della produzione (LocalDecl) è usata per le dichiarazioni, ma le variabili possono anche essere dichiarate in ogni altra azione semantica. Le azioni semantiche, inoltre, possono non solo accedere alle variabili locali ma anche ai metodi dichiarati all’inizio della grammatica attributata [41,42].

6.3.4 Gli attributi

Le produzioni sono considerate come metodi di parsing. L’occorrenza di un non terminale sulla parte destra di una produzione può essere vista come una chiamata al metodo per l’analisi di questo non terminale. I non terminali possono avere attributi che corrispondono come parametri ai metodi di analisi per i non terminali. Ci sono attributi di input, che sono usati per passare valori alle produzioni di un non terminale, e attributi di output, che sono usati per far tornare il valore dalle produzioni ad un non terminale visitato (cioè al posto in cui il non terminale occorre in una certa altra produzione) [41,42].

Come con i parametri, distinguiamo tra attributi formali, che sono specificati nelle dichiarazioni dei non terminali nella parte sinistra della produzione, e attributi attuali, che sono specificati nelle occorrenze dei non terminali nella parte destra della produzione.

Gli attributi sono inclusi tra angoli (cioè <…>). Se gli attributi contengono gli operatori < oppure > o tipi generici come List<T> allora l’attributo può essere scritto come <. … .>.

Capitolo 6 - Parser generator Coco/R

Coco/R controlla che i non terminali con attributi siano sempre usati con attributi e che i non terminali senza attributi siano sempre usati senza attributi. Tuttavia, Coco/R non controlla la corrispondenza fra gli attributi formali e quelli attuali, operazione lasciata al compilatore del linguaggio di uscita [41,42].

6.3.5 Attributi dei simboli terminali

I simboli terminali non hanno attributi in Coco1/R. Ad ogni modo lo scanner restituisce il valore del token (cioè la stringa di tokens) come pure il numero di linea e la colonna dei tokens. Queste informazioni possono essere viste come attributi di output di quel token [41].

6.3.6 Il simbolo ANY

Nelle produzioni della grammatica il simbolo ANY denota ogni token che non è un’alternativa al simbolo ANY nella produzione corrente. La seguente produzione, per esempio, produce una lista di attributi in Coco1/R e restituisce il numero di caratteri tra simboli ad angolo:

Attributes < out int len > =

‘<’ (. int beg = t.pos + 1; .) {ANY}

‘>’ (. len = t.pos – beg; .) .

In questo esempio il simbolo > è un’alternativa implicita al simbolo ANY. Il significato della produzione è che ANY è in relazione con tutti i tokens ad

Capitolo 6 - Parser generator Coco/R

eccezione del simbolo >. L’attributo t.pos indica la posizione, nel testo, del token riconosciuto più di recente [41].

Documenti correlati