int enter(SymTbl& tb, SymKind kind) /* 심볼 테이블 등록 */ { int n, mem_size; bool isLocal = is_localName(tb.name, kind); extern int localAdrs; /* 로컬 변수 주소 관리 */ extern Mymemory Dmem; /* 메모리 */ // 확인 mem_size = tb.aryLen; if (mem_size == 0) mem_size = 1; /* 단순 변수일 때 */ if (kind!=varId && tb.name[0]=='$') /* $ 사용 확인 */ err_exit("변수명 이외에서 $를 사용할 수 없습니다: ", tb.name); tb.nmKind = kind; n = -1; /* 중복확인 */ if (kind == fncId) n = searchName(tb.name, 'G'); if (kind == paraId) n = searchName(tb.name, 'L'); if (n != -1) err_exit("이름이 중복되었습니다: ", tb.name); // 주소 설정 if (kind == fncId) tb.adrs = get_lineNo(); /* 함수 시작 행 */ else { if (isLocal) { tb.adrs = localAdrs; localAdrs += mem_size; } /* 로컬 */ else { tb.adrs = Dmem.size(); /* 글로벌 */ Dmem.resize(Dmem.size() + mem_size); /* 글로벌 영역 확보 */ } } // 등록 if (isLocal) { n = Ltable.size(); Ltable.push_back(tb); } /* 로컬 */ else { n = Gtable.size(); Gtable.push_back(tb); } /* 글로벌 */ return n; /* 등록 위치 */ }
/* * エラーメッセージを表示し、BBIインタプリタを終了する * 関数宣言で次のデフォルト引数を指定 * void err_exit(Tobj a="\1", Tobj b="\1", Tobj c="\1", Tobj d="\1") */ void err_exit(Tobj a, Tobj b, Tobj c, Tobj d){ Tobj ob[5]; ob[1]=a; ob[2]=b; ob[3]=c; ob[4]=d; cerr << "line:" << get_lineNo() << " ERROR "; for(int i=0;i<=4 && ob[i].s!="\1";i++){ if(ob[i].type == 'd') cout << ob[i].d; //数値情報 if(ob[i].type == 's') cout << ob[i].s; //文字列情報 } cout << endl; exit(1); }