实验三:递归下降语法分析实验

一、    实验目的

编制一个递归下降分析程序。

二、    实验内容和要求

输入:算术表达式;

输出:判断结果(输入正确/错误)。

三、实验方法、步骤及结果测试

1.源程序名:递归下降语法分析.c

   可执行程序名:递归下降语法分析.exe

2. 原理分析及流程图

采用递归子程序方法进行语法分析,对文法中的每个非终结符号按其产生式结构产生相应的语法分析子程序,完成相应的识别任务。其中终结符产生匹配命令,非终结符则产生调用命令。

流程图:

3. 主要程序段及其解释:

#include<stdio.h>
#include<string.h>char prog[100],token[8],ch;
char *rwtab[6]={"begin","if","then","while","do","end"};
int syn,p,m,n,sum;

void E();            //E->TE1;
void E1();           //E1->+TE1|-TE1|ε
void T();            //T->FT1
void T1();            //T1->*FT1 |/FT1|ε
void F();            //F->(E) | i

error();
void scaner();int main()
{  p=0;  printf("\nplease input a string (end with '#'): \n");  do  {  scanf("%c",&ch);  prog[p++]=ch;  }while(ch!='#'); p=0;scaner();E();

}  void E()
{T();E1();
}void E1()
{if((syn==13)||(syn==14)){scaner();T();E1();}else {if(syn!=28 && syn!=0)error();}
}void T()
{F();T1();
}
void T1()
{if((syn==15)||(syn==16)){scaner();F();T1();}else {if(syn!=28 && syn!=0 && syn!=13)error();}}
void F()
{if(syn==27){scaner();E();if(syn==28){scaner();E();if(syn==0)printf("\nTrue!\n");}elseerror();}else if(syn==11||syn==10)scaner();
}error()
{printf("\n Syn Error!\n");
}void 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;  }
}  

4. 运行结果及分析

转载于:https://www.cnblogs.com/ashh/p/6216447.html

实验报告(3)-语法分析相关推荐

  1. 编译原理实验报告一:PL0语言编译器分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告一:PL0语言编译器分析 一.实验目的 通过阅读与解析一个实际编译器(PL/0语言编译器)的源代码, 加深对编译阶段(包括词法分析.语法分析.语义分析.中间代码生成等)和编译系统软件结构的理解 ...

  2. 编译原理实验报告三:语法分析(PL0,词法分析,语法分析,中间代码生成)

    实验报告三:语法分析 一.实验目的 通过设计.开发一个S语言的语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容的理解,提高语法分析方法的实践能力. 二.实验要求        根 ...

  3. 递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

    递归下降语法分析器实验报告 编译原理实验报告 题目: 递归下降语法分析器 学 院 计算机科学与技术 专 业 xxxxxxxxxxxxxxxx 学 号 xxxxxxxxxxxx 姓 名 宁剑 指导教师 ...

  4. c语言的适当大小的子集,编译原理上机实验报告

    编译原理上机实验报告,编制C语言子集的词法分析程序,编制递归下降法的语法分析程序 编译技术上机实验题目 实验一 一.题目 编制C语言子集的词法分析程序 二.目的 通过设计.编制.调试一个具体的词法分析 ...

  5. 201506110135陈若倩词法分析实验报告

    实验一.词法分析实验 商业软件工程专业   陈若倩  201506110135 一. 实验目的 通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解. 二. 实验 ...

  6. java lr0分析,LR0分析器实验报告.doc

    <编译?原理> 课程设?计性实验报告 课程?题目: ? ?LR(0)分析法 姓? 名: ? ? 钟继文 ?专业班级: ? 计算机科?学与技术(1)班 指?导老师: ? ? 孙长圣老师 学 ...

  7. 编译原理实验:自上而下语法分析

    编译原理实验:自上而下语法分析 1. 实验题目:自上而下语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自上而下语法分析 ...

  8. c 语言编写编译原理语义分析实验,北邮 编译原理 语义分析实验报告

    <北邮 编译原理 语义分析实验报告>由会员分享,可在线阅读,更多相关<北邮 编译原理 语义分析实验报告(14页珍藏版)>请在人人文库网上搜索. 1.编译原理第六章 语义分析目 ...

  9. 数据库原理实验报告【全集】

    如果对你有帮助,记得点赞哦! 实验1~8:SQL Server 2008的安装及管理工具的使用.SQL Server数据库的管理.SQL Server数据表的管理.数据查询.索引和视图.数据完整性.T ...

  10. 编译原理实验:自下而上语法分析

    编译原理实验:自下而上语法分析 1. 实验题目:自下而上语法分析 实验目的 实验内容 实验要求 输入输出 2. 设计思想 3. 算法流程 4. 源程序 5. 调试数据 1. 实验题目:自下而上语法分析 ...

最新文章

  1. 【iOS】通过NSURLProtocol提高Web加载速度
  2. terminate和quit导致串口资源被占用
  3. Django模板继承
  4. Servlet获得Http请求,GET/POST
  5. 1010 一元多项式求导 (25 分)(c语言)
  6. windows同时安装python2和3编码_Windows同时安装多个版本,python2和python3,window
  7. C语言高效编程与代码优化
  8. java中怎么声明常量_如何在Java中声明一个常量
  9. 时间操作(Java版)—获取给定时间与当前系统时间的差值(以毫秒为单位)
  10. java web学习步骤,javaweb学习路线有哪些?如何学习?
  11. BLP安全操作系统---道里云公司参展英特尔北京IDF峰会介绍(三)
  12. golang httpServer对于keepAlive长连接的处理方式
  13. mysql packet_mysql配置: max_allowed_packet
  14. 99.9%解决谷歌商店(Google Play)下载应用卡在等待中问题
  15. 车联网白皮书 (网联自动驾驶分册)
  16. 黄宇c语言第三次作业,北京交通大学黄宇黄宇老师C语言第1次作业.doc
  17. Pytorch之Dataloader参数collate_fn研究
  18. 「Nginx实战」中学到的东西用在面试上,面试官都被怼得哑口无言
  19. python将日期分隔成单独的年月日时分列
  20. Word中㎡的上标²变成了2该如何处理

热门文章

  1. 图像的缩放,旋转,转置和镜像
  2. 思科室外AP无法注册到WLC
  3. 第二章 算法——程序的灵魂
  4. QUIC协议学习记录
  5. Java基础——泛型
  6. CSS之clearfix清除浮动
  7. HDU 4122:Alice's mooncake shop RMQ(2011 Asia Fuzhou Regional Contest )
  8. VIM批量文件查找和替换
  9. 项目管理(七)- 项目利益相关者责任
  10. getifaddrs