Author: bernhard
Date: Sun Aug  7 13:32:04 2005
New Revision: 8859

Modified:
   trunk/languages/bc/README
   trunk/languages/bc/TODO
   trunk/languages/bc/docs/parrot_bc.pod
   trunk/languages/bc/grammar/bc_python.g
   trunk/languages/bc/python/lib/bc/BcLexer.py
   trunk/languages/bc/python/lib/bc/BcLexerTokenTypes.txt
   trunk/languages/bc/python/lib/bc/BcParser.py
   trunk/languages/bc/python/lib/bc/BcTreeWalker.py
   trunk/languages/bc/t/basic.t
   trunk/languages/bc/t/harness
Log:
Use unlimited registers. Pxx -> $Pxx.
Statements delimited by ';' are now all printed.


Modified: trunk/languages/bc/README
==============================================================================
--- trunk/languages/bc/README   (original)
+++ trunk/languages/bc/README   Sun Aug  7 13:32:04 2005
@@ -1,7 +1,7 @@
 # Copyright: 2005 The Perl Foundation.  All Rights Reserved.
 # $Id$
 
-Implementation of 'POSIX bc' with the help Python code created from
+This in an implementation of 'POSIX bc' with the help Python code created from
 an ANTLR grammar.
 
 Requirements:
@@ -17,4 +17,4 @@ Building:
 Testing:
 
 'make test'. When GNU bc is available, the test suite will be run against GNU 
bc as well.
-
+For compatability with 'POSIX bc' the flags '--standard' and '--quiet' are 
used.

Modified: trunk/languages/bc/TODO
==============================================================================
--- trunk/languages/bc/TODO     (original)
+++ trunk/languages/bc/TODO     Sun Aug  7 13:32:04 2005
@@ -1,8 +1,10 @@
 # Copyright: 2005 The Perl Foundation.  All Rights Reserved.
 # $Id$
 
-A fairly concrete list of TODOs for Parrot bc. See docs/parrot_bc.pod for 
visions.
+A fairly concrete list of TODOs for Parrot bc.
+See docs/parrot_bc.pod for visions.
 
+- TODO in t/basic.t is no longer handled
 - Format 0.1 as .1
 
 - Open a ticket in RT

Modified: trunk/languages/bc/docs/parrot_bc.pod
==============================================================================
--- trunk/languages/bc/docs/parrot_bc.pod       (original)
+++ trunk/languages/bc/docs/parrot_bc.pod       Sun Aug  7 13:32:04 2005
@@ -3,11 +3,12 @@
 
 =head1 Overview
 
-This implementation of bc is based on ANTLR.
+This is an implementation of 'POSIX bc'. It is based on ANTLR.
 
 =head1 Why Parrot bc
 
-Self education.
+Self education. A fairly simple language but has symbols and subroutines.
+Test for decimal bignum libraries.
 
 =head2 Vision
 

Modified: trunk/languages/bc/grammar/bc_python.g
==============================================================================
--- trunk/languages/bc/grammar/bc_python.g      (original)
+++ trunk/languages/bc/grammar/bc_python.g      Sun Aug  7 13:32:04 2005
@@ -174,7 +174,7 @@ input_item
   ;
 
 semicolon_list
-  : statement (SEMICOLON statement)*
+  : statement (SEMICOLON! statement)*
   ;
 
 statement
