www.pudn.com > Micro.rar > Lex.cpp


#include "StdAfx.h" 
#include ".\lex.h" 
#include  
#include  
 
 
Lex::Lex(void) 
{ 
} 
 
Lex::~Lex(void) 
{ 
} 
 
extern FILE  outfp; 
extern FILE  infp; 
 
Word  g_token; 
token current_token = UNDEFINE; 
bool  matched = true; 
 
token scanner() { 
	int in_char, c; 
	clear_buffer(); 
	if( feof(stdin) ) { 
		fprintf(stderr, "eof stdin\n"); 
		return SCANEOF; 
	} 
	while( (in_char = getchar()) != EOF ) { 
		if( isspace(in_char) ) { 
			continue; 
		} 
		else if( isalpha(in_char) ) { 
			/*  ID ::= LETTER | ID LETTER | ID DIGIT | ID UNDERSCORE  */ 
			buffer_char(in_char); 
			for( c = getchar(); isalnum(c) || c == '_'; c = getchar() ) { 
				buffer_char(c); 
			} 
			ungetc(c, stdin); 
			return  check_reserved(); 
		} 
		else if( isdigit(in_char) ) { 
			/*  INTLITERAL ::= DIGIT | INTLITERAL DIGIT  */ 
			buffer_char(in_char); 
			for(c = getchar(); isdigit(c); c = getchar() ) { 
				buffer_char(c); 
			} 
			ungetc(c, stdin); 
			return INTLITERAL; 
		} 
		else if( in_char == '(' ) { 
			return LPAREN; 
		} 
		else if( in_char == ')' ) { 
			return RPAREN; 
		} 
		else if( in_char == ';' ) { 
			return SEMICOLON; 
		} 
		else if( in_char == ',' ) { 
			return COMMA; 
		} 
		else if( in_char == '+' ) { 
			return PLUSOP; 
		} 
		else if( in_char == '*' ) { 
			return MULOP; 
		} 
		else if( in_char == '/' ) { 
			return DIVOP; 
		} 
		else if( in_char == ':' ) { 
			/*  looking for ":="  */ 
			c = getchar(); 
			if( c == '=' ) { 
				return ASSIGNOP; 
			} else { 
				ungetc(c, stdin); 
				lexical_error(in_char); 
			} 
		} 
		else if( in_char == '-' ) { 
			/*  is it --, comment start  */ 
			c = getchar(); 
			if( c == '-' ) { 
				do { 
					in_char = getchar(); 
				} while( in_char != '\n' ); 
			} 
			else { 
				ungetc(c, stdin); 
				return  MINUSOP; 
			} 
			//return LPAREN; ////////// ???????????????? 
		} 
		else  { 
			lexical_error(in_char); 
		} 
	} 
	fprintf(stderr, "return SCANEOF\n"); 
	return SCANEOF; 
} 
token check_reserved(void){ 
	// read  write  begin  end  function 
	char * read     = "read"; 
	char * write    = "write"; 
	char * begin    = "begin"; 
	char * end      = "end"; 
	char * function = "function"; 
	if( g_token.buf[0] == 'r' ) { 
		if( g_token.len != strlen(read) ) { 
			return ID; 
		} 
		if( strncmp(read, g_token.buf, strlen(read) ) == 0 ) { 
			return READ; 
		} 
	} 
	else if( g_token.buf[0] == 'w' ) { 
		if( g_token.len != strlen(write) ) { 
			return ID; 
		} 
		if( strncmp(write, g_token.buf, strlen(write) ) == 0 ) { 
			return WRITE; 
		} 
	} 
	else if( g_token.buf[0] == 'b' ) { 
		if( g_token.len != strlen(begin) ) { 
			return ID; 
		} 
		if( strncmp(begin, g_token.buf, strlen(begin)) == 0 ) { 
			return BEGIN; 
		} 
	} 
	else if( g_token.buf[0] == 'e' ) { 
		if( g_token.len != strlen(end) ) { 
			return ID; 
		} 
		if( strncmp(end, g_token.buf, strlen(end) ) == 0 ) { 
			return END; 
		} 
	} 
	else if( g_token.buf[0] == 'f' ) { 
		if( g_token.len != strlen(function) ) { 
			return ID; 
		} 
		if( strncmp(function, g_token.buf, strlen(function) ) == 0 ) { 
			return FUNCTION; 
		} 
	} 
	return ID; 
} 
void buffer_char(int c) { 
	if( g_token.len >= WORD_LEN ) { 
		error("word too long"); 
	} 
	g_token.buf[g_token.len++] = c; 
} 
void clear_buffer(void){ 
	for(int i = WORD_LEN-1; i > 0; i--) { 
		g_token.buf[i] = 0; 
	} 
	g_token.len = 0; 
} 
void lexical_error(int c) { 
	fprintf(stderr, "[ Lex-Error ] - %c is unexpected\n", c); 
	exit(1); 
}