diff --git a/extra/peg/ebnf/ebnf-tests.factor b/extra/peg/ebnf/ebnf-tests.factor index 56f0d63445..13d0ce887e 100644 --- a/extra/peg/ebnf/ebnf-tests.factor +++ b/extra/peg/ebnf/ebnf-tests.factor @@ -51,4 +51,17 @@ IN: temporary } } [ "one two | three" 'choice' parse parse-result-ast +] unit-test + +{ + T{ ebnf-sequence f + V{ + T{ ebnf-non-terminal f "one" } + T{ ebnf-choice f + V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } } + } + } + } +} [ + "one (two | three)" 'choice' parse parse-result-ast ] unit-test \ No newline at end of file diff --git a/extra/peg/ebnf/ebnf.factor b/extra/peg/ebnf/ebnf.factor index 9723316b33..4a1d7b341b 100644 --- a/extra/peg/ebnf/ebnf.factor +++ b/extra/peg/ebnf/ebnf.factor @@ -95,8 +95,16 @@ DEFER: 'rhs' : 'element' ( -- parser ) 'non-terminal' 'terminal' 2array choice ; +DEFER: 'choice' + +: 'group' ( -- parser ) + "(" token sp hide + [ 'choice' sp ] delay + ")" token sp hide + 3array seq [ first ] action ; + : 'sequence' ( -- parser ) - 'element' sp + 'element' sp 'group' sp 2array choice repeat1 [ dup length 1 = [ first ] [ ] if ] action ;