Questo è un po 'come una versione concreta della domanda In arrivo con i token per un lexer .
Sto scrivendo un lexer per un piccolo sottoinsieme di HTML. Mi chiedo che cosa dovrei fare quando il flusso di input termina e sono in uno stato in cui ho riconosciuto correttamente un token, ma so che sarà un errore di sintassi.
Sottolineo "lo so" perché questo è l'essere umano che conosco, perché sono consapevole delle regole grammaticali che sono "regole del parser" (rispetto alle "regole del lexer"). So che questo non è corretto: <b>hello</b
, ma non c'è nulla che impedisca al lexer di emettere quanto segue.
Token: BEGIN-OPEN-TAG
Token: TAG-NAME Value: b
Token: END-TAG
Token: DATA Value: hello
Token: BEGIN-CLOSE-TAG
Token: TAG-NAME Value: b
Quindi parser prenderebbe questo come un errore e lo segnalerà. La ragione per cui so che posso lanciare un errore prima è solo perché sono a conoscenza del parser e delle regole definite lì. Ottengo dei vantaggi dal contrassegnare questo come sequenza di token non valida, o dovrei provare a mantenere tale logica lontana dal lexer? Quando dovrebbe mai un lexer emettere un errore?
Dovrebbe consentire <b<hello</b>
allora? Come dovrebbe un lexer gestire un <
casuale nel mezzo del testo: The \lt sign is <b><</b>
? Tornando indietro? O dovrei registrarlo come [data] [<] [tagname] [>] [<] [</] [tagname] [>]
e poi far sapere al parser che [<]
è valido nel mezzo dei dati?
Quanto sopra non sono domande su cui mi aspetto una risposta, ma più di "se decido sulla domanda di cui sopra, allora è un abisso di linee più sfocate, motivo per cui ho tutti questi dubbi". Sto attraversando un periodo difficile per decidere a cosa dovrebbe interessare il lexer. Se lo faccio preoccupare troppo, sto creando un parser allo stesso tempo. Se non lo faccio abbastanza, sto praticamente facendo una procedura "split at whitespace".