最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

编译原理 实验二 语法分析

来源:动视网 责编:小OO 时间:2025-09-30 22:25:21
文档

编译原理 实验二 语法分析

网工二班陈衍席1205110125编译原理实验2语法分析(2课时)实验目的:理解自上而下分析法的基本思想,理解递归下降分析法的基本思路,掌握构造递归下降子程序的方法。实验内容:运用递归下降子程序法,实现整数四则运算表达式的语法分析程序。实验要求:编写程序,上机调试和测试,纪录调试和测试情况,结合程序进行分析。实验环境:VisualC++6.0或以上版本,WindowsXP或以上版本,微软汇编工具(在Software子目录下)。实现要点与提示:需要实现的语法分析程序的功能是,接受一个表达式,分析
推荐度:
导读网工二班陈衍席1205110125编译原理实验2语法分析(2课时)实验目的:理解自上而下分析法的基本思想,理解递归下降分析法的基本思路,掌握构造递归下降子程序的方法。实验内容:运用递归下降子程序法,实现整数四则运算表达式的语法分析程序。实验要求:编写程序,上机调试和测试,纪录调试和测试情况,结合程序进行分析。实验环境:VisualC++6.0或以上版本,WindowsXP或以上版本,微软汇编工具(在Software子目录下)。实现要点与提示:需要实现的语法分析程序的功能是,接受一个表达式,分析
网工二班 陈衍席 1205110125

编译原理实验2 语法分析(2课时)

实验目的:理解自上而下分析法的基本思想,理解递归下降分析法的基本思路,掌握构造递归下降子程序的方法。

实验内容:运用递归下降子程序法,实现整数四则运算表达式的语法分析程序。

实验要求:编写程序,上机调试和测试,纪录调试和测试情况,结合程序进行分析。

实验环境:Visual C++ 6.0或以上版本,Windows XP或以上版本,微软汇编工具(在Software子目录下)。

实现要点与提示:

需要实现的语法分析程序的功能是,接受一个表达式,分析该表达式,并根据输入正确与否给出相应信息。测试时,如果输入的表达式分析正确,则输出表示分析正确的信息;否则,输出表示分析错误的信息。

实验代码:

#include

#include

#include

char prog[100],ch,token[8];

int p=0,syn,n,i;

char *keyword[6]={"begin

void scaner();

void Irparse();

void statement();

void expression_r();

void term();

void factor();

void main()

{  int select=-1;

       p=0;

       printf("please input sentence, end of '#' !\\n");

       do

       {

              ch=getchar();

              prog[p++]=ch;

       }while(ch!='#');

       p=0;

       printf("请输入1 或 2 \\n  1.词法分析\\n  2.语法分析\\n");

              scanf("%d",&select);

       if(select==1)

       {    do

              {

              scaner();

              switch(syn)

                     { case -1:printf("词法分析 出错\\n");break;

default :printf("<%d,%s>\\n",syn,token);break;

                     }    

              }while(syn!=0);

              printf("词法分析 成功\\n");

       }

       else if(select==2)   

       {

              scaner();

       if(syn==1)

              {Irparse();}//begin

       else

              {printf("语法分析出错! 请检查begin关键字\\n");return;}

    if(syn==6)//end

              {

                     scaner();

                     if(syn==0)

                     {

                            printf("恭喜 语法分析 成功\\n");

                     }

                     else

                     {printf("语法分析出错! 请检查是否缺少'#'\\n");}

              }

       else{printf("语法分析出错! 请检查是否缺少'end'\\n");}

      

      

       }

       getchar();

 

}

void scaner()

{

      

             

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

       {token[n]='\\0';}

       n=0;

      ch=prog[p++];

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

             

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

              {

                     do{

                            token[n++]=ch;

                            ch=prog[p++];

}while((ch>='a'&&ch<='z')||(ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));

                     syn=10;

                    

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

                     {if(strcmp(token,keyword[n])==0)

                     {

                            syn=n+1;

                           

                     }

                     }

                     p--;

                     //return;

              }

else if(ch>='0'&&ch<='9')

              {

                     p--;

                     do

                     {

                            token[n++]=prog[p++];

                            ch=prog[p];

}while(ch>='0'&&ch<='9');

                     syn=11;

                    

                    

                     return;

              }

              else

              {

                    

                     //ch=prog[p++];

                     switch(ch)

                     {

                     case '+':syn=13;token[0]=ch;break;

                     case '-':syn=14;token[0]=ch;break;

                     case '*':syn=15;token[0]=ch;break;

                     case '/':syn=16;token[0]=ch;break;

                     case ':':syn=17;token[0]=ch;

                                   ch=prog[p++];

                                   if(ch=='='){token[1]=ch;syn++;}

                                   else p--;

                                   break;

case '<':syn=20;token[0]=ch;

                                   ch=prog[p++];

if(ch=='>'){token[1]=ch;syn++;}

                                   else if(ch=='='){token[1]=ch;syn=syn+2;}

                                   else p--;

                                   break;

case '>':syn=23;token[0]=ch;

                                ch=prog[p++];

                                   if(ch=='='){token[1]=ch;syn++;}

                                   else p--;

                                   break;

                     case '=':syn=25;token[0]=ch;break;

                     case ';':syn=26;token[0]=ch;break;

                     case '(':syn=27;token[0]=ch;break;

                     case ')':syn=28;token[0]=ch;break;

                     case '#':syn=0;token[0]=ch;break;

                    

                     default: printf("词法分析出错! 请检查是否输入非法字符\\n");syn=-1;break;

                    

                     }

 

                     //return;

              }

             

}

 

 

void Irparse()

{

       scaner();

       statement();

       while(syn==26)//;

              {

                     scaner();

                     statement();

              }

      

}

void statement()

{

       if(syn==10)

       {

              scaner();

              if(syn==18)

              {

                     scaner();

                     expression_r();

              }

              else

              {

                     printf("语法分析出错! 请检查表达式是否正确\\n");return;

              }

       }

       else

       {

              printf("语法分析出错!  请检查语句是否正确\\n");return;

       }

}

 

void expression_r()

{

       term();

       while(syn==13||syn==14)//+ -

       {

              scaner();

              term();

       }

}

 

void term()

{

       factor();

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

       {

              scaner();

              factor();

       }

}

void factor()

{

       if(syn==10||syn==11)

       {

              scaner();

       }

       else if(syn==27)

       {

              scaner();

              expression_r();

              if(syn==28)

              {

                     scaner();

              }

              else {printf("语法分析出错! 请检查是否缺少')'\\n");return;}

       }

       else {printf("语法分析出错! 请检查是否输入非法字符\\n");return;}

}

运行截图

实验总结:

      通过本次上级实验,加强了动手能力,扩展语法分析的知识,对语法分析有更深刻的理解,但因为准备的不足,使得实验进入误区,老是在一个地方失败好几次,下次实验前应该做好准备,好能更顺利的做实验。

文档

编译原理 实验二 语法分析

网工二班陈衍席1205110125编译原理实验2语法分析(2课时)实验目的:理解自上而下分析法的基本思想,理解递归下降分析法的基本思路,掌握构造递归下降子程序的方法。实验内容:运用递归下降子程序法,实现整数四则运算表达式的语法分析程序。实验要求:编写程序,上机调试和测试,纪录调试和测试情况,结合程序进行分析。实验环境:VisualC++6.0或以上版本,WindowsXP或以上版本,微软汇编工具(在Software子目录下)。实现要点与提示:需要实现的语法分析程序的功能是,接受一个表达式,分析
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top