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 toTestFuncDefinition = new HashSet(); private Set alreadyDefine = new HashSet(); + private Map funArityMap = new HashMap(); // 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\");"); + } }