⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lexical.cpp

📁 基于单片机的 snmp协议解析的一些原代码 给有用的 同行
💻 CPP
📖 第 1 页 / 共 4 页
字号:
      //invalid expression with no operator
      fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }

   if(parse_bool5(fp))
   {
   	//Valid bool4
      //production bool4::bool5
   	return(1);
   }

   //invalid
   fseek(fp,fpos,SEEK_SET);
   return(0);
}

int parse_bool5(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
	token = get_next_token(fp,token);

   if(strcmp(token,"!")==0)
   {
   	if(parse_bool6(fp))
      {
      	//Valid bool5
         //production bool5:: ! bool6
         safe_free(token);
         return(1);
      }
      else
      {
      	//invalid negation with no bool6 after
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }
   else
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
   	if(parse_bool6(fp))
      {
      	//Valid bool5
         //production bool5::bool6
         return(1);
      }
      else
      {
      	//invalid
         return(0);
      }
   }
}

int parse_bool6(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);

   if(strcmp(token,"(")==0)
   {
   	if(parse_logicexpr(fp))
      {
      	memset(token,'\0',strlen(token));
         token = get_next_token(fp,token);
         if(strcmp(token,")")==0)
         {
         	//Valid bool6
            //production bool6::(logicexpr)
            safe_free(token);
            return(1);
         }
         //invalid
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
      //invalid
      fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   //invalid
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(0);
}

int parse_expr(FILE *fp)
{
   long fpos;

   fpos = ftell(fp);
   if(parse_term(fp))
   {
   	if(parse_eprime(fp))
      {
      	//Valid expr
         //production expr::term eprime
         return(1);
      }
      else
      {
      	fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   else
   	return(0);
}

int parse_eprime(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);

   if(strcmp(token,"+")==0)
   {
   	if(parse_term(fp))
      {
      	if(parse_eprime(fp))
         {
         	//Valid eprime
            //production eprime:: + term eprime
         	safe_free(token);
            return(1);
         }
         else
         {
         	safe_free(token);
            fseek(fp,fpos,SEEK_SET);
            return(0);
         }
      }
      else
      {
      	safe_free(token);
         fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   if(strcmp(token,"-")==0)
   {
   	if(parse_term(fp))
      {
      	if(parse_eprime(fp))
         {
         	//Valid eprime
            //production eprime:: - term eprime
         	safe_free(token);
            return(1);
         }
         else
         {
         	safe_free(token);
            fseek(fp,fpos,SEEK_SET);
            return(0);
         }
      }
      else
      {
      	safe_free(token);
         fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   //Valid eprime
   //production eprime::e
   safe_free(token);
   fseek(fp,fpos,SEEK_SET);
   return(1);
}

int parse_term(FILE *fp)
{
	long fpos;

   fpos = ftell(fp);

	if(parse_fneg(fp))
   {
   	if(parse_tprime(fp))
      {
      	//Valid term
         //production term::fneg tprime
      	return(1);
      }
      else
      {
      	//pushback fneg
      	fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   else
   	return(0);
}

int parse_tprime(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);

   if(strcmp(token,"*")==0)
   {
   	if(parse_fneg(fp))
      {
      	if(parse_tprime(fp))
         {
         	//Valid tprime
            //production tprime:: * fneg tprime
         	safe_free(token);
            return(1);
         }
         else
         {
         	safe_free(token);
            fseek(fp,fpos,SEEK_SET);
            return(0);
         }
      }
      else
      {
      	safe_free(token);
         fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   if(strcmp(token,"/")==0)
   {
   	if(parse_fneg(fp))
      {
      	if(parse_tprime(fp))
         {
         	//Valid tprime
            //production tprime:: / fneg tprime
         	safe_free(token);
            return(1);
         }
         else
         {
         	safe_free(token);
            fseek(fp,fpos,SEEK_SET);
            return(0);
         }
      }
      else
      {
      	safe_free(token);
         fseek(fp,fpos,SEEK_SET);
         return(0);
      }
   }
   //Valid tprime
   //production tprime::e
   safe_free(token);
   fseek(fp,fpos,SEEK_SET);
   return(1);
}

int parse_fneg(FILE *fp)
{
   long fpos;
	char *token;

   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));

   fpos = ftell(fp);
   token = get_next_token(fp,token);

   if(strcmp(token,"-")==0)
   {
   	if(parse_factor(fp))
      {
      	//Valid fneg production fneg:: -factor
         safe_free(token);
         return(1);
      }
      else
      {
      	fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }
   else
   {
   	//pushback input
   	fseek(fp,fpos,SEEK_SET);
   	if(parse_factor(fp))
      {
      	//Valid fneg production fneg::factor
         safe_free(token);
         return(1);
      }
      else
      {
      	safe_free(token);
         return(0);
      }
   }
}

int parse_factor(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);

   if(strcmp(token,"(")==0)
   {
   	if(parse_expr(fp))
      {
      	memset(token,'\0',strlen(token));
         token = get_next_token(fp,token);
         if(strcmp(token,")")==0)
         {
         	//Valid factor
            //production factor::(expr)
            safe_free(token);
            return(1);
         }
         else
			{
         	info_message("Missing close parenthesis in factor.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	info_message("Missing expression after open parenthesis in factor.\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }

   //pushback input
   fseek(fp,fpos,SEEK_SET);

   if(parse_fname(fp))
   {
		memset(token,'\0',strlen(token));
      token = get_next_token(fp,token);
      if(strcmp(token,"(")==0)
      {
      	if(parse_arglist(fp))
         {
         	memset(token,'\0',strlen(token));
            token = get_next_token(fp,token);
            if(strcmp(token,")")==0)
            {
            	//Valid factor
               //production factor::fname(arglist)
               safe_free(token);
               return(1);
            }
            else
            {
            	info_message("Missing close parenthesis in function call.\n");
					fseek(fp,fpos,SEEK_SET);
               safe_free(token);
               return(0);
            }
         }
         else
         {
         	info_message("Bad argument list in function call.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	info_message("Missing open parenthesis after function name.\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }
   //pushback input
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);

   if(parse_float(fp))
   {
    	//production factor::float
   	return(1);
   }

   if(parse_integer(fp))
   {
   	//production factor::integer
      return(1);
   }

   if(parse_identifier(fp))
   {
   	//production factor::identifier
      return(1);
   }
   return(0);
}

int parse_string(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp, token);

   if(strcmp(token,"\"")==0)
   {
   	memset(token,'\0',strlen(token));
      token[0] = (char)fgetc(fp);
      //read input until closing quote is encountered
      while(strcmp(token,"\"")!=0)
      {
      	if(strcmp(token,"\\")==0)
         {
         	//escape character coming so read it in
            token[0] =(char)fgetc(fp);
         }
         if(feof(fp))
         {
         	//Unclosed string
         	fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
         else
         	token[0] = (char)fgetc(fp);
      }
      //Valid string
      safe_free(token);
      return(1);
   }
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(0);
}

int parse_identifier(FILE *fp)
{
	char *token;
   long fpos;
   char c;

   fpos = ftell(fp);

   //reject function names
	if(parse_fname(fp))
   	return(0);

   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp, token);

   //reject all keywords
   if(strcmp(token,"begin")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"end")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"if")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"while")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"goto")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"label")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"int")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"float")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
   if(strcmp(token,"string")==0)
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }

   //check for starting charater
   if(strlen(token) > 0)
	{
   	c = token[0];
   	if(isitalpha(c))
      {
      	//valid identifier
      	safe_free(token);
         return(1);
      }
   }
   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(0);
}

int parse_float(FILE *fp)
{
	char *token;
   long fpos;

   fpos = ftell(fp);
   if(parse_integer(fp))
   {
	   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   	token = get_next_token(fp,token);
      if(strcmp(token,".")==0)
      {
      	if(parse_integer(fp))
         {
         	//valid float
            //production float::integer.integer
            safe_free(token);
            return(1);
         }
      }
	   fseek(fp,fpos,SEEK_SET);
      safe_free(token);
   }
   return(0);
}

int parse_integer(FILE *fp)
{
	char *token;
   long fpos;
   int  i, valid;

   fpos = ftell(fp);
   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);

   valid = 1;
   for(i=0; i < (int)strlen(token);i++)
   {
   	if(!(token[i] == '0' || token[i] == '1' || token[i] == '2' ||
      	token[i] == '3' || token[i] == '4' || token[i] == '5' ||
         token[i] == '6' || token[i] == '7' || token[i] == '8' ||
         token[i] == '9'))
      	valid = 0;
   }
   if(valid)
   {
   	//valid integer
      safe_free(token);
      return(1);
   }
   else
   {
   	fseek(fp,fpos,SEEK_SET);
   	safe_free(token);
      return(0);
   }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -