最新文章专题视频专题问答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-26 11:22:23
文档

编译原理语法分析

《编译原理》实验报告专业班级_软工1502姓名_赵翘楚_学号_20151107062_一、实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语言的语法用扩充的BNF表示如下:⑴::=beginend⑵::={;}⑶::=⑷::=ID:=⑸::={+|-}⑹::={*|/⑺::=ID|NUM|()2.2实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成
推荐度:
导读《编译原理》实验报告专业班级_软工1502姓名_赵翘楚_学号_20151107062_一、实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语言的语法用扩充的BNF表示如下:⑴::=beginend⑵::={;}⑶::=⑷::=ID:=⑸::={+|-}⑹::={*|/⑺::=ID|NUM|()2.2实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成
《编译原理》实验报告

专业班级_软工1502 姓名_赵翘楚_  学号_20151107062_

一、 实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

二、实验要求

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

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

用扩充的BNF表示如下:

⑴<程序>::=begin<语句串>end

⑵<语句串>::=<语句>{;<语句>}

⑶<语句>::=<赋值语句>

⑷<赋值语句>::=ID:=<表达式>

⑸<表达式>::=<项>{+<项> | -<项>}

⑹<项>::=<因子>{*<因子> | /<因子>

⑺<因子>::=ID | NUM | (<表达式>)

2.2 实验要求说明

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

例如:

 输入  begin a:=9; x:=2*3; b:=a+x end #

 输出  success!

 输入  x:=a+b*c end #

 输出  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-4 statement语句分析函数示意图 图2-5 expression表达式分析函数示意图

 是

 否 否

 是

 是

 否

 否

 是

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

 否

 是

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

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

#include "stdio.h"

#include "string.h"

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

char *rwtab[6]={"begin

int syn,p,m,n,sum;

int kk;

factor();

expression();

yucu();

term();

statement();

lrparser();

scaner();

main()

{

 p=kk=0;

 printf("\\nplease input a string (end with '#'): \\n");

 do

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

     prog[p++]=ch;

   }while(ch!='#');

 p=0;

 scaner();

 lrparser();

 getch();

}

lrparser()

{

 if(syn==1)

   { 

s读下一个单词符号*/

 调用yucu()函数;*/

     if (syn==6)

       { scaner();

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

 printf("success!\\n");

 }

     else { if(kk!=1) printf("the string haven't got a 'end'!\\n");

     kk=1;

   }

    }

 else { printf("haven't got a 'begin'!\\n");

 kk=1;

       }

 return;

}

yucu()

s调用函数statement();*/

  while(syn==26)

   {

 读下一个单词符号*/

    if(syn!=6) 

s调用函数statement();*/

   } 

  return;

}

statement()

{ if(syn==10)

   {

 读下一个单词符号*/

     if(syn==18)

 读下一个单词符号*/

 调用函数statement();*/

       }

     else { printf("the sing ':=' is wrong!\\n");

     kk=1;

    }

   }

  else { printf("wrong sentence!\\n");

  kk=1;

       }

  return;

}

expression()

{ term();

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

 读下一个单词符号*/

 调用函数term();*/

    }

  return;

}

term()

{ factor();

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

 读下一个单词符号*/

 调用函数factor(); */

    }

  return;

}

factor()

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

  else if(syn==27)

 读下一个单词符号*/

 调用函数statement();*/

      if(syn==28) 

s读下一个单词符号*/

      else { printf("the error on '('\\n");

      kk=1;

     }

    }

  else { printf("the expression error!\\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;

    }

      }

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

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

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

   ch=prog[p++];

 }

 p--;

 syn=11;

      }

    else switch(ch)

       { case '<':m=0;

    ch=prog[p++];

    if(ch=='>')

      {  syn=21;

      }

    else if(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;

       }

    }

二、结果分析:

输入 begin a:=9; x:=2*3; b:=a+x end # 后输出success! 如图4-1所示:

图4-1

输入 x:=a+b*c end  #  后输出  error 如图4-2所示:

图4-2

三、总结:

通过本次试验,了解了语法分析的运行过程,主程序大致流程为:“置初值” 调用scaner函数读下一个单词符号 调用IrParse 结束。递归下降分析的大致流程为:“先判断是否为begin” 不是则“出错处理”,若是则“调用scaner函数” 调用语句串分析函数 “判断是否为end” 不是则“出错处理”,若是则调用scaner函数 “判断syn=0&&kk=0是否成立”成立则说明分析成功打印出来。不成立则“出错处理”。

文档

编译原理语法分析

《编译原理》实验报告专业班级_软工1502姓名_赵翘楚_学号_20151107062_一、实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。二、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语言的语法用扩充的BNF表示如下:⑴::=beginend⑵::={;}⑶::=⑷::=ID:=⑸::={+|-}⑹::={*|/⑺::=ID|NUM|()2.2实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top