   dup >r ?head-slice [
     r> <parse-result> 
   ] [
-    r> 2drop f
+    drop input-slice "Expected token '" r> append "'" append add-error f
   ] if ;
 
 M: token-parser (compile) ( parser -- quot )

    input set
    0 pos set
    f lrstack set
    H{ } clone heads set
    H{ } clone packrat set
  ] H{ } make-assoc swap bind ; inline

USE: prettyprint

TUPLE: parse-result remaining ast ;
TUPLE: parse-error details ; 
TUPLE: error-details remaining message ;
TUPLE: parser id compiled ;
M: parser equal? [ id>> ] bi@ = ;

M: parser hashcode* id>> hashcode* ;

C: <parse-result>  parse-result
C: <error-details> error-details
C: <parser>        parser

SYMBOL: errors

: <parse-error> ( -- parse-error )
  V{ } clone parse-error boa ;

: add-error ( remaining message -- )
  errors get [  
    [ <error-details> ] [ details>> ] bi* push 
  ] [
    2drop
  ] if* ;
  
SYMBOL: ignore 

SYMBOL: packrat
SYMBOL: pos
