Example #1
0
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;                                                       /* 등록 위치 */
}
Example #2
0
/*
 * エラーメッセージを表示し、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);
}