Syntax tree for ebnf

release
Chris Double 2007-11-28 10:28:28 +13:00
parent 31d57422da
commit ed359b6623
2 changed files with 43 additions and 9 deletions

View File

@ -12,6 +12,24 @@ IN: temporary
"\"55\"" 'terminal' parse parse-result-ast "\"55\"" 'terminal' parse parse-result-ast
] unit-test ] unit-test
! { } [ {
! "digit = \"0\" | \"1\" | \"2\"" 'rule' parse parse-result-ast T{ ebnf-rule f
! ] unit-test "digit"
T{ ebnf-choice f
V{ T{ ebnf-terminal f "1" } T{ ebnf-terminal f "2" } }
}
}
} [
"digit = \"1\" | \"2\"" 'rule' parse parse-result-ast
] unit-test
{
T{ ebnf-rule f
"digit"
T{ ebnf-sequence f
V{ T{ ebnf-terminal f "1" } T{ ebnf-terminal f "2" } }
}
}
} [
"digit = \"1\" \"2\"" 'rule' parse parse-result-ast
] unit-test

View File

@ -6,10 +6,14 @@ IN: peg.ebnf
TUPLE: ebnf-non-terminal symbol ; TUPLE: ebnf-non-terminal symbol ;
TUPLE: ebnf-terminal symbol ; TUPLE: ebnf-terminal symbol ;
TUPLE: ebnf-choice options ; TUPLE: ebnf-choice options ;
TUPLE: ebnf-sequence elements ;
TUPLE: ebnf-rule symbol elements ;
C: <ebnf-non-terminal> ebnf-non-terminal C: <ebnf-non-terminal> ebnf-non-terminal
C: <ebnf-terminal> ebnf-terminal C: <ebnf-terminal> ebnf-terminal
C: <ebnf-choice> ebnf-choice C: <ebnf-choice> ebnf-choice
C: <ebnf-sequence> ebnf-sequence
C: <ebnf-rule> ebnf-rule
GENERIC: ebnf-compile ( ast -- quot ) GENERIC: ebnf-compile ( ast -- quot )
@ -25,7 +29,17 @@ M: ebnf-choice ebnf-compile ( ast -- quot )
ebnf-compile , ebnf-compile ,
] each ] each
] { } make , ] { } make ,
[ call ] , \ map , [ call ] , \ map , \ choice ,
] [ ] make ;
M: ebnf-sequence ebnf-compile ( ast -- quot )
[
[
ebnf-sequence-elements [
ebnf-compile ,
] each
] { } make ,
[ call ] , \ map , \ seq ,
] [ ] make ; ] [ ] make ;
DEFER: 'rhs' DEFER: 'rhs'
@ -40,7 +54,9 @@ DEFER: 'rhs'
'non-terminal' 'terminal' 2array choice ; 'non-terminal' 'terminal' 2array choice ;
: 'sequence' ( -- parser ) : 'sequence' ( -- parser )
'element' sp repeat1 ; 'element' sp
"|" token sp ensure-not 2array seq [ first ] action
repeat1 [ <ebnf-sequence> ] action ;
: 'choice' ( -- parser ) : 'choice' ( -- parser )
'element' sp "|" token sp list-of [ <ebnf-choice> ] action ; 'element' sp "|" token sp list-of [ <ebnf-choice> ] action ;
@ -53,13 +69,13 @@ DEFER: 'rhs'
: 'rhs' ( -- parser ) : 'rhs' ( -- parser )
'repeat0' 'repeat0'
'choice'
'sequence' 'sequence'
'choice'
'element' 'element'
4array choice ; 4array choice ;
: 'rule' ( -- parser ) : 'rule' ( -- parser )
'non-terminal' 'non-terminal' [ ebnf-non-terminal-symbol ] action
"=" token sp "=" token sp hide
'rhs' 'rhs'
3array seq ; 3array seq [ first2 <ebnf-rule> ] action ;