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

📄 lexical.cpp

📁 基于单片机的 snmp协议解析的一些原代码 给有用的 同行
💻 CPP
📖 第 1 页 / 共 4 页
字号:
   {
   	return(0);
   }
}

int parse_statement(FILE *fp)
{
	char *token;
   long fpos;
   long fpos2;
   int temp_index;
   int jump;

   //set original file position
   fpos = ftell(fp);

   //look for declaration
   if(parse_declaration(fp))
   	return(1);

   //look for function call
   if(parse_fname(fp))
   {
      token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
		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 functioncall statement found
               insert_statement_record(&statement_table, statement_index,
               	fpos, ftell(fp), FUNCTIONCALL_TYPE, statement_index + 1, -1);
               statement_index++;
            	safe_free(token);
               return(1);
            }
            else
            {
		      	//pushback all input
      		   info_message("Missing close parenthesis in function call\n");
		         fseek(fp,fpos,SEEK_SET);
      			safe_free(token);
		         return(0);
            }
         }
         else
         {
	      	//pushback all input
   	      info_message("Bad argument list\n");
      	   fseek(fp,fpos,SEEK_SET);
      		safe_free(token);
         	return(0);
         }
      }
      else
      {
      	//pushback all input
         info_message("Missing open parenthesis in function call\n");
         fseek(fp,fpos,SEEK_SET);
      	safe_free(token);
         return(0);
      }
   }

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

   //look for if
   if(strcmp(token,"if")==0)
   {
   	memset(token, '\0', strlen(token));
      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)
            {
            	//reserve a statement index number
               temp_index = statement_index;
               statement_index++;
               //save file position
               fpos2 = ftell(fp);

            	if(parse_statementblock(fp))
               {
               	//Valid if statement found
                  //determine if jump statement exists
                  if(statement_index == temp_index +1)
                  	jump = -1;
                  else
                  	jump = temp_index +1;
	               insert_statement_record(&statement_table, temp_index,
   	            							fpos, fpos2, IF_TYPE,
                     						statement_index, jump);
         	   	safe_free(token);
            	   return(1);
               }
               else
               {
               	info_message("Bad statement block in if statement\n");
                  fseek(fp,fpos,SEEK_SET);
                  safe_free(token);
                  return(0);
               }
            }
            else
            {
            	info_message("Missing close parenthesis in if statement.\n");
               fseek(fp,fpos,SEEK_SET);
               safe_free(token);
               return(0);
            }
         }
         else
         {
         	info_message("Bad logic expression in if statement.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
         info_message("Missing open parenthesis in if statement\n");
         fseek(fp,fpos,SEEK_SET);
      	safe_free(token);
         return(0);
      }
   }

   //look for while
   if(strcmp(token,"while")==0)
   {
   	memset(token, '\0', strlen(token));
      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)
            {
            	//reserve a statement index number
               temp_index = statement_index;
               statement_index++;

               //save file position
               fpos2 = ftell(fp);

            	if(parse_statementblock(fp))
               {
               	//Valid while statement found
	               insert_statement_record(&statement_table, temp_index,
   	            							fpos, fpos2, WHILE_TYPE,
                     						statement_index, temp_index + 1);
         	   	safe_free(token);
            	   return(1);
               }
               else
               {
               	info_message("Bad statement block in while statement\n");
                  fseek(fp,fpos,SEEK_SET);
                  safe_free(token);
                  return(0);
               }
            }
            else
            {
            	info_message("Missing close parenthesis in while statement.\n");
               fseek(fp,fpos,SEEK_SET);
               safe_free(token);
               return(0);
            }
         }
         else
         {
         	info_message("Bad logic expression in while statement.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
         info_message("Missing open parenthesis in while statement\n");
         fseek(fp,fpos,SEEK_SET);
      	safe_free(token);
         return(0);
      }
   }

   //look for goto
   if(strcmp(token,"goto")==0)
   {
   	if(parse_identifier(fp))
      {
      	//Valid goto statement found
         insert_statement_record(&statement_table, statement_index,
            	fpos, ftell(fp), GOTO_TYPE, statement_index + 1, -1);
         statement_index++;
       	safe_free(token);
         return(1);
      }
      else
      {
         info_message("Badly formed goto statement\n");
         fseek(fp,fpos,SEEK_SET);
      	safe_free(token);
         return(0);
      }
   }

   //look for label
   if(strcmp(token,"label")==0)
   {
   	if(parse_identifier(fp))
      {
      	//Valid goto statement found
         insert_statement_record(&statement_table, statement_index,
            	fpos, ftell(fp), LABEL_TYPE, statement_index + 1, -1);

         //Pushback entire statement...
         fseek(fp,fpos,SEEK_SET);
         //get LABEL token...
         memset(token, '\0', strlen(token));
         token = get_next_token(fp, token);
         //throwaway the LABEL token and get the identifier...
         memset(token, '\0', strlen(token));
         token = get_next_token(fp, token);
         //add to symbol table...
         temp_index = add_identifier_to_st(&symbol_table, token,
         											 SY_LABEL_TYPE, 0);
			//record statement index in symbol table
			set_value_in_st(symbol_table, temp_index,
         					 0, 0.0, "", statement_index);
			//exit successfully.
         statement_index++;
       	safe_free(token);
         return(1);
      }
      else
      {
         info_message("Badly formed label statement\n");
         fseek(fp,fpos,SEEK_SET);
      	safe_free(token);
         return(0);
      }
   }

   //look for assignment, first pushback token
   fseek(fp,fpos,SEEK_SET);
   memset(token, '\0', strlen(token));

   if(parse_identifier(fp))
   {
   	memset(token, '\0', strlen(token));
      token = get_next_token(fp,token);
      if(strcmp(token,"=")==0)
      {
      	if(parse_expr(fp))
         {
				//Valid assignment
            //production statement::identifier = expr
	         insert_statement_record(&statement_table, statement_index,
   	         	fpos, ftell(fp), ASSIGNMENT_TYPE, statement_index + 1, -1);
      	   statement_index++;
       		safe_free(token);
	         return(1);
         }
         else
         {
         	info_message("Bad expr in assignment.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	info_message("Missing operator in assignment.\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }

   safe_free(token);
   return(0);
}

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

   //set original file position
   fpos = ftell(fp);

   token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
   token = get_next_token(fp,token);
   if(strcmp(token,"int")==0)
   {
   	if(parse_identifier(fp))
      {
      	//Valid int declaration
         fpos2 = ftell(fp);
         insert_statement_record(&statement_table, statement_index,
         	fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
         statement_index++;
         safe_free(token);
         return(1);
       }
      else
      {
      	info_message("Missing identifier for int declaration\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }

   if(strcmp(token,"float")==0)
   {
   	if(parse_identifier(fp))
      {
      	//Valid float declaration
         fpos2 = ftell(fp);
         insert_statement_record(&statement_table, statement_index,
         	fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
         statement_index++;
         safe_free(token);
         return(1);
      }
      else
      {
      	info_message("Missing identifier for float declaration\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }

   if(strcmp(token,"string")==0)
   {
   	if(parse_identifier(fp))
      {
         memset(token, '\0', strlen(token));
         token = get_next_token(fp,token);
         if(strcmp(token,"[")==0)
         {
         	if(parse_integer(fp))
            {
            	memset(token,'\0',strlen(token));
               token = get_next_token(fp,token);
               if(strcmp(token,"]")==0)
               {
               	fpos2 = ftell(fp);
               	//Valid string declaration
			         insert_statement_record(&statement_table, statement_index,
         				fpos, fpos2, DECLARATION_TYPE, statement_index +1, -1);
			         statement_index++;
         			safe_free(token);
			         return(1);
               }
               else
               {
			      	info_message("Missing close bracket for string declaration\n");
         			fseek(fp,fpos,SEEK_SET);
			         safe_free(token);
         			return(0);
               }
            }
            else
            {
		      	info_message("Missing size for string declaration\n");
      		   fseek(fp,fpos,SEEK_SET);
		         safe_free(token);
      		   return(0);
            }
         }
         else
         {
	      	info_message("Missing open bracket for string declaration\n");
   	      fseek(fp,fpos,SEEK_SET);
      	   safe_free(token);
         	return(0);
         }
      }
      else
      {
      	info_message("Missing identifier for string declaration\n");
         fseek(fp,fpos,SEEK_SET);
         safe_free(token);
         return(0);
      }
   }

   fseek(fp,fpos,SEEK_SET);
   safe_free(token);
   return(0);
}

int parse_statementblock(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,"begin")==0)
   {
   	if(parse_statementlist(fp))
      {
      	memset(token,'\0',strlen(token));
         token = get_next_token(fp,token);
         if(strcmp(token,"end")==0)
         {
         	//Valid statementblock found
            safe_free(token);
            return(1);
         }
         else
         {
         	info_message("Missing end for begin.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	memset(token,'\0',strlen(token));
         token = get_next_token(fp,token);
         if(strcmp(token,"end")==0)
         {
         	//Valid statementblock found
            safe_free(token);
            return(1);
         }
         else
         {
         	info_message("Missing end for begin.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
   }
   else
   {
   	fseek(fp,fpos,SEEK_SET);
      safe_free(token);
      return(0);
   }
}

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

   fpos = ftell(fp);
   if(parse_expr(fp))
   {
   	fpos2 = ftell(fp);
   	token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
      token = get_next_token(fp, token);
      if(strcmp(token,",")==0)
      {
      	if(parse_arglist(fp))
         {
         	//Valid arglist
            //production arglist::expr, arglist
            safe_free(token);
            return(1);
         }
         else
         {
         	//Invalid but how?
            info_message("Missing arglist following comma.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	//Valid arglist
         //production arglist::expr
         fseek(fp,fpos2,SEEK_SET);
         safe_free(token);
         return(1);
      }
   }

   if(parse_string(fp))
   {
   	fpos2 = ftell(fp);
   	token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char));
      token = get_next_token(fp, token);
      if(strcmp(token,",")==0)
      {
      	if(parse_arglist(fp))
         {
         	//Valid arglist
            //production arglist::string, arglist
            safe_free(token);
            return(1);
         }
         else
         {
         	//Invalid but how?
            info_message("Missing arglist following comma.\n");
            fseek(fp,fpos,SEEK_SET);
            safe_free(token);
            return(0);
         }
      }
      else
      {
      	//Valid arglist
         //production arglist::string
         fseek(fp,fpos2,SEEK_SET);
         safe_free(token);
         return(1);
      }
   }

   //Valid empty arglist
   //production arglist::e
   return(1);
}

int parse_fname(FILE *fp)
{
	//This function must check all defined functions in
   //the macro language
   char *token;
   long fpos;

   fpos = ftell(fp);
   if((token = (char *)safe_alloc(TOKEN_SIZE,sizeof(char))) == NULL)
   {
   	printf("Failed safe_alloc in parse_fname\n");
      return(0);
   }

   token = get_next_token(fp,token);
   
   if(strcmp(token,"outfile")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"out")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"infile")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"inuser")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"invar")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"randomInt")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"randomFloat")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"sleep")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"getError")==0)
   {
   	safe_free(token);
      return(1);
   }

   if(strcmp(token,"intToFloat")==0)
   {
   	safe_free(token);
      return(1);

⌨️ 快捷键说明

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