资源简介
此程序使用算符优先法的语义分析方法实现了将赋值语句翻译为四元式的功能。这种仅将{=,+,-,*,/}当做运算符,而将括号当做深度的变种算符优先法,很好控制,很容易就能翻译赋值语句。
该程序是linux平台下的,若在Windows下只需将头文件unistd.h 改为io.h

代码片段和文件信息
#include
#include
#include
struct calculate{
char cal; /*用来存储运算符*/
int priority; /*用来标记运算符的优先级*/
}cal_buf[256];
char var_buf[256][16]; /*用来存储用到的变量*/
int depth=0cal_counter=0var_counter=0;
void word_get();
void var_save(char *buffer);
void translate();
void print(int flg);
void del(int flg);
int main(){
FILE *fd;
fd=fopen(“input.txt““r“); /*打开input.txt文件做读操作*/
close(0); /*关闭标准输入*/
dup2(fileno(fd)0); /*标准输入重定向到fd*/
memset(cal_buf0x00sizeof(cal_buf));/*刷新缓冲区*/
memset(var_buf0x00sizeof(var_buf));
word_get(); /*获取单词*/
translate(); /*翻译为四元式*/
return 0;
}
/***************************************************
*获取单词并将其分开存储
*如a=b+((c+d)*e) 存储的则是:
*(1)运算符:{=++*}其中每个运算符有其特定的优先级,
* 相同的运算符优先级也可能不同
*(2)变量:{abcde}
**************************************************/
void word_get(){
int calflg=0;
char cbuffer[16];
memset(buffer0x00sizeof(buffer));
while((c=getchar())!=EOF){
if(c==9 || c==10 || c==‘ ‘)continue;/*忽略TAB,换行,空格*/
/****************************************************
*存储每一个运算符(‘+‘‘-‘‘*‘‘/‘),并为它计算优先级
*优先级=2*深度+运算符本身的优先级
*其中深度为括号的层数,‘(‘则深度加1,‘)‘则深度减1
*一个深度相当于两个优先级
*‘+‘‘-‘的优先级为1,‘*‘‘/‘的优先级为2
*‘=‘优先级为0
****************************************************/
switch(c){
case ‘+‘:
case ‘-‘:{
cal_buf[cal_counter].cal=c;
cal_buf[cal_counter].priority=2*depth+1;/*优先级=2*深度+运算符本身的优先级*/
cal_counter++; /*运算符计数器加1*/
calflg=1; /*设置运算符标志*/
var_save(buffer); /*保存赋值语句中所出现的变量*/
var_counter++; /*变量计数器加1*/
memset(buffer0x00sizeof(buffer));
break;
}
case ‘*‘:
case ‘/‘:{
cal_buf[cal_counter].cal=c;
cal_buf[cal_counter].priority=2*depth+2;
cal_counter++;
calflg=1;
var_save(buffer);
var_counter++;
memset(buffer0x00sizeof(buffer));
break;
}
case ‘=‘:{
cal_buf[cal_counter].cal=c;
cal_buf[cal_counter].priority=0;
cal_counter++;
calflg=1;
var_save(buffer);
var_counter++;
memset(buffer0x00sizeof(buffer));
break;
}
case ‘(‘:{
depth++; /*深度加1*/
calflg=1;
var_save(buffer);
var_counter++;
memset(buffer0x00sizeof(buffer));
break;
}
case ‘)‘:{
depth--; /*深度减1*/
calflg=1;
var_save(buffer);
var_counter++;
memset(buffer0x00sizeof(buffer));
break;
}
}
if(calflg==1){
calflg=0; /*重置运算符标志*/
continue;
}
if(c==‘;‘){
var_save(buffer);
var_counter++;
break;
}
else
buffer[strlen(buffer)]=c;
}
}
/*保存赋值语句中所出现的变量*/
void var_save(char *buffer){
if(buffer[0]==0x00){
var_counter--;
return;
}
strcpy(var_buf[var_counter]buffer);
}
/*************************************
*赋值语句翻译
*每次找到优先级最高的那个运算符翻译
*************************************/
void translate(){
int i;
int flg;
int max_priority;
if(cal
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 27 2010-06-02 08:55 input.txt
文件 4730 2010-06-02 09:16 evaluation_translate.c
----------- --------- ---------- ----- ----
4757 2
- 上一篇:通信原理动画——全了
- 下一篇:国家统计局行政区划编码.zip
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
- 龙书《编译原理》(Compilers:Principle
评论
共有 条评论