fjsc: allow compilation of factor quotations to javascript
parent
f1256d0f3c
commit
8b6bf522df
|
@ -2,12 +2,12 @@
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
!
|
!
|
||||||
IN: fjsc
|
IN: fjsc
|
||||||
USING: kernel lazy-lists parser-combinators strings math sequences namespaces io ;
|
USING: kernel lazy-lists parser-combinators strings math sequences namespaces io words arrays ;
|
||||||
|
|
||||||
TUPLE: ast-number value ;
|
TUPLE: ast-number value ;
|
||||||
TUPLE: ast-identifier value ;
|
TUPLE: ast-identifier value ;
|
||||||
TUPLE: ast-string value ;
|
TUPLE: ast-string value ;
|
||||||
TUPLE: ast-quotation expression ;
|
TUPLE: ast-quotation values ;
|
||||||
TUPLE: ast-array elements ;
|
TUPLE: ast-array elements ;
|
||||||
TUPLE: ast-define name stack-effect expression ;
|
TUPLE: ast-define name stack-effect expression ;
|
||||||
TUPLE: ast-expression values ;
|
TUPLE: ast-expression values ;
|
||||||
|
@ -76,19 +76,19 @@ LAZY: 'stack-effect' ( -- parser )
|
||||||
|
|
||||||
LAZY: 'define' ( -- parser )
|
LAZY: 'define' ( -- parser )
|
||||||
":" token sp
|
":" token sp
|
||||||
'identifier' sp &>
|
'identifier' sp [ ast-identifier-value ] <@ &>
|
||||||
'stack-effect' sp <!?> <&>
|
'stack-effect' sp <!?> <&>
|
||||||
'expression' <:&>
|
'expression' <:&>
|
||||||
";" token sp <& [ first3 <ast-define> ] <@ ;
|
";" token sp <& [ first3 <ast-define> ] <@ ;
|
||||||
|
|
||||||
LAZY: 'quotation' ( -- parser )
|
LAZY: 'quotation' ( -- parser )
|
||||||
"[" token sp
|
"[" token sp
|
||||||
'expression' &>
|
'expression' [ ast-expression-values ] <@ &>
|
||||||
"]" token sp <& [ <ast-quotation> ] <@ ;
|
"]" token sp <& [ <ast-quotation> ] <@ ;
|
||||||
|
|
||||||
LAZY: 'array' ( -- parser )
|
LAZY: 'array' ( -- parser )
|
||||||
"{" token sp
|
"{" token sp
|
||||||
'expression' &>
|
'expression' [ ast-expression-values ] <@ &>
|
||||||
"}" token sp <& [ <ast-array> ] <@ ;
|
"}" token sp <& [ <ast-array> ] <@ ;
|
||||||
|
|
||||||
LAZY: 'word' ( -- parser )
|
LAZY: 'word' ( -- parser )
|
||||||
|
@ -99,9 +99,9 @@ LAZY: 'atom' ( -- parser )
|
||||||
'identifier' 'number' <|> 'string' <|> ;
|
'identifier' 'number' <|> 'string' <|> ;
|
||||||
|
|
||||||
LAZY: 'alien' ( -- parser )
|
LAZY: 'alien' ( -- parser )
|
||||||
'array' [ ast-array-elements ast-expression-values ] <@
|
'array' [ ast-array-elements ] <@
|
||||||
'string' [ ast-string-value ] <@ <&>
|
'string' [ ast-string-value ] <@ <&>
|
||||||
'array' [ ast-array-elements ast-expression-values ] <@ <:&>
|
'array' [ ast-array-elements ] <@ <:&>
|
||||||
"alien-invoke" token sp <& [ first3 <ast-alien> ] <@ ;
|
"alien-invoke" token sp <& [ first3 <ast-alien> ] <@ ;
|
||||||
|
|
||||||
LAZY: 'comment' ( -- parser )
|
LAZY: 'comment' ( -- parser )
|
||||||
|
@ -152,35 +152,11 @@ M: ast-identifier (compile)
|
||||||
|
|
||||||
M: ast-define (compile)
|
M: ast-define (compile)
|
||||||
"world.define_word(\"" ,
|
"world.define_word(\"" ,
|
||||||
dup ast-define-name ast-identifier-value ,
|
dup ast-define-name ,
|
||||||
"\",\"source\"," ,
|
"\",\"source\"," ,
|
||||||
ast-define-expression (compile)
|
ast-define-expression (compile)
|
||||||
",world," , ;
|
",world," , ;
|
||||||
|
|
||||||
M: ast-quotation (literal)
|
|
||||||
"world.make_quotation(\"source\"," ,
|
|
||||||
ast-quotation-expression (compile)
|
|
||||||
")" , ;
|
|
||||||
|
|
||||||
M: ast-quotation (compile)
|
|
||||||
"world.data_stack.push(world.make_quotation(\"source\"," ,
|
|
||||||
ast-quotation-expression (compile)
|
|
||||||
"),world," , ;
|
|
||||||
|
|
||||||
M: ast-array (literal)
|
|
||||||
"[" ,
|
|
||||||
ast-array-elements ast-expression-values [ (literal) ] [ "," , ] interleave
|
|
||||||
"]" , ;
|
|
||||||
|
|
||||||
M: ast-array (compile)
|
|
||||||
"world.data_stack.push(" , (literal) ",world," , ;
|
|
||||||
|
|
||||||
|
|
||||||
M: ast-expression (literal)
|
|
||||||
ast-expression-values [
|
|
||||||
(literal)
|
|
||||||
] each ;
|
|
||||||
|
|
||||||
: do-expressions ( seq -- )
|
: do-expressions ( seq -- )
|
||||||
dup empty? not [
|
dup empty? not [
|
||||||
unclip
|
unclip
|
||||||
|
@ -195,6 +171,30 @@ M: ast-expression (literal)
|
||||||
] [
|
] [
|
||||||
drop "world.next" ,
|
drop "world.next" ,
|
||||||
] if ;
|
] if ;
|
||||||
|
|
||||||
|
M: ast-quotation (literal)
|
||||||
|
"world.make_quotation(\"source\"," ,
|
||||||
|
ast-quotation-values do-expressions
|
||||||
|
")" , ;
|
||||||
|
|
||||||
|
M: ast-quotation (compile)
|
||||||
|
"world.data_stack.push(world.make_quotation(\"source\"," ,
|
||||||
|
ast-quotation-values do-expressions
|
||||||
|
"),world," , ;
|
||||||
|
|
||||||
|
M: ast-array (literal)
|
||||||
|
"[" ,
|
||||||
|
ast-array-elements [ (literal) ] [ "," , ] interleave
|
||||||
|
"]" , ;
|
||||||
|
|
||||||
|
M: ast-array (compile)
|
||||||
|
"world.data_stack.push(" , (literal) ",world," , ;
|
||||||
|
|
||||||
|
|
||||||
|
M: ast-expression (literal)
|
||||||
|
ast-expression-values [
|
||||||
|
(literal)
|
||||||
|
] each ;
|
||||||
|
|
||||||
M: ast-expression (compile)
|
M: ast-expression (compile)
|
||||||
ast-expression-values do-expressions ;
|
ast-expression-values do-expressions ;
|
||||||
|
@ -227,6 +227,41 @@ M: ast-comment (compile)
|
||||||
M: ast-stack-effect (compile)
|
M: ast-stack-effect (compile)
|
||||||
drop ;
|
drop ;
|
||||||
|
|
||||||
|
GENERIC: (parse-factor-quotation) ( object -- ast )
|
||||||
|
|
||||||
|
M: number (parse-factor-quotation) ( object -- ast )
|
||||||
|
<ast-number> ;
|
||||||
|
|
||||||
|
M: symbol (parse-factor-quotation) ( object -- ast )
|
||||||
|
>string <ast-identifier> ;
|
||||||
|
|
||||||
|
M: word (parse-factor-quotation) ( object -- ast )
|
||||||
|
word-name <ast-identifier> ;
|
||||||
|
|
||||||
|
M: string (parse-factor-quotation) ( object -- ast )
|
||||||
|
<ast-identifier> ;
|
||||||
|
|
||||||
|
M: quotation (parse-factor-quotation) ( object -- ast )
|
||||||
|
[
|
||||||
|
[ (parse-factor-quotation) , ] each
|
||||||
|
] { } make <ast-quotation> ;
|
||||||
|
|
||||||
|
M: array (parse-factor-quotation) ( object -- ast )
|
||||||
|
[
|
||||||
|
[ (parse-factor-quotation) , ] each
|
||||||
|
] { } make <ast-array> ;
|
||||||
|
|
||||||
|
M: wrapper (parse-factor-quotation) ( object -- ast )
|
||||||
|
wrapped word-name <ast-word> ;
|
||||||
|
|
||||||
|
GENERIC: fjsc-parse ( object -- ast )
|
||||||
|
|
||||||
|
M: string fjsc-parse ( object -- ast )
|
||||||
|
'expression' parse car parse-result-parsed ;
|
||||||
|
|
||||||
|
M: quotation fjsc-parse ( object -- ast )
|
||||||
|
(parse-factor-quotation) ;
|
||||||
|
|
||||||
: fjsc-compile ( ast -- string )
|
: fjsc-compile ( ast -- string )
|
||||||
[
|
[
|
||||||
[
|
[
|
||||||
|
|
Loading…
Reference in New Issue