Author: bernhard
Date: Sun Feb 19 05:52:32 2006
New Revision: 11664
Modified:
trunk/languages/bc/ChangeLog
trunk/languages/bc/docs/antlr_3.pod
trunk/languages/bc/grammar/antlr_3/antlr_past2pir_past.g
trunk/languages/bc/grammar/antlr_3/bc.g
Log:
Play with PASTinPIR generation with ANTLR3.
Modified: trunk/languages/bc/ChangeLog
==============================================================================
--- trunk/languages/bc/ChangeLog (original)
+++ trunk/languages/bc/ChangeLog Sun Feb 19 05:52:32 2006
@@ -1,6 +1,9 @@
# $Id$
-2005-01-22 Bernhard Schmalhofer
+2006-01-22 Bernhard Schmalhofer
+ * Play with PASTinPIR generation for ANTLR3.
+
+2006-01-22 Bernhard Schmalhofer
* Break the ANTLR PAST_Val nodes up into PAST_Val_Strqq and
PAST_Val_Num.
This allows support for the 'valtype' attribute in Allison's PAST.
Modified: trunk/languages/bc/docs/antlr_3.pod
==============================================================================
--- trunk/languages/bc/docs/antlr_3.pod (original)
+++ trunk/languages/bc/docs/antlr_3.pod Sun Feb 19 05:52:32 2006
@@ -43,7 +43,18 @@ options
'->' Is for tree construction
'^' Is for definition and matching of tree nodes
[EMAIL PROTECTED] declare additional member variables in the parser class
+
[EMAIL PROTECTED] ??
+
+scope a stack for symbols
+{
+ channel = 99;
+}
+put match into Nirwana
+
+
=head2 Lexer
The lexer specification can be in the parser specification.
Modified: trunk/languages/bc/grammar/antlr_3/antlr_past2pir_past.g
==============================================================================
--- trunk/languages/bc/grammar/antlr_3/antlr_past2pir_past.g (original)
+++ trunk/languages/bc/grammar/antlr_3/antlr_past2pir_past.g Sun Feb 19
05:52:32 2006
@@ -7,14 +7,14 @@ tree grammar AntlrPast2PirPast;
options
{
- ASTLabelType=CommonTree;
- tokenVocab='grammar/antlr_3/BcParser';
+ ASTLabelType = CommonTree;
+ tokenVocab = 'grammar/antlr_3/BcParser';
}
-gen_pir_past
- : ^(PROGRAM expr)
- {
- String pirBefore
+gen_pir_past
+ :
+ {
+ String pirBefore
= "#!/usr/bin/env parrot\n"
+ "\n"
+ "# Do not edit this file.\n"
@@ -28,8 +28,50 @@ gen_pir_past
+ " .local pmc stmts_children\n"
+ " stmts_children = new PerlArray\n";
+ System.out.println( pirBefore );
+ }
+ ^(PROGRAM expr)
+ {
String pirAfter
- = " .local pmc stmts\n"
+ = " \$P20 = new 'PAST::Exp' \n"
+ + " \$P21 = new PerlArray \n"
+ + " push \$P21, \$P10 \n"
+ + " \$P20.set_node('1', 1, \$P21) \n"
+ + " \$P30 = new 'PAST::Op' \n"
+ + " \$P31 = new PerlArray \n"
+ + " push \$P31, \$P20 \n"
+ + " \$P30.set_node('1', 1, 'print' ,\$P31) \n"
+ + " \$P40 = new 'PAST::Exp' \n"
+ + " \$P41 = new PerlArray \n"
+ + " push \$P41, \$P30 \n"
+ + " \$P40.set_node('1', 1, \$P41) \n"
+ + " \$P50 = new 'PAST::Stmt' \n"
+ + " \$P51 = new PerlArray \n"
+ + " push \$P51, \$P40 \n"
+ + " \$P50.set_node('1', 1 ,\$P51) \n"
+ + " push stmts_children, \$P50 \n"
+ + " \$P60 = new 'PAST::Val' \n"
+ + " \$P60.set_node( '1', 0, '\\n' ) \n"
+ + " \$P60.valtype( 'strqq' ) \n"
+ + " \$P70 = new 'PAST::Exp' \n"
+ + " \$P71 = new PerlArray \n"
+ + " push \$P71, \$P60 \n"
+ + " \$P70.set_node('1', 1, \$P71) \n"
+ + " \$P80 = new 'PAST::Op' \n"
+ + " \$P81 = new PerlArray \n"
+ + " push \$P81, \$P70 \n"
+ + " \$P80.set_node('1', 1, 'print' ,\$P81) \n"
+ + " \$P90 = new 'PAST::Exp' \n"
+ + " \$P91 = new PerlArray \n"
+ + " push \$P91, \$P80 \n"
+ + " \$P90.set_node('1', 1, \$P91) \n"
+ + " \$P100 = new 'PAST::Stmt' \n"
+ + " \$P101 = new PerlArray \n"
+ + " push \$P101, \$P90 \n"
+ + " \$P100.set_node('1', 1 ,\$P101) \n"
+ + " push stmts_children, \$P100 \n"
+ + "\n"
+ + " .local pmc stmts\n"
+ " stmts = new 'PAST::Stmts'\n"
+ " stmts.set_node('1', 1, stmts_children)\n"
+ "\n"
@@ -103,52 +145,26 @@ gen_pir_past
+ " end\n"
+ ".end\n";
- String pirDummy
- = " \$P10 = new 'PAST::Val' \n"
- + " \$P10.set_node( '1', 0, " + $expr.text + " ) \n"
- + " \$P10.valtype( 'num' ) \n"
- + " \$P20 = new 'PAST::Exp' \n"
- + " \$P21 = new PerlArray \n"
- + " push \$P21, \$P10 \n"
- + " \$P20.set_node('1', 1, \$P21) \n"
- + " \$P30 = new 'PAST::Op' \n"
- + " \$P31 = new PerlArray \n"
- + " push \$P31, \$P20 \n"
- + " \$P30.set_node('1', 1, 'print' ,\$P31) \n"
- + " \$P40 = new 'PAST::Exp' \n"
- + " \$P41 = new PerlArray \n"
- + " push \$P41, \$P30 \n"
- + " \$P40.set_node('1', 1, \$P41) \n"
- + " \$P50 = new 'PAST::Stmt' \n"
- + " \$P51 = new PerlArray \n"
- + " push \$P51, \$P40 \n"
- + " \$P50.set_node('1', 1 ,\$P51) \n"
- + " push stmts_children, \$P50 \n"
- + " \$P60 = new 'PAST::Val' \n"
- + " \$P60.set_node( '1', 0, '\\n' ) \n"
- + " \$P60.valtype( 'strqq' ) \n"
- + " \$P70 = new 'PAST::Exp' \n"
- + " \$P71 = new PerlArray \n"
- + " push \$P71, \$P60 \n"
- + " \$P70.set_node('1', 1, \$P71) \n"
- + " \$P80 = new 'PAST::Op' \n"
- + " \$P81 = new PerlArray \n"
- + " push \$P81, \$P70 \n"
- + " \$P80.set_node('1', 1, 'print' ,\$P81) \n"
- + " \$P90 = new 'PAST::Exp' \n"
- + " \$P91 = new PerlArray \n"
- + " push \$P91, \$P80 \n"
- + " \$P90.set_node('1', 1, \$P91) \n"
- + " \$P100 = new 'PAST::Stmt' \n"
- + " \$P101 = new PerlArray \n"
- + " push \$P101, \$P90 \n"
- + " \$P100.set_node('1', 1 ,\$P101) \n"
- + " push stmts_children, \$P100 \n";
-
- System.out.print( pirBefore + pirDummy + pirAfter );
+ System.out.print( pirAfter );
}
;
-expr
+expr_int_1
: INT
;
+
+
+expr returns [int reg]
+ @init
+ {
+ $reg = 10;
+ }
+ : expr_int_1
+ {
+ String pir
+ = " \$P" + $reg + " = new 'PAST::Val' \n"
+ + " \$P" + $reg + ".set_node( '1', 0, " +
$expr_int_1.text + " ) \n"
+ + " \$P" + $reg + ".valtype( 'num' ) \n";
+ System.out.println( pir );
+ }
+ ;
Modified: trunk/languages/bc/grammar/antlr_3/bc.g
==============================================================================
--- trunk/languages/bc/grammar/antlr_3/bc.g (original)
+++ trunk/languages/bc/grammar/antlr_3/bc.g Sun Feb 19 05:52:32 2006
@@ -1,14 +1,16 @@
// Copyright: 2006 The Perl Foundation. All Rights Reserved.
// $Id$
-// Parse bc
+// Parse bc with ANTLR3
+// This grammar is derived from
<http://www.funet.fi/pub/doc/posix/p1003.2/d11.2/4.3>
+
grammar BcParser;
options
{
- output=AST;
- ASTLabelType=CommonTree;
+ output = AST;
+ ASTLabelType = CommonTree;
}
tokens
@@ -18,24 +20,29 @@ tokens
program
- : INT quit -> ^( PROGRAM INT )
+ : input_item quit -> ^( PROGRAM input_item )
+ ;
+
+input_item
+ : INT
;
INT
: ('0'..'9')+
;
+// quit is required, make testing easier
quit
- : 'quit'
- ;
+ : 'quit'
+ ;
WS
- : ( ' '
- | '\t'
- | '\r'
- | '\n'
- )+
- {
+ : ( ' '
+ | '\t'
+ | '\r'
+ | '\n'
+ )+
+ {
channel = 99;
- }
- ;
+ }
+ ;