2013-05-29 15 views
5

Sto facendo un analizzatore lessicale di base in Java per il mio progetto semestrale e sono in conflitto su un concetto con il mio insegnante di materia.La stringa "1a" è un errore per l'analizzatore lessicale o no?

mia opinione è che, in generale, se un ingresso come "1 bis" è dato a analizzatore lessicale allora dovrebbe dare uscita come:

"<Number><Identifier>"

Ma, il mio insegnante dice che dovrebbe segnalare questo come un errore perché invece di trattarlo come un numero e un identificatore dovrebbe segnalare l'intera stringa (cioè "1a") come un errore. Questo perché (come lui dice) gli identificatori non possono iniziare con un numero.

Al contrario, penso che questa dovrebbe essere la responsabilità della fase successiva del compilatore (analizzatore di sintassi) per decidere se qualcosa è un identificatore valido o meno. So che ha ragione riguardo agli identificatori che non iniziano con un numero, ma ho bisogno di una chiusura da parte dell'analizzatore lessicale che dovrebbe decidere chi.

Apprezzerò molto il vostro aiuto. Grazie

risposta

3

Un analizzatore lessicale deve occuparsi di quali tipi di token sono legali o meno e dividere il testo in token. Errore se una stringa non può formare un token valido.

L'analizzatore di sintassi tratta solo la struttura del programma una volta determinati i token. Darà un errore se i token non possono essere analizzati secondo la grammatica data.

Quindi il tuo insegnante ha ragione. Determinare se un identificatore è legale rientra nell'analisi lessicale.

+0

Perché l'analizzatore lessicale non può leggere '1' e quindi si ferma a 'a' flag '1' come numero e quindi ricomincia e legge 'a' e lo contrassegna come identificatore. Non c'è un separatore qui per la NFA che tratta i numeri? – Cheeta

+0

Direi che la tokenizzazione avviene con separatori predefiniti, solitamente con spazi. Affinché l'analizzatore lessicale separi la stringa in 1 e a avremo bisogno di definire regole aggiuntive per farlo. Penso che ciò che il tuo insegnante ha in mente è che 1a è un token e poiché non corrisponde ad un'espressione regolare per un identificatore, l'analizzatore lessicale darà un errore. –

+0

Dipende da come viene scritto l'analizzatore lessicale. Usando flex è in realtà molto facile generare un analizzatore lessicale che analizzerebbe 1a come un numero seguito da un identificatore. – Eelke

-1

non posso fornire un contributo sulle questioni filosofia-di-lessici, ma posso fornire una risposta per come si dovrebbe codificare il vostro progetto:

codice come egli suggerisce, se si vuole ottenere una A.

+0

Direi che è bello discutere, anche se si finisce per sbagliare o la tua opinione non corrisponde alle specifiche del progetto. In quale altro modo possiamo imparare? Downvoted perché questa è una risposta davvero non necessaria, e avrebbe dovuto essere un commento se detto affatto. –

0

Il motivo è che le lingue usano spesso postfix sui numeri, come 1L in C è il valore 1 di tipo long invece del tipo predefinito int. Inoltre, vuoi essere in grado di aggiungere postfix in seguito in una lingua. Considera il tuo 1a. In primo luogo questo sarebbe analizzato come valore int 1 seguito da un identificatore a. Ma ora il creatore del tuo compilatore decide di iniziare a usare come postfix sui numeri. All'improvviso 1a diventa un singolo token.

Per 1a c'è anche un caso speciale che è che 1a potrebbe essere inteso come un numero esadecimale ma si è dimenticato di inserire il suffisso/prefisso richiesto 0x1a per C o 1ah per alcune versioni assembler.

0

Rilevare questo nel parser funziona solo per le grammatiche in cui un numero seguito da un identificatore risulta essere sintatticamente non valido. Se 1 a era una sintassi valida nella tua lingua, dovresti avere per gestirlo nel lexer perché il parser non è in grado di distinguere tra 1a (senza spazi) e 1 a (con spazi bianchi).

Perché non fare questo nel lexer? Il compito del lexer è di semplificare il lavoro del parser. Qualsiasi lavoro che possa fare per semplificare il parser senza aggiungere molta complessità al lexer stesso è una buona idea.