Exemple #1
0
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);
		}
	}
}
Exemple #2
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;
}