Example #1
0
void process_single_declaration (node * decl, TYPE t) {
	node * n;
	char * idcpy;
	KIND koverride;
	int offsetoverride = 0; // you can't have zero offset for stack elements so this marks global ref
	// make a copy of id name
	idcpy = strcpy ( (char*)malloc(strlen(decl->name)+1), decl->name);
	// check extern flag and print action +++++++++
	if (shouldSetExtern) {
		koverride = EXTERN;
	} else {
		koverride = decl->k;
		if (koverride == VAR) {
			if (sts->current_scope->s == LOCAL) {
				fprintf (fp, "\tsubl\t$4, %%esp\n");
				currentOffset -= 4;	
				offsetoverride = currentOffset;
			} else {
				push_back_global (idcpy); //TODO-check this for memory things
			}
		}
	}
	// insert symbol
	if ( (n = st_insert_id (sts, idcpy, koverride, t, offsetoverride, decl->plist)) != NULL ) {
		if (compare_symbol (n, koverride, t, decl->plist) > 0)
			error_handler(OVERLOADED_DECL_ERROR, NULL);
		roll_back_params(decl->plist);
		list_destroy(decl->plist);
		free(decl->plist);
	}
}
Example #2
0
void process_matrix_declaration (char * id, int dim1, int dim2) {
	int subOff = 0;
	int offsetoverride;
	KIND koverride;
	List * dimlist;
	node * n;
	char * idcpy;
	// check for invalid dimensions
	if ( (dim1 <= 0) || (dim2 < 0) ) {
		error_handler (MATRIX_DIM_ERROR, id);
	}
	// make a copy of id name
	idcpy = strcpy ( (char*)malloc(strlen(id)+1), id);
	// build list to hold dimensions
	dimlist = (List*) malloc (sizeof(List));
	list_initialize (dimlist);
	// determine total space on stack and set dimensions
	if (dim2 == 0) {
		subOff = dim1 * 4;
		koverride = ARRAY;
		append_node (dimlist, NULL, ARRAY, UNKNOWN, dim1, NULL);
	} else {
		subOff = dim1 * dim2 * 4;
		koverride = MATRIX;
		append_node (dimlist, NULL, MATRIX, UNKNOWN, dim1, NULL);
		append_node (dimlist, NULL, MATRIX, UNKNOWN, dim2, NULL);
	}
	// create space on stack
	fprintf (fp, "\tsubl\t$%d, %%esp\n", subOff);
	offsetoverride = currentOffset - 4; // save the array stack beginning into symtab
	currentOffset -= subOff;	
	// insert into symtab
	if ( (n = st_insert_id (sts, idcpy, koverride, INT, offsetoverride, dimlist)) != NULL ) {
		if (compare_symbol (n, koverride, INT, dimlist) > 0)
			error_handler(OVERLOADED_DECL_ERROR, NULL);
	}
}
Example #3
0
 static int compare_vmsymbol_sid(const void* void_a, const void* void_b) {
   Symbol* a = vmSymbols::symbol_at(*((vmSymbols::SID*) void_a));
   Symbol* b = vmSymbols::symbol_at(*((vmSymbols::SID*) void_b));
   return compare_symbol(a, b);
 }
