All pastes #2088942 Raw Edit

Unnamed

public text v1 · immutable
#2088942 ·published 2011-10-11 03:56 UTC
rendered paste body
Index: /trunk/HW2/part18/Parser.java
===================================================================
--- /trunk/HW2/part18/Parser.java (revision 27)
+++ /trunk/HW2/part18/Parser.java (revision 28)
@@ -6,4 +6,5 @@
     private Set <String> toTestFuncDefinition = new HashSet<String>(); 
     private Set <String> alreadyDefine = new HashSet<String>(); 
+    private Map <String, Integer> funArityMap = new HashMap<String, Integer>();
 
     // need a symbol table
@@ -112,4 +113,8 @@
     private void fun_proto(){
         if( is(TK.ID) ) {
+
+            String funName = tok.string;
+            Integer arity;
+
             if (symtab.add_entry(tok.string, tok.lineNumber, TK.FUNPROTOS)) {
 
@@ -121,4 +126,15 @@
             }
             scan();
+
+            if(is(TK.NUM)){
+                arity = Integer.parseInt(tok.string);
+                if(funName.equals("main") && arity != 0){
+                  System.err.println("main function can't have parameters but specified " + arity);
+                  System.exit(1);
+                } else{
+                  funArityMap.put(funName, arity);
+                }
+            }
+
             mustbe(TK.NUM);
         }
@@ -137,7 +153,7 @@
     private void fun_def(){
       mustbe(TK.FUN);
-
       gcprint("int ");
 
+      // check code
       Entry e = symtab.search(tok.string);
       if (e==null){
@@ -152,7 +168,7 @@
 
       alreadyDefine.add(tok.string);
-
       toTestFuncDefinition.remove(tok.string);
 
+      //////////////////////////////////////
       gcprintid(tok.string);
       scan();
@@ -173,9 +189,29 @@
     
     private void formals_list() {
+        if(is(TK.ID)){
+          symtab.begin_st_block();
+          symtab.add_entry(tok.string, tok.lineNumber, TK.VAR);
+          gcprint("int ");
+          gcprintid(tok.string);
+
+          scan();
+          while( is(TK.COMMA) ) {
+              gcprint(", ");
+              scan();
+          
+              symtab.add_entry(tok.string, tok.lineNumber, TK.VAR);
+              gcprint("int ");
+              gcprintid(tok.string);
+              mustbe(TK.ID);
+          }
+        }
     }
 
     private void block() {
         gcprint("{");
-        symtab.begin_st_block(); while( first(f_declaration) ) {
+        gcprint("{");
+        symtab.begin_st_block(); 
+
+        while( first(f_declaration) ) {
             declaration();
         }
@@ -184,4 +220,5 @@
         }
         symtab.end_st_block();
+        gcprint("}");
         gcprint("}");
      }
@@ -475,15 +512,10 @@
 
     private void actuals_list(){
-        gcprint("printf(\"%d\", ");
         expression();
-        gcprint(");");
-
         while(is(TK.COMMA)){
+          gcprint(", ");
           scan();
-          gcprint("printf(\" %d\",");
           expression();
-          gcprint(");");
-        }
-        gcprint("printf(\"\\n\");");
+        }
     }