2013-04-19 8 views
10

Sto scrivendo un parser a due passaggi in cui prima scrivo il testo in token (utilizzando Alex) quindi analizzo quei token (utilizzando Parsec). Tutto bene finché non ho provato ad aggiungere le informazioni sulla posizione ai token per poter scrivere un buon messaggio di errore.Tracking Position quando i token di digitalizzazione complica Parser

Inizialmente ho avuto:

data Token = TAtom | TString String | TInt Integer | TFloat [...] 

Mi sembra possibile aggiungere un elemento Position ad ogni Token costruttore o di creare un nuovo tipo come data TokenWithPosition = T Token Position.

Ho avviato il secondo percorso, ma ora ho il problema di dover creare un TokenWithPosition con una posizione falsa quando voglio descrivere un token in Parsec, o devo scartare lo TokenWithPosition ogni volta che voglio fare un confronto In breve, la mia bella grammatica pulita è stata invasa dal codice necessario per ignorare le informazioni sulla posizione.

Quindi la mia domanda: esiste un modo pulito per tenere traccia delle informazioni sulla posizione senza complicare il parser nel secondo passaggio? Questo sembra qualcosa che avrebbe una soluzione standard.

risposta

3

È necessario utilizzare le funzioni da Text.Parsec.Prim (ad esempio, tokenPrim) per implementare i propri "parser primitivi".

Questi parser primitivi aggiorneranno lo stato interno di Parsec con le informazioni sulla posizione e restituiranno un puro Token senza la posizione.