一、词法分析

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char *rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
void scanner(){//整数,字符(串),其他for(int i=0; i<16; i++) {token[i]=NULL;}ch=program[p++];while(ch==' '){ch=program[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){token[m++]=ch;ch=program[p++];}token[m++]='\0';p--;syn=10;for(int i=0; i<6; i++) {if(strcmp(token, rwtab[i])==0) {syn=i+1;break;}}}else if(ch>='0' && ch<='9') {sum=0;while(ch>='0' && ch<='9') {sum=sum*10+ch-'0';ch=program[p++];}p--;syn=11;if(sum>65536)syn=-1;}else switch(ch) {case '+':syn=13; token[0]='+';  break;case '-':syn=14; token[0]='-';break;case '*':syn=15; token[0]='*'; break;case '/':syn=16; token[0]='/'; break;case ':':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=18;}else {syn=17;p--;}break;case '<':m=0; token[m++]=ch;ch=program[p++];if(ch=='>') {token[m++]=ch;syn=21;}else if(ch=='=') {token[m++]=ch;syn=22;}else {syn=20;p--;}break;case '>':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=24;}else {syn=23;p--;}break;case '=':syn=25; token[0]=ch;break;case ';':syn=26; token[0]=ch;break;case '(':syn=27; token[0]=ch;break;case ')':syn=28; token[0]=ch;break;case '#':syn=0; token[0]=ch;break;default: syn=-1;break;}
}
int main()
{p=0;printf("please input string:\n");do{ch=cin.get();program[p++]=ch;}while(ch!='#');p=0;do {scanner();switch(syn) {case 11:cout<<"<"<<syn<<","<<sum<<">"<<endl; break;case -1:cout<<"Error"<<endl; break;default:cout<<"<"<<syn<<","<<token<<">"<<endl; break;}}while(syn!=0);return 0;
}

二、语法分析

#include <iostream>
#include <cstdio>
#include <cstring>
#include <String>
using namespace std;int sign=1;string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m;//下标
int kk;//出错处理标记void scanner();
void factor();
void term();
void expression();
void statement();
void statementString();
void irparser();void scanner(){//整数,字符(串),其他char token[16];ch=program[p++];while(ch==' '){ch=program[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){token[m++]=ch;ch=program[p++];}token[m++]='\0';p--;syn=10;for(int i=0; i<6; i++) {if((string(token)==rwtab[i])) {syn=i+1;break;}}}else if(ch>='0' && ch<='9') {sum=0;while(ch>='0' && ch<='9') {sum=sum*10+ch-'0';ch=program[p++];}p--;syn=11;if(sum>65536)syn=-1;}else switch(ch) {case '+':syn=13; token[0]='+';  break;case '-':syn=14; token[0]='-';break;case '*':syn=15; token[0]='*'; break;case '/':syn=16; token[0]='/'; break;case ':':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=18;}else {syn=17;p--;}break;case '<':m=0; token[m++]=ch;ch=program[p++];if(ch=='>') {token[m++]=ch;syn=21;}else if(ch=='=') {token[m++]=ch;syn=22;}else {syn=20;p--;}break;case '>':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=24;}else {syn=23;p--;}break;case '=':syn=25; token[0]=ch;break;case ';':syn=26; token[0]=ch;break;case '(':syn=27; token[0]=ch;break;case ')':syn=28; token[0]=ch;break;case '#':syn=0; token[0]=ch;break;default: syn=-1;break;}
}void factor() { //因子if(syn==10) {//::调用,继续扫描scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else if(syn==11) {//::调用,继续扫描scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else if(syn==27) {scanner();//cout<<sign++<<"==syn=="<<syn<<endl;expression();if(syn==28) {//::调用,继续扫描scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else {cout<<"error:没有匹配的')' !"<<endl;kk=1;}}else {cout<<"error:不是factor !"<<endl;kk=1;}return ;
}void term() { //项factor();while(syn==15 || syn==16) { //*、/scanner();//cout<<sign++<<"==syn=="<<syn<<endl;factor();}return ;//::出错处理
}void expression() { //表达式term();while(syn==13 || syn==14) {//+、-scanner();//cout<<sign++<<"==syn=="<<syn<<endl;term();}return ;//::出错处理
}void statement() { //语句,赋值语句if(syn==10) { //标识符scanner();//cout<<sign++<<"==syn=="<<syn<<endl;if(syn==18) { //:=scanner();//cout<<sign++<<"==syn=="<<syn<<endl;expression();}else {cout<<"error:不是赋值语句 !"<<endl;kk=1;}}else {cout<<"error:不是语句 !"<<endl;kk=1;}return ;
}void statementString() { //语句串statement();while(syn==26) { //;scanner();//cout<<sign++<<"==syn=="<<syn<<endl;statement();}return ;//::出错处理
}void irparser() { //程序if(syn==1) { //beginscanner();//cout<<sign++<<"==syn=="<<syn<<endl;statementString();if(syn==6) { //endscanner();//cout<<sign++<<"==syn=="<<syn<<endl;if(syn==0&&kk==0) {cout<<"success !"<<endl;}/*else { //一定会有#标志,否则输入不会结束cout<<"没有结束标志 !"<<endl;kk=1;}*/}else {if(kk==0){cout<<"error:没有end !"<<endl;kk=1;}}}else {cout<<"error:没有begin !"<<endl;kk=1;}return ;
}int main()
{p=0;kk=0;printf("please input string:\n");do{ch=cin.get();program[p++]=ch;}while(ch!='#');p=0;scanner();//cout<<sign++<<"==syn=="<<syn<<endl;irparser();return 0;
}

