【编译原理】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 ...
随机推荐
- Redis高可用详解:持久化技术及方案选择
文章摘自:https://www.cnblogs.com/kismetv/p/9137897.html 前言 在上一篇文章中,介绍了Redis的内存模型,从这篇文章开始,将依次介绍Redis高可用相关 ...
- 转移 Visual Studio 2017 的安装临时文件
每次更新 Visual Studio 2017 会在 C 盘留下大量的缓存文件,因为目录比较深,怕以后忘了,用目录链接的形式转移到其它磁盘,也好方便清理: mklink /D C:\ProgramDa ...
- netty实现多个handler顺序调用
在netty中,一次数据交互,可以由多个handler去处理,例如 handler1 和 handler2,那么,在前面那个handler的 messageReceived 的最后要加上 ctx.se ...
- [ci] jenkins kubernetes插件配置(容器模式)-通过jnlp
有个小伙用sh结合jenkins搞的k8s cicd还不错 jenkins kubernetes插件 首先插件管理,搜索kubernetes plugin安装 配置kubernetes云 配置项目 执 ...
- [Big Data - Kafka] Kafka设计解析(四):Kafka Consumer解析
High Level Consumer 很多时候,客户程序只是希望从Kafka读取数据,不太关心消息offset的处理.同时也希望提供一些语义,例如同一条消息只被某一个Consumer消费(单播)或被 ...
- 省市区三级联动——思路、demo、示例
说明(2017-12-13 11:03:58): 1. 这个功能应该是注册的时候非常.常用的了,不过现在都是微信登录,手机端自动获取位置什么的,可能就网站还用用吧! 2. 这个东西的难点在于统计各地省 ...
- Android 自动化测试——Monkey测试
Android自带了很多方便的测试工具和方法,包括我们常用的单元测试.Robotium测试.Monkey测试.MonkeyRunner测试.senevent模拟等.这些方法对于我们编写高质量的APP十 ...
- ECSHOP后台编辑器不能上传中文名图片的解决办法
在后台上传商品图片的时候,如果你选择一个中文名称的图片,那么上传后会产生乱码,导致图片显示不出来. 下面说一种解决办法: 使用“年月日时分秒 + 6个随机字符”做为文件名,如 201010161356 ...
- 30. Substring with Concatenation of All Words
题目: You are given a string, s, and a list of words, words, that are all of the same length. Find all ...
- cannot open shared object file: No such file or directory
一般我们在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:error while loading shared libraries: libxxx.so: cannot ope ...