コンパイラ

$$の使い方がわからなかったので、調べたら速攻で使えたとさ。
$$ないとやってられなかったのに、頑張っていろいろちまちました関数を作ってた俺っていったい…。
というわけで、$$使ったら今回の課題は一瞬で終わりましたよっと・・・orz。
使いかたは最初のほうに変数名宣言しとけばあとは使える。

%union {
int num;
char ident[MAXLENGTH+1];
}
・・・・・
%token IDENT
とかいろいろ定義してあるところに、

%type proc_id_list proc_decl arg_list
とかを追加する。これは proc_id_listの$$の値をnumのint型にするよ。みたいな感じだと思う。

んであとは、

proc_id_list
: IDENT
{
$$ = 1;
gen(INT,0,0,1);
add_var($1);
}

proc_id_list COMMA IDENT

{ $$ = $1 + 1;
gen(INT,0,0,1);
add_var($3);
}
;

てやる。
そうすれば、
例えば

proc_decl:
PROCEDURE IDENT LPAREN proc_id_list RPAREN SEMICOLON inblock

こんなんがあったら$4で、proc_id_listの中で定義された$$の値が使える。