三、语义分析

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <String>
#include <malloc.h>
using namespace std;string rwtab[6]={"begin","if","then","while","do","end"};
//syn:单词符号的种别码;
//token:单词符号的字符串
//sum:整数
char token[16];
int sum,syn;
char program[110],ch;//输入程序,单个字符
int p,m,q;//下标
int kk;//出错处理标记struct {char result1[8];char ag11[8];char op1[8];char ag21[8];
}quad[20];char *newtemp();//新形式
void emit(string result, string ag1, string op, string ag2);void irparser();
int statementString();
int statement();
char *expression();
char *term();
char *factor();
void scanner();
char *newtemp() {char *p;char m[8];p=(char *)malloc(8);kk++;itoa(kk,m,10);strcpy(p+1,m);p[0]='t';return (p);
}
//结果 值一 运算符  值二
void emit(char *result, char *ag1, char *op, char *ag2) {strcpy(quad[q].result1,result);strcpy(quad[q].ag11,ag1);strcpy(quad[q].op1,op);strcpy(quad[q].ag21,ag2);q++;return ;
}void scanner(){//整数,字符(串),其他char token[16];ch=program[p++];while(ch==' '){ch=program[p];p++;}if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){m=0;while((ch>='a'&&ch<'z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9')){token[m++]=ch;ch=program[p++];}token[m++]='\0';p--;syn=10;for(int i=0; i<6; i++) {if((string(token)==rwtab[i])) {syn=i+1;break;}}}else if(ch>='0' && ch<='9') {sum=0;while(ch>='0' && ch<='9') {sum=sum*10+ch-'0';ch=program[p++];}p--;syn=11;if(sum>65536)syn=-1;}else switch(ch) {case '+':syn=13; token[0]='+';  break;case '-':syn=14; token[0]='-';break;case '*':syn=15; token[0]='*'; break;case '/':syn=16; token[0]='/'; break;case ':':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=18;}else {syn=17;p--;}break;case '<':m=0; token[m++]=ch;ch=program[p++];if(ch=='>') {token[m++]=ch;syn=21;}else if(ch=='=') {token[m++]=ch;syn=22;}else {syn=20;p--;}break;case '>':m=0; token[m++]=ch;ch=program[p++];if(ch=='=') {token[m++]=ch;syn=24;}else {syn=23;p--;}break;case '=':syn=25; token[0]=ch;break;case ';':syn=26; token[0]=ch;break;case '(':syn=27; token[0]=ch;break;case ')':syn=28; token[0]=ch;break;case '#':syn=0; token[0]=ch;break;default: syn=-1;break;}
}char *factor() { //因子char *fplace;fplace=(char *)malloc(12);if(syn==10) {// '*' 调用,继续扫描strcpy(fplace,token);scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else if(syn==11) {// '/' 调用,继续扫描itoa(sum,fplace,10);scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else if(syn==27) {scanner();//cout<<sign++<<"==syn=="<<syn<<endl;fplace=expression();if(syn==28) {//::调用,继续扫描scanner();//cout<<sign++<<"==syn=="<<syn<<endl;}else {cout<<"error:没有匹配的')' !"<<endl;kk=1;exit(0);}}else {cout<<"error:不是factor !"<<endl;kk=1;exit(0);}return (fplace);
}char *term() { //项char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,factor());while((syn==15) || (syn==16)) { //*、/if(syn==15) strcpy(tt,"*");else strcpy(tt,"/");scanner();//cout<<sign++<<"==syn=="<<syn<<endl;strcpy(ep2,factor());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);//strcpy(eplace,tp);}return (eplace);
}char *expression() { //表达式char *tp,*ep2,*eplace,*tt;tp=(char *)malloc(12);ep2=(char *)malloc(12);eplace=(char *)malloc(12);tt=(char *)malloc(12);strcpy(eplace,term());while((syn==13) || (syn==14)) {//+、-if(syn==13) strcpy(tt,"+");else strcpy(tt,"-");scanner();//cout<<sign++<<"==syn=="<<syn<<endl;strcpy(ep2,term());strcpy(tp,newtemp());emit(tp,eplace,tt,ep2);strcpy(eplace,tp);}return (eplace);
}int statement() { //语句,赋值语句char tt[8],eplace[8];int schain=0;if(syn==10) { //标识符strcpy(tt,token);scanner();//cout<<sign++<<"==syn=="<<syn<<endl;if(syn==18) { //:=scanner();//cout<<sign++<<"==syn=="<<syn<<endl;strcpy(eplace,expression());emit(tt,eplace,"","");schain=0;}else {cout<<"error:不是赋值语句 !"<<endl;kk=1;exit(0);}}else {cout<<"error:不是语句 !"<<endl;kk=1;}return (schain);
}int statementString() { //语句串int schain=0;schain=statement();while(syn==26) { //;scanner();//cout<<sign++<<"==syn=="<<syn<<endl;schain=statement();}return (schain);
}void irparser() { //程序int schain=0;kk=0;if(syn==1) { //beginscanner();//cout<<sign++<<"==syn=="<<syn<<endlschain=statementString();if(syn==6) { //endscanner();//cout<<sign++<<"==syn=="<<syn<<endl;if((syn==0)&&(kk==0)) {cout<<"success !"<<endl;}/*else { //一定会有#标志,否则输入不会结束cout<<"没有结束标志 !"<<endl;kk=1;}*/}else {if(kk==0)cout<<"error:没有end !"<<endl;kk=1;exit(0);}}else {cout<<"error:没有begin !"<<endl;kk=1;exit(0);}//  return (schain);
}int main()
{p=0;kk=0;q=0;printf("please input string:\n");do{ch=cin.get();program[p++]=ch;}while(ch!='#');p=0;scanner();//cout<<sign++<<"==syn=="<<syn<<endl;irparser();printf("result\tval1\top\tval2\n");for(int i=0; i<q; i++) { //输出三地址代码cout<<quad[i].result1<<"\t"<<quad[i].ag11<<"\t"<<quad[i].op1<<"\t"<<quad[i].ag21<<endl;}return 0;
}

