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

Reply via email to