my_syn_r.h

来自「这是个源码合集」· C头文件 代码 · 共 395 行

H
395
字号
/*-----------------------------------*\
规则::-
头:-项1+<,/;>+项2+<,/;>+...+项n+<.>

\*-----------------------------------*/

/*-----------------------------------*\
--几种正确的R形式-------
f(X):-g1(X),(kk(b);kk(a));g3(X).
f(X):-g1(X),kk(b);kk(a);g3(X).
f:-g1(X),kk(b);kk(a);g3(X).
f(X):-g(X).
run:-human(X).
f(a,X):-g(X).
f(a,X,n):-g(X);go(key).
\*-----------------------------------*/

/*-----------------------------------*\
--几种错误的R形式-------
f(X):-g1(X),(kk(b)kk(a));g3(X).
f(X):-g1(X),(kk(b);kk(a));g3(X)
f(X):-g1(X).(kk(b);kk(a));g3(X).
f(X):-g1(X.)(kk(b);kk(a));g3(X).
f(X):-g1(X,)(kk(b);kk(a));g3(X).
humanabc9)
human(abc9).
human(X).
\*-----------------------------------*/

/*-----------------------------------*\
--正确的R形式的结构-------
Rule=R_head+R_middle+R_body+R_end
R_head=C
R_head=R_predicate
R_middle=:-
R_body=R_term+R_termsuff
R_termsuff=0
R_termsuff=R_CON+R_term+R_termsuff
R_term=R_predicate
R_term=R_LBR+R_term+R_CON+R_term+R_RBR
R_LBR=<(>
R_RBR=<)>
R_CON=<,/;>
R_end=<.>



\*-----------------------------------*/

//下表为脚本语言程序(询问部分)的递归结构
void Rule();
void R_head();
void R_middle();
void R_body();
void R_end();

void R_term();
void R_termsuff();

void R_predicate();
void R_A();
void R_Asuff();
void R_Aend();

