starting to work on supporting packages and import statements.
authorbdemsky <bdemsky>
Tue, 14 Nov 2006 22:01:40 +0000 (22:01 +0000)
committerbdemsky <bdemsky>
Tue, 14 Nov 2006 22:01:40 +0000 (22:01 +0000)
Robust/src/IR/ClassDescriptor.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/Main/Main.java
Robust/src/Parse/java14.cup

index 3b51b536840268c64d05da2ab80c159c9149ca59..b1e05b136e9d2009734b3ddbec69a441777928e1 100644 (file)
@@ -3,19 +3,12 @@ import java.util.*;
 import IR.Tree.*;
 
 public class ClassDescriptor extends Descriptor {
-    public ClassDescriptor(String classname) {
-       super(classname);
-       superclass=null;
-       flags=new SymbolTable();
-       fields=new SymbolTable();
-       methods=new SymbolTable();
-       classid=UIDCount++;
-    }
     private static int UIDCount=0; 
     private final int classid;
     String superclass;
     ClassDescriptor superdesc;
     boolean hasFlags=false;
+    String packagename;
 
     Modifiers modifiers;
 
@@ -23,6 +16,20 @@ public class ClassDescriptor extends Descriptor {
     SymbolTable flags;
     SymbolTable methods;
 
+    public ClassDescriptor(String classname) {
+       this("", classname);
+    }
+
+    public ClassDescriptor(String packagename, String classname) {
+       super(classname);
+       superclass=null;
+       flags=new SymbolTable();
+       fields=new SymbolTable();
+       methods=new SymbolTable();
+       classid=UIDCount++;
+       this.packagename=packagename;
+    }
+
     public int getId() {
        return classid;
     }
index 636821f7c8411cf4c607a008f210e1b82e3565a7..17eceb26ce517efaf86f4667c5402eede9af6832 100644 (file)
@@ -17,6 +17,26 @@ public class BuildIR {
 
     /** Parse the classes in this file */
     public void parseFile(ParseNode pn) {
+       NameDescriptor packages;
+       Vector singleimports=new Vector();
+       Vector multiimports=new Vector();
+
+       ParseNode ipn=pn.getChild("imports").getChild("import_decls_list");
+       if (ipn!=null) {
+           ParseNodeVector pnv=ipn.getChildren();
+           for(int i=0;i<pnv.size();i++) {
+               ParseNode pnimport=pnv.elementAt(i);
+               NameDescriptor nd=parseName(pnimport.getChild("name"));
+               if (isNode(pnimport,"import_single"))
+                   singleimports.add(nd);
+               else
+                   multiimports.add(nd);
+           }
+       }
+       ParseNode ppn=pn.getChild("packages").getChild("package");
+       if (ppn!=null) {
+           packages=parseName(pn.getChild("name"));
+       }
        ParseNode tpn=pn.getChild("type_declaration_list");
        if (tpn!=null) {
            ParseNodeVector pnv=tpn.getChildren();
index 9478237483155ae4b209f7ca8098fb915ab24a3b..af5c038c7d925e869e8df3846cadcf92d199100d 100644 (file)
@@ -95,7 +95,7 @@ public class Main {
        ParseNode p=(ParseNode) g./*debug_*/parse().value;
        state.addParseNode(p);
        if (l.numErrors()!=0) {
-           System.out.println("Error parsing Object.java");
+           System.out.println("Error parsing "+sourcefile);
            System.exit(l.numErrors());
        }
     }
index ae8058e558303191588b552147f585db72444a77..d964ee8be488804c945ae458e3e42e6bfed8e4df 100644 (file)
@@ -120,12 +120,12 @@ non terminal ParseNode array_type;
 non terminal ParseNode name, simple_name, qualified_name;
 // 19.6) Packages
 non terminal ParseNode compilation_unit;
-//non terminal ParseNode package_declaration_opt, package_declaration;
-//non terminal ParseNode import_declarations_opt, import_declarations;
+non terminal ParseNode package_declaration_opt, package_declaration;
+non terminal ParseNode import_declarations_opt, import_declarations;
 non terminal ParseNode type_declarations_opt, type_declarations;
-//non terminal ParseNode import_declaration;
-//non terminal ParseNode single_type_import_declaration;
-//non terminal ParseNode type_import_on_demand_declaration;
+non terminal ParseNode import_declaration;
+non terminal ParseNode single_type_import_declaration;
+non terminal ParseNode type_import_on_demand_declaration;
 non terminal ParseNode type_declaration;
 // 19.7) Productions used only in the LALR(1) grammar
 non terminal ParseNode modifiers_opt, modifiers, modifier;
@@ -501,26 +501,44 @@ qualified_name ::= name:name DOT IDENTIFIER:id {:
 
 // 19.6) Packages
 compilation_unit ::=
-//              package_declaration_opt
-//              import_declarations_opt
+                package_declaration_opt:pdo
+                import_declarations_opt:ido
                type_declarations_opt:tdo {: 
                ParseNode pn=new ParseNode("compilation_unit");
                pn.addChild(tdo);
+               pn.addChild("packages").addChild(pdo);
+               pn.addChild("imports").addChild(ido);
                RESULT=pn;
                :}
                ;
-//package_declaration_opt ::= package_declaration | ;
-//import_declarations_opt ::= import_declarations | ;
+package_declaration_opt ::= package_declaration:pdo {:
+               RESULT=pdo;
+       :} |
+       {: RESULT=new ParseNode("empty"); :}
+;
+
+import_declarations_opt ::= import_declarations:ido {: 
+               RESULT=ido;
+       :} | 
+       {: RESULT=new ParseNode("empty"); :}
+;
 type_declarations_opt   ::= type_declarations:tds {:
                RESULT=tds;
                :}   | 
        {: RESULT=new ParseNode("empty"); :}
        ;
 
-//import_declarations ::=
-//               import_declaration
-//       |       import_declarations import_declaration
-//       ;
+import_declarations ::=
+               import_declaration:id {: 
+               ParseNode pn=new ParseNode("import_decls_list");
+               pn.addChild(id);
+               RESULT=pn;
+       :}
+       |       import_declarations:ids import_declaration:id {: 
+               ids.addChild(id);
+               RESULT=ids;
+       :}
+       ;
 
 type_declarations ::= 
                type_declaration:td {:
@@ -534,19 +552,31 @@ type_declarations ::=
                :}
        ;
 
-//package_declaration ::=
-//               PACKAGE name SEMICOLON
-//       ;
-//import_declaration ::=
-//               single_type_import_declaration
-//       |       type_import_on_demand_declaration
-//       ;
-//single_type_import_declaration ::=
-//               IMPORT name SEMICOLON
-//       ;
-//type_import_on_demand_declaration ::=
-//               IMPORT name DOT MULT SEMICOLON
-//       ;
+package_declaration ::=
+               PACKAGE name:name SEMICOLON {: 
+       ParseNode pn=new ParseNode("package");
+       pn.addChild(name);
+       RESULT=pn;
+       :}
+       ;
+import_declaration ::=
+               single_type_import_declaration:sid {: RESULT=sid; :}
+       |       type_import_on_demand_declaration:iod {: RESULT=iod; :}
+       ;
+single_type_import_declaration ::=
+               IMPORT name:name SEMICOLON {: 
+       ParseNode pn=new ParseNode("import_single");
+       pn.addChild(name);
+       RESULT=pn;
+:}
+       ;
+type_import_on_demand_declaration ::=
+               IMPORT name:name DOT MULT SEMICOLON {:
+       ParseNode pn=new ParseNode("import_ondemand");
+       pn.addChild(name);
+       RESULT=pn;
+       :}       
+       ;
 
 type_declaration ::=
                class_declaration:cd