diff --git a/extra/peg/peg-tests.factor b/extra/peg/peg-tests.factor index 82d993af3c..b10fcb8e55 100644 --- a/extra/peg/peg-tests.factor +++ b/extra/peg/peg-tests.factor @@ -93,3 +93,15 @@ IN: temporary { V{ "a" "a" "a" } } [ "aaab" 0 "a" token repeat1 parse parse-result-ast ] unit-test + +{ V{ "a" "b" } } [ + "ab" 0 "a" token optional "b" token 2array seq parse parse-result-ast +] unit-test + +{ V{ f "b" } } [ + "b" 0 "a" token optional "b" token 2array seq parse parse-result-ast +] unit-test + +{ f } [ + "cb" 0 "a" token optional "b" token 2array seq parse +] unit-test \ No newline at end of file diff --git a/extra/peg/peg.factor b/extra/peg/peg.factor index 4a43c1b965..e2f0cfd1b2 100644 --- a/extra/peg/peg.factor +++ b/extra/peg/peg.factor @@ -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 or ; + +: optional ( parser -- parser ) + optional-parser construct-boa init-parser ;