2007-11-27 00:13:36 -05:00
|
|
|
! Copyright (C) 2007 Chris Double.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
|
|
!
|
2009-10-19 07:01:20 -04:00
|
|
|
USING: kernel tools.test peg peg.ebnf peg.ebnf.private words
|
|
|
|
math math.parser sequences accessors peg.parsers parser
|
2016-03-31 02:29:48 -04:00
|
|
|
namespaces arrays strings eval unicode multiline ;
|
2008-03-01 17:00:45 -05:00
|
|
|
IN: peg.ebnf.tests
|
2007-11-27 00:13:36 -05:00
|
|
|
|
|
|
|
{ T{ ebnf-non-terminal f "abc" } } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"abc" non-terminal-parser parse
|
2007-11-27 00:13:36 -05:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ T{ ebnf-terminal f "55" } } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"'55'" terminal-parser parse
|
2007-11-27 00:13:36 -05:00
|
|
|
] unit-test
|
|
|
|
|
2007-11-27 16:28:28 -05:00
|
|
|
{
|
2015-07-02 13:34:01 -04:00
|
|
|
T{ ebnf-rule f
|
2007-11-27 19:05:53 -05:00
|
|
|
"digit"
|
2008-03-19 10:05:40 -04:00
|
|
|
T{ ebnf-choice f
|
|
|
|
V{ T{ ebnf-terminal f "1" } T{ ebnf-terminal f "2" } }
|
2007-11-27 16:28:28 -05:00
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 16:28:28 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"digit = '1' | '2'" rule-parser parse
|
2007-11-27 16:28:28 -05:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{
|
2015-07-02 13:34:01 -04:00
|
|
|
T{ ebnf-rule f
|
|
|
|
"digit"
|
2008-03-19 10:05:40 -04:00
|
|
|
T{ ebnf-sequence f
|
|
|
|
V{ T{ ebnf-terminal f "1" } T{ ebnf-terminal f "2" } }
|
2007-11-27 16:28:28 -05:00
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 16:28:28 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"digit = '1' '2'" rule-parser parse
|
2007-11-27 21:14:11 -05:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{
|
|
|
|
T{ ebnf-choice f
|
2015-07-02 13:34:01 -04:00
|
|
|
V{
|
2007-11-27 21:14:11 -05:00
|
|
|
T{ ebnf-sequence f
|
|
|
|
V{ T{ ebnf-non-terminal f "one" } T{ ebnf-non-terminal f "two" } }
|
|
|
|
}
|
|
|
|
T{ ebnf-non-terminal f "three" }
|
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 21:14:11 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"one two | three" choice-parser parse
|
2007-11-27 21:26:25 -05:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{
|
|
|
|
T{ ebnf-sequence f
|
2015-07-02 13:34:01 -04:00
|
|
|
V{
|
2007-11-27 21:26:25 -05:00
|
|
|
T{ ebnf-non-terminal f "one" }
|
2008-04-28 22:15:05 -04:00
|
|
|
T{ ebnf-whitespace f
|
|
|
|
T{ ebnf-choice f
|
|
|
|
V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } }
|
|
|
|
}
|
2007-11-27 21:26:25 -05:00
|
|
|
}
|
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 21:26:25 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"one {two | three}" choice-parser parse
|
2007-11-27 21:32:04 -05:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{
|
|
|
|
T{ ebnf-sequence f
|
2015-07-02 13:34:01 -04:00
|
|
|
V{
|
2007-11-27 21:32:04 -05:00
|
|
|
T{ ebnf-non-terminal f "one" }
|
|
|
|
T{ ebnf-repeat0 f
|
|
|
|
T{ ebnf-sequence f
|
|
|
|
V{
|
|
|
|
T{ ebnf-choice f
|
|
|
|
V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } }
|
|
|
|
}
|
|
|
|
T{ ebnf-non-terminal f "four" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 21:32:04 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"one ((two | three) four)*" choice-parser parse
|
2007-11-27 21:49:14 -05:00
|
|
|
] unit-test
|
|
|
|
|
2011-06-06 19:32:19 -04:00
|
|
|
{
|
|
|
|
T{ ebnf-sequence f
|
2015-07-02 13:34:01 -04:00
|
|
|
V{
|
2011-06-06 19:32:19 -04:00
|
|
|
T{ ebnf-non-terminal f "one" }
|
|
|
|
T{ ebnf-ignore f
|
|
|
|
T{ ebnf-sequence f
|
|
|
|
V{
|
|
|
|
T{ ebnf-choice f
|
|
|
|
V{ T{ ebnf-non-terminal f "two" } T{ ebnf-non-terminal f "three" } }
|
|
|
|
}
|
|
|
|
T{ ebnf-non-terminal f "four" }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2011-06-06 19:32:19 -04:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"one ((two | three) four)~" choice-parser parse
|
2011-06-06 19:32:19 -04:00
|
|
|
] unit-test
|
|
|
|
|
2007-11-27 21:49:14 -05:00
|
|
|
{
|
|
|
|
T{ ebnf-sequence f
|
2015-07-02 13:34:01 -04:00
|
|
|
V{
|
|
|
|
T{ ebnf-non-terminal f "one" }
|
2007-11-27 21:49:14 -05:00
|
|
|
T{ ebnf-optional f T{ ebnf-non-terminal f "two" } }
|
|
|
|
T{ ebnf-non-terminal f "three" }
|
|
|
|
}
|
2015-07-02 13:34:01 -04:00
|
|
|
}
|
2007-11-27 21:49:14 -05:00
|
|
|
} [
|
2015-08-15 21:10:13 -04:00
|
|
|
"one ( two )? three" choice-parser parse
|
2007-11-27 21:49:14 -05:00
|
|
|
] unit-test
|
2008-03-19 00:34:28 -04:00
|
|
|
|
|
|
|
{ "foo" } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"\"foo\"" identifier-parser parse
|
2008-03-19 00:34:28 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "foo" } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"'foo'" identifier-parser parse
|
2008-03-19 00:34:28 -04:00
|
|
|
] unit-test
|
|
|
|
|
2015-08-24 17:41:02 -04:00
|
|
|
{ "\"" } [
|
|
|
|
"\"\\\"\"" identifier-parser parse
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "\\" } [
|
|
|
|
"\"\\\\\"" identifier-parser parse
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "AΣ𝄞" } [
|
|
|
|
"'\\x41\\u{greek-capital-letter-sigma}\\u01D11E'" identifier-parser parse
|
|
|
|
] unit-test
|
|
|
|
|
2008-03-19 00:34:28 -04:00
|
|
|
{ "foo" } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"foo" non-terminal-parser parse symbol>>
|
2008-03-19 00:34:28 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "foo" } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"foo]" non-terminal-parser parse symbol>>
|
2008-03-19 00:34:28 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-03-19 09:16:30 -04:00
|
|
|
{ V{ "a" "b" } } [
|
2015-07-02 13:34:01 -04:00
|
|
|
"ab" [EBNF foo='a' 'b' EBNF]
|
2008-03-19 09:16:30 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ 1 "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" [EBNF foo=('a')[[ drop 1 ]] 'b' EBNF]
|
2008-03-19 09:16:30 -04:00
|
|
|
] unit-test
|
2008-03-19 02:15:52 -04:00
|
|
|
|
2008-03-19 09:16:30 -04:00
|
|
|
{ V{ 1 2 } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" [EBNF foo=('a') [[ drop 1 ]] ('b') [[ drop 2 ]] EBNF]
|
2008-03-19 20:55:19 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ CHAR: A } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"A" [EBNF foo=[A-Z] EBNF]
|
2008-03-19 20:55:19 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ CHAR: Z } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"Z" [EBNF foo=[A-Z] EBNF]
|
2008-03-19 20:55:19 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"0" [EBNF foo=[A-Z] EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-03-19 20:55:19 -04:00
|
|
|
|
|
|
|
{ CHAR: 0 } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"0" [EBNF foo=[^A-Z] EBNF]
|
2008-03-19 20:55:19 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"A" [EBNF foo=[^A-Z] EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-03-19 20:55:19 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"Z" [EBNF foo=[^A-Z] EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-03-27 06:54:34 -04:00
|
|
|
|
2008-03-30 00:17:31 -04:00
|
|
|
{ V{ "1" "+" "foo" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1" [EBNF foo='1' '+' '1' [[ drop "foo" ]] EBNF]
|
2008-03-30 00:17:31 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "foo" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] EBNF]
|
2008-03-30 00:17:31 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "foo" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF]
|
2008-03-30 00:17:31 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "bar" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"1-1" [EBNF foo='1' '+' '1' => [[ drop "foo" ]] | '1' '-' '1' => [[ drop "bar" ]] EBNF]
|
2008-03-30 00:17:31 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-03-30 21:59:22 -04:00
|
|
|
{ 6 } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"4+2" [EBNF num=[0-9] => [[ digit> ]] foo=num:x '+' num:y => [[ x y + ]] EBNF]
|
2008-03-30 21:59:22 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ 6 } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"4+2" [EBNF foo=[0-9]:x '+' [0-9]:y => [[ x digit> y digit> + ]] EBNF]
|
2008-03-30 21:59:22 -04:00
|
|
|
] unit-test
|
2008-03-30 00:17:31 -04:00
|
|
|
|
2008-03-30 23:50:05 -04:00
|
|
|
{ 10 } [
|
2008-07-03 23:48:52 -04:00
|
|
|
{ 1 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF]
|
2008-03-30 23:50:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
{ "a" 2 3 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-03-30 23:50:05 -04:00
|
|
|
|
|
|
|
{ 3 } [
|
2008-07-03 23:48:52 -04:00
|
|
|
{ 1 2 "a" 4 } [EBNF num=. ?[ number? ]? list=list:x num:y => [[ x y + ]] | num EBNF]
|
2008-03-30 23:50:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"ab" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-01 19:59:12 -04:00
|
|
|
|
|
|
|
{ V{ "a" " " "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a b" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "\t" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\tb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "\n" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\nb" [EBNF -=" " | "\t" | "\n" foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" f "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" " " "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a b" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
|
|
|
|
{ V{ "a" "\t" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\tb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "\n" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\nb" [EBNF -=" " | "\t" | "\n" foo="a" (-)? "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\tb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a\nb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF]
|
2008-04-01 19:59:12 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"axb" [EBNF -=(" " | "\t" | "\n")? => [[ drop ignore ]] foo="a" - "b" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-01 19:59:12 -04:00
|
|
|
|
2015-07-02 13:34:01 -04:00
|
|
|
{ V{ V{ 49 } "+" V{ 49 } } } [
|
2015-09-08 19:15:10 -04:00
|
|
|
! Test direct left recursion.
|
|
|
|
! Using packrat, so first part of expr fails, causing 2nd choice to be used
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF]
|
2008-03-28 07:49:39 -04:00
|
|
|
] unit-test
|
2008-03-27 06:54:34 -04:00
|
|
|
|
2015-07-02 13:34:01 -04:00
|
|
|
{ V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [
|
2015-09-08 19:15:10 -04:00
|
|
|
! Test direct left recursion.
|
|
|
|
! Using packrat, so first part of expr fails, causing 2nd choice to be used
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1+1" [EBNF num=([0-9])+ expr=expr "+" num | num EBNF]
|
2008-03-28 09:51:49 -04:00
|
|
|
] unit-test
|
|
|
|
|
2015-07-02 13:34:01 -04:00
|
|
|
{ V{ V{ V{ 49 } "+" V{ 49 } } "+" V{ 49 } } } [
|
2015-09-08 19:15:10 -04:00
|
|
|
! Test indirect left recursion.
|
|
|
|
! Using packrat, so first part of expr fails, causing 2nd choice to be used
|
2008-07-03 23:48:52 -04:00
|
|
|
"1+1+1" [EBNF num=([0-9])+ x=expr expr=x "+" num | num EBNF]
|
2008-03-28 07:49:39 -04:00
|
|
|
] unit-test
|
2008-03-27 06:54:34 -04:00
|
|
|
|
2008-04-02 23:09:03 -04:00
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"abcd='9' | ('8'):x => [[ x ]]" ebnf-parser (parse) remaining>> empty?
|
2008-04-02 23:09:03 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-03-28 10:41:40 -04:00
|
|
|
EBNF: primary
|
|
|
|
Primary = PrimaryNoNewArray
|
2008-04-01 19:59:12 -04:00
|
|
|
PrimaryNoNewArray = ClassInstanceCreationExpression
|
2008-03-28 10:41:40 -04:00
|
|
|
| MethodInvocation
|
|
|
|
| FieldAccess
|
|
|
|
| ArrayAccess
|
|
|
|
| "this"
|
|
|
|
ClassInstanceCreationExpression = "new" ClassOrInterfaceType "(" ")"
|
|
|
|
| Primary "." "new" Identifier "(" ")"
|
|
|
|
MethodInvocation = Primary "." MethodName "(" ")"
|
|
|
|
| MethodName "(" ")"
|
|
|
|
FieldAccess = Primary "." Identifier
|
|
|
|
| "super" "." Identifier
|
2008-04-01 19:59:12 -04:00
|
|
|
ArrayAccess = Primary "[" Expression "]"
|
2008-03-28 10:41:40 -04:00
|
|
|
| ExpressionName "[" Expression "]"
|
|
|
|
ClassOrInterfaceType = ClassName | InterfaceTypeName
|
|
|
|
ClassName = "C" | "D"
|
|
|
|
InterfaceTypeName = "I" | "J"
|
|
|
|
Identifier = "x" | "y" | ClassOrInterfaceType
|
|
|
|
MethodName = "m" | "n"
|
|
|
|
ExpressionName = Identifier
|
|
|
|
Expression = "i" | "j"
|
|
|
|
main = Primary
|
2015-07-02 13:34:01 -04:00
|
|
|
;EBNF
|
2008-03-28 10:41:40 -04:00
|
|
|
|
|
|
|
{ "this" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"this" primary
|
2008-03-28 10:41:40 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "this" "." "x" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"this.x" primary
|
2008-03-28 10:41:40 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ "this" "." "x" } "." "y" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"this.x.y" primary
|
2008-03-28 10:41:40 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ "this" "." "x" } "." "m" "(" ")" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"this.x.m()" primary
|
2008-03-28 10:41:40 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ V{ "x" "[" "i" "]" } "[" "j" "]" } "." "y" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"x[i][j].y" primary
|
2008-03-28 10:41:40 -04:00
|
|
|
] unit-test
|
2008-04-14 06:42:45 -04:00
|
|
|
|
2008-04-28 20:37:26 -04:00
|
|
|
{ V{ V{ "a" "b" } "c" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"abc" [EBNF a="a" "b" foo=(a "c") EBNF]
|
2008-04-28 20:37:26 -04:00
|
|
|
] unit-test
|
|
|
|
|
2011-06-06 19:32:19 -04:00
|
|
|
{ V{ "a" "c" } } [
|
|
|
|
"abc" [EBNF a="a" "b"~ foo=(a "c") EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ "a" V{ "b" "b" } } "c" } } [
|
|
|
|
"abbc" [EBNF a=("a" "b"*) foo=(a "c") EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "c" } } [
|
|
|
|
"abc" [EBNF a=("a" ("b")~) foo=(a "c") EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "c" } } [
|
|
|
|
"abc" [EBNF a=("a" "b"~) foo=(a "c") EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "c" } [
|
|
|
|
"abc" [EBNF a=("a" "b")~ foo=(a "c") EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
2008-04-28 22:15:05 -04:00
|
|
|
{ V{ V{ "a" "b" } "c" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"abc" [EBNF a="a" "b" foo={a "c"} EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ "a" "b" } "c" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"abc" [EBNF a="a" "b" foo=a "c" EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"a bc" [EBNF a="a" "b" foo=(a "c") EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 20:37:26 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"a bc" [EBNF a="a" "b" foo=a "c" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 20:37:26 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2008-07-03 20:32:02 -04:00
|
|
|
"a bc" [EBNF a="a" "b" foo={a "c"} EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 20:37:26 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"ab c" [EBNF a="a" "b" foo=a "c" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 20:37:26 -04:00
|
|
|
|
|
|
|
{ V{ V{ "a" "b" } "c" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab c" [EBNF a="a" "b" foo={a "c"} EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"ab c" [EBNF a="a" "b" foo=(a "c") EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 22:15:05 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"a b c" [EBNF a="a" "b" foo=a "c" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 22:15:05 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"a b c" [EBNF a="a" "b" foo=(a "c") EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 20:37:26 -04:00
|
|
|
|
2008-06-29 22:32:20 -04:00
|
|
|
[
|
2015-07-02 13:34:01 -04:00
|
|
|
"a b c" [EBNF a="a" "b" foo={a "c"} EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] must-fail
|
2008-04-28 22:15:05 -04:00
|
|
|
|
|
|
|
{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab cab c" [EBNF a="a" "b" foo={a "c"}* EBNF]
|
2008-04-28 20:37:26 -04:00
|
|
|
] unit-test
|
2008-04-28 22:15:05 -04:00
|
|
|
|
|
|
|
{ V{ } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab cab c" [EBNF a="a" "b" foo=(a "c")* EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ V{ V{ "a" "b" } "c" } V{ V{ "a" "b" } "c" } } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab c ab c" [EBNF a="a" "b" foo={a "c"}* EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2011-06-06 19:32:19 -04:00
|
|
|
{ V{ V{ "a" "c" } V{ "a" "c" } } } [
|
|
|
|
"ab c ab c" [EBNF a="a" "b"~ foo={a "c"}* EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ } } [
|
|
|
|
"ab c ab c" [EBNF a="a" "b" foo=(a "c")* EBNF]
|
|
|
|
] unit-test
|
|
|
|
|
2008-04-28 22:15:05 -04:00
|
|
|
{ V{ } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab c ab c" [EBNF a="a" "b" foo=(a "c")* EBNF]
|
2008-04-28 22:15:05 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-16 01:39:14 -04:00
|
|
|
{ V{ "a" "a" "a" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF]
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"aaa" [EBNF a=('a')* b=!('b') a:x => [[ x ]] EBNF]
|
|
|
|
"aaa" [EBNF a=('a')* b=!('b') (a):x => [[ x ]] EBNF] =
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "a" "a" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF]
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"aaa" [EBNF a=('a')* b=a:x => [[ x ]] EBNF]
|
|
|
|
"aaa" [EBNF a=('a')* b=(a):x => [[ x ]] EBNF] =
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"number=(digit)+:n 'a'" ebnf-parser (parse) remaining>> length zero?
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"number=(digit)+ 'a'" ebnf-parser (parse) remaining>> length zero?
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"number=digit+ 'a'" ebnf-parser (parse) remaining>> length zero?
|
2008-06-16 01:39:14 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"number=digit+:n 'a'" ebnf-parser (parse) remaining>> length zero?
|
2008-06-18 07:07:26 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-18 09:10:44 -04:00
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"foo=(name):n !(keyword) => [[ n ]]" rule-parser parse
|
|
|
|
"foo=name:n !(keyword) => [[ n ]]" rule-parser parse =
|
2008-06-18 09:10:44 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ t } [
|
2015-08-15 21:10:13 -04:00
|
|
|
"foo=!(keyword) (name):n => [[ n ]]" rule-parser parse
|
|
|
|
"foo=!(keyword) name:n => [[ n ]]" rule-parser parse =
|
2008-06-18 09:10:44 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-18 07:07:26 -04:00
|
|
|
<<
|
|
|
|
EBNF: parser1
|
|
|
|
foo='a'
|
|
|
|
;EBNF
|
|
|
|
>>
|
|
|
|
|
|
|
|
EBNF: parser2
|
|
|
|
foo=<foreign parser1 foo> 'b'
|
|
|
|
;EBNF
|
|
|
|
|
|
|
|
EBNF: parser3
|
|
|
|
foo=<foreign parser1> 'c'
|
|
|
|
;EBNF
|
|
|
|
|
|
|
|
EBNF: parser4
|
|
|
|
foo=<foreign any-char> 'd'
|
|
|
|
;EBNF
|
|
|
|
|
|
|
|
{ "a" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"a" parser1
|
2008-06-18 07:07:26 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "b" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" parser2
|
2008-06-18 07:07:26 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ "a" "c" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ac" parser3
|
2008-06-18 07:07:26 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ CHAR: a "d" } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ad" parser4
|
2008-06-18 09:10:44 -04:00
|
|
|
] unit-test
|
2008-06-19 19:49:08 -04:00
|
|
|
|
2009-04-17 13:46:04 -04:00
|
|
|
{ } [
|
2015-07-02 13:34:01 -04:00
|
|
|
"USING: kernel peg.ebnf ; \"a\\n\" [EBNF foo='a' '\n' => [[ drop \"\n\" ]] EBNF] drop" eval( -- )
|
2008-06-19 19:53:07 -04:00
|
|
|
] unit-test
|
|
|
|
|
2008-06-19 20:35:33 -04:00
|
|
|
[
|
2009-04-17 16:49:21 -04:00
|
|
|
"USING: peg.ebnf ; <EBNF foo='a' foo='b' EBNF>" eval( -- ) drop
|
2008-06-19 20:35:33 -04:00
|
|
|
] must-fail
|
|
|
|
|
2008-06-19 19:53:07 -04:00
|
|
|
{ t } [
|
2015-09-08 19:15:10 -04:00
|
|
|
! Rule lookup occurs in a namespace. This causes an incorrect duplicate rule
|
|
|
|
! if a var in a namespace is set. This unit test is to remind me to fix this.
|
2015-08-15 21:10:13 -04:00
|
|
|
[ "fail" "foo" set "foo='a'" ebnf-parser parse transform drop t ] with-scope
|
2008-06-20 08:28:13 -04:00
|
|
|
] unit-test
|
|
|
|
|
2015-09-09 21:28:08 -04:00
|
|
|
! Tokenizer tests
|
2008-06-20 08:28:13 -04:00
|
|
|
{ V{ "a" CHAR: b } } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"ab" [EBNF tokenizer=default foo="a" . EBNF]
|
2008-06-20 08:28:13 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
TUPLE: ast-number value ;
|
|
|
|
|
|
|
|
EBNF: a-tokenizer
|
|
|
|
Letter = [a-zA-Z]
|
|
|
|
Digit = [0-9]
|
|
|
|
Digits = Digit+
|
|
|
|
SingleLineComment = "//" (!("\n") .)* "\n" => [[ ignore ]]
|
|
|
|
MultiLineComment = "/*" (!("*/") .)* "*/" => [[ ignore ]]
|
|
|
|
Space = " " | "\t" | "\r" | "\n" | SingleLineComment | MultiLineComment
|
|
|
|
Spaces = Space* => [[ ignore ]]
|
2011-10-16 16:01:58 -04:00
|
|
|
Number = Digits:ws '.' Digits:fs => [[ ws "." fs 3array "" concat-as string>number ast-number boa ]]
|
2008-06-20 08:28:13 -04:00
|
|
|
| Digits => [[ >string string>number ast-number boa ]]
|
|
|
|
Special = "(" | ")" | "{" | "}" | "[" | "]" | "," | ";"
|
|
|
|
| "?" | ":" | "!==" | "~=" | "===" | "==" | "=" | ">="
|
|
|
|
| ">" | "<=" | "<" | "++" | "+=" | "+" | "--" | "-="
|
|
|
|
| "-" | "*=" | "*" | "/=" | "/" | "%=" | "%" | "&&="
|
|
|
|
| "&&" | "||=" | "||" | "." | "!"
|
|
|
|
Tok = Spaces (Number | Special )
|
|
|
|
;EBNF
|
|
|
|
|
|
|
|
{ V{ CHAR: 1 T{ ast-number f 23 } ";" CHAR: x } } [
|
2015-07-02 13:34:01 -04:00
|
|
|
"123;x" [EBNF bar = .
|
|
|
|
tokenizer = <foreign a-tokenizer Tok> foo=.
|
|
|
|
tokenizer=default baz=.
|
|
|
|
main = bar foo foo baz
|
2008-07-03 23:48:52 -04:00
|
|
|
EBNF]
|
2008-06-20 08:28:13 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ CHAR: 5 "+" CHAR: 2 } } [
|
2015-07-02 13:34:01 -04:00
|
|
|
"5+2" [EBNF
|
|
|
|
space=(" " | "\n")
|
|
|
|
number=[0-9]
|
|
|
|
operator=("*" | "+")
|
|
|
|
spaces=space* => [[ ignore ]]
|
|
|
|
tokenizer=spaces (number | operator)
|
|
|
|
main= . . .
|
2008-07-03 23:48:52 -04:00
|
|
|
EBNF]
|
2008-06-20 08:28:13 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ V{ CHAR: 5 "+" CHAR: 2 } } [
|
2015-07-02 13:34:01 -04:00
|
|
|
"5 + 2" [EBNF
|
|
|
|
space=(" " | "\n")
|
|
|
|
number=[0-9]
|
|
|
|
operator=("*" | "+")
|
|
|
|
spaces=space* => [[ ignore ]]
|
|
|
|
tokenizer=spaces (number | operator)
|
|
|
|
main= . . .
|
2008-07-03 23:48:52 -04:00
|
|
|
EBNF]
|
2008-06-20 09:49:07 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "++" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"++--" [EBNF tokenizer=("++" | "--") main="++" EBNF]
|
2008-06-29 22:32:20 -04:00
|
|
|
] unit-test
|
|
|
|
|
|
|
|
{ "\\" } [
|
2008-07-03 23:48:52 -04:00
|
|
|
"\\" [EBNF foo="\\" EBNF]
|
2008-07-14 23:42:13 -04:00
|
|
|
] unit-test
|
2009-03-30 20:42:04 -04:00
|
|
|
|
2009-04-17 16:49:21 -04:00
|
|
|
[ "USE: peg.ebnf [EBNF EBNF]" eval( -- ) ] must-fail
|
2009-03-30 20:42:04 -04:00
|
|
|
|
2015-07-26 01:59:56 -04:00
|
|
|
[ "USE: peg.ebnf [EBNF
|
2009-03-30 20:42:04 -04:00
|
|
|
lol = a
|
|
|
|
lol = b
|
2015-07-26 01:59:56 -04:00
|
|
|
EBNF]" eval( -- )
|
2009-03-30 20:42:04 -04:00
|
|
|
] [
|
|
|
|
error>> [ redefined-rule? ] [ name>> "lol" = ] bi and
|
|
|
|
] must-fail-with
|
2010-05-04 00:35:17 -04:00
|
|
|
|
2015-07-03 12:39:59 -04:00
|
|
|
{
|
2010-05-04 00:35:17 -04:00
|
|
|
{ "a" "a" }
|
2015-07-03 12:39:59 -04:00
|
|
|
} [
|
2010-05-04 00:35:17 -04:00
|
|
|
EBNF: foo Bar = "a":a1 "a":a2 => [[ a1 a2 2array ]] ;EBNF
|
|
|
|
"aa" foo
|
|
|
|
] unit-test
|
|
|
|
|
2015-07-03 12:39:59 -04:00
|
|
|
{
|
2010-05-04 00:35:17 -04:00
|
|
|
{ "a" "a" }
|
2015-07-03 12:39:59 -04:00
|
|
|
} [
|
2010-05-04 00:52:37 -04:00
|
|
|
EBNF: foo2 Bar = "a":a-1 "a":a-2 => [[ a-1 a-2 2array ]] ;EBNF
|
2010-05-04 00:35:17 -04:00
|
|
|
"aa" foo2
|
|
|
|
] unit-test
|