[EBNF ... EBNF] now does an implicit call

db4
Chris Double 2008-07-04 12:32:02 +12:00
parent e47f944cca
commit 8aa7bc6d78
2 changed files with 65 additions and 64 deletions

View File

@ -113,142 +113,142 @@ IN: peg.ebnf.tests
] unit-test ] unit-test
{ V{ "a" "b" } } [ { V{ "a" "b" } } [
"ab" [EBNF foo='a' 'b' EBNF] call ast>> "ab" [EBNF foo='a' 'b' EBNF] ast>>
] unit-test ] unit-test
{ V{ 1 "b" } } [ { V{ 1 "b" } } [
"ab" [EBNF foo=('a')[[ drop 1 ]] 'b' EBNF] call ast>> "ab" [EBNF foo=('a')[[ drop 1 ]] 'b' EBNF] ast>>
] unit-test ] unit-test
{ V{ 1 2 } } [ { V{ 1 2 } } [
"ab" [EBNF foo=('a') [[ drop 1 ]] ('b') [[ drop 2 ]] EBNF] call ast>> "ab" [EBNF foo=('a') [[ drop 1 ]] ('b') [[ drop 2 ]] EBNF] ast>>
] unit-test ] unit-test
{ CHAR: A } [ { CHAR: A } [
"A" [EBNF foo=[A-Z] EBNF] call ast>> "A" [EBNF foo=[A-Z] EBNF] ast>>
] unit-test ] unit-test
{ CHAR: Z } [ { CHAR: Z } [
"Z" [EBNF foo=[A-Z] EBNF] call ast>> "Z" [EBNF foo=[A-Z] EBNF] ast>>
] unit-test ] unit-test
[ [
"0" [EBNF foo=[A-Z] EBNF] call "0" [EBNF foo=[A-Z] EBNF]
] must-fail ] must-fail
{ CHAR: 0 } [ { CHAR: 0 } [
"0" [EBNF foo=[^A-Z] EBNF] call ast>> "0" [EBNF foo=[^A-Z] EBNF] ast>>
] unit-test ] unit-test
[ [
"A" [EBNF foo=[^A-Z] EBNF] call "A" [EBNF foo=[^A-Z] EBNF]
] must-fail ] must-fail
[ [
"Z" [EBNF foo=[^A-Z] EBNF] call "Z" [EBNF foo=[^A-Z] EBNF]
] must-fail ] must-fail
{ V{ "1" "+" "foo" } } [ { V{ "1" "+" "foo" } } [
"1+1" [EBNF foo='1' '+' '1' [[ drop "foo" ]] EBNF] call ast>> "1+1" [EBNF foo='1' '+' '1' [[ drop "foo" ]] EBNF] ast>>
] unit-test ] unit-test
{ "foo" } [ { "foo" } [
"1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] EBNF] call ast>> "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] EBNF] ast>>
] unit-test ] unit-test
{ "foo" } [ { "foo" } [
"1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call ast>> "1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] ast>>
] unit-test ] unit-test
{ "bar" } [ { "bar" } [
"1-1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] call ast>> "1-1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF] ast>>
] unit-test ] unit-test
{ 6 } [ { 6 } [
"4+2" [EBNF num=[0-9] => [[ digit> ]] foo=num:x '+' num:y => [[ x y + ]] EBNF] call ast>> "4+2" [EBNF num=[0-9] => [[ digit> ]] foo=num:x '+' num:y => [[ x y + ]] EBNF] ast>>
] unit-test ] unit-test
{ 6 } [ { 6 } [
"4+2" [EBNF foo=[0-9]:x '+' [0-9]:y => [[ x digit> y digit> + ]] EBNF] call ast>> "4+2" [EBNF foo=[0-9]:x '+' [0-9]:y => [[ x digit> y digit> + ]] EBNF] ast>>
] unit-test ] unit-test
{ 10 } [ { 10 } [
{ 1 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF] call ast>> { 1 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF] ast>>
] unit-test ] unit-test
[ [
{ "a" 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF] call { "a" 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF]
] must-fail ] must-fail
{ 3 } [ { 3 } [
{ 1 2 "a" 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF] call ast>> { 1 2 "a" 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF] ast>>
] unit-test ] unit-test
[ [
"ab" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call "ab" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF]
] must-fail ] must-fail
{ V{ "a" " " "b" } } [ { V{ "a" " " "b" } } [
"a b" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>> "a b" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "\t" "b" } } [ { V{ "a" "\t" "b" } } [
"a\tb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>> "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "\n" "b" } } [ { V{ "a" "\n" "b" } } [
"a\nb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] call ast>> "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" f "b" } } [ { V{ "a" f "b" } } [
"ab" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>> "ab" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" " " "b" } } [ { V{ "a" " " "b" } } [
"a b" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>> "a b" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "\t" "b" } } [ { V{ "a" "\t" "b" } } [
"a\tb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>> "a\tb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "\n" "b" } } [ { V{ "a" "\n" "b" } } [
"a\nb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] call ast>> "a\nb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "b" } } [ { V{ "a" "b" } } [
"ab" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>> "ab" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "b" } } [ { V{ "a" "b" } } [
"a\tb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>> "a\tb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "b" } } [ { V{ "a" "b" } } [
"a\nb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call ast>> "a\nb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] ast>>
] unit-test ] unit-test
[ [
"axb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF] call "axb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF]
] must-fail ] must-fail
{ V{ V{ 49 } "+" V{ 49 } } } [ { V{ V{ 49 } "+" V{ 49 } } } [
#! Test direct left recursion. #! Test direct left recursion.
#! Using packrat, so first part of expr fails, causing 2nd choice to be used #! Using packrat, so first part of expr fails, causing 2nd choice to be used
"1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call ast>> "1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] ast>>
] unit-test ] unit-test
{ V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [ { V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [
#! Test direct left recursion. #! Test direct left recursion.
#! Using packrat, so first part of expr fails, causing 2nd choice to be used #! Using packrat, so first part of expr fails, causing 2nd choice to be used
"1+1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] call ast>> "1+1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF] ast>>
] unit-test ] unit-test
{ V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [ { V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [
#! Test indirect left recursion. #! Test indirect left recursion.
#! Using packrat, so first part of expr fails, causing 2nd choice to be used #! Using packrat, so first part of expr fails, causing 2nd choice to be used
"1+1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] call ast>> "1+1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF] ast>>
] unit-test ] unit-test
{ t } [ { t } [
@ -303,85 +303,85 @@ main = Primary
'ebnf' compile must-infer 'ebnf' compile must-infer
{ V{ V{ "a" "b" } "c" } } [ { V{ V{ "a" "b" } "c" } } [
"abc" [EBNF a="a" "b" foo=(a "c") EBNF] call ast>> "abc" [EBNF a="a" "b" foo=(a "c") EBNF] ast>>
] unit-test ] unit-test
{ V{ V{ "a" "b" } "c" } } [ { V{ V{ "a" "b" } "c" } } [
"abc" [EBNF a="a" "b" foo={a "c"} EBNF] call ast>> "abc" [EBNF a="a" "b" foo={a "c"} EBNF] ast>>
] unit-test ] unit-test
{ V{ V{ "a" "b" } "c" } } [ { V{ V{ "a" "b" } "c" } } [
"abc" [EBNF a="a" "b" foo=a "c" EBNF] call ast>> "abc" [EBNF a="a" "b" foo=a "c" EBNF] ast>>
] unit-test ] unit-test
[ [
"a bc" [EBNF a="a" "b" foo=(a "c") EBNF] call "a bc" [EBNF a="a" "b" foo=(a "c") EBNF]
] must-fail ] must-fail
[ [
"a bc" [EBNF a="a" "b" foo=a "c" EBNF] call "a bc" [EBNF a="a" "b" foo=a "c" EBNF]
] must-fail ] must-fail
[ [
"a bc" [EBNF a="a" "b" foo={a "c"} EBNF] call "a bc" [EBNF a="a" "b" foo={a "c"} EBNF]
] must-fail ] must-fail
[ [
"ab c" [EBNF a="a" "b" foo=a "c" EBNF] call "ab c" [EBNF a="a" "b" foo=a "c" EBNF]
] must-fail ] must-fail
{ V{ V{ "a" "b" } "c" } } [ { V{ V{ "a" "b" } "c" } } [
"ab c" [EBNF a="a" "b" foo={a "c"} EBNF] call ast>> "ab c" [EBNF a="a" "b" foo={a "c"} EBNF] ast>>
] unit-test ] unit-test
[ [
"ab c" [EBNF a="a" "b" foo=(a "c") EBNF] call "ab c" [EBNF a="a" "b" foo=(a "c") EBNF]
] must-fail ] must-fail
[ [
"a b c" [EBNF a="a" "b" foo=a "c" EBNF] call "a b c" [EBNF a="a" "b" foo=a "c" EBNF]
] must-fail ] must-fail
[ [
"a b c" [EBNF a="a" "b" foo=(a "c") EBNF] call "a b c" [EBNF a="a" "b" foo=(a "c") EBNF]
] must-fail ] must-fail
[ [
"a b c" [EBNF a="a" "b" foo={a "c"} EBNF] call "a b c" [EBNF a="a" "b" foo={a "c"} EBNF]
] must-fail ] must-fail
{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [ { V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
"ab cab c" [EBNF a="a" "b" foo={a "c"}* EBNF] call ast>> "ab cab c" [EBNF a="a" "b" foo={a "c"}* EBNF] ast>>
] unit-test ] unit-test
{ V{ } } [ { V{ } } [
"ab cab c" [EBNF a="a" "b" foo=(a "c")* EBNF] call ast>> "ab cab c" [EBNF a="a" "b" foo=(a "c")* EBNF] ast>>
] unit-test ] unit-test
{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [ { V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
"ab c ab c" [EBNF a="a" "b" foo={a "c"}* EBNF] call ast>> "ab c ab c" [EBNF a="a" "b" foo={a "c"}* EBNF] ast>>
] unit-test ] unit-test
{ V{ } } [ { V{ } } [
"ab c ab c" [EBNF a="a" "b" foo=(a "c")* EBNF] call ast>> "ab c ab c" [EBNF a="a" "b" foo=(a "c")* EBNF] ast>>
] unit-test ] unit-test
{ V{ "a" "a" "a" } } [ { V{ "a" "a" "a" } } [
"aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF] call ast>> "aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF] ast>>
] unit-test ] unit-test
{ t } [ { t } [
"aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF] call ast>> "aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF] ast>>
"aaa" [EBNF a=('a')* b=!('b') (a):x => [[ x ]] EBNF] call ast>> = "aaa" [EBNF a=('a')* b=!('b') (a):x => [[ x ]] EBNF] ast>> =
] unit-test ] unit-test
{ V{ "a" "a" "a" } } [ { V{ "a" "a" "a" } } [
"aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF] call ast>> "aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF] ast>>
] unit-test ] unit-test
{ t } [ { t } [
"aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF] call ast>> "aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF] ast>>
"aaa" [EBNF a=('a')* b=(a):x => [[ x ]] EBNF] call ast>> = "aaa" [EBNF a=('a')* b=(a):x => [[ x ]] EBNF] ast>> =
] unit-test ] unit-test
{ t } [ { t } [
@ -445,11 +445,11 @@ foo=<foreign any-char> 'd'
] unit-test ] unit-test
{ t } [ { t } [
"USING: kernel peg.ebnf ; [EBNF foo='a' '\n' => [[ drop \"\n\" ]] EBNF]" eval drop t "USING: kernel peg.ebnf ; \"a\\n\" [EBNF foo='a' '\n' => [[ drop \"\n\" ]] EBNF]" eval drop t
] unit-test ] unit-test
[ [
"USING: peg.ebnf ; [EBNF foo='a' foo='b' EBNF]" eval drop "USING: peg.ebnf ; \"ab\" [EBNF foo='a' foo='b' EBNF]" eval drop
] must-fail ] must-fail
{ t } [ { t } [
@ -460,7 +460,7 @@ foo=<foreign any-char> 'd'
#! Tokenizer tests #! Tokenizer tests
{ V{ "a" CHAR: b } } [ { V{ "a" CHAR: b } } [
"ab" [EBNF tokenizer=default foo="a" . EBNF] call ast>> "ab" [EBNF tokenizer=default foo="a" . EBNF] ast>>
] unit-test ] unit-test
TUPLE: ast-number value ; TUPLE: ast-number value ;
@ -488,7 +488,7 @@ Tok = Spaces (Number | Special )
tokenizer = <foreign a-tokenizer Tok> foo=. tokenizer = <foreign a-tokenizer Tok> foo=.
tokenizer=default baz=. tokenizer=default baz=.
main = bar foo foo baz main = bar foo foo baz
EBNF] call ast>> EBNF] ast>>
] unit-test ] unit-test
{ V{ CHAR: 5 "+" CHAR: 2 } } [ { V{ CHAR: 5 "+" CHAR: 2 } } [
@ -499,7 +499,7 @@ Tok = Spaces (Number | Special )
spaces=space* => [[ ignore ]] spaces=space* => [[ ignore ]]
tokenizer=spaces (number | operator) tokenizer=spaces (number | operator)
main= . . . main= . . .
EBNF] call ast>> EBNF] ast>>
] unit-test ] unit-test
{ V{ CHAR: 5 "+" CHAR: 2 } } [ { V{ CHAR: 5 "+" CHAR: 2 } } [
@ -510,13 +510,13 @@ Tok = Spaces (Number | Special )
spaces=space* => [[ ignore ]] spaces=space* => [[ ignore ]]
tokenizer=spaces (number | operator) tokenizer=spaces (number | operator)
main= . . . main= . . .
EBNF] call ast>> EBNF] ast>>
] unit-test ] unit-test
{ "++" } [ { "++" } [
"++--" [EBNF tokenizer=("++" | "--") main="++" EBNF] call ast>> "++--" [EBNF tokenizer=("++" | "--") main="++" EBNF] ast>>
] unit-test ] unit-test
{ "\\" } [ { "\\" } [
"\\" [EBNF foo="\\" EBNF] call ast>> "\\" [EBNF foo="\\" EBNF] ast>>
] unit-test ] unit-test

View File

@ -523,7 +523,8 @@ M: ebnf-non-terminal (transform) ( ast -- parser )
parse-result-ast transform dup dup parser [ main swap at compile ] with-variable parse-result-ast transform dup dup parser [ main swap at compile ] with-variable
[ compiled-parse ] curry [ with-scope ] curry ; [ compiled-parse ] curry [ with-scope ] curry ;
: [EBNF "EBNF]" reset-tokenizer parse-multiline-string ebnf>quot nip parsed reset-tokenizer ; parsing : [EBNF "EBNF]" reset-tokenizer parse-multiline-string ebnf>quot nip
parsed \ call parsed reset-tokenizer ; parsing
: EBNF: : EBNF:
reset-tokenizer CREATE-WORD dup ";EBNF" parse-multiline-string reset-tokenizer CREATE-WORD dup ";EBNF" parse-multiline-string