Le descrizioni dell'analisi lessicale e della sintassi, utilizzano una notazione per le grammatiche BNF. Utilizzano il seguente stile di definizione:
name: lc_letter (lc_letter | "_")* lc_letter: "a"..."z"
La prima riga dice che un "nome", name
, è una
"lettera_minuscola", lc_letter
, seguita da una sequenza di zero
o più altre "lettere_minuscole", lc_letter
, o caratteri
di sottolineatura. Una "a" è un singolo carattere dell'alfabeto da
"a" a "z". (Queste regole aderiscono alle
definizioni delle regole lessicali e grammaticali in questo
documento.)
Ogni regola inizia con un nome (che è lo stesso nome definito dalla
regola) e un punto. Una sbarra verticale (|
) viene usata per
separare le alternative; è l'operatore con la precedenza più bassa in
questa notazione. Un asterisco (*
) significa zero o più
ripetizioni dell'oggetto precedente, un più (+
) significa una o
più ripetizioni e una frase racchiusa tra parentesi quadre ([
]
) significa zero o una occorrenza (in altre parole, la frase è
facoltativa). Gli operatori *
e +
si applicano il più
strettamente possibile (in termini di numero di oggetti); le parentesi
tonde vengono utilizzate per raggruppare (un gruppo si comporta come
un singolo oggetto). Le stringhe costanti letterali sono incluse tra
caratteri di quotatura. Gli spazi hanno solo il significato di
separare i token. Le regole vengono normalmente contenute in una
singola riga; le righe con molte alternative possono essere formattate
alternativamente facendo iniziare tutte le righe dopo la prima con una
sbarra verticale.
Nelle definizioni lessicali (come nell'esempio sopra), vengono
utilizzate due ulteriori convenzioni. Due caratteri costanti
letterali, separati da tre punti significano una scelta di un singolo
carattere nell'intervallo indicato (estremi inclusi) di caratteri
ASCII. Una frase tra parentesi angolari (<...>
) da una
descrizione informale del simbolo definito; per esempio, questo può
essere utilizzato nel descrivere la nozione di "carattere di
controllo", se necessario.
Anche se la notazione utilizzata è pressoché la stessa, c'è una grande differenza tra il significato delle definizioni lessicali e quelle sintattiche: una definizione lessicale opera su caratteri individuali del sorgente in input, mentre una definizione sintattica opera sulla sequenza di token generati dall'analisi lessicale. Tutti gli utilizzi di BNF nel prossimo capitolo (``Analisi Lessicale'') sono definizioni lessicali; quelle nei capitoli successivi sono definizioni sintattiche.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.