2015-09-27 21 views
5

Mi chiedevo se c'è un modo per ottenere te ingresso rimanente da Parsec dopo si ferma l'analisi, o se è stato un parse esito positivo o negativo, forse questa firma:ricevere input sinistro di Parsec

parseRemaining :: Stream s Identity t => Parsec s() a -> SourceName -> s -> (s, Either ParseError a) 

dove otteniamo invece di un Either ParseError a, abbiamo inoltre ottiene il restante Stream s

+1

Considerare l'utilizzo di attoparsec, è molto più veloce e supporta corrispondenze parziali. – arrowd

+0

Non sto analizzando file di grandi dimensioni o qualcosa del genere e, a quanto ho capito, Parsec offre un'interfaccia * più semplice *. Uso Parsec a causa di [questa risposta] (http://stackoverflow.com/a/19213247/1276441) – chamini2

risposta

0

Date un'occhiata a Megaparsec - una forchetta moderna di Parsec, a partire dalla versione 4.2.0 permette di fornire stato personalizzato all'inizio del parsing ed estrae lo stato del parser alla fine (è non importa se il parser ha esito positivo o negativo). Questo permette di analizzare parzialmente ingresso, riprendere l'analisi, specificare la posizione iniziale testuale non standard, , etc. runParser' e runParserT'.


Disclosure: sono uno degli autori di Megaparsec.

+0

Sono stato io a chiedere questa funzione, la sto usando. – chamini2

1

è possibile utilizzare getInput, che è un parser che restituisce l'ingresso rimanente.

+0

Ciò funzionerebbe per ottenere l'input solo su analisi che hanno esito positivo. Mi piacerebbe un modo per ottenere l'input in entrambi i casi. – chamini2

0

Ho scavato un po 'negli interni di Parsec e non sono riuscito a trovare un modo semplice per recuperare le informazioni di stato (che contiene lo stream).

Una soluzione ad hoc sarebbe esaminare l'errore ricevuto e quindi utilizzare le informazioni sulla posizione per dedurre dove si era interrotto l'analisi. (Naturalmente, questo dovrebbe funzionare solo se il flusso supporta la ricerca di.)

Problemi correlati