资源简介
此程序使用算符优先法的语义分析方法实现了将赋值语句翻译为四元式的功能。这种仅将{=,+,-,*,/}当做运算符,而将括号当做深度的变种算符优先法,很好控制,很容易就能翻译赋值语句。该程序是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
相关资源
- 编译原理用C++消除左递归
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
- C语言简化编译器前端 编译原理 LR1
- C-Minus编译器 编译原理实验
- LL1文法
- 现代编译原理C语言描述-高清-完整目
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
评论
共有 条评论