@@ -357,7 +357,7 @@ tokens 
 plus! returns [reg_name]
   : #(PLUS reg_name_left=left:expr reg_name_right=right:expr)
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -369,7 +369,7 @@ plus! returns [reg_name]
 minus! returns [reg_name]
   : #(MINUS reg_name_left=left:expr reg_name_right=right:expr)
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -381,7 +381,7 @@ minus! returns [reg_name]
 mul! returns [reg_name]
   : #(MUL reg_name_left=left:expr reg_name_right=right:expr)
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -393,7 +393,7 @@ mul! returns [reg_name]
 div! returns [reg_name]
   : #(DIV reg_name_left=left:expr reg_name_right=right:expr)
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -405,7 +405,7 @@ div! returns [reg_name]
 mod! returns [reg_name]
   : #(MOD reg_name_left=left:expr reg_name_right=right:expr)
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -417,7 +417,7 @@ mod! returns [reg_name]
 integer! returns [reg_name]
   : i:NUMBER
   {
-    reg_name = "P%d" % self.reg_num
+    reg_name = "$P%d" % self.reg_num
     self.reg_num = self.reg_num + 1
     pir = "\n" + \
           reg_name + " = new .Float\n" + \
@@ -451,18 +451,18 @@ expr returns [reg_name]
   ;
 
 expr_line
-  : reg_name=E:expr
+  : #( PIR_PRINT reg_name=E:expr )
     {
       #expr = #( [ PIR_NOOP, "noop" ], #E, [PIR_OP, "\nprint "], 
[PIR_OP,reg_name], [PIR_NEWLINE, "\nprint \"\\n\" # "] )
     }
   ;
 
 expr_list
-  : (expr)+
+  : (expr_line)+
   ;
 
 gen_pir!
-  : #( PIR_PRINT B:expr_line )
+  : B:expr_list
     {
       #gen_pir = #([PIR_HEADER, "pir header tree\n#"], #B, [PIR_FOOTER, "pir 
footer tree\nend\n#"]); 
     }

Modified: trunk/languages/bc/python/lib/bc/BcLexer.py
==============================================================================
--- trunk/languages/bc/python/lib/bc/BcLexer.py (original)
+++ trunk/languages/bc/python/lib/bc/BcLexer.py Sun Aug  7 13:32:04 2005
@@ -1,4 +1,4 @@
-### $ANTLR 2.7.5 (20050416): "bc_python.g" -> "BcLexer.py"$
+### $ANTLR 2.7.5 (20050425): "bc_python.g" -> "BcLexer.py"$
 ### import antlr and other modules ..
 import sys
 import antlr

Modified: trunk/languages/bc/python/lib/bc/BcLexerTokenTypes.txt
==============================================================================
--- trunk/languages/bc/python/lib/bc/BcLexerTokenTypes.txt      (original)
+++ trunk/languages/bc/python/lib/bc/BcLexerTokenTypes.txt      Sun Aug  7 
13:32:04 2005
@@ -1,4 +1,4 @@
-// $ANTLR 2.7.5 (20050416): bc_python.g -> BcLexerTokenTypes.txt$
+// $ANTLR 2.7.5 (20050425): bc_python.g -> BcLexerTokenTypes.txt$
 BcLexer    // output token vocab name
 DIGIT=4
 NUMBER=5

Modified: trunk/languages/bc/python/lib/bc/BcParser.py
==============================================================================
--- trunk/languages/bc/python/lib/bc/BcParser.py        (original)
+++ trunk/languages/bc/python/lib/bc/BcParser.py        Sun Aug  7 13:32:04 2005
@@ -1,4 +1,4 @@
-### $ANTLR 2.7.5 (20050416): "bc_python.g" -> "BcParser.py"$
+### $ANTLR 2.7.5 (20050425): "bc_python.g" -> "BcParser.py"$
 ### import antlr and other modules ..
 import sys
 import antlr
@@ -154,9 +154,6 @@ class Parser(antlr.LLkParser):
             while True:
                 if (self.LA(1)==SEMICOLON):
                     pass
-                    tmp10_AST = None
-                    tmp10_AST = self.astFactory.create(self.LT(1))
-                    self.addASTChild(currentAST, tmp10_AST)
                     self.match(SEMICOLON)
                     self.statement()
                     self.addASTChild(currentAST, self.returnAST)

