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
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
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. –
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