计算机语言常用符号含义,符号的含义 - 解析编译原理
其中动作符号的含义如下
@BRF↑label1 :输出 BRF label1,
@BR↑label2:输出 BR label2,
@SETlabel↓label1:设置标号label1
@SETlabel↓label2:设置标号label2
*/
int if_stat(){
int es=0,label1,label2; //if
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
if (strcmp(token,“(”)) return(es=5); //少左括号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
if (strcmp(token,“)”)) return(es=6); //少右括号
label1=labelp++;//用label1记住条件为假时要转向的标号
fprintf(fout,“ BRF LABEL%d/n”,label1);//输出假转移指令
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=statement();
if (es》0) return(es);
label2=labelp++;//用label2记住要转向的标号
fprintf(fout,“ BR LABEL%d/n”,label2);//输出无条件转移指令
fprintf(fout,“LABEL%d:/n”,label1);//设置label1记住的标号
if (strcmp(token,“else”)==0)//else部分处理
{
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=statement();
if (es》0) return(es);
}
fprintf(fout,“LABEL%d:/n”,label2);//设置label2记住的标号
return(es);
}
//《while_stat》::= while (《expr 》) 《 statement 》
//《while_stat》::=while @SET↑labellabel1(《expression》) @BRF↑label2
// 《statement 》@BR↑label1 @SETlabel↓label2
//动作解释如下:
//@SETlabel↑label1:设置标号label1
//@BRF↑label2 :输出 BRF label2,
//@BR↑label1:输出 BR label1,
//@SETlabel↓label2:设置标号label2
int while_stat()
{
int es=0,label1,label2;
label1=labelp++;
fprintf(fout,“LABEL%d:/n”,label1);//设置label1标号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
if (strcmp(token,“(”)) return(es=5); //少左括号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
if (strcmp(token,“)”)) return(es=6); //少右括号
label2=labelp++;
fprintf(fout,“ BRF LABEL%d/n”,label2);//输出假转移指令
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=statement();
if (es》0) return(es);
fprintf(fout,“ BR LABEL%d/n”,label1);//输出无条件转移指令
fprintf(fout,“LABEL%d:/n”,label2);//设置label2标号
return(es);
}
//《for_stat》::= for(《expr》,《expr》,《expr》)《statement》
/*
《for_stat》::=for (《expression》;
@SETlabel↓label1《 expression 》@BRF↑label2@BR↑label3;
@SETlabel↓label4 《 expression 》@BR↑label1)
@SETlabel↓label3 《语句 》@BR↑label4@SETlabel↓label2
动作解释:
1. @SETlabel↓label1:设置标号label1
2. @BRF↑label2 :输出 BRF label2,
3. @BR↑label3:输出 BR label3,
4. @SETlabel↓label4:设置标号label4
5. @BR↑label1:输出 BR label1,
6. @SETlabel↓label3:设置标号label3
7. @BR↑label4:输出 BR label4,
8. @SETlabel↓label2:设置标号label2
*/
int for_stat()
{
int es=0,label1,label2,label3,label4;
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
if (strcmp(token,“(”)) return(es=5); //少左括号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
if (strcmp(token,“;”)) return(es=4); //少分号
label1=labelp++;
fprintf(fout,“LABEL%d:/n”,label1);//设置label1标号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
label2=labelp++;
fprintf(fout,“ BRF LABEL%d/n”,label2);//输出假条件转移指令
label3=labelp++;
fprintf(fout,“ BR LABEL%d/n”,label3);//输出无条件转移指令
if (strcmp(token,“;”)) return(es=4); //少分号
label4=labelp++;
fprintf(fout,“LABEL%d:/n”,label4);//设置label4标号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
fprintf(fout,“ BR LABEL%d/n”,label1);//输出无条件转移指令
if (strcmp(token,“)”)) return(es=6); //少右括号
fprintf(fout,“LABEL%d:/n”,label3);//设置label3标号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=statement();
if (es》0) return(es);
fprintf(fout,“ BR LABEL%d/n”,label4);//输出无条件转移指令
fprintf(fout,“LABEL%d:/n”,label2);//设置label2标号
return(es);
}
//《write_stat》::=write 《expression》;
//《write_stat》::=write 《expression》@OUT;
//动作解释:
//@ OUT:输出 OUT
int write_stat()
{
int es=0;
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0)return(es);
if (strcmp(token,“;”)) return(es=4); //少分号
fprintf(fout,“ OUT/n”);//输出指令
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
}
//《read_stat》::=read ID;
//《read_stat》::=read ID↑n LOOK↓n↑d @IN@STI↓d;
//动作解释:
//@LOOK↓n↑d:查符号表n,给出变量地址d; 没有,变量没定义
//@IN:输出IN
//@STI↓d:输出指令代码STI d
int read_stat()
{
int es=0,address;
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
if (strcmp(token,“ID”)) return(es=3); //少标识符
es=lookup(token1,&address);
if (es》0) return(es);
fprintf(fout,“ IN /n”);//输入指令
fprintf(fout,“ STI %d/n”,address);//指令
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
if (strcmp(token,“;”)) return(es=4); //少分号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
}
//《compound_stat》::={《statement_list》}
int compound_stat(){ //复合语句函数
int es=0;
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=statement_list();
return(es);
}
//《expression_stat》::=《expression》;|;
int expression_stat()
{
int es=0;
if (strcmp(token,“;”)==0)
{
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
}
es=expression();
if (es》0) return(es);
if (strcmp(token,“;”)==0)
{
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
} else
{
es=4;
return(es);//少分号
}
}
//《expression》::=ID↑n@LOOK↓n↑d@ASSIGN=《bool_expr》@STO↓d |《bool_expr》
int expression()
{
int es=0,fileadd;
char token2[20],token3[40];
if (strcmp(token,“ID”)==0)
{
fileadd=ftell(fp); //@ASSIGN记住当前文件位置
fscanf(fp,“%s %s/n”, &token2,&token3);
printf(“%s %s/n”,token2,token3);
if (strcmp(token2,“=”)==0) //‘=’
{
int address;
es=lookup(token1,&address);
if (es》0) return(es);
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=bool_expr();
if (es》0) return(es);
fprintf(fout,“ STO %d/n”,address);
} else
{
fseek(fp,fileadd,0); //若非‘=’则文件指针回到‘=’前的标识符
printf(“%s %s/n”,token,token1);
es=bool_expr();
if (es》0) return(es);
}
} else es=bool_expr();
return(es);
}
//《bool_expr》::=《additive_expr》
// |《 additive_expr 》(》|《|》=|《=|==|!=)《 additive_expr 》
/*
《bool_expr》::=《additive_expr》
|《 additive_expr 》》《additive_expr》@GT
|《 additive_expr 》《《additive_expr》@LES
|《 additive_expr 》》=《additive_expr 》@GE
|《 additive_expr 》《=《 additive_expr 》@LE
|《 additive_expr 》==《 additive_expr 》@EQ
|《 additive_expr 》!=《 additive_expr 》@NOTEQ
*/
int bool_expr()
{
int es=0;
es=additive_expr();
if(es》0) return(es);
if ( strcmp(token,“》”)==0 || strcmp(token,“》=”)==0
||strcmp(token,“《”)==0 || strcmp(token,“《=”)==0
||strcmp(token,“==”)==0|| strcmp(token,“!=”)==0)
{
char token2[20];
strcpy(token2,token);//保存运算符
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=additive_expr();
if(es》0) return(es);
if ( strcmp(token2,“》”)==0 ) fprintf(fout,“ GT/n”);
if ( strcmp(token2,“》=”)==0 ) fprintf(fout,“ GE/n”);
if ( strcmp(token2,“《”)==0 ) fprintf(fout,“ LES/n”);
if ( strcmp(token2,“《=”)==0 ) fprintf(fout,“ LE/n”);
if ( strcmp(token2,“==”)==0 ) fprintf(fout,“ EQ/n”);
if ( strcmp(token2,“!=”)==0 ) fprintf(fout,“ NOTEQ/n”);
}
return(es);
}
//《additive_expr》::=《term》{(+|-)《 term 》}
//《 additive_expr》::=《term》{(+《 term 》@ADD |-《项》@SUB)}
int additive_expr()
{
int es=0;
es=term();
if(es》0) return(es);
while (strcmp(token,“+”)==0 || strcmp(token,“-”)==0)
{
char token2[20];
strcpy(token2,token);
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=term();
if(es》0) return(es);
if ( strcmp(token2,“+”)==0 ) fprintf(fout,“ ADD/n”);
if ( strcmp(token2,“-”)==0 ) fprintf(fout,“ SUB/n”);
}
return(es);
}
//《 term 》::=《factor》{(*| /)《 factor 》}
//《 term 》::=《factor》{(*《 factor 》@MULT | /《 factor 》@DIV)}
int term()
{
int es=0;
es=factor();
if(es》0) return(es);
while (strcmp(token,“*”)==0 || strcmp(token,“/”)==0)
{
char token2[20];
strcpy(token2,token);
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=factor();
if(es》0) return(es);
if ( strcmp(token2,“*”)==0 ) fprintf(fout,“ MULT/n”);
if ( strcmp(token2,“/”)==0 ) fprintf(fout,“ DIV/n”);
}
return(es);
}
//《 factor 》::=(《additive_expr》)| ID|NUM
//《 factor 》::=(《 expression 》)| ID↑n@LOOK↓n↑d@LOAD↓d |NUM↑i@LOADI↓i
int factor()
{
int es=0;
if (strcmp(token,“(”)==0)
{
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
es=expression();
if (es》0) return(es);
if (strcmp(token,“)”)) return(es=6); //少右括号
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
} else
{
if (strcmp(token,“ID”)==0)
{
int address;
es=lookup(token1,&address);//查符号表,获取变量地址
if (es》0) return(es);//变量没声明
fprintf(fout,“ LOAD %d/n”,address);
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
}
if (strcmp(token,“NUM”)==0)
{
fprintf(fout,“ LOADI %s/n”,token1);
fscanf(fp,“%s %s/n”,&token,&token1);
printf(“%s %s/n”,token,token1);
return(es);
}else
{
es=7;//缺少操作数
return(es);
}
}
return(es);
}
//主程序
void main(){
int es=0;
es=TESTscan();//调词法分析
if (es》0) printf(“词法分析有错,编译停止!”);
else printf(“词法分析成功!/n”);
if (es==0)
{
es=TESTparse(); //调语法、语义分析并生成代码
if (es==0) printf(“语法、语义分析并生成代码成功!/n”);
else printf(“语法、语义分析并生成代码错误!/n”);
}
}
下面我们可以进行测试:如下我挑了几个典型的。大家可以看看。
计算机语言常用符号含义,符号的含义 - 解析编译原理相关推荐
- Vue2.0源码解析——编译原理
Vue2.0源码解析--编译原理 前言:本篇文章主要对Vue2.0源码的编译原理进行一个粗浅的分析,其中涉及到正则.高阶函数等知识点,对js的考察是非常的深的,因此我们来好好啃一下这个编译原理的部分. ...
- 编译原理课程设计符号表部分
<编译原理>课程设计实验报告 姓名:xx 班级:1617 学号:1617 分工部分:符号表 ##目录 文章目录 <编译原理>课程设计实验报告 主要内容 一.设计符号表 二.设计 ...
- 逆波兰式 java_Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析...
Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...
- 转载收藏 常用数学符号的读法及其含义
首先,说明本文的引用地址是:https://blog.csdn.net/xiaolang85/article/details/51344531 常用数学符号的读法及其含义 近来发现很多学生对一些数 ...
- 常用数学符号的读法及其含义
常用数学符号的读法及其含义 近来发现很多学生对一些数学符号的读法及其含义不是很清楚.今天特把一些常用的列表如下.希望能够提供一些帮助! 大写 小写 英文注音 国际音标注音 ...
- 怎么把字母缩小当符号_电气设计图纸中AL、AW、HAL等各种符号分别代表什么含义?...
学习电气就需要我们进行各种电气图纸的识别,有人说电气图纸很难识别,各种符号真的傻傻分不清,如果你连最基础的电气符号,都不能够识别清楚,又怎么能够期望自己可以看懂电气图呢?所以第一步要做的就是了解熟悉, ...
- 布尔代数(基本概念,运算规则,符号/数字代表的含义)
布尔代数(基本概念,运算规则,符号/数字代表的含义) 基本概念: •集合B至少包含两个元素: •零(表示为0),以及单位(表示为1): •至少有三种操作: •互补,表示为' •总和,表示为+,例如x+ ...
- 常用的正则符号(python)
常用的正则符号(python) 1. 原字符 指代直接存在于字符串内部的子串. s1 = '通过几天Python的学习,感觉Python很简单,非常容易上手!' re.findall('Python' ...
- 【常用】数学符号及读法大全
数学符号及读法大全 常用数学输入符号: ≈ ≡ ≠ = ≤≥ < > ≮ ≯ ∷ ± + - × ÷ / ∫ ∮ ∝ ∞ ∧ ∨ ∑ [ ∏ π ] ∪ ∩ ∈ ∉ ∵ ∴ ⊥ | ∠ ...
最新文章
- LeetCode之Sort List
- java检测tcp存活_keep-alive 和 TCP存活检测
- mysql启动集群报连接本地失败_启动本地安装的pxc集群失败,前面的步骤都检查没错了...
- SP22343 NORMA2 - Norma(分治优化复杂度)
- 使用Maven安装本地jar
- python chromedriver_Linux下搭建Python3.7+Selenium+Chrome+Chromedriver
- Cesium Workshop
- 【Qt-Camera】大华相机显示线程
- HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
- 做过启动盘的U盘怎么复原?三种方法教你
- 数学猜想验证步骤_猜想验证思想在数学教学中的应用
- 1v1微信聊天测试点
- [Pytorch系列-24]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 1
- 【LeetCode】马三来刷题之 Single Number
- 超好看的情侣纪念日记录单页HTML自适应源码
- 现代黄河三角洲的冲淤分区及地层特征(二)
- 公众号欢迎各位大佬投稿
- 堪比病毒营销的新思路:换个姿势玩抖音!
- 西行漫记(3):敏捷的奥秘
- 服装进销存软件哪个简单好用?
热门文章
- 皮一皮:现在知道公司老说信息完整的重要性...
- 每日一皮:这真的是亲妈吗...
- 【偶尔一道ctf】xctf adword mobile easy-apk
- 服务器响应丢包了怎么办,服务器丢包的原因有那些
- curl header 自定义参数接收不到_如何快速有效的通过curl命令来检测url告警机制?...
- 华理c语言设计网上作业,华东理工大学第一学年第二学期网上作业参考答案C语言设计1...
- SpringBoot使用security和jwt进行鉴权设计
- oracle全文索引的简单配置
- “nvinfer1::ILogger”: 不能实例化抽象类
- linux服务器远程桌面 数字键盘不能用