Exemple #1
0
//hlavni funkce
struct lexeme read_lexeme(void) {
	struct lexeme tmpData;
	tmpData.type = NO_TYPE;

	read_input();

q0: //default state
	if(PRINT) printf("q0 default\n");
	switch(input_char_type) {
		case UNDERSCORE:
		case LETTER:
			temp_length = 0;
			save_temp(input_char);
			read_input();
			goto q1; //identifier
		case DIGIT:
			tmpData.type = INTEGER;
			temp_length = 0;
			save_temp(input_char);
			read_input();
			goto q4; //integer or double
			break;
		case WHITE_SPACE:
			read_input();
			goto q0; //default state
		/*
		case UNDERSCORE:
			temp_length = 0;
			save_temp(input_char);
			read_input();
			goto q1; //underscored identifier
		*/
		case END:
			tmpData.type = END_OF_FILE;
			return tmpData;
		case OTHERS:
			switch(input_char) {
				case '+':
					tmpData.type = PLUS;
					return tmpData;
				case '-':
					tmpData.type = MINUS;
					return tmpData;
				case '*':
					tmpData.type = MULT;
					return tmpData;
				case '/':
					read_input();
					goto q3; //comments or divide
				case '=':
					read_input();
					if(input_char == '=') {
						tmpData.type = EQ;
						return tmpData;
					}
					return_input();
					tmpData.type = EQUALS;
					return tmpData;
				case '<':
					read_input();
					if(input_char == '=') {
						tmpData.type = LTE;
						return tmpData;
					} else if(input_char == '<') {
						tmpData.type = INSOP;
						return tmpData;
					}
					return_input();
					tmpData.type = LT;
					return tmpData;
				case '>':
					read_input();
					if(input_char == '=') {
						tmpData.type = GTE;
						return tmpData;
					} else if(input_char == '>') {
						tmpData.type = EXTOP;
						return tmpData;
					}
					return_input();
					tmpData.type = GT;
					return tmpData;
				case '!':
					read_input();
					if(input_char == '=') {
						tmpData.type = NEQ;
						return tmpData;
					}
					throw_error(CODE_ERROR_LEX, "invalid input");
					break;
				case ';':
					tmpData.type = SEMICOLON;
					return tmpData;
				case '(':
					tmpData.type = LPAR;
					return tmpData;
				case ')':
					tmpData.type = RPAR;
					return tmpData;
				case '{':
					tmpData.type = LBR;
					return tmpData;
				case '}':
					tmpData.type = RBR;
					return tmpData;
				case ',':
					tmpData.type = COLON;
					return tmpData;
				case '"':
					tmpData.type = STRING;
					temp_length = 0;
					chunks = 0;
					length = 0;
					read_input();
					goto q8; //string
				default:
					throw_error(CODE_ERROR_LEX, "invalid input");
					break;
			}
			break;
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
	}

q1: //identifier OK
	if(PRINT) printf("q1 identifier\n");
	switch(input_char_type) {
		case LETTER:
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q1; //identifier
		case UNDERSCORE:
			save_temp(input_char);
			read_input();
			goto q1; //underscored identifier
		default:
			return_input();
			save_temp(0);
			if((tmpData.type = check_keyword(temp)) == IDENTIFIER) {
				if((tmpData.value.string = (char *)malloc(temp_length)) == NULL)
					throw_error(CODE_ERROR_INTERNAL, "malloc error");
				memcpy((void *)tmpData.value.string, (void *)temp, temp_length);
			}
			return tmpData;
	}
/*
q2: //underscored identifier OK
	if(PRINT) printf("q2 underscored identifier\n");
	switch(input_char_type) {
		case LETTER:
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q1; //identifier
		case UNDERSCORE:
			save_temp(input_char);
			read_input();
			goto q2; //underscored identifier
		default:
			return_input();
			return tmpData;
	}
*/
q3: //comments or divide OK
	if(PRINT) printf("q3 comments or divide\n");
	switch(input_char_type) {
		case LETTER:
		case DIGIT:
		case WHITE_SPACE:
			return_input();
			tmpData.type = DIVIDE;
			return tmpData;
		default:
			switch(input_char) {
				case '/':
					//q11
					do {
						read_input();
					} while(input_char != '\n' && input_char_type != END);
					if(input_char_type == END) {
						tmpData.type = END_OF_FILE;
						return tmpData;
					}
					read_input();
					goto q0; //default state
				case '*':
					//q12
					do {
						do {
							read_input();
						} while(input_char != '*' && input_char_type != END);
						if(input_char_type == END) {
							throw_error(CODE_ERROR_LEX, "invalid input");
							break;
						}
						read_input();
						if(input_char == '/') {
							read_input();
							goto q0; //default state
						} else if(input_char == '*') {
							return_input();
						} else if(input_char_type == END) {
							throw_error(CODE_ERROR_LEX, "invalid input");
							break;
						}
					} while(1);
				default:
					return_input();
					tmpData.type = DIVIDE;
					return tmpData;
			}
			break;
	}

q4: //integer or double OK
	if(PRINT) printf("q4 integer or double\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q4; //integer or double
		/*
		case WHITE_SPACE:
			save_temp(0);
			tmpData.value.integer = atoi((const char *)temp);
			return tmpData;
		*/
		case LETTER:
			if(input_char == 'e' || input_char == 'E') {
				save_temp(input_char);
				read_input();
				tmpData.type = DOUBLE;
				goto q5; //double e
			} else {
				throw_error(CODE_ERROR_LEX, "invalid input");
				break;
			}
		case END:
			/*
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
			*/
			return_input();
			save_temp(0);
			tmpData.value.integer = atoi((const char *)temp);
			return tmpData;			
		case UNDERSCORE:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;				
		case OTHERS:			
			if(input_char == '.') {
				save_temp(input_char);
				read_input();
				tmpData.type = DOUBLE;
				goto q13; //double
			}
			return_input();
			save_temp(0);
			tmpData.value.integer = atoi((const char *)temp);
			return tmpData;		
		default:
			return_input();
			save_temp(0);
			tmpData.value.integer = atoi((const char *)temp);
			return tmpData;
	}

q5: //double e OK
	if(PRINT) printf("q5 double e\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q7; //double e
		case OTHERS:
			if(input_char == '+' || input_char == '-') {  
				save_temp(input_char);
				read_input();
				goto q14; //double e +-
			}/* else {
				return_input();
				save_temp(0);
				tmpData.value.real = strtod((const char *)temp, &e_strtod);
				return tmpData;
			}*/	
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
	}

q13: //potential double
	if(PRINT) printf("q13 potential double\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q6; //double
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;				
	} 
	
q14: //potential double e +-
	if(PRINT) printf("q14 potential double e +-\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q7; //double e +-
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;				
	} 	

q6: //double OK
	if(PRINT) printf("q6 double\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q6; //double
		case LETTER:
			if(input_char == 'e' || input_char == 'E') {
				save_temp(input_char);
				read_input();
				goto q5; //double e
			} else {
				throw_error(CODE_ERROR_LEX, "invalid input");
				break;
			}
		/*
		case WHITE_SPACE:
			save_temp(0);
			tmpData.value.real = strtod((const char *)temp, &e_strtod);
			return tmpData;
		case END:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
		*/ 
		default:
			return_input();
			save_temp(0);
			tmpData.value.real = strtod((const char *)temp, &e_strtod);
			return tmpData;
	}

q7: //double e +- OK
	if(PRINT) printf("q7 double e +-\n");
	switch(input_char_type) {
		case DIGIT:
			save_temp(input_char);
			read_input();
			goto q7; //double e +-
		/*
		case WHITE_SPACE:
			save_temp(0);
			tmpData.value.real = strtod((const char *)temp, &e_strtod);
			return tmpData;
		case END:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
		*/
		default:
			return_input();
			save_temp(0);
			tmpData.value.real = strtod((const char *)temp, &e_strtod);
			return tmpData;
	}

q8: //string OK
	if(PRINT) printf("q8 string\n");
	switch(input_char_type) {
		case OTHERS:	
		 		if(input_char == '\\') {
				//save(&tmpData, input_char);
				read_input();
				goto q9;	//escaped string
			} else if(input_char == '"') {
				//q10
				save(&tmpData, 0);  //UZAVRENI RETEZCE NULOVYM ZNAKEM
				return tmpData;
			}
			save(&tmpData, input_char);
			read_input();
			goto q8; //string
		case WHITE_SPACE:	
				if(input_char == 32) {
				save(&tmpData, input_char);
				read_input();
				goto q8; //string	
			}
			printf("%d\n",input_char);	
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
		case END:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;
		default:	
			save(&tmpData, input_char);
			read_input();
			goto q8;  //string
	}

q9: //escaped string OK
	if(PRINT) printf("q9 escaped string\n");
	switch(input_char_type) {
		case END:
		if(PRINT) printf("vypis 1\n");
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;			
		default:
		if(PRINT) printf("vypis 2\n");
		
		//  n -> \n   t -> \t   /* LOMITKA DOPLNENA */
		
			if(input_char == 'n' || input_char == 't' || input_char == '\\' || input_char == '"') 
			{
												if(PRINT) printf("vypis 3\n");
			//	save(&tmpData, '\\');   NENMA TU BYT
 				if(input_char == 'n')
 				save(&tmpData, '\n');	
 				else if (input_char == 't')
 				save(&tmpData, '\t');
 				else
				save(&tmpData, input_char);
												if(PRINT) printf("vypis 5\n");
				read_input();
												if(PRINT) printf("vypis 6\n");
				goto q8;  //string
												if(PRINT) printf("vypis 7\n");
			} else if(input_char == 'x') 
												if(PRINT) printf("vypis 8\n");
			{
				read_input();
												if(PRINT) printf("vypis 9\n");
				goto q16;
			}
			throw_error(CODE_ERROR_LEX, "invalid input");
												if(PRINT) printf("\n");
			break;			
	}
	
	
	
q16: //escaped string x

tmpx = 0;
	switch(input_char_type) {
		case LETTER:
									if(PRINT) printf("vypis 10\n");
			if(input_char >= 'A' && input_char <= 'F') {
								tmpx += (input_char - 'A'+10)*16;
				
												break;
									if(PRINT) printf("vypis 11\n");
								
			} else if(input_char >= 'a' && input_char <= 'f') {
								tmpx += (input_char - 'a'+10)*16;
				
									if(PRINT) printf("vypis 12\n");	
								break;						
					
			}
			throw_error(CODE_ERROR_LEX, "invalid input");
	
						
		case DIGIT:
			tmpx += (input_char - '0')*16;
			//ulozit do tmp promenne ....prevod na cislo dokoncit z hexadec. na cislo
			//neznamekovy char, nasobeni 16
			// tmp_esc_val[0] = '2';  DELETE
 			//printf("** %i\n", tmp_esc_val);
			//printf("** %c\n", tmp_esc_val);			
			//tmp_esc_val = input_char * 16;
					if(PRINT) printf("vypis 14\n");
			
			break;
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;		
	}
	read_input();
	goto q17;
	
q17: //escaped string xH
	switch(input_char_type) {
		case LETTER:
		if(input_char >= 'A' && input_char <= 'F') {
				tmpx += (input_char - 'A'+10);
				break;
									
			} else if(input_char >= 'a' && input_char <= 'f') {
				tmpx += (input_char - 'a'+10);
				break;							
			}
			throw_error(CODE_ERROR_LEX, "invalid input");
			
		case DIGIT:
			tmpx += (input_char - '0');
			break;
			//tmp_esc_val[1] = '1';
			//const char *frmtChar = hexToInt(tmp_esc_val);
			//unsigned char *resChar;
			//sscanf(&frmtChar, "%c", &resChar);
		
		default:
			throw_error(CODE_ERROR_LEX, "invalid input");
			break;		
	}	
	save(&tmpData,tmpx);			
	read_input();
	goto q8;
	}
Exemple #2
0
int main(){
	return_input();

	return 0;
}