写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.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 . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...
-
必要的软件架构师——编译原理&;#183;语法
最近软测试.我观看进程的视频! 发现里面有很多内容已经在自我不错的接触过程.而占80%比例! 但其中的一部分.我很奇怪的一部分.研究,在这里,将我研究的内容整理分享给大家! 编译原理: 首先,我第一眼 ...
-
python实现算术表达式的词法语法语义分析(编译原理应用)
本学期编译原理的一个大作业,我的选题是算术表达式的词法语法语义分析,当时由于学得比较渣,只用了递归下降的方法进行了分析. 首先,用户输入算术表达式,其中算术表达式可以包含基本运算符,括号,数字,以及用 ...
-
跟vczh看实例学编译原理——三:Tinymoe与无歧义语法分析
文章中引用的代码均来自https://github.com/vczh/tinymoe. 看了前面的三篇文章,大家应该基本对Tinymoe的代码有一个初步的感觉了.在正确分析"print ...
随机推荐
-
自定义底部工具栏及顶部工具栏和Fragment配合使用demo
首先简单的介绍下fragment,fragment是android3.0新增的概念,其中文意思是碎片,它与activity非常相似,用来在一个activity中描述一些行为或一部分用户界面.使用锁个f ...
-
python设计模式1:创建型模式
1.原型模式 如果想根据现有的对象复制出新的对象并进行修改,可以考虑“原型模式”,而无需知道任何创建细节.(有点像写轮眼...你不需要知道它) import copy class Point: __s ...
-
[LintCode] Implement Trie 实现字典树
Implement a trie with insert, search, and startsWith methods. Have you met this question in a real i ...
-
excel让每个单元格的宽度随着字体自动变动的两种方式(有更好方法的大神,请忽略,求评论下)
1.打开在EXCEL的工作表,点击工作表左上方的方框,选中整个工作表,将鼠标一致A列的右边线处,也就是A列和B列中间的分界线处,光标会变成十字,鼠标左键双击,列宽会调整到最恰当处.截图如下
-
JAVA用户数据输入
数据输入 首先需要导入扫描仪 然后声明扫描仪 输出输入提示 接收用户数据的数据 输出用户数据的数据 实例: import java.util.Scanner; //导入扫描仪 public class ...
-
javascript自执行函数为什么要把windows作为参数传进去
http://segmentfault.com/q/1010000000311686 (function (window, $, undefined) { play=function(){ $(&qu ...
-
一份React-Native学习指南-感谢分享
自己在学习React-Native过程中整理的一份学习指南,包含 教程.开源app和资源网站等,还在不断更新中.欢迎pull requests! React-Native学习指南 本指南汇集React ...
-
Oracle EBS-SQL (PO-8):检查有供货比例无采购员.sql
select distinct msr.sourcing_rule_name 名称 , msi.description 说明 , ...
-
重回博客 谈一谈Node中的异步和单线程
重回博客,这个帐号之前注册后就只发了一篇博客.听朋友建议,决定一周两次更新. 第一篇谈论一下最近想的比较多的异步的问题. 传统多线程异步 传统的异步是多线程的,当要同时做两件事的时候,他们是执行在不同 ...
-
Python中高级变量类型(列表,元组,字典,字符串,公共方法...)
高级变量类型 目标 列表 元组 字典 字符串 公共方法 变量高级 知识点回顾 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 (int) 浮点型(float) 布尔型(bool) ...