写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!

本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/8964342.html

  使用递归下降子程序实现的PL/0语言的算术表达式的自上而下语法分析。该语言的其他语法实现思想与此一致,故不赘述。

  运行此程序前,必须先将代码通过:【编译原理】c++实现词法分析器的词法分析,生成词法表(词法表是txt文件,为了语法分析成功,务必删除文件中最后空着的一行,即文件末尾不可以留空白行)。生成的该词法表为此程序的必要输入。

  1. /*
  2. this code was first initiated by TZ,COI,HZAU
  3. contact email:xmb028@163.com
  4. personal website:wnm1503303791.github.io
  5. personal blogs:www.cnblogs.com/acm-icpcer/
  6. this code has been posted on my personal blog,checking url:www.cnblogs.com/acm-icpcer/p/8964342.html
  7. Copyright 2018/4/27 TZ.
  8. All Rights Reserved.
  9. */
  10.  
  11. #include<cstdio>
  12. #include<cstring>
  13. #include<algorithm>
  14. #include<iostream>
  15. #include<string>
  16. #include<vector>
  17. #include<stack>
  18. #include<bitset>
  19. #include<cstdlib>
  20. #include<cmath>
  21. #include<set>
  22. #include<list>
  23. #include<deque>
  24. #include<map>
  25. #include<queue>
  26. #include<fstream>
  27. using namespace std;
  28.  
  29. /*
  30. S->X(AX)*|AX(AX)*
  31. X->Y(MY)*
  32. Y->I|N|(S)
  33. A->+|-
  34. M->*|/
  35. C->=|#|<|<=|>|>=
  36. */
  37. char buffer[];
  38. bool x(fstream &f);
  39. bool s(fstream &f);
  40.  
  41. bool preproccess(char *a,char *b)
  42. {
  43. int i1=,i2=;
  44. memset(b,,'\0');
  45. while(a[i2]!=',')
  46. {
  47. b[i1]=a[i2];
  48. ++i1,++i2;
  49. }
  50. return true;
  51. }
  52.  
  53. bool a(fstream &f)
  54. {
  55. f.getline(buffer,);
  56. char t[];//存放字符标志
  57. preproccess(buffer,t);
  58. cout<<buffer<<","<<t<<endl;
  59.  
  60. if((!strcmp(t,"plus"))||(!strcmp(t,"minus")))
  61. {
  62. return true;
  63. }
  64. else
  65. {
  66. cout<<"add operator ERROR"<<endl;
  67. return false;
  68. }
  69. }
  70.  
  71. bool m(fstream &f)
  72. {
  73. f.getline(buffer,);
  74. char t[];//存放字符标志
  75. preproccess(buffer,t);
  76. cout<<buffer<<","<<t<<endl;
  77.  
  78. if((!strcmp(t,"times"))||(!strcmp(t,"slash")))
  79. {
  80. return true;
  81. }
  82. else
  83. {
  84. cout<<"times operator ERROR"<<endl;
  85. return false;
  86. }
  87. }
  88.  
  89. bool c(fstream &f)
  90. {
  91. f.getline(buffer,);
  92. char t[];//存放字符标志
  93. preproccess(buffer,t);
  94. cout<<buffer<<","<<t<<endl;
  95.  
  96. if ( (!strcmp(t,"eql"))
  97. ||(!strcmp(t,"lss"))
  98. ||(!strcmp(t,"leq"))
  99. ||(!strcmp(t,"gtr"))
  100. ||(!strcmp(t,"geq"))
  101. )
  102. {
  103. return true;
  104. }
  105. else
  106. {
  107. cout<<"compare operator ERROR"<<endl;
  108. return false;
  109. }
  110. }
  111.  
  112. bool y(fstream &f)
  113. {
  114. f.getline(buffer,);
  115. char t[];//存放字符标志
  116. preproccess(buffer,t);
  117. cout<<buffer<<","<<t<<endl;
  118.  
  119. if(!strcmp(t,"ident"))
  120. {
  121. return true;
  122. }
  123. else if(!strcmp(t,"number"))
  124. {
  125. return true;
  126. }
  127. else if(!strcmp(t,"lparen"))
  128. {
  129. s(f);
  130.  
  131. f.getline(buffer,);
  132. preproccess(buffer,t);
  133. cout<<buffer<<","<<t<<endl;
  134.  
  135. if(!strcmp(t,"rparen"))
  136. {
  137. return true;
  138. }
  139. else
  140. return false;
  141. }
  142. else
  143. {
  144. cout<<"yingzi operator ERROR"<<endl;
  145. return false;
  146. }
  147. }
  148.  
  149. bool x(fstream &f)
  150. {
  151. bool /*a1=y(f),*/a2=false,a3=false;
  152. while(!f.eof())
  153. {
  154. a2=m(f);
  155. a3=y(f);
  156. }
  157. return (a2)&a3;
  158. }
  159.  
  160. bool s(fstream &f)
  161. {
  162. bool a1=false,a2=false;
  163. while(!f.eof())
  164. {
  165. a1=y(f);
  166. a2=x(f);
  167. }
  168. return a1&a2;
  169. }
  170.  
  171. int main()
  172. {
  173. fstream f1,f2;
  174. f1.open("lexical.txt", ios::in);//打开文件,供读
  175. f2.open("lexical.txt", ios::in);
  176.  
  177. bool result1=s(f1);//start the grammar detection
  178. /*
  179. cout<<"break:"<<endl;
  180. bool result2=x(f2);
  181. */
  182. if(result1/*||result2*/)
  183. cout<<"ACCEPTED!"<<endl;
  184. else
  185. cout<<"ERROR!"<<endl;
  186.  
  187. f1.close();
  188. f2.close();
  189. return ;
  190. }

