logo资料库

编译原理实验报告.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
实验一:无符号数的词法分析程序
实验二:语法分析程序的设计
4)对所有没出现在规则右部的首部的终结符a,
专业班级 学 姓 号 2 名 指导教师
实验一:无符号数的词法分析程序 一、 实验目的和要求 (一)目的 1. 培养学生初步掌握编译原理实验的技能 2. 验证所学理论、巩固所学知识并加深理解 3. 对学生进行实验研究的基本训练 (二)要求 从键盘上输入一串字符(包括字母、数字等),编写程序识别出其中的无符号数。 二、 实验内容和原理 掌握词法分析的基本思想,并用高级语言编写无符号数(包括整数和实数)的词法分析 程序。 无符号数文法规则定义如下: <无符号数>→<无符号实数> | <无符号整数> <无符号实数>→<无符号整数> . <数字串>[<比例因子>]<无符号整数>E<比例因子> <比例因子>→<有符号整数> <有符号整数>→[+ | -]<无符号整数> <无符号整数>→<数字串> <数字串>→<数字>{<数字>} <数字>→0 1 2 3 …… 9 读无符号数的程序流程图见下图
三、 主要仪器设备 C++编程环境、DevC++软件 四、 操作方法与实验步骤 //使用标准命名空间 //定义可输入的字符个数 //无符号数 编辑代码如下: #include using namespace std; #define M 101 #define UNSIGNEDNUMBER 1 #define PLUS 2 #define SUBTRACT 3 #define MULTIPLY 4 #define DIVIDE 5 #define LEFTBRACKET 6 #define RIGHTBRACKET 7 #define INEFFICACIOUSLABEL 8 char pause; class AccidenceAnalysis { //加号 //除号 //减号 //乘号 //左括号 //右括号 //定义 词法分析 类 private: char testStr[M],*p; //私有数据 public: //构造函数 AccidenceAnalysis(); //析构函数 ~AccidenceAnalysis(); //输入函数 void InputStr(); void Output(int a,char *p1,char *p2); int IsAcceptantCharacter(char *p); int IsOperator(char *p); int IsUnsignedNum(char *p); void AbnormityExamine(char a[]); void IdentifyOperator(char *p); void AssortIdentify(); void static Scroll(); void static Instruction(); //指导说明函数 void static StartAccidenceAnalysis(); //输出条形 void static StartSystem(); 组首元素 } AccidenceAnalysis::~AccidenceAnalysis() { } void AccidenceAnalysis::InputStr() { system("cls"); Scroll(); cout<<"\t 输入待分析单词["<
Str[i]=*ptr2;i++; Str[i]=']';i++; ptr2++; label=1; continue; Str[i]=*ptr2;i++; *ptr1=*ptr2; ptr1++; ptr2++; } else { } } Str[i]='\0'; while(ptr1<=ptr2) { *ptr1='\0'; ptr1++; } if(label==1) { char ch; cout<>ch; getchar(); cout<<"\a"; if(ch=='Y'||ch=='y') { system("cls"); cout<<"\t\a 警告!您所输入的字符序列 已经包含非字符集字符,如果继续识别," <<"\n\n\t 系统会跳过这些字符,而 识 别 结 果 很 有 可 能 不 符 合 您 的 初 始 构 思."<>a; getchar(); cout<<"\a"; switch(a) { case 1: system("cls"); break; case 2: InputStr(); break; case 3: system("cls"); StartSystem(); case 4: cout<<"\t 谢谢使用!"; exit(1); cout<<"\n\t 您输入的序列,非字符 default: 集字符已被[]标记:"<
p1++; } cout<
p++; { Output(UNSIGNEDNUMBER,p1,--p); p++; continue; } else if(*p=='+'||*p=='-') { p++; if(IsUnsignedNum(p)) { while(IsUnsignedNum(p)) p++; (UNSIGNEDNUMBER,p1,--p); Output p++; continue; } else { Output(INEFFICACIOUSLABEL,p1,--p); p++; continue; } } else { Output(INEFFICACIOUSLABEL,p1,--p) ; p++; continue; } } else if(*p=='.') { p++; while(IsUnsignedNum(p)) p++; if(*p=='\0') { p++; if(IsUnsignedNum(p)) { while(IsUnsignedNum(p)) p++; Output(UNSIGNEDNUMBER,p1,--p); p++; continue; } else if(*p=='+'||*p=='-') { p++; if(IsUnsignedNum(p)) { while(IsUnsignedNum(p)) p++; Output (UNSIGNEDNUMBER,p1,--p); p++; continue; } else { Output(INEFFICACIOUSLABEL,p1,--p); p++; continue; } } else { Output(INEFFICACIOUSLABEL,p1,--p) ; p++; continue; } } else { Output(UNSIGNEDNUMBER,p1,--p); Output(UNSIGNEDNUMBER,p1,--p); p++; continue; } else if(*p=='E') p++; continue; } }
else { Output(UNSIGNEDNUMBER,p1,--p); { Output(INEFFICACIOUSLABEL,p1,--p) p++; continue; } } if(*p=='.') { p++; if(IsUnsignedNum(p)) { p++; while(IsUnsignedNum(p)) p++; if(*p=='\0') { Output(UNSIGNEDNUMBER,p1,--p); p++; continue; } else if(*p=='E') { p++; if(IsUnsignedNum(p)) { p++; continue; } } else { Output(INEFFICACIOUSLABEL,p1,--p) p++; continue; } } else{ Output(UNSIGNEDNUMBER,p1,--p); p++; continue; } } else { Output(INEFFICACIOUSLABEL,p1,--p) ; ; ; while(IsUnsignedNum(p)) p++; Output(UNSIGNEDNUMBER,p1,--p); } } p++; continue; p++; continue; } else if(*p=='+'||*p=='-') { p++; if(IsUnsignedNum(p)) { while(IsUnsignedNum(p)) p++; Output (UNSIGNEDNUMBER,p1,--p); p++; continue; } else } else if(*p=='E') {Output(INEFFICACIOUSLABEL,p,p); p++; continue; } } cout<
AccidenceAnalysis::StartAccidenceAnalysis() 的规则及系统处理机制:"<>a; getchar(); cout<<"\a"; switch(a) { case 1: system("cls"); cout<<"\t 您所输入的字符应在此 词法分析器可识别的字符集以内:"<
分享到:
收藏