home *** CD-ROM | disk | FTP | other *** search
/ ftp.ee.pdx.edu / 2014.02.ftp.ee.pdx.edu.tar / ftp.ee.pdx.edu / pub / users / Harry / compilers / p8 / Generator0.java < prev    next >
Text File  |  2006-01-29  |  4KB  |  141 lines

  1. // ----------------------------- IR Code Generation -----------------------------
  2. //
  3. // Methods to walk an Abstract Syntax Tree, generating the Intermediate
  4. // Representation (IR) code.
  5. //
  6. // There will be only one instance of this class.  The primary method is:
  7. //      generator.generateIR (ast)
  8. // This method will walk the AST (calling other methods as necessary).  As it
  9. // walks the tree, it will generate the IR code.
  10. //
  11. // <Your Name Here> -- <Date>
  12. //
  13.  
  14. import java.io.*;
  15.  
  16. class Generator {
  17.  
  18.  
  19.     //
  20.     // Constants
  21.     //
  22.     static final int INITIAL_VARIABLE_OFFSET      =  -4;
  23.     static final int VARIABLE_OFFSET_INCR         =  -4;
  24.     static final int INITIAL_FORMAL_OFFSET        = +68;
  25.     static final int FORMAL_OFFSET_INCR           =  +4;
  26.     static final int REGISTER_SAVE_AREA_SIZE      = +64;
  27.     static final int DISPLAY_REG_SAVE_AREA_OFFSET = +64;
  28.  
  29.     static final int INTEGER_MODE = 1;
  30.     static final int REAL_MODE    = 2;
  31.     static final int STRING_MODE  = 3;
  32.     static final int BOOLEAN_MODE = 4;
  33.  
  34.  
  35.  
  36.     //
  37.     // Fields
  38.     //
  39.     int lexicalLev = 0;
  40.     int maxLexicalLevel = 0;
  41.     Ast.Body currentBody;
  42.     Ast.StringConst stringList = null;
  43.     Ast.RealConst floatList = null;
  44.     int nextLabelNumber = 1;
  45.     int nextTempNumber = 1;
  46.  
  47.  
  48.  
  49.     //
  50.     //  Constructor
  51.     //
  52.     Generator () { }
  53.  
  54.  
  55.  
  56.     // generateIR (ast)
  57.     //
  58.     // This method is called to generate the IR code.  It is passed
  59.     // a pointer to an Abstract Syntax Tree "ast".
  60.     //
  61.     void generateIR (Ast.Body ast)
  62.         throws FatalError
  63.     {
  64.         Main.parser.lexer.lineNumber = 0;
  65.         genBody (ast);
  66.     }
  67.     
  68.  
  69. ...
  70.     
  71.     
  72.     // genAssignStmt (assignStmt)
  73.     //
  74.     // Generate IR code for the AssignStmt pointed to by "assignStmt".
  75.     //
  76.     void genAssignStmt (Ast.AssignStmt assignStmt)
  77.         throws FatalError
  78.     {
  79.         IR.comment ("ASSIGNMENT STMT...");
  80.         Ast.Node x = genLValue (assignStmt.lValue);
  81.         Ast.Node y = genExpr (assignStmt.expr);
  82.         IR.store (x, y);
  83.     }
  84.  
  85.  
  86. ...
  87.  
  88.  
  89.     // newLabel ()
  90.     //
  91.     // This method returns a newly created string of the form "Label_43".  The
  92.     // integer part is incremented on each call, making the returned string unique
  93.     // from all previous strings returned by this function.
  94.     //
  95.     String newLabel () {
  96.         return "Label_" + (nextLabelNumber++);
  97.     }
  98.  
  99.  
  100.  
  101.     // newTemp ()
  102.     //
  103.     // This method creates a new local variable with a name such as "t47"
  104.     // and adds it to the current Body.
  105.     //
  106.     // This method creates a new VarDecl node, fills it in, and links it into
  107.     // the list of VarDecls for the current body.  It assumes that "currentBody"
  108.     // points to the Body node for the current routine.
  109.     //
  110.     // This method returns a pointer to the VarDecl just created.
  111.     //
  112.     Ast.VarDecl newTemp () {
  113.         Ast.VarDecl vd = new Ast.VarDecl ();
  114.         vd.lineNumber = 0;
  115.         vd.id = "t" + (nextTempNumber++);
  116.         vd.typeName = null;
  117.         vd.expr = null;
  118.         vd.lexLevel = -1;           //  -1 signals a temporary variable
  119.         vd.next = null;
  120.         vd.offset = 0;
  121.         if (currentBody.varDecls == null) {
  122.             currentBody.varDecls = vd;
  123.         } else {
  124.             Ast.VarDecl p = currentBody.varDecls;
  125.             Ast.VarDecl last = null;
  126.             while (p != null) {
  127.                 last = p;
  128.                 p = p.next;
  129.             }
  130.             if (last == null) {
  131.                 currentBody.varDecls = vd;
  132.             } else {
  133.                 last.next = vd;
  134.             }
  135.         }
  136.         return vd;
  137.     }
  138.  
  139.  
  140. }
  141.