Ignore:
Timestamp:
Dec 2, 2012, 12:50:44 AM (6 years ago)
Author:
ksherdy
Message:

General refactoring.

Location:
proto/pablo/src/compiler/backend
Files:
2 added
1 moved

Legend:

Unmodified
Added
Removed
  • proto/pablo/src/compiler/backend/visitors/CPPUnparser.java

    r2702 r2710  
    1 package compiler.codeGenerator.visitors;
     1package compiler.backend.visitors;
    22
    33import ast.*;
     
    77
    88import compiler.ast.Accessors;
    9 import compiler.ast.Generators;
     9import compiler.backend.visitors.helpers.CodeStore;
     10import compiler.backend.visitors.helpers.UnparserUtil;
    1011import compiler.codeGenerator.visitors.helpers.*;
     12import compiler.lang.carryset.CarrySet2CPP;
     13import compiler.lang.pablo.Builtins2CPP;
     14
     15//
     16// Design:      This class clones the AST function body in the visit(FuncDefNode) method and
     17//                      modifies the FuncDefNode body to handle atEOF, inFile and EOF_mask in block     
     18//                      final block processing.
     19//
     20
     21// Target
     22/*             
     23struct @name
     24{
     25  @name() {}
     26  IDISA_INLINE void do_block(@parameters)
     27  {
     28        @do_block                               
     29  }
     30  IDISA_INLINE void do_final_block(@parameters)
     31  {
     32    @do_final_block
     33  }                             
     34  CarryArray<@carry_count, @carry_n_count> carryQ;
     35};
     36*/
    1137
    1238public class CPPUnparser extends Unparser {
     
    2551                return codeStore.toStringIndented(indent);
    2652        }
    27 
     53       
    2854        //////////////////////////////////////////////////////////////
    2955        // visitors
     
    7399       
    74100        ////////////////////////////////////////////////////////////////////////////
    75         // Stream Funcs
     101        // Stream Funcs - User defined stream function (language extension point)
    76102        ////////////////////////////////////////////////////////////////////////////
    77103        public CodeStore visitLeave(FuncDefNode node, List<CodeStore> childResults) {
    78                 CodeStore code = new CodeStore();
    79 
    80                 CodeStore returnType = childResults.get(0);
    81                 CodeStore FuncName = childResults.get(1);
    82                 CodeStore blockStmt; 
    83                
     104               
     105               
     106               
     107                CodeStore code = new CodeStore();
     108                // CodeStore returnType = childResults.get(0);
     109                 
     110                String funcName = childResults.get(1).getResultVarName();
    84111                String parameters = new String();
     112                               
    85113                if(Accessors.hasParameters(node)) {
    86114                        parameters = childResults.get(2).getResultVarName();
    87                         blockStmt = childResults.get(3);
    88                 } else {
    89                         blockStmt = childResults.get(2);
    90                 }
     115                }
     116               
     117                // TODO - CarryArray carry_count ...
     118               
     119                boolean isFinalBlock = false;
     120                CodeStore nonFinalBlockCodeStore = XFormBlockStmt(Accessors.blockStmtNode(node), isFinalBlock);
     121                       
     122                isFinalBlock = true;
     123                CodeStore finalBlockCodeStore = XFormBlockStmt(Accessors.blockStmtNode(node), isFinalBlock);
     124               
     125                code.addFormattedLine("struct %s", funcName);
     126                code.addLine("{");
     127                code.indentedFormattedLine("%s () {}", funcName);
     128                code.addFormattedLine("IDISA_INLINE void do_block(%s)", parameters);
     129                code.addLine("{");
     130                code.addAll(nonFinalBlockCodeStore, 1);
     131                code.dedentedLine("}");
     132                code.addFormattedLine("IDISA_INLINE void do_final_block(%s)", parameters);
     133                code.addLine("{");
     134                code.addAll(finalBlockCodeStore, 1);
     135                code.dedentedLine("}");
     136                code.addFormattedLine("CarryArray<%s,%s> carryQ;", "99", "99"); // CGO
     137                code.dedentedLine("};");
    91138                               
    92                 code.addFormattedLine("%s %s(%s)",
    93                                 returnType.getResultVarName(),
    94                                 FuncName.getResultVarName(),
    95                                 parameters);   
    96                
    97                 code.addLine("{");
    98                 code.addAll(blockStmt, 1);
    99                 code.dedentedLine("}");
    100                 return code;
     139                return code;
     140        }
     141
     142        private CodeStore XFormBlockStmt(BlockStmtNode node, boolean isFinalBlock) {
     143                BlockStmtNode copy = node.deepCopy();
     144                Pablo2CarryXFormer pablo2CarryQ = new Pablo2CarryXFormer(copy, new Builtins2CPP(), new CarrySet2CPP());
     145                pablo2CarryQ.XForm(isFinalBlock);                   
     146                CodeStore codeStore = copy.accept(new CPPUnparser());
     147                return codeStore;
    101148        }
    102149
     
    135182        }
    136183
    137         // Func invocation
    138         //
    139         // TODO - Verify correctness, both returns Var and code line.
    140         //
     184        // FuncCall Stmt 
    141185        public CodeStore visitLeave(FuncCallNode node, List<CodeStore> childResults) {
    142186                CodeStore code = new CodeStore();
     
    149193                resultVar.append(")");
    150194               
    151                 code.setResultVarName(resultVar.toString());   // Func invocation as an expression     
    152                
    153                 code.addFormattedLine("%s;", resultVar.toString()); // Func invocation as a Stmt
     195                code.setResultVarName(resultVar.toString());            // Function invocation as an expression
     196               
     197                code.addFormattedLine("%s;", resultVar.toString()); // Function invocation as a statement
    154198               
    155199                return code;
     
    364408                code.addFormattedLine("struct %s", structName.getResultVarName());
    365409                code.addLine("{");
    366                 if(Accessors.hasStructBody(node)) {
     410                if(Accessors.hasStructBody(node)) {                             
    367411                        code.addAll(childResults.get(1),0);
    368412                }
     
    376420        public CodeStore visitLeave(StructTypeBodyNode node, List<CodeStore> childResults) {
    377421                CodeStore code = new CodeStore();
    378                 /*
     422               
    379423                for (CodeStore child: childResults.subList(0, 1)) {
    380                         code.addLine(child.toString(),1);
     424                        code.addAll(child,1);
    381425                }
    382426                for (CodeStore child: childResults.subList(1, childResults.size())) {
    383                         code.addLine(child.toString(),0);
     427                        code.addAll(child,0);
    384428                }       
    385                 */
    386                 code.addAll(childResults.get(0),1);
    387429               
    388430                return code;
Note: See TracChangeset for help on using the changeset viewer.