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 + -
显示快捷键?