Example #4
0
vmSymbols::SID vmSymbols::find_sid(Symbol* symbol) {
  // Handle the majority of misses by a bounds check.
  // Then, use a binary search over the index.
  // Expected trip count is less than log2_SID_LIMIT, about eight.
  // This is slow but acceptable, given that calls are not
  // dynamically common.  (methodOop::intrinsic_id has a cache.)
  NOT_PRODUCT(find_sid_calls++);
  int min = (int)FIRST_SID, max = (int)SID_LIMIT - 1;
  SID sid = NO_SID, sid1;
  int cmp1;
  sid1 = vm_symbol_index[min];
  cmp1 = compare_symbol(symbol, symbol_at(sid1));
  if (cmp1 <= 0) {              // before the first
    if (cmp1 == 0)  sid = sid1;
  } else {
    sid1 = vm_symbol_index[max];
    cmp1 = compare_symbol(symbol, symbol_at(sid1));
    if (cmp1 >= 0) {            // after the last
      if (cmp1 == 0)  sid = sid1;
    } else {
      // After checking the extremes, do a binary search.
      ++min; --max;             // endpoints are done
      int mid = mid_hint;       // start at previous success
      while (max >= min) {
        assert(mid >= min && mid <= max, "");
        NOT_PRODUCT(find_sid_probes++);
        sid1 = vm_symbol_index[mid];
        cmp1 = compare_symbol(symbol, symbol_at(sid1));
        if (cmp1 == 0) {
          mid_hint = mid;
          sid = sid1;
          break;
        }
        if (cmp1 < 0)
          max = mid - 1;        // symbol < symbol_at(sid)
        else
          min = mid + 1;

        // Pick a new probe point:
        mid = (max + min) / 2;
      }
    }
  }

#ifdef ASSERT
  // Perform the exhaustive self-check the first 1000 calls,
  // and every 100 calls thereafter.
  static int find_sid_check_count = -2000;
  if ((uint)++find_sid_check_count > (uint)100) {
    if (find_sid_check_count > 0)  find_sid_check_count = 0;

    // Make sure this is the right answer, using linear search.
    // (We have already proven that there are no duplicates in the list.)
    SID sid2 = NO_SID;
    for (int index = (int)FIRST_SID; index < (int)SID_LIMIT; index++) {
      Symbol* sym2 = symbol_at((SID)index);
      if (sym2 == symbol) {
        sid2 = (SID)index;
        break;
      }
    }
    // Unless it's a duplicate, assert that the sids are the same.
    if (_symbols[sid] != _symbols[sid2]) {
      assert(sid == sid2, "binary same as linear search");
    }
  }
#endif //ASSERT

  return sid;
}
Example #5
0
token LRParsing::lexicalAnalizer(){
	char readchar;
	int state=0;//0=start
	char readbuf[100];
	token ret_tok={"","",0,0,0,0};
	int buf_index=0;
	double num;
	int multifier;
	int num_index=0;

	//readAll.AppendChar(' ');
	if(read_type == 1)
		readAll.AppendChar(EOF);
	do{
		//readchar = fgetc(fp);
		if(read_type == 1){
			readchar = readAll.GetAt(*index);
			(*index)++;
		} else if(read_type ==0){
			readchar = fgetc(read_fp);
		}

		if(readchar == EOF && state==0){
				ret_tok.tokenName="EOF";
				strcpy_s(ret_tok.strbuf,"\0");
				ret_tok.tokenType=44;
				return ret_tok;
		}

		readbuf[buf_index++]=readchar;
		readbuf[buf_index]='\0';
		switch(state){
		case 0:
			if((readchar>='a' && readchar<='z') || (readchar>='A' && readchar<='Z') || readchar=='_') state=1;
			
			else if(readchar == '>') state=5;
			else if(readchar == '<') state=6;
			else if(readchar == '=') state=7;
			else if(readchar == '!') state=8;
			else if(readchar == '&') state=9;
			else if(readchar == '|') state=10;

			else if(readchar == '+') state=30;
			else if(readchar == '-') state=31;
			else if(readchar == '*') {ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=5; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '/') state=32;
			else if(readchar == '%') {ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=7; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '.') {ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=11; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == ',') {ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=12; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}

			else if(readchar == '(') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=16; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == ')') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=17; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '{') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=18; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '}') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=19; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '[') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=20; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == ']') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=21; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '\\') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=22; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == ':') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=23; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == ';') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=24; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '"') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=25; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '\'') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=26; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar == '#') {ret_tok.tokenName="METADATA"; ret_tok.tokenType=27; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}

			else if(readchar>='0' && readchar<='9') {state=70; num=readchar-48;}

			else if(readchar=='\n') { strcpy_s(readbuf,""); buf_index=0; state=0;}
			else if(readchar=='\t') {strcpy_s(readbuf,""); buf_index=0; state=0;}
			else if(readchar==' ') {strcpy_s(readbuf,""); buf_index=0; state=0;}

			else state=ERROR;
			break;
		case 1:
			if((readchar>='a' && readchar<='z') || (readchar>='A' && readchar<='Z') || readchar=='_' || (readchar>='0' && readchar<='9')) state=1;
			else {
				ret_back(index, readbuf, buf_index);
				ret_tok.tokenType= compare_keyword(readbuf);
				if(ret_tok.tokenType!=-1){
					ret_tok.tokenName="KEYWORD";
					strcpy_s(ret_tok.strbuf,readbuf);
				}else{
					ret_tok.tokenType=0;
					strcpy_s(ret_tok.strbuf,readbuf);
					ret_tok.tokenName="ID";
					ret_tok.attribute=compare_symbol(readbuf);}
				return ret_tok;
			}
			break;

		case 5:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='='){ ret_tok.attribute=GE; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else{ret_back(index, readbuf, buf_index); ret_tok.attribute=GT; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 6:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='='){ ret_tok.attribute=LE; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar=='>'){ ret_tok.attribute=LG; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else{ret_back(index, readbuf, buf_index); ret_tok.attribute=LT; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 7:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='='){ ret_tok.attribute=EQ; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else {ret_back(index,readbuf,buf_index); ret_tok.tokenName="="; ret_tok.tokenType=8; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 8:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='='){ ret_tok.attribute=NE; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else {ret_back(index,readbuf,buf_index); ret_tok.tokenName="!"; ret_tok.tokenType=10; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 9:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='&'){ ret_tok.attribute=AND; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else {ret_back(index,readbuf,buf_index); ret_tok.tokenName="&"; ret_tok.tokenType=13; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 10:
			ret_tok.tokenName="ROP";
			ret_tok.tokenType=2;
			if(readchar=='|'){ ret_tok.attribute=OR; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else state=ERROR;
			break;

		case 30:
			if(readchar=='+'){ ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=14; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else{ ret_back(index, readbuf, buf_index); ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=3; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 31:
			if(readchar=='-'){ ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=15; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else if(readchar=='>'){ ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=9; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			else{ ret_back(index, readbuf, buf_index); ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=4; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;
		case 32:
			if(readchar == '/') state=100;
			else if(readchar == '*') state=101;
			else {ret_back(index, readbuf, buf_index); ret_tok.tokenName="OPERATOR"; ret_tok.tokenType=6; strcpy_s(ret_tok.strbuf,readbuf); return ret_tok;}
			break;

		case 70:
			if(readchar>='0' && readchar<='9') {state=70; num = num*10+(readchar-48);}
			else if (readchar == '.') state=71;
			else if (readchar == 'E') state=73;
			else {ret_back(index, readbuf, buf_index); ret_tok.tokenName="NUM"; ret_tok.tokenType=1; strcpy_s(ret_tok.strbuf,readbuf); ret_tok.attribute=0; ret_tok.Nval0=static_cast<int>(num); return ret_tok;}
			break;
		case 71:
			if(readchar>='0' && readchar<='9') {state=72; num_index++; num=num*10+(readchar-48);}
			else state=ERROR;
			break;
		case 72:
			if(readchar>='0' && readchar<='9') {state=72; num_index++; num=num*10+(readchar-48);}
			else if(readchar == 'E') {
				state=73;
				for(int i=0;i<num_index; i++){
					num=num/10.0;
				}
			}
			else {
				for(int i=0;i<num_index; i++){
					num=num/10.0;
				}
				ret_back(index, readbuf, buf_index); ret_tok.tokenName="NUM"; ret_tok.tokenType=1; strcpy_s(ret_tok.strbuf,readbuf); ret_tok.attribute=1; ret_tok.Nval1=num; return ret_tok;
			}
			break;
		case 73:
			if(readchar>='0' && readchar<='9') {state=74; multifier=readchar-48;}
			else if(readchar=='+' || readchar=='-') {state=74; multifier=0;}
			else state=ERROR;
			break;
		case 74:
			if(readchar>='0' && readchar<='9') {state=74; multifier=multifier*10+(readchar-48);}
			else{
				for(int i=0;i<multifier; i++)
					num*=10;
				ret_back(index, readbuf, buf_index); ret_tok.tokenName="NUM"; ret_tok.tokenType=1; strcpy_s(ret_tok.strbuf,readbuf);
				if(num_index<=multifier){ret_tok.attribute=0; ret_tok.Nval0=static_cast<int>(num);}
				else{ret_tok.attribute=1; ret_tok.Nval1=num;}
				return ret_tok;
			}
			break;

		case 100:
			strcpy_s(readbuf,"");
			buf_index=0;
			if(readchar == '\n') state=0;
			break;
		case 101:
			strcpy_s(readbuf,"");
			buf_index=0;
			if(readchar == '*') state=100+2;
			break;
		case 102:
			strcpy_s(readbuf,"");
			buf_index=0;
			if(readchar == '/') state=0;
			else state=101;
			break;
		
		case -1:
			strcpy_s(readbuf,"");
			buf_index=0;
			if(readchar==' ' || readchar=='\t' || readchar=='\n') state=0;
			break;
		}
	}while(readbuf[0] != EOF);
	return ret_tok;
}