【编译原理】c++实现自上而下语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文!
本博客全网唯一合法URL:http://www.cnblogs.com/acm-icpcer/p/8964342.html
使用递归下降子程序实现的PL/0语言的算术表达式的自上而下语法分析。该语言的其他语法实现思想与此一致,故不赘述。
运行此程序前,必须先将代码通过:【编译原理】c++实现词法分析器的词法分析,生成词法表(词法表是txt文件,为了语法分析成功,务必删除文件中最后空着的一行,即文件末尾不可以留空白行)。生成的该词法表为此程序的必要输入。
- /*
- this code was first initiated by TZ,COI,HZAU
- contact email:xmb028@163.com
- personal website:wnm1503303791.github.io
- personal blogs:www.cnblogs.com/acm-icpcer/
- this code has been posted on my personal blog,checking url:www.cnblogs.com/acm-icpcer/p/8964342.html
- Copyright 2018/4/27 TZ.
- All Rights Reserved.
- */
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<iostream>
- #include<string>
- #include<vector>
- #include<stack>
- #include<bitset>
- #include<cstdlib>
- #include<cmath>
- #include<set>
- #include<list>
- #include<deque>
- #include<map>
- #include<queue>
- #include<fstream>
- using namespace std;
- /*
- S->X(AX)*|AX(AX)*
- X->Y(MY)*
- Y->I|N|(S)
- A->+|-
- M->*|/
- C->=|#|<|<=|>|>=
- */
- char buffer[];
- bool x(fstream &f);
- bool s(fstream &f);
- bool preproccess(char *a,char *b)
- {
- int i1=,i2=;
- memset(b,,'\0');
- while(a[i2]!=',')
- {
- b[i1]=a[i2];
- ++i1,++i2;
- }
- return true;
- }
- bool a(fstream &f)
- {
- f.getline(buffer,);
- char t[];//存放字符标志
- preproccess(buffer,t);
- cout<<buffer<<","<<t<<endl;
- if((!strcmp(t,"plus"))||(!strcmp(t,"minus")))
- {
- return true;
- }
- else
- {
- cout<<"add operator ERROR"<<endl;
- return false;
- }
- }
- bool m(fstream &f)
- {
- f.getline(buffer,);
- char t[];//存放字符标志
- preproccess(buffer,t);
- cout<<buffer<<","<<t<<endl;
- if((!strcmp(t,"times"))||(!strcmp(t,"slash")))
- {
- return true;
- }
- else
- {
- cout<<"times operator ERROR"<<endl;
- return false;
- }
- }
- bool c(fstream &f)
- {
- f.getline(buffer,);
- char t[];//存放字符标志
- preproccess(buffer,t);
- cout<<buffer<<","<<t<<endl;
- if ( (!strcmp(t,"eql"))
- ||(!strcmp(t,"lss"))
- ||(!strcmp(t,"leq"))
- ||(!strcmp(t,"gtr"))
- ||(!strcmp(t,"geq"))
- )
- {
- return true;
- }
- else
- {
- cout<<"compare operator ERROR"<<endl;
- return false;
- }
- }
- bool y(fstream &f)
- {
- f.getline(buffer,);
- char t[];//存放字符标志
- preproccess(buffer,t);
- cout<<buffer<<","<<t<<endl;
- if(!strcmp(t,"ident"))
- {
- return true;
- }
- else if(!strcmp(t,"number"))
- {
- return true;
- }
- else if(!strcmp(t,"lparen"))
- {
- s(f);
- f.getline(buffer,);
- preproccess(buffer,t);
- cout<<buffer<<","<<t<<endl;
- if(!strcmp(t,"rparen"))
- {
- return true;
- }
- else
- return false;
- }
- else
- {
- cout<<"yingzi operator ERROR"<<endl;
- return false;
- }
- }
- bool x(fstream &f)
- {
- bool /*a1=y(f),*/a2=false,a3=false;
- while(!f.eof())
- {
- a2=m(f);
- a3=y(f);
- }
- return (a2)&a3;
- }
- bool s(fstream &f)
- {
- bool a1=false,a2=false;
- while(!f.eof())
- {
- a1=y(f);
- a2=x(f);
- }
- return a1&a2;
- }
- int main()
- {
- fstream f1,f2;
- f1.open("lexical.txt", ios::in);//打开文件,供读
- f2.open("lexical.txt", ios::in);
- bool result1=s(f1);//start the grammar detection
- /*
- cout<<"break:"<<endl;
- bool result2=x(f2);
- */
- if(result1/*||result2*/)
- cout<<"ACCEPTED!"<<endl;
- else
- cout<<"ERROR!"<<endl;
- f1.close();
- f2.close();
- return ;
- }
运行示例:
1、在词法分析器中输入待分析代码:
2、检查词法分析表,删除文件最后的空行:
3、运行本次的语法分析程序:
附产生式推导过程:
tz
first posted@COI HZAU,2018/4/27
last updated@COI HZAU,2018/4/28
【编译原理】c++实现自上而下语法分析器的更多相关文章
- 【编译原理】LL1文法语法分析器
上篇文章[编译原理]语法分析--自上向下分析 分析了LL1语法,文章最后说给出栗子,现在补上去. 说明: 这个语法分析器是利用LL1分析方法实现的. 预测分析表和终结符以及非终结符都是针对一个特定文法 ...
- 编译原理_P1004
龙书相关知识点总结 //*************************引论***********************************// 1. 编译器(compiler):从一中语言( ...
- 编译原理简单语法分析器(first,follow,分析表)源码下载
编译原理(简单语法分析器下载) http://files.cnblogs.com/files/hujunzheng/%E5%8A%A0%E5%85%A5%E5%90%8C%E6%AD%A5%E7%AC ...
- 【编译原理】c++实现自下而上语法分析器
写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...
- <编译原理 - 函数绘图语言解释器(2)语法分析器 - python>
<编译原理 - 函数绘图语言解释器(2)语法分析器 - python> 背景 编译原理上机实现一个对函数绘图语言的解释器 - 用除C外的不同种语言实现 设计思路: 设计函数绘图语言的文法, ...
- Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用
catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
- 必要的软件架构师——编译原理·语法
最近软测试.我观看进程的视频! 发现里面有很多内容已经在自我不错的接触过程.而占80%比例! 但其中的一部分.我很奇怪的一部分.研究,在这里,将我研究的内容整理分享给大家! 编译原理: 首先,我第一眼 ...
- python实现算术表达式的词法语法语义分析(编译原理应用)
本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...
- 跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
随机推荐
- 一道简单的python面试题-购物车
要求实现:1.程序开始运行时要求手动填入工资金额2.然后展示一份带有价格的商品列表3.选择某个商品,足够金额购买就添加到购物车,否则提示无法购买4.退出后列出购物车清单 #!/usr/bin/pyth ...
- 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 ...
- maven的配置及一些常用命令
一般来说,github上大多的java项目都是使用maven,ant等进行构建的.由于之前没有使用过maven,因此这几天对maven进行了简单的学习.古话说:“温故而知新”,一些命令长时间不使用都会 ...
- kafka项目中踩到的一个坑(客户端和服务器端版本不一致问题)
启动项目时控制台抛出的异常信息: -- :: --- [ main] o.s.s.c.ThreadPoolTaskScheduler : Initializing ExecutorService 't ...
- C#中怎么判断一个数组中是否存在某个数组值
(1) 第一种方法: ,,}; ); // 这里的1就是你要查找的值 ) // 不存在 else // 存在 (2) 第二种方法: string[] strArr = {"a",& ...
- remmina如何上传文件到linux服务器
1.安装filezilla 2. remmina中选择列表中的主机,点击“外部工具 -> filezilla-xfp.sh” 3. 弹出filezilla,输入主机,端口,用户名,密码,连接, ...
- 开源网络库ACE、Boost的ASIO、libevent、libev、ZeroMQ
开源C/C++网络库:ACE C++语言 跨平台Boost的ASIO C++语言 跨平台libevent C语言 主要支持linux,新版增加了对windows的IOC ...
- GitStack 第三方开源服务器端
GitStack 开源集成Git的界面服务器端 官网URL:http://gitstack.com 详情 请看<分布式版本控制系统Git--使用GitStack+TortoiseGi ...
- CentOS命令介绍综合
1,显示当前使用的shell [root@localhost ~]# echo $SHELL2,显示当前系统使用的所有shell [root@localhost ~]# cat /etc/shells ...
- IOC容器特性注入第二篇:初始引擎查找对应的IOC容器
上篇文章介绍了如何利用反射类查找网站bin文件夹下面所有DLL的程序集类,这篇文章将介绍如何初始化一个IOC容器引擎. 目前IOC容器有很多,如Ninject,Autofac等,每个容器的驱动都不一样 ...