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 );
}
}