| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 816 人关注过本帖
标题:[求助]本人新手,急求求求C编译试验问题,各路大人请进.
取消只看楼主 加入收藏
qwea
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2005-7-12
收藏
 问题点数:0 回复次数:0 
[求助]本人新手,急求求求C编译试验问题,各路大人请进.

第一个: // 语法制导翻译器设计示范程序 // ----- 算数表达式四元式翻译(递归子程序法) // 要求:1. 读懂该程序,并上机调试成功; // 2. 运行该程序,输入源表达式(字母:表示变量,数字:表示常数。) // 3. 反复运行,考查输出的各种四元式的正确性。 // 4. 实验报告内容:表达式的属性翻译文法;递归子程序框图; // 运行结果的记录(输出的四元式不得少于10条!)

#include "stdafx.h" #include "string.h" #include "stdio.h"

char w; //当前单词(w) int j=1; //临时变量序号 struct TOKEN //单词的 TOKEN 结构 { char t; int i; } ; struct TOKEN word, sem[10]; //结构单词(word),语义栈(sem) int i_sem;

struct QT //四元式结构 { char w; struct TOKEN word1; struct TOKEN word2; struct TOKEN temp; } ;

char exp[50]; //原算术表达式区 int i=0; //原单词序号

struct QT qt[30]; //四元式区 int q=0; //四元式序号

int E(); int T(); int F();

void next(); //读下一个单词 void newt(); //申请一个临时变量函数 void quat(char); //生成四元式函数

int main() //主函数 { printf("please input your expression: "); scanf(" %s",exp); // 输入表达式 next(); // next(w) E(); if (w=='\0') { printf("\n"); for (i=0;i<q;i++) //输出四元式序列 { printf(" (%d) ",i+1); printf(" ( %c",qt[i].w); printf(" , %c.%d",qt[i].word1.t,qt[i].word1.i); printf(" , %c.%d",qt[i].word2.t,qt[i].word2.i); printf(" , %c.%d )\n",qt[i].temp.t,qt[i].temp.i); } } else printf("err"); printf("\nHello World!\n"); return 0; } int E() { char w1; //算符(+\-)暂存变量 T(); while ( w=='+' || w=='-') { w1=w; //暂存运算符(+|-) next(); //next(w) T(); quat(w1); } return 1; } int T() { char w2; //算符(*|/)暂存变量 F(); while ( w=='*' || w=='/') { w2=w; //暂存运算符(*|/) next(); //next(w) F(); quat(w2); } return 1; } int F() { if ( w=='(') { next(); //next(w) E(); if ( w!=')') { printf("err"); return 0; } } else if ((w>='a' && w<='z')||(w>='0' && w<='9')) { word.t=w; word.i=0 ; sem[++i_sem]=word; //push(SEM,w) } else { printf("err"); return 0; } next(); //next(w) return 1; }

void next() { w=exp[i]; i++; }

void newt() { word.t='t'; word.i=j++; }

