直接分析法编制C语言子集的词法分析程序.docx

上传人:b****6 文档编号:7739939 上传时间:2023-01-26 格式:DOCX 页数:20 大小:98.34KB
下载 相关 举报
直接分析法编制C语言子集的词法分析程序.docx_第1页
第1页 / 共20页
直接分析法编制C语言子集的词法分析程序.docx_第2页
第2页 / 共20页
直接分析法编制C语言子集的词法分析程序.docx_第3页
第3页 / 共20页
直接分析法编制C语言子集的词法分析程序.docx_第4页
第4页 / 共20页
直接分析法编制C语言子集的词法分析程序.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

直接分析法编制C语言子集的词法分析程序.docx

《直接分析法编制C语言子集的词法分析程序.docx》由会员分享,可在线阅读,更多相关《直接分析法编制C语言子集的词法分析程序.docx(20页珍藏版)》请在冰豆网上搜索。

直接分析法编制C语言子集的词法分析程序.docx

直接分析法编制C语言子集的词法分析程序

词法分析

一、实验目的

使用直接分析法编制C语言子集的词法分析程序

二、实验要求

利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

2.1待分析的简单语言的语法

用扩充的BNF表示如下:

⑴<程序>:

=begin<语句串>end

⑵<语句串>:

=<语句>{;<语句>}

⑶<语句>:

=<赋值语句>

⑷<赋值语句>:

=ID:

=<表达式>

⑸<表达式>:

=<项>{+<项>|-<项>}

⑹<项>:

