]> gitweb.factorcode.org Git - factor.git/commitdiff
Throw error on failed parse, returning relevant error information
authorChris Double <chris@bethia.(none)>
Wed, 25 Jun 2008 01:14:15 +0000 (13:14 +1200)
committerChris Double <chris@bethia.(none)>
Thu, 10 Jul 2008 01:56:05 +0000 (13:56 +1200)
extra/peg/peg.factor

index 54c25778de8857ab060de057965f45387280d359..0d0d8ed72c4fda6e5cf5888b0f7f5467cb3b3112 100755 (executable)
@@ -9,19 +9,30 @@ IN: peg
 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: <parser> parser
+C: <parse-result>  parse-result
+C: <error-details> error-details
+C: <parser>        parser
 
-SYMBOL: ignore 
+SYMBOL: errors
+
+: <parse-error> ( -- parse-error )
+  V{ } clone parse-error boa ;
 
-: <parse-result> ( remaining ast -- parse-result )
-  parse-result boa ;
+: add-error ( remaining message -- )
+  errors get [  
+    [ <error-details> ] [ details>> ] bi* push 
+  ] [
+    2drop
+  ] if* ;
+  
+SYMBOL: ignore 
 
 SYMBOL: packrat
 SYMBOL: pos
@@ -207,6 +218,7 @@ C: <head> peg-head
     input set
     0 pos set
     f lrstack set
+    <parse-error> errors set
     H{ } clone heads set
     H{ } clone packrat set
   ] H{ } make-assoc swap bind ; inline
@@ -257,7 +269,7 @@ SYMBOL: delayed
   ] with-compilation-unit ;
 
 : compiled-parse ( state word -- result )
-  swap [ execute ] with-packrat ; inline 
+  swap [ execute [ errors get throw ] unless* ] with-packrat ; inline 
 
 : parse ( input parser -- result )
   dup word? [ compile ] unless compiled-parse ;
@@ -288,7 +300,7 @@ TUPLE: token-parser symbol ;
   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 )