词法、语法、语义分析实验相关推荐

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

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

  2. 编译原理 第一章(源程序、目标程序、解释器、编译器、词法语法语义分析)

    第一章 (一)什么是编译程序 1.编译程序 将用高级语言书写的程序翻译成等价的低级语言程序(汇编.机器语言),这种翻译程序称为编译程序. 2.源程序 编译程序的输入对象为源程序 3.目标程序 编译程序 ...

  3. 编译实验(二)语法/语义分析

    源代码下载链接:http://download.csdn.net/download/supersmart_dong/10224159 通过词法分析,我们成功得到了一个完整的token 文件以及符号表, ...

  4. 八、CPython语法改动实验:增加“非”与“前缀自增”

    -- by liou, 未经许可禁止转载 本文是"CPython Compiler Analyse"系列博客的第八章实验部分.该系列文章主要针对CPython3.8的编译器部分进行 ...

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

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

  6. 构造可配置词法语法分析器生成器(上)

    本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo 前言 源程序在被编译为目标程序需要经过如下6个过程:词法分析,语法分析,语义分析,中间代码生成,代码优 ...

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

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

  8. 基于flex/bison工具生成sysY2022文法的词法/语法分析器

    基于flex/bison工具生成sysY2022文法的词法/语法分析器 本文内容学习借鉴了往届参赛的优秀校友学长学姐的开源作品代码,仅用于学习目的,现分享给大家,如有侵权请联系我删除.我使用的开发环境 ...

  9. pg/og内核原理-词法语法解析(更新中)

    目录 概念与含义 流程概览 词法语法代码 parsenode.h kwlist.h scan.l gram.y bison的使用 查看状态机 解决规约冲突 plpgsql的词法与语法 概念与含义 一条 ...

  10. 词法语法语义_阅读法语的开源

    词法语法语义 说英语的人有很多很棒的开源资源,很容易忘记,并不是每个人都可以用英语进行交流. 因此,我一直在寻找西班牙语和法语的出色开源资源,以便在需要时可以推荐它们. 我最近看过的一个是LinuxF ...

