void ISend::msg_handler(unsigned char *dat, unsigned char len) { unsigned char ret; // ret = strncmp((char *)&item[1], (const char *)&dat[4], item_len-1); ret = compare_keyword(dat); if (ret == 0) { if (getStatus() == S_S) { setStatus(S_A); /*返回结果,打出来*/ /*处理所有接收回来的应答码*/ clearAckData(); strncpy((char *)strAck, (const char *)&dat[4+item_len], len-4-item_len); strAckLen = len -4-item_len; onReceive(dat, len); } } }
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; }