其中动作符号的含义如下

@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”);

}

}

下面我们可以进行测试:如下我挑了几个典型的。大家可以看看。

计算机语言常用符号含义,符号的含义 - 解析编译原理相关推荐

  1. Vue2.0源码解析——编译原理

    Vue2.0源码解析--编译原理 前言:本篇文章主要对Vue2.0源码的编译原理进行一个粗浅的分析,其中涉及到正则.高阶函数等知识点,对js的考察是非常的深的,因此我们来好好啃一下这个编译原理的部分. ...

  2. 编译原理课程设计符号表部分

    <编译原理>课程设计实验报告 姓名:xx 班级:1617 学号:1617 分工部分:符号表 ##目录 文章目录 <编译原理>课程设计实验报告 主要内容 一.设计符号表 二.设计 ...

  3. 逆波兰式 java_Java 实现《编译原理》中间代码生成 -逆波兰式生成与计算 - 程序解析...

    Java 实现<编译原理>中间代码生成 -逆波兰式生成与计算 - 程序解析 编译原理学习笔记 (一)逆波兰式是什么? 逆波兰式(Reverse Polish notation,RPN,或逆 ...

  4. 转载收藏 常用数学符号的读法及其含义

    首先,说明本文的引用地址是:https://blog.csdn.net/xiaolang85/article/details/51344531 常用数学符号的读法及其含义   近来发现很多学生对一些数 ...

  5. 常用数学符号的读法及其含义

    常用数学符号的读法及其含义   近来发现很多学生对一些数学符号的读法及其含义不是很清楚.今天特把一些常用的列表如下.希望能够提供一些帮助! 大写  小写     英文注音     国际音标注音     ...

  6. 怎么把字母缩小当符号_电气设计图纸中AL、AW、HAL等各种符号分别代表什么含义?...

    学习电气就需要我们进行各种电气图纸的识别,有人说电气图纸很难识别,各种符号真的傻傻分不清,如果你连最基础的电气符号,都不能够识别清楚,又怎么能够期望自己可以看懂电气图呢?所以第一步要做的就是了解熟悉, ...

  7. 布尔代数(基本概念,运算规则,符号/数字代表的含义)

    布尔代数(基本概念,运算规则,符号/数字代表的含义) 基本概念: •集合B至少包含两个元素: •零(表示为0),以及单位(表示为1): •至少有三种操作: •互补,表示为' •总和,表示为+,例如x+ ...

  8. 常用的正则符号(python)

    常用的正则符号(python) 1. 原字符 指代直接存在于字符串内部的子串. s1 = '通过几天Python的学习,感觉Python很简单,非常容易上手!' re.findall('Python' ...

  9. 【常用】数学符号及读法大全

    数学符号及读法大全 常用数学输入符号: ≈ ≡ ≠ = ≤≥ < > ≮ ≯ ∷ ± + - × ÷ / ∫ ∮ ∝ ∞ ∧ ∨ ∑ [ ∏ π ] ∪ ∩ ∈ ∉ ∵ ∴  ⊥ | ∠  ...

最新文章

  1. LeetCode之Sort List
  2. java检测tcp存活_keep-alive 和 TCP存活检测
  3. mysql启动集群报连接本地失败_启动本地安装的pxc集群失败,前面的步骤都检查没错了...
  4. SP22343 NORMA2 - Norma(分治优化复杂度)
  5. 使用Maven安装本地jar
  6. python chromedriver_Linux下搭建Python3.7+Selenium+Chrome+Chromedriver
  7. Cesium Workshop
  8. 【Qt-Camera】大华相机显示线程
  9. HTML+CSS+JavaScript仿京东购物商城网站 web前端制作服装购物商城 html电商购物网站
  10. 做过启动盘的U盘怎么复原?三种方法教你
  11. 数学猜想验证步骤_猜想验证思想在数学教学中的应用
  12. 1v1微信聊天测试点
  13. [Pytorch系列-24]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 1
  14. 【LeetCode】马三来刷题之 Single Number
  15. 超好看的情侣纪念日记录单页HTML自适应源码
  16. 现代黄河三角洲的冲淤分区及地层特征(二)
  17. 公众号欢迎各位大佬投稿
  18. 堪比病毒营销的新思路:换个姿势玩抖音!
  19. 西行漫记(3):敏捷的奥秘
  20. 服装进销存软件哪个简单好用?

热门文章

  1. 皮一皮:现在知道公司老说信息完整的重要性...
  2. 每日一皮:这真的是亲妈吗...
  3. 【偶尔一道ctf】xctf adword mobile easy-apk
  4. 服务器响应丢包了怎么办,服务器丢包的原因有那些
  5. curl header 自定义参数接收不到_如何快速有效的通过curl命令来检测url告警机制?...
  6. 华理c语言设计网上作业,华东理工大学第一学年第二学期网上作业参考答案C语言设计1...
  7. SpringBoot使用security和jwt进行鉴权设计
  8. oracle全文索引的简单配置
  9. “nvinfer1::ILogger”: 不能实例化抽象类
  10. linux服务器远程桌面 数字键盘不能用