Cosa segue l'analisi lessicale?

2

Sto lavorando su un compilatore di giocattoli (per un linguaggio semplice come PL / 0) e ho il mio lexer attivo e funzionante. A questo punto dovrei iniziare a lavorare sulla costruzione dell'albero di analisi, ma prima di iniziare mi chiedevo: quante informazioni si possono raccogliere solo dalla stringa di token? Ecco cosa ho raccolto finora:

  1. Si può già fare l'evidenziazione della sintassi avendo solo la lista dei token. I numeri e gli operatori si colorano di conseguenza e anche le parole chiave.
  2. Anche l'autoformattazione (indentazione) dovrebbe essere possibile. Come? Specificare per ogni tipo di token quanti spazi bianchi o caratteri di nuova riga dovrebbero seguirlo. Inoltre, quando stampi token, modifica una variabile di allineamento (quando la stampante di codice legge "{" incrementa la variabile di allineamento di 1 e decrementa di 1 per "}". Ogni volta che inizia a stampare su una nuova riga, la stampante di codice si allineerà in base a questo variabile di allineamento)
  3. Nelle lingue senza subroutine nidificate si può ottenere un elenco completo di subroutine e la loro firma. Come? Basta leggere ciò che segue dopo la parola chiave "procedura" o "funzione" fino a quando non si preme il primo ")" (questo dovrebbe funzionare bene in un linguaggio Pascal senza subroutine nidificate)
  4. In linguaggi come Pascal puoi anche determinare le variabili locali ei loro tipi, dato che sono dichiarati in un posto speciale (ok, non puoi gestire anche l'inizializzazione, ma puoi analizzare sequenze come: "var a, b, c: intero ")
  5. Può anche essere possibile il rilevamento di funzioni ricorsive, o anche una rappresentazione grafica di quale subroutine chiama chi. Se si riesce a identificare il corpo di una funzione, si può anche cercare se ci sono menzioni di nomi di altre funzioni.
  6. Raccolta di statistiche sul codice, come il numero di linee, istruzioni, subroutine

EDIT: ho chiarito perché penso che alcuni processi siano possibili. Mentre leggo commenti e risposte mi rendo conto che la risposta dipende molto dal linguaggio che sto analizzando.

    
posta adrianton3 28.11.2012 - 14:53
fonte

1 risposta

2

Hai un piccolo problema con le tue definizioni lì. La formattazione automatica e la definizione della funzione ricorsiva (e persino il rilevamento di variabili) non dovrebbero essere possibili in un lexer, perché un lexer, per definizione, è lineare e privo di contesto. Il suo compito è leggere, identificare e convalidare un singolo token, e poi farlo di nuovo e ancora e ancora fino a raggiungere la fine del file, e il gioco è fatto.

Qualsiasi analisi ricorsiva e qualsiasi cosa che richieda lo stato di memorizzazione prima dell'inizio del token corrente va oltre lo scopo di un lexer e dovrebbe invece essere eseguita nel parser. Questa separazione delle preoccupazioni rende il tuo codice più pulito e meno probabile che contenga bug sottili e difficili da rintracciare.

    
risposta data 28.11.2012 - 15:08
fonte

Leggi altre domande sui tag