最新文章

  1. kivy python 读取oracle数据库_Kivy和Python线程-如何在它们之间获取数据
  2. 区块链将重新定义世界
  3. 径向基神经网络(实例故障分类)
  4. ThreadLocal可以解决并发问题吗
  5. 双刃剑与灰色地带:“泄露数据收藏家”的素描
  6. MTK-TP(电阻屏校准程序ts_lib移植)
  7. codeforces 1060 A
  8. CodeForces 1514A Perfectly Imperfect Array
  9. hdu 1317——XYZZY
  10. ncf 推荐系统_浅析神经协同过滤NCF在推荐系统的应用
  11. 和菜鸟一起学android4.0.3源码之lcd屏幕背光调节
  12. VLFeat在matlab和vs中安装
  13. 【毕设教学】单片机控制步进电机
  14. 介绍几款WAP网页制作工具
  15. excel转txt后导入mysql 20211207
  16. 唯众高职人工智能技术应用专业解决方案
  17. winhex使用简介
  18. 斗地主牌型判断实现(二)
  19. 我看韩寒-话题2010读后
  20. 无限循环滚动代码阿里巴巴国际站店铺装修代码底图滚动黑色半透明显示效果自定义内容装修代码全屏显示

热门文章

  1. win10安装破解软件提示病毒并且删除安装软件,暂时关闭安全检查
  2. 4年市值蒸发99%,陈欧烧光300亿带领聚美走向了衰落
  3. U3D 设置帧率与垂直同步
  4. exit函数和析构函数的关系
  5. 2010年度总结3:GIS导航软件项目
  6. matlab合并有序数组,《数组合并》JS合并两个数组的3种方法详解
  7. 如何用小米手机查看当前移动信号的强弱
  8. 为svn服务增加自助修改密码功能
  9. load()是python文件操作的函数_Python 文件读写
  10. 《MATLAB神经网络超级学习手册》——第2章 MATLAB基础 2.1 基本概念