Author: chromatic
Date: Mon Apr 24 23:48:30 2006
New Revision: 12421
Modified:
trunk/languages/pheme/lib/PhemeSymbols.pir
trunk/languages/pheme/lib/pge2past.tg
trunk/languages/pheme/lib/pheme.g
trunk/languages/pheme/lib/post2pir.tg
Log:
Clean up subroutine hoisting code (fixes a bug).
Allow comments.
Make empty lists work (yow, ugly hack until cons works better).
Modified: trunk/languages/pheme/lib/PhemeSymbols.pir
==============================================================================
--- trunk/languages/pheme/lib/PhemeSymbols.pir (original)
+++ trunk/languages/pheme/lib/PhemeSymbols.pir Mon Apr 24 23:48:30 2006
@@ -4,11 +4,12 @@
.local pmc symbols
symbols = new .Hash
- symbols['car'] = 1
- symbols['cdr'] = 1
- symbols['cons'] = 1
- symbols['include_file'] = 1
- symbols['write'] = 1
+ symbols['car'] = 1
+ symbols['cdr'] = 1
+ symbols['cons'] = 1
+ symbols['include_file'] = 1
+ symbols['write'] = 1
+ symbols['__make_empty_cons'] = 1
store_global 'PhemeCompiler', 'symbols', symbols
.return()
@@ -117,3 +118,9 @@
print message_string
.return()
.end
+
+.sub __make_empty_cons
+ .local pmc result
+ result = new .ResizableStringArray
+ .return( result )
+.end
Modified: trunk/languages/pheme/lib/pge2past.tg
==============================================================================
--- trunk/languages/pheme/lib/pge2past.tg (original)
+++ trunk/languages/pheme/lib/pge2past.tg Mon Apr 24 23:48:30 2006
@@ -73,10 +73,20 @@
goto iter_loop
iter_end:
- result = tree.get( 'maybe_promote_sub', result )
+ .local string child_type
+ child_type = typeof op
+ unless child_type == 'PAST::Op' goto return_result
+
+ result = tree.get( 'maybe_promote_sub', result )
+
+ return_result:
.return( result )
}
+PAST::Exp: maybe_op(.) = {
+ .return( node )
+}
+
PAST::Val: maybe_op(.) = {
.local pmc op
op = new 'PAST::Op'
@@ -96,10 +106,13 @@
.local pmc op
op = children[0]
+
.local string op_name
op_name = op.'op'()
if op_name == 'define' goto return_sub
- .return( node )
+ .local pmc result
+ result = node
+ .return( result )
return_sub:
.local pmc sub_name
@@ -127,6 +140,12 @@
empty_list: result(.) = {
.local pmc result
result = new 'PAST::Exp'
+
+ .local pmc cons
+ cons = new 'PAST::Op'
+ cons.'op'( '__make_empty_cons' )
+
+ result.'add_child'( cons )
.return( result )
}
Modified: trunk/languages/pheme/lib/pheme.g
==============================================================================
--- trunk/languages/pheme/lib/pheme.g (original)
+++ trunk/languages/pheme/lib/pheme.g Mon Apr 24 23:48:30 2006
@@ -1,16 +1,21 @@
grammar Pheme::Grammar;
-rule prog { [ <list> \s* ]+ }
+rule prog { [ <list> <ws>* ]+ }
-rule list { \( <list_items>+ \s* \) }
+rule list { \( <list_items>+ <ws>* \) }
# quoted_string has to come first
-rule list_items { [ <quoted_string> | <atom> | <list> | <empty_list> ] \s* }
+rule list_items { [ <quoted_string> | <atom> | <list> | <empty_list> ] <ws>* }
-rule empty_list { '\(\) }
+rule empty_list { \(\) }
-rule atom { <symbol_tag>? [ <-[ \n\r\(\)]> ]+ }
+rule atom { [ <symbol_tag> | <quote> ]? [ <-[ \n\r\(\)]> ]+ }
rule quoted_string { <PGE::Text::bracketed: '"> }
+rule quote { ' }
+
rule symbol_tag { \# }
+
+rule ws { [ ; \N+ | \s ]+ }
+
Modified: trunk/languages/pheme/lib/post2pir.tg
==============================================================================
--- trunk/languages/pheme/lib/post2pir.tg (original)
+++ trunk/languages/pheme/lib/post2pir.tg Mon Apr 24 23:48:30 2006
@@ -144,7 +144,6 @@
goto iter_loop
iter_end:
-
outvar = join ', ', outvars
result .= "\t"
result .= varname