void quat(char ww) { newt(); qt[q].w=ww; //QT[q]:=(ww,SEM[s-1],SEM[s],temp); qt[q].word1=sem[i_sem-1]; qt[q].word2=sem[i_sem]; qt[q].temp=word; i_sem--; //pop(SEM); i_sem--; //pop(SEM); sem[++i_sem]=word; //push(SEM,temp); q++; } 第二个: // 词法分析器设计示范程序 ------ 源程序 => TOKEN 序列

// 要求:1. 读懂并运行该程序( 输入文件 : in.txt ; 结果文件 : out.txt ) ; // 2. 用不同的输入文件内容反复运行,考查错误处理和结果文件中的TOKEN序列。 // 3. 把该程序拷贝一副本,在该副本上进行自主地修改和调试程序; // 4. 实验报告内容:(1) 画出作为分析器的自动机的状态图和变换表; // (2) 运行结果文件原样照抄(TOKEN序列和错误信息至少各一条!) // (3) 讨论对该程序运行、理解和修改调试情况。 // 注:输入文件的源程序中(变量:字母开头的字母/数字串; 常数:数字串--整数。)

#include "stdafx.h" #include "string.h" #include "math.h" // 关键字表;界符表;标识符表;常数表。 char KT[15][12]={"program","begin","end","var","while","do","repeat","until","for","to","if","then","else"}; char PT[16][12]={";", ":", "(", ")", ",",":=", "+", "-", "*", "/", ">", ">=", "=", "<", "<=","<>"}; char IT[50][12]; int CT[20]; int num_KT=13;int num_PT=16;int num_IT=0,num_CT=0; // 四个表中各元素个数的初值

struct aut { char ch; int st; }; //自动机压缩变换表结构

//自动机压缩变换表(l:字母,d:数字,p:界符,$:其他符): struct aut aut1[4]={{'l',2},{'d',3},{'p',4},{'$',10}}; struct aut aut2[4]={{'l',2},{'d',2},{'p',6},{'$',6}}; struct aut aut3[4]={{'l',7},{'d',3},{'p',7},{'$',7}}; struct aut aut4[4]={{'l',8},{'d',8},{'p',5},{'$',8}}; struct aut aut5[4]={{'l',9},{'d',9},{'p',9},{'$',9}}; struct aut *ptr; int num_aut=4;

struct token { char code; int value; }; //Token结构 struct token tok[100]; //Token数组 int i_token=0,num_token=0; //Token计数器和Token个数 char strword[15]; //当前单词 int i_str; //当前单词指针 int n,t,num; //数值,类型及转换后的常数值 char in_buffer[100]; //源程序缓冲区 int i; char ch,ch1; //源程序缓冲区指针;当前字符为ch,换码后为ch1 int s; //状态变量 int err=0, erp=0; //错误编码与错误位置号

char map(); void DFA(); void act(int s); int find(int s,char ch); int InsertConst(int num); int ReserveK(char *str); int ReserveP(char *str); int InsertID(char *str);

int main(int argc, char* argv[]) // 词法分析主程序 { FILE *fp; fp=fopen("in.txt","r"); // 打开输入文件 fgets(in_buffer,100,fp); // 把输入文件的内容读到缓冲区变量中 DFA(); // 调用单词处理器(有限自动机 DFA) { // 从此开始输出结果: FILE *fp1; fp1=fopen("out.txt","w"); rewind(fp1); fprintf(fp1,"\n * 源程序清单:\n"); fprintf(fp1," %s ",in_buffer); fprintf(fp1,"\n\n"); fprintf(fp1," * 关键字表:\n"); fprintf(fp1," "); for (i=0;i<15;i++) fprintf(fp1," %s",KT[i]); fprintf(fp1,"\n\n"); fprintf(fp1," * 界符表:\n"); for (i=0;i<15;i++) fprintf(fp1," %s",PT[i]); fprintf(fp1,"\n\n");

fprintf(fp1," * 标识符表:"); for (i=0;i<num_IT;i++) fprintf(fp1," %s ",IT[i]); fprintf(fp1,"\n\n"); fprintf(fp1," * 常数表:"); for (i=0;i<num_CT;i++) fprintf(fp1," %d ",CT[i]); fprintf(fp1,"\n\n"); fprintf(fp1," * Token序列:\n"); for (i=0;i<num_token;i++) { fprintf(fp1," (%c,%d)",tok[i].code,tok[i].value); if (i==8 || i==18) fprintf(fp1,"\n"); } fclose(fp1); fprintf(fp1,"\n\n"); fclose(fp); printf("\n\n * 源程序:%s\n\n ",in_buffer); printf("\n * 错误信息:"); if (err==1) printf("\n\n 非法界符!位置号为:%d\n",erp); else if (err==2) printf("\n\n 缺结束符(#)!位置号为:%d\n",erp); printf("\n\n 请修改输入文件 in.txt ! \n\n"); printf(" 输出结果在文件 out.txt 中! \n\n"); } return 0 ; }

