资源简介

此程序使用算符优先法的语义分析方法实现了将赋值语句翻译为四元式的功能。这种仅将{=,+,-,*,/}当做运算符,而将括号当做深度的变种算符优先法,很好控制,很容易就能翻译赋值语句。该程序是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

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4730  2010-06-02 09:16  evaluation_translate.c

     文件         27  2010-06-02 08:55  input.txt

----------- ---------  ---------- -----  ----

                 4757                    2


评论

共有 条评论