Change ebnf variables to not use namespaces

db4
Chris Double 2008-04-03 17:28:09 +13:00
parent 27f2992dc5
commit cc7d945a80
1 changed files with 37 additions and 18 deletions

View File

@ -237,17 +237,16 @@ GENERIC: (transform) ( ast -- parser )
SYMBOL: parser
SYMBOL: main
SYMBOL: vars
: transform ( ast -- object )
H{ } clone dup dup [ parser set V{ } vars set swap (transform) main set ] bind ;
H{ } clone dup dup [ parser set swap (transform) main set ] bind ;
M: ebnf (transform) ( ast -- parser )
rules>> [ (transform) ] map peek ;
M: ebnf-rule (transform) ( ast -- parser )
dup elements>>
vars get clone vars [ (transform) ] with-variable [
(transform) [
swap symbol>> set
] keep ;
@ -282,30 +281,50 @@ M: ebnf-repeat1 (transform) ( ast -- parser )
M: ebnf-optional (transform) ( ast -- parser )
transform-group optional ;
: build-locals ( string vars -- string )
dup empty? [
drop
] [
GENERIC: build-locals ( code ast -- code )
M: ebnf-sequence build-locals ( code ast -- code )
elements>> dup [ ebnf-var? ] subset empty? [
drop
] [
[
"USING: locals namespaces ; [let* | " %
[ dup % " [ \"" % % "\" get ] " % ] each
" | " %
%
" ] with-locals" %
"USING: locals sequences ; [let* | " %
dup length swap [
dup ebnf-var? [
name>> %
" [ " % # " over nth ] " %
] [
2drop
] if
] 2each
" | " %
%
" ] with-locals" %
] "" make
] if ;
M: ebnf-var build-locals ( code ast -- )
[
"USING: locals kernel ; [let* | " %
name>> % " [ dup ] " %
" | " %
%
" ] with-locals" %
] "" make ;
M: object build-locals ( code ast -- )
drop ;
M: ebnf-action (transform) ( ast -- parser )
[ parser>> (transform) ] keep
code>> vars get build-locals string-lines [ parse-lines ] with-compilation-unit action ;
[ parser>> (transform) ] [ code>> ] [ parser>> ] tri build-locals
string-lines [ parse-lines ] with-compilation-unit action ;
M: ebnf-semantic (transform) ( ast -- parser )
[ parser>> (transform) ] keep
code>> vars get build-locals string-lines [ parse-lines ] with-compilation-unit semantic ;
[ parser>> (transform) ] [ code>> ] [ parser>> ] tri build-locals
string-lines [ parse-lines ] with-compilation-unit semantic ;
M: ebnf-var (transform) ( ast -- parser )
[ parser>> (transform) ] [ name>> ] bi
dup vars get push [ dupd set ] curry action ;
parser>> (transform) ;
M: ebnf-terminal (transform) ( ast -- parser )
symbol>> token ;