=<因子>{*<因子>|/<因子>

⑺<因子>:

=ID|NUM|(<表达式>)

2.2实验要求说明

输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。

例如:

输入begina:

=9;x:

=2*3;b:

=a+xend#

输出success!

输入x:

=a+b*cend#

输出error

2.3词法分析程序的酸法思想

(1)主程序示意图如图2-1所示。

图2-1词法分析主程序示意图

(2)递归下降分析程序示意图如图2-2所示。

(3)语句串分析过程示意图如图2-3所示。

 

 

图2-3语句串分析示意图

图2-2递归下降分析程序示意图

(4)statement语句分析程序流程如图2-4、2-5、2-6、2-7所示。

否是

图2-4statement语句分析函数示意图图2-5expression表达式分析函数示意图

否否

图2-6term分析函数示意图

图2-7factor分析过程示意图

三、词法分析程序的C语言程序源代码:

#include"stdio.h"

#include"string.h"

charprog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum;

intkk;

factor();

expression();

yucu();

term();

statement();

lrparser();

scaner();

main()

{

 p=kk=0;

 printf("\npleaseinputastring(endwith'#'):

\n");

 do

  {scanf("%c",&ch);

    prog[p++]=ch;

  }while(ch!

='#');

 p=0;

 scaner();

 lrparser();

 getch();

}

lrparser()

{

 if(syn==1)

  {

scaner();/*读下一个单词符号*/

    yucu();/*调用yucu()函数;*/

    if(syn==6)

      {scaner();

 if((syn==0)&&(kk==0))

printf("success!

\n");

 }

    else{if(kk!

=1)printf("thestringhaven'tgota'end'!

\n");

    kk=1;

  }

   }

 else{printf("haven'tgota'begin'!

\n");

 kk=1;

      }

 return;

}

yucu()

{

statement();/*调用函数statement();*/

 while(syn==26)

  {

scaner();/*读下一个单词符号*/

   if(syn!

=6)

statement();/*调用函数statement();*/

  }

 return;

}

statement()

{if(syn==10)

  {

scaner();/*读下一个单词符号*/

    if(syn==18)

      {scaner();/*读下一个单词符号*/

 expression();/*调用函数statement();*/

      }

    else{printf("thesing':

='iswrong!

\n");

    kk=1;

   }

  }

 else{printf("wrongsentence!

\n");

 kk=1;

      }

 return;

}

expression()

{term();

 while((syn==13)||(syn==14))

   {scaner();/*读下一个单词符号*/

     term();/*调用函数term();*/

   }

 return;

}

term()

{factor();

 while((syn==15)||(syn==16))

   {scaner();/*读下一个单词符号*/

     factor();/*调用函数factor();*/

   }

 return;

}

factor()

{if((syn==10)||(syn==11))scaner();

 elseif(syn==27)

   {scaner();/*读下一个单词符号*/

     expression();/*调用函数statement();*/

     if(syn==28)

scaner();/*读下一个单词符号*/

     else{printf("theerroron'('\n");

     kk=1;

    }

   }

 else{printf("theexpressionerror!

\n");

 kk=1;

      }

 return;

}

 scaner()

 { sum=0;

   for(m=0;m<8;m++)token[m++]=NULL;

   m=0;

   ch=prog[p++];

   while(ch=='')ch=prog[p++];

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

     {while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

  {token[m++]=ch;

   ch=prog[p++];

  }

     p--;

     syn=10;

     token[m++]='\0';

     for(n=0;n<6;n++)

 if(strcmp(token,rwtab[n])==0)

   {syn=n+1;

     break;

   }

     }

   elseif((ch>='0')&&(ch<='9'))

     {while((ch>='0')&&(ch<='9'))

 {sum=sum*10+ch-'0';

  ch=prog[p++];

 }

 p--;

 syn=11;

     }

   elseswitch(ch)

      {case'<':

m=0;

   ch=prog[p++];

   if(ch=='>')

     { syn=21;

     }

   elseif(ch=='=')

     { syn=22;

     }

   else

     { syn=20;

        p--;

     }

   break;

 case'>':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=24;

     }

   else

     {syn=23;

       p--;

     }

   break;

 case':

':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=18;

     }

   else

     {syn=17;

       p--;

     }

   break;

 case'+':

syn=13;break;

 case'-':

syn=14;break;

 case'*':

syn=15;break;

 case'/':

syn=16;break;

 case'(':

syn=27;break;

 case')':

syn=28;break;

 case'=':

syn=25;break;

 case';':

syn=26;break;

 case'#':

syn=0;break;

 default:

syn=-1;break;

      }

   }

四、结果分析:

输入begina:

=9;x:

=2*3;b:

=a+xend#后输出success!

如图4-1所示:

图4-1

输入x:

=a+b*cend#后输出error如图4-2所示:

图4-2

五、总结:

通过本次试验,了解了词法分析的运行过程,主程序大致流程为:

“置初值”调用scaner函数读下一个单词符号调用IrParse结束。

递归下降分析的大致流程为:

“先判断是否为begin”不是则“出错处理”,若是则“调用scaner函数”调用语句串分析函数“判断是否为end”不是则“出错处理”,若是则调用scaner函数“判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。

不成立则“出错处理”。

 

语义分析程序

#include"stdio.h"

#include"string.h"

charprog[100],token[8],ch;

char*rwtab[6]={"begin","if","then","while","do","end"};

intsyn,p,m,n,sum,q;

intkk;

struct{charresult1[8];

   charag11[8];

   charop1[8];

   charag21[8];

 }quad[20];

char*factor();

char*expression();

intyucu();

char*term();

intstatement();

intlrparser();

char*newtemp();

scaner();

emit(char*result,char*ag1,char*op,char*ag2);

main()

{intj;

 q=p=kk=0;

 printf("\npleaseinputastring(endwith'#'):

");

 do

  {scanf("%c",&ch);

    prog[p++]=ch;

  }while(ch!

='#');

 p=0;

 scaner();

 lrparser();

if(q>19)printf("tolongsentense!

\n");

elsefor(j=0;j

getch();

}

intlrparser()

 {intschain=0;

   kk=0;

   if(syn==1)

     {scaner();

 schain=yucu();

 if(syn==6)

 {scaner();

   if((syn==0)&&(kk==0)) printf("Success!

\n");

 }

 else{if(kk!

=1)printf("shortof'end'!

\n");

       kk=1;

       getch();

       exit(0);

     }

     }

   else{printf("shortof'begin'!

\n");

   kk=1;

   getch();

   exit(0);

 }

   return(schain);

}

intyucu()

{intschain=0;

 schain=statement();

 while(syn==26)

  {scaner();

    schain=statement();

  }

 return(schain);

}

intstatement()

{chartt[8],eplace[8];

 intschain=0;

 if(syn==10)

  {strcpy(tt,token);

    scaner();

    if(syn==18)

      {scaner();

 strcpy(eplace,expression());

 emit(tt,eplace,"","");

 schain=0;

 }

    else{printf("shortofsign':

='!

\n");

    kk=1;

    getch();

    exit(0);

   }

   return(schain);

  }

}

char*expression()

{char*tp,*ep2,*eplace,*tt;

 tp=(char*)malloc(12);

 ep2=(char*)malloc(12);

 eplace=(char*)malloc(12);

 tt=(char*)malloc(12);

 strcpy(eplace,term());

 while((syn==13)||(syn==14))

  {if(syn==13)strcpy(tt,"+");

    elsestrcpy(tt,"-");

    scaner();

    strcpy(ep2,term());

    strcpy(tp,newtemp());

    emit(tp,eplace,tt,ep2);

    strcpy(eplace,tp);

  }

 return(eplace);

}

char*term()

{char*tp,*ep2,*eplace,*tt;

 tp=(char*)malloc(12);

 ep2=(char*)malloc(12);

 eplace=(char*)malloc(12);

 tt=(char*)malloc(12);

 strcpy(eplace,factor());

 while((syn==15)||(syn==16))

  {if(syn==15)strcpy(tt,"*");

    elsestrcpy(tt,"/");

    scaner();

    strcpy(ep2,factor());

    strcpy(tp,newtemp());

    emit(tp,eplace,tt,ep2);

    strcpy(eplace,tp);

  }

 return(eplace);

}

char*factor()

{char*fplace;

 fplace=(char*)malloc(12);

 strcpy(fplace,"");

 if(syn==10)

  {strcpy(fplace,token);

    scaner();

  }

 elseif(syn==11)

  {itoa(sum,fplace,10);

    scaner();

  }

 elseif(syn==27)

  {scaner();

    fplace=expression();

    if(syn==28)scaner();

    else{printf("erroron')'!

\n");

    kk=1;

    getch();

    exit(0);

  }

  }

 else{printf("erroron'('!

\n");

 kk=1;

 getch();

 exit(0);

      }

 return(fplace);

}

char*newtemp()

{char*p;

 charm[8];

 p=(char*)malloc(8);

 kk++;

 itoa(kk,m,10);

 strcpy(p+1,m);

 p[0]='t';

 return(p);

 }

scaner()

 { sum=0;

   for(m=0;m<8;m++)token[m++]=NULL;

   m=0;

   ch=prog[p++];

   while(ch=='')ch=prog[p++];

   if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

     {while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

  {token[m++]=ch;

   ch=prog[p++];

  }

     p--;

     syn=10;

     token[m++]='\0';

     for(n=0;n<6;n++)

 if(strcmp(token,rwtab[n])==0)

   {syn=n+1;

     break;

   }

     }

   elseif((ch>='0')&&(ch<='9'))

     {while((ch>='0')&&(ch<='9'))

 {sum=sum*10+ch-'0';

  ch=prog[p++];

 }

 p--;

 syn=11;

     }

   elseswitch(ch)

      {case'<':

m=0;

   ch=prog[p++];

   if(ch=='>')

     { syn=21;

     }

   elseif(ch=='=')

     { syn=22;

     }

   else

     { syn=20;

        p--;

     }

   break;

 case'>':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=24;

     }

   else

     {syn=23;

       p--;

     }

   break;

 case':

':

m=0;

   ch=prog[p++];

   if(ch=='=')

     {syn=18;

     }

   else

     {syn=17;

       p--;

     }

   break;

 case'+':

syn=13;break;

 case'-':

syn=14;break;

 case'*':

syn=15;break;

 case'/':

syn=16;break;

 case'(':

syn=27;break;

 case')':

syn=28;break;

 case'=':

syn=25;break;

 case';':

syn=26;break;

 case'#':

syn=0;break;

 default:

syn=-1;break;

      }

   }

emit(char*result,char*ag1,char*op,char*ag2)

{

strcpy(quad[q].result1,result);

strcpy(quad[q].ag11,ag1);

strcpy(quad[q].op1,op);

strcpy(quad[q].ag21,ag2);

q++;

}

 

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1