Modified: trunk/languages/bc/python/lib/bc/BcTreeWalker.py
==============================================================================
--- trunk/languages/bc/python/lib/bc/BcTreeWalker.py    (original)
+++ trunk/languages/bc/python/lib/bc/BcTreeWalker.py    Sun Aug  7 13:32:04 2005
@@ -1,4 +1,4 @@
-### $ANTLR 2.7.5 (20050416): "bc_python.g" -> "BcTreeWalker.py"$
+### $ANTLR 2.7.5 (20050425): "bc_python.g" -> "BcTreeWalker.py"$
 ### import antlr and other modules ..
 import sys
 import antlr
@@ -131,7 +131,7 @@ class Walker(antlr.TreeParser):
             _t = _t109
             _t = _t.getNextSibling()
             plus_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -254,7 +254,7 @@ class Walker(antlr.TreeParser):
             _t = _t111
             _t = _t.getNextSibling()
             minus_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -313,7 +313,7 @@ class Walker(antlr.TreeParser):
             _t = _t113
             _t = _t.getNextSibling()
             mul_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -372,7 +372,7 @@ class Walker(antlr.TreeParser):
             _t = _t115
             _t = _t.getNextSibling()
             div_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -431,7 +431,7 @@ class Walker(antlr.TreeParser):
             _t = _t117
             _t = _t.getNextSibling()
             mod_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -472,7 +472,7 @@ class Walker(antlr.TreeParser):
             self.match(_t,NUMBER)
             _t = _t.getNextSibling()
             integer_AST = currentAST.root
-            reg_name = "P%d" % self.reg_num
+            reg_name = "$P%d" % self.reg_num
             self.reg_num = self.reg_num + 1
             pir = "\n" + \
                  reg_name + " = new .Float\n" + \
@@ -587,11 +587,25 @@ class Walker(antlr.TreeParser):
         E = None
         try:      ## for error handling
             pass
+            _t123 = _t
+            tmp7_AST = None
+            tmp7_AST_in = None
+            tmp7_AST = self.astFactory.create(_t)
+            tmp7_AST_in = _t
+            self.addASTChild(currentAST, tmp7_AST)
+            _currentAST123 = currentAST.copy()
+            currentAST.root = currentAST.child
+            currentAST.child = None
+            self.match(_t,PIR_PRINT)
+            _t = _t.getFirstChild()
             E = antlr.ifelse(_t == antlr.ASTNULL, None, _t)
             reg_name=self.expr(_t)
             _t = self._retTree
             E_AST = self.returnAST
             self.addASTChild(currentAST, self.returnAST)
+            currentAST = _currentAST123
+            _t = _t123
+            _t = _t.getNextSibling()
             expr = antlr.make(self.astFactory.create(PIR_NOOP,"noop"), E_AST, 
self.astFactory.create(PIR_OP,"\nprint "), 
self.astFactory.create(PIR_OP,reg_name), 
self.astFactory.create(PIR_NEWLINE,"\nprint \"\\n\" # "))
             expr_line_AST = currentAST.root
         
@@ -613,20 +627,20 @@ class Walker(antlr.TreeParser):
         expr_list_AST = None
         try:      ## for error handling
             pass
-            _cnt125= 0
+            _cnt126= 0
             while True:
                 if not _t:
                     _t = antlr.ASTNULL
-                if (_tokenSet_0.member(_t.getType())):
+                if (_t.getType()==PIR_PRINT):
                     pass
-                    self.expr(_t)
+                    self.expr_line(_t)
                     _t = self._retTree
                     self.addASTChild(currentAST, self.returnAST)
                 else:
                     break
                 
-                _cnt125 += 1
-            if _cnt125 < 1:
+                _cnt126 += 1
+            if _cnt126 < 1:
                 raise antlr.NoViableAltException(_t)
             expr_list_AST = currentAST.root
         
@@ -650,23 +664,10 @@ class Walker(antlr.TreeParser):
         B = None
         try:      ## for error handling
             pass