void R_LBR();
void R_RBR();
void R_CON();
void R_end();
//
////////////////////////////////////////////////////////////////
//Rule=R_head+R_middle+R_body+R_end
//
void Rule()
{
  R_head();
  R_middle();
  R_body();
  R_end();
}
//
////////////////////////////////////////////////////////////////
//R_head=C
//R_head=R_predicate
//
void R_head()
{
  if(Code_F[Code_I]>=BY_BEGIN_OF_C+1&&Code_F[Code_I]<=BY_BEGIN_OF_C+BY_MAX_NUM_OF_C)
  //规则头的第一个单词一定要是标识符
  {
      Code_I++;
	  if(Code_F[Code_I]==LBR)
	  //如果规则头的第二个单词是(
	  {
        Code_I--;//则回退
        R_predicate();//判断规则头是否为谓词
	  } 
  }
  else
  {
   r_error(1);
   //规则头的第一个单词不是标识符  -----出错!
  }
}
//
////////////////////////////////////////////////////////////////
//
void R_predicate()
{
 if(Code_F[Code_I]>=BY_BEGIN_OF_C+1&&Code_F[Code_I]<=BY_BEGIN_OF_C+BY_MAX_NUM_OF_C)
 //谓词的第一个单词一定要是标识符
 {
    Code_I++;
	if(Code_F[Code_I]==LBR)
	//谓词的第二个单词一定要是(
	{
      Code_I++;
	  R_A();
	  R_Asuff();
	  R_Aend();
	}
	else
	{
	   r_error(3); 
       //谓词的第二个单词不是(,出错
	}
 }
 else
 {
   r_error(2); 
   //谓词的第一个单词不是标识符,出错
 }
}
//
////////////////////////////////////////////////////////////////
//
void R_A()
{
  if(Code_F[Code_I]>=BY_BEGIN_OF_C+1&&Code_F[Code_I]<=BY_BEGIN_OF_C+BY_MAX_NUM_OF_C)
  //参数的第一个单词或者是标识符
  {	  
     Code_I++; 
   	 if(Code_F[Code_I]==LBR)
	 //参数的第一个单词是标识符,并且参数第二个单词是(
	 {
      Code_I++;
	  R_A();
	  R_Asuff();
	  R_Aend();
	 }
	 else
     //参数的第一个单词或者是标识符,而参数第二个单词不是(
     //则说明参数是常量,需要回退一个单词.
	 {
	   //回退一个单词.
       //!!!!!!!!!!!!!!!-------------
	   return;
	 }
  }
  else
  {
      if(Code_F[Code_I]>=BY_BEGIN_OF_V+1&&Code_F[Code_I]<=BY_BEGIN_OF_V+BY_MAX_NUM_OF_V)
      //参数的第一个单词不是标识符,而是变量
	  {
		Code_I++;
        return;
	  }
      else
	  {
         r_error(4); 
         //参数的第一个单词不是标识符  也不是变量  出错
	  }
  }
}
//
////////////////////////////////////////////////////////////////
//
void R_Asuff()
{
  if(Code_F[Code_I]==COM)
  //如果参数后缀的第一个单词是COM
  {
    Code_I++;
	R_A();
	R_Asuff();
  }
  else
  { 
	if(Code_F[Code_I]==RBR)
    //如果参数后缀的第一个单词不是COM,而是RBR
	{
	  //回退一个单词.
	  //!!!!!!!!!!!!!!!-------------
	  return;
	}
	else
	{
	  r_error(5); 
      //参数后缀的第一个单词不是COM  也不是RBR  则出错
	}
  }
}
//
////////////////////////////////////////////////////////////////
//
void R_Aend()
{
  if(Code_F[Code_I]==RBR)
  //参数尾的第一个单词一定是RBR
  {
	Code_I++;
    return;
  }
  else
  {
    r_error(6); 
    //参数尾的第一个单词不是RBR,则出错
  }
}
//
////////////////////////////////////////////////////////////////
//R_middle=:-
//
void R_middle()
{
   if(Code_F[Code_I]==IF)
   //规则中部的第一个单词一定是IF
   {
	 Code_I++;	     
     return;
   }
   else
   {
     r_error(7); 
     //规则中部的第一个单词不是IF,则出错
   }
}
//
////////////////////////////////////////////////////////////////
//R_body=R_term+R_termsuff
//
void R_body()
{
  R_term();
  R_termsuff();
}
//
////////////////////////////////////////////////////////////////
//R_term=R_predicate
//R_term=R_LBR+R_term+R_CON+R_term+R_RBR
//
void R_term()
{
  if(Code_F[Code_I]==LBR)
  //当项的第一个单词是(时
  {
    R_LBR();
	R_term();
	R_CON();
	R_term();
	R_RBR();
  }
  else
  {
    if(Code_F[Code_I]>=BY_BEGIN_OF_C+1&&Code_F[Code_I]<=BY_BEGIN_OF_C+BY_MAX_NUM_OF_C)
    //项的第一个单词不是(而是标识符时
	{
	   R_predicate();
	}
	else
	{
	   r_error(8); 
       //项的第一个单词既不是(  也不是标识符  -----出错
	}
  }
}
//
////////////////////////////////////////////////////////////////
//R_termsuff=0
//R_termsuff=R_CON+R_term+R_termsuff
//
void R_termsuff()
{
  if(Code_F[Code_I]==SEM||Code_F[Code_I]==COM)
  //如果项后缀的第一个单词是;  或者是,  则
  {
    R_CON();
	R_term();
	R_termsuff();
  }
  else
  {
    if(Code_F[Code_I]==DOT)
	//如果项后缀的第一个单词是.  则
	{
      return;	
	}
	else
	{
	   r_error(9); 
       //项后缀的第一个单词既不是<;/,>  也不是.  -----出错
	}
  }
}
//
////////////////////////////////////////////////////////////////
//R_LBR=<(>
//
void R_LBR()
{
   if(Code_F[Code_I]==LBR)
   //R_LBR的第一个单词一定是(
   {
	 Code_I++;
     return;
   }
   else
   {
     r_error(10); 
     //R_LBR的第一个单词不是(  -----出错
   }
}
//
////////////////////////////////////////////////////////////////
//R_RBR=<)>
//
void R_RBR()
{
   if(Code_F[Code_I]==RBR)
   //R_RBR的第一个单词一定是)
   {
	 Code_I++;	     
     return;
   }
   else
   {
     r_error(11); 
     //R_RBR的第一个单词不是)  -----出错
   }
}
//
////////////////////////////////////////////////////////////////
//R_CON=<,/;>
//
void R_CON()
{
   if(Code_F[Code_I]==COM)
   //R_CON的第一个单词可能是,
   {
	 Code_I++;	     
     return;
   }
   else
   {   
	  if(Code_F[Code_I]==SEM)
      //R_CON的第一个单词也可能是;
	  {
	    Code_I++;	     
        return;
	  }
	  else
	  {
        r_error(12); 
        //R_CON的第一个单词既不是,  也不是;  -----出错
	  }
   }
}
//
////////////////////////////////////////////////////////////////
//R_end=<.>
//
void R_end()
{
  if(Code_F[Code_I]==DOT)
  //规则尾的第一个单词一定是DOT
  {	     
	  if(Code_I!=Syn_Lines-1)
	  //说明DOT以后还有其他的字符
	  {
	      r_error(13);
          //说明DOT以后还有其他的字符,则出错
	  }
	  else
	  {
          return;
	  }
  }
  else
  {
    r_error(14); 
    //规则尾的第一个单词不是DOT,则出错
  }
}
//
////////////////////////////////////////////////////////////////
//

⌨️ 快捷键说明

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