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); } }
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); } }
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); }
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; }
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; }