-            _t127 = _t
-            tmp7_AST = None
-            tmp7_AST_in = None
-            tmp7_AST = self.astFactory.create(_t)
-            tmp7_AST_in = _t
-            _currentAST127 = currentAST.copy()
-            currentAST.root = currentAST.child
-            currentAST.child = None
-            self.match(_t,PIR_PRINT)
-            _t = _t.getFirstChild()
             B = antlr.ifelse(_t == antlr.ASTNULL, None, _t)
-            self.expr_line(_t)
+            self.expr_list(_t)
             _t = self._retTree
             B_AST = self.returnAST
-            currentAST = _currentAST127
-            _t = _t127
-            _t = _t.getNextSibling()
             gen_pir_AST = currentAST.root
             gen_pir_AST = antlr.make(self.astFactory.create(PIR_HEADER,"pir 
header tree\n#"), B_AST, self.astFactory.create(PIR_FOOTER,"pir footer 
tree\nend\n#"));
             currentAST.root = gen_pir_AST
@@ -748,10 +749,3 @@ _tokenNames = [
     "PIR_NEWLINE"
 ]
     
-
-### generate bit set
-def mk_tokenSet_0(): 
-    ### var1
-    data = [ 6274678816L, 0L]
-    return data
-_tokenSet_0 = antlr.BitSet(mk_tokenSet_0())

Modified: trunk/languages/bc/t/basic.t
==============================================================================
--- trunk/languages/bc/t/basic.t        (original)
+++ trunk/languages/bc/t/basic.t        Sun Aug  7 13:32:04 2005
@@ -16,7 +16,7 @@ use FindBin;
 use lib "$FindBin::Bin/../../lib", "$FindBin::Bin/../../../../lib";
 
 use Test::More;
-use Parrot::Test tests => 28;
+use Parrot::Test tests => 30;
 
 sub run_tests
 {
@@ -26,8 +26,15 @@ sub run_tests
     die "invalid test" unless ref( $test_case ) eq 'ARRAY';
     die "invalid test" unless scalar(@$test_case) == 2 || scalar(@$test_case) 
== 3;
 
-    my ( $bc, $expected, $desc ) = @{$test_case};
-    language_output_is( 'bc', "$bc\nquit\n", "$expected\n", $desc || "bc: $bc" 
);
+    my $bc_code  = $test_case->[0] . "\nquit\n";
+    my $expected = ref($test_case->[1]) eq '' ?
+                     $test_case->[1] 
+                     :
+                     ref($test_case->[1]) eq 'ARRAY' ?
+                       join( "\n", @{$test_case->[1]} ) :
+                       die "expected ARRAY reference";   
+    my $desc     = $test_case->[2] || "bc: $bc_code";
+    language_output_is( 'bc', $bc_code, "$expected\n", $desc );
   }
 } 
 
@@ -65,14 +72,16 @@ my @tests = 
        [ '2 * 2 + .4', '4.4' ],
        [ '.1 - 6 / 2', '-2.9' ],
        [ '2 % 2 + 4', '4' ],
-
+       # semicolons
+       [ '1; 2', [1, 2] ],
+       [ '1+1*1; 2+2*2', [2, 6] ],
+       [ '3-3/3; 4+4%4;  5-5+5', [2, 4, 5] ],
      );
+
 my @todo_tests = 
      ( # floats
        [ '.1', '.1' ],
        [ '-.1', '-.1' ],
-       # semicolons
-       [ '1; 2', "1\n2" ],
      );
 
 run_tests( [EMAIL PROTECTED] );

Modified: trunk/languages/bc/t/harness
==============================================================================
--- trunk/languages/bc/t/harness        (original)
+++ trunk/languages/bc/t/harness        Sun Aug  7 13:32:04 2005
@@ -69,7 +69,7 @@ if ( grep { m/^--files$/ } @ARGV ) {
     };
     if ( $use_gnu_bc ) {
        $ENV{PARROT_BC_TEST_PROG} = 'bc --standard --quiet';
-       # Test::Harness::runtests( @files ) if scalar( @files );
+       Test::Harness::runtests( @files ) if scalar( @files );
     }
 }
 

Reply via email to