add optional parser

release
Chris Double 2007-11-21 15:50:47 +13:00
parent e9df13dad5
commit ffa71ef86f
2 changed files with 21 additions and 1 deletions

View File

@ -93,3 +93,15 @@ IN: temporary
{ V{ "a" "a" "a" } } [
"aaab" 0 <parse-state> "a" token repeat1 parse parse-result-ast
] unit-test
{ V{ "a" "b" } } [
"ab" 0 <parse-state> "a" token optional "b" token 2array seq parse parse-result-ast
] unit-test
{ V{ f "b" } } [
"b" 0 <parse-state> "a" token optional "b" token 2array seq parse parse-result-ast
] unit-test
{ f } [
"cb" 0 <parse-state> "a" token optional "b" token 2array seq parse
] unit-test

View File

@ -136,7 +136,15 @@ M: repeat0-parser parse ( state parser -- result )
TUPLE: repeat1-parser p1 ;
M: repeat1-parser parse ( state parser -- result )
repeat1-parser-p1 tuck parse dup [ clone-result (repeat-parser) ] [ nip ] if ;
repeat1-parser-p1 tuck parse dup [ clone-result (repeat-parser) ] [ nip ] if ;
: repeat1 ( parser -- parser )
repeat1-parser construct-boa init-parser ;
TUPLE: optional-parser p1 ;
M: optional-parser parse ( state parser -- result )
dupd optional-parser-p1 parse swap f <parse-result> or ;
: optional ( parser -- parser )
optional-parser construct-boa init-parser ;