91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

此程序使用算符優先法的語義分析方法實現了將賦值語句翻譯為四元式的功能。這種僅將{=,+,-,*,/}當做運算符,而將括號當做深度的變種算符優先法,很好控制,很容易就能翻譯賦值語句。 該程序是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


評論

共有 條評論