예제 #1
0
/*returns next token from source file*/
token scanner()
{
	char c;
	
	clear_buffer();
	
	while(TRUE)
	{
		c = getc(fin);
		
		if(c == EOF)
			return SCANEOF;
		
		else if(isspace(c))
		{
			if (c == '\n')
				line_num = line_num + 1;
		}
		
		else if (isalpha(c))
		{
			buffer_char (c);
			c = getc (fin);
			while (isalnum(c) || c == '_')
			{
				buffer_char(c);
				c = getc(fin);
			}
			ungetc(c, fin);
			return check_reserved();
		}
		
		else if (isdigit(c))
		{
			buffer_char(c);
			c = getc(fin);
			while(isdigit(c))
			{
				buffer_char(c);
				c = getc(fin);
			}
			ungetc(c,fin);
			return INTLITERAL;
		}
		
		else if (c == '(')
			return LPAREN;
		
		else if (c == ')')
			return RPAREN;
		else if (c == '{')
			return LCURL;
		
		else if (c == '}')
			return RCURL;
		else if (c == ',')
			return COMMA;
			
		else if (c == ';')
			return SEMICOLON;
			
		else if (c == '+')
			return PLUSOP;
		else if (c == '-')
			return MINUSOP;
		else if (c == '*')
			return MULTOP;	
		else if (c == '/')
			{
				c = getc(fin);
				if(c == '/')
				{
					do
						c = getc(fin);
					while (c != '\n');
					line_num = line_num + 1;
				}
				else
				{
					ungetc(c, fin);
					return DIVOP;
				}
			}
		else if (c == '=')
			{
				c = getc(fin);
				if(c == '=')
				{
					return EQUALS;
				}
				else
				{
					ungetc(c, fin);
					lexical_error();
				}
			}
		else if (c == '!')
			{
				c = getc(fin);
				if(c == '=')
				{
					return NOTEQ;
				}
				else
				{
					ungetc(c, fin);
					lexical_error();
				}
			}
		else if (c == '<')
			{
				c = getc(fin);
				if(c == '=')
				{
					return LESSEQ;
				}
				else
				{
					ungetc(c, fin);
					return LESS;
				}
			}
		else if (c == '>')
			{
				c = getc(fin);
				if(c == '=')
				{
					return GREATEQ;
				}
				else
				{
					ungetc(c, fin);
					return GREATER;
				}
			}
		else if (c == ':')
		{
			c = getc(fin);
			if(c == '=')
				return ASSIGNOP;
			else
			{
				ungetc(c, fin);
				lexical_error();
			}
		}
		
		else
			lexical_error();
	}
}
token scanner(void)
{
	int in_char,c;

	clear_buffer();
	if (feof(archivo))
		return SCANEOF;

	while (feof(archivo)==0){
		in_char=fgetc(archivo);
		if (isspace(in_char))
			continue; /*do nothing */
		else if (isalpha(in_char)){
			/*
				ID::=LETTER | ID LETTER
							| ID DIGIT
							| ID UNDERSCORE
			*/
			buffer_char(in_char);
			for (c= fgetc(archivo);isalnum(c)||c=='-';c=fgetc(archivo))
				buffer_char(c);
				//ungetc(c,stdin);
				return check_reserved();

		}else if (isdigit(in_char)){
			/*
				INTLITERAL :: = DIGIT |
								INTLITERAL DIGIT
			*/
			buffer_char(in_char);
			for (c=fgetc(archivo);isdigit(c);c=fgetc(archivo))
				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==':'){
			/*looking for ":="*/
			c=fgetc(archivo);
			if (c=='=')
				return ASSIGNOP ;
			else{
				//ungetc(c,stdin);
				lexical_error(in_char);
			}		
		}
	
		else if (in_char=='-'){
			/*is it --;comment start */
			c=fgetc(archivo);
			if (c=='-'){
				do 
					in_char=fgetc(archivo);
				while (in_char!='\n');

			} else{
				//ungetc(c,stdin);
				return MINUSOP;
			}
		}else 
			lexical_error(in_char);
		}
}