void getch() // 读字符 { while (in_buffer[i]==' ') i++; // 滤空格 if (in_buffer[i]!='\0') ch=in_buffer[i++]; // 读取一个有效字符 else { err=2;erp=i-1;} }

void DFA() // 单词处理机(有限自动机) { while (s!=10) { s=1; // 自动机设置开始状态 while (1) { act(s); // 在状态 s 处,执行相应的操作 if ((s>=6 && s<=10)||(err!=0)) break; getch(); ch1=map(); // 读一个字符并换码 s=find(s,ch1); // 查自动机的变换表 } if (err!=0) break; else i--; // 回退一个符号 } }

void act(int s) // 自动机各状态节点处的动作函数 { int code; switch (s) { case 1:n=0;t=0;num=0;i_str=0; // 常数转换中各变量的初始化 strword[i_str]='\0'; // 其它变量初始化 break; case 2:strword[i_str++]=ch; // 将ch中的符号拼接到strword的尾部; break; case 3:n=10*n+ch-48; // 字符串常数转换为数值常数; break; case 4:strword[i_str++]=ch; // 将ch中的符号拼接到strword的尾部; break; case 5:strword[i_str++]=ch; // 将ch中的符号拼接到strword的尾部; break; case 6:strword[i_str]='\0'; code=ReserveK(strword); //查关键字表 if (code) { tok[i_token].code='k'; tok[i_token++].value=code; } //生成关键字Token else { tok[i_token].code='i'; tok[i_token++].value=InsertID(strword)+1; } //生成标识符Token num_token++; break; case 7:num=n; //常数值转换完成 tok[i_token].code='c'; tok[i_token++].value=InsertConst(num)+1; //生成常数Token num_token++; break; case 8:strword[i_str]='\0'; code=ReserveP(strword); //查界符表 if (code) { tok[i_token].code='p'; tok[i_token++].value=code; //生成单界符Token num_token++; } else { err=1; erp=i-2; } break; case 9:strword[i_str]='\0'; code=ReserveP(strword); //查界符表 if (code) { tok[i_token].code='p'; tok[i_token++].value=code; //生成双界符Token num_token++; } else {i--;strword[i_str-1]='\0';act(8);} //回退一个符号,处理单界符 break; case 10: if (ch!='#') if (in_buffer[i]!='\0') { err=1; erp=i;} else {err=2;erp=i-1;} break; } } char map() //字符换码 { if (ch>='a' && ch<='z') ch1='l' ; //字母 else if (ch>='0' && ch<='9') ch1='d'; //数字 else if (ch!='#') ch1='p'; //界符 else ch1='$'; //其他 return ch1; } int find(int s,char ch) //查自动机变换表函数 { int i; struct aut *p; if (s==1) p=aut1; else if (s==2) p=aut2; else if (s==3) p=aut3; else if (s==4) p=aut4; else if (s==5) p=aut5; for (i=0;i<num_aut;i++) if (((p+i)->ch)==ch1) { s=(p+i)->st; break; } return s; } int InsertConst(int num) //查填常数表函数 { int i; for (i=0;i<num_CT;i++) if (num==CT[i]) return i; CT[i]=num; num_CT++; return i; }

int ReserveK(char *str) //查关键字表函数 { int i; for (i=0;i<num_KT;i++) if (!strcmp(KT[i],str)) return (i+1); return 0; }

int ReserveP(char *str) //查界符表函数 { int i; for (i=0;i<num_PT;i++) if (!strcmp(PT[i],str)) return (i+1); return 0; }

int InsertID(char *str) //查填标识符表函数 { int i; for (i=0;i<num_IT;i++) if (!strcmp(IT[i],str)) return i; strcpy(IT[i],str); num_IT++; return i; } 希望各路大人在这两天给我答复,再次感谢.

搜索更多相关主题的帖子: 编译 大人 试验 变量 
2005-07-12 17:20
快速回复:[求助]本人新手,急求求求C编译试验问题,各路大人请进.
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.040930 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved