rendered paste bodyIndex: /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\");");
+ }
}