运行示例:

1、在词法分析器中输入待分析代码:

2、检查词法分析表,删除文件最后的空行:

3、运行本次的语法分析程序:

附产生式推导过程:

tz

first posted@COI HZAU,2018/4/27

last updated@COI HZAU,2018/4/28

【编译原理】c++实现自上而下语法分析器的更多相关文章

  1. 【编译原理】LL1文法语法分析器

    上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...

  2. 编译原理_P1004

    龙书相关知识点总结 //*************************引论***********************************// 1. 编译器(compiler):从一中语言( ...

  3. 编译原理简单语法分析器(first,follow,分析表)源码下载

    编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...

  4. 【编译原理】c++实现自下而上语法分析器

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  5. <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>

    <编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...

  6. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

  7. 必要的软件架构师——编译原理&#183;语法

    最近软测试.我观看进程的视频! 发现里面有很多内容已经在自我不错的接触过程.而占80%比例! 但其中的一部分.我很奇怪的一部分.研究,在这里,将我研究的内容整理分享给大家! 编译原理: 首先,我第一眼 ...

  8. python实现算术表达式的词法语法语义分析(编译原理应用)

    本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...

  9. 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析

    文章中引用的代码均来自https://github.com/vczh/tinymoe.   看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...

随机推荐

  1. 一道简单的python面试题-购物车

    要求实现:1.程序开始运行时要求手动填入工资金额2.然后展示一份带有价格的商品列表3.选择某个商品,足够金额购买就添加到购物车,否则提示无法购买4.退出后列出购物车清单 #!/usr/bin/pyth ...

  2. ansible执行shell模块和command模块报错| FAILED | rc=127 >> /bin/sh: lsof: command not found和| rc=2 >> [Errno 2] No such file or directory

    命令: ansible -i hosts_20 st  -m shell -a 'service zabbix_agentd star'  -K --become ansible -i hosts_2 ...

  3. maven的配置及一些常用命令

    一般来说,github上大多的java项目都是使用maven,ant等进行构建的.由于之前没有使用过maven,因此这几天对maven进行了简单的学习.古话说:“温故而知新”,一些命令长时间不使用都会 ...

  4. kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)

    启动项目时控制台抛出的异常信息: -- :: --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 't ...

  5. C#中怎么判断一个数组中是否存在某个数组值

    (1) 第一种方法: ,,}; ); // 这里的1就是你要查找的值 ) // 不存在 else // 存在 (2) 第二种方法: string[] strArr = {"a",& ...

  6. remmina如何上传文件到linux服务器

    1.安装filezilla 2. remmina中选择列表中的主机,点击“外部工具 -> filezilla-xfp.sh” 3. 弹出filezilla,输入主机,端口,用户名,密码,连接, ...

  7. 开源网络库ACE、Boost的ASIO、libevent、libev、ZeroMQ

    开源C/C++网络库:ACE          C++语言 跨平台Boost的ASIO  C++语言 跨平台libevent     C语言   主要支持linux,新版增加了对windows的IOC ...

  8. GitStack 第三方开源服务器端

      GitStack 开源集成Git的界面服务器端 官网URL:http://gitstack.com     详情 请看<分布式版本控制系统Git--使用GitStack+TortoiseGi ...

  9. CentOS命令介绍综合

    1,显示当前使用的shell [root@localhost ~]# echo $SHELL2,显示当前系统使用的所有shell [root@localhost ~]# cat /etc/shells ...

  10. IOC容器特性注入第二篇:初始引擎查找对应的IOC容器

    上篇文章介绍了如何利用反射类查找网站bin文件夹下面所有DLL的程序集类,这篇文章将介绍如何初始化一个IOC容器引擎. 目前IOC容器有很多,如Ninject,Autofac等,每个容器的驱动都不一样 ...