2015-03-27 8 views
43

Ho un parser che è stato scritto usando RegexParsers di Scala - linkScala PackratParser ignora fallimento parser

aveva alcuni seri problemi di prestazioni durante l'analisi di una grammatica che aveva espressioni profondamente nidificate. Come tale ho creato una versione in cui mixo in Scala PackratParsers - link

La versione di Packrat non presenta lo stesso problema di prestazioni e analizza correttamente la grammatica. Tuttavia, quando fornisco una grammatica non valida per il test, ad es. this

Il vecchio parser (non packrat) utilizzato per segnalare correttamente il fallimento 'regola non valido', tramite il fallimento parser combinatore | failure("Invalid rule") qui - link

Quando si utilizza la versione packrat-parser, se abilito Tracing Riesco a vedere dalla traccia che l'errore è stato creato proprio come nella versione non packrat, tuttavia PackratParser sembra ignorarlo e restituire sempre failure: Base Failure.

C'è qualcosa di diverso nella gestione degli errori quando si usano PackratParsers che devo capire?

risposta

1

Sembra che sia necessario utilizzare err("Invalid rule") anziché failure, in quanto garantisce che non verrà eseguito alcun backtracking.

+0

Se uso 'err (" Regola invalida ")' invece di 'fallimento (" Regola invalida ")' allora perché il backtracking si è fermato, molte delle mie altre regole che erano in precedenza valide iniziano a restituire 'err (" Regola non valida ") 'che non è corretto. – adamretter

Problemi correlati