È necessario che una fase di valutazione per un lexer funzioni correttamente?

4

Wikipedia dice che il processo lessicale è spesso diviso in due fasi. Il processo di scansione e il processo di valutazione. Wikipedia definisce:

  • Il processo di scansione come:

    The first stage, the scanner, is usually based on a finite-state machine (FSM). It has encoded within it information on the possible sequences of characters that can be contained within any of the tokens it handles (individual instances of these character sequences are known as lexemes).

  • E il processo di valutazione con questa definizione:

    A lexeme, however, is only a string of characters known to be of a certain kind (e.g., a string literal, a sequence of letters). In order to construct a token, the lexical analyzer needs a second stage, the evaluator, which goes over the characters of the lexeme to produce a value.

In un primo momento, le definizioni di cui sopra sembravano fare una netta distinzione tra i due processi, ma più ne ho letto su questi, più sembrano fondersi insieme.

La mia comprensione è che il primo stadio, lo scanner, viene utilizzato per interrompere il programma di origine raw, in "blocchi" significativi. Questo ovviamente significa che lo scanner avrebbe bisogno di avere un modo, in cui capire quando e dove dividere il programma sorgente.

Wikipedia spiega in qualche modo come ciò è realizzato:

It has encoded within it information on the possible sequences of characters that can be contained within any of the tokens it handles (individual instances of these character sequences are known as lexemes). [...] In many cases, the first non-whitespace character can be used to deduce the kind of token that follows and subsequent input characters are then processed one at a time until reaching a character that is not in the set of characters acceptable for that token (this is known as the maximal munch rule, or longest match rule).

La parte in grassetto sembra affermare che lo scanner ha delle regole. E in base a quelle regole, è in grado di separare correttamente il programma sorgente in lessemi. Mi sembra però che lo scanner sia perfettamente in grado di svolgere il lavoro della fase di valutazione con relativa facilità.

Supponiamo che uno scanner abbia attraversato un programma sorgente e dividi il programma sorgente in lessemi classificati in base al tipo di carattere corrente letto dal programma sorgente. Ciò significa che lo scanner conosce già tipo del lessema corrente dalla conoscenza del tipo del carattere corrente che ha letto e ha l'abilità di creare un token dal lexeme.

Supponendo la validità della mia logica, perché non si dovrebbe progettare il lexer in modo tale che lo scanner vada avanti e classifica i lessemi che crea, invece di passarlo allo stadio separato? O forse ho un'idea sbagliata di che cosa è ogni fase?

    
posta Christian Dean 04.12.2016 - 03:13
fonte

1 risposta

6

why would one not design their lexer in such a way, so that the scanner goes ahead and classifies the lexemes it creates, instead of passing it to separate stage?

Non dobbiamo prendere queste fasi così letteralmente. Logicamente è un'operazione separata per valutare il lessema ora conoscendo la vera classificazione. Tuttavia, hai ragione nel senso che uno scanner può costruire il prossimo token direttamente dal lexeme classificato, e senza dover necessariamente creare un flusso di lessemi e un secondo stadio.

Si noti inoltre che uno scanner non è strettamente necessario, un parser può operare direttamente sul testo e sarebbe simile: avendo classificato alcuni input per mezzo del riconoscimento usando le sue regole grammaticali di produzione, valuta il valore sul posto per costruirne (sintassi) albero di sintassi.

    
risposta data 04.12.2016 - 04:11
fonte

Leggi altre domande sui tag