Syntax tree for ebnf
parent
31d57422da
commit
ed359b6623
|
@ -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
|
|
@ -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 ;
|
||||||
|
|
Loading…
Reference in New Issue