1、编译原理实验报告实验三语法分析器1实验目的熟悉并掌握语法分析器的工作原理和一般设计方法。通过本实验,进一步提高实际问题分析与解决的能力,以及程序设计能力。2实验要求:(1) 简单语言的语法规则如下: S i := E ; S if C then S S while C do S C E E C E E C E 0 do if x2 = 7 then i= z;6实验总结通过这次实验,我对词法分析器有了进一步的了解,把理论知识应用于实验中。也让我重新熟悉了 C 和 C+语言的相关内容,加深了对 C、C+语言知识的深化和用途的理解。通过这次语义分析的实验, 我对高级语言的学习有了更深的认识 ,了解
2、得更透彻。我了解了高级语言转化为目标代码或汇编指令的过程,。对今后的学习将起很大的作用,对以后的编程有很大的帮助. 并且通过此次实验,我了解了 LR 语法分析的实质和过程。实验虽然只是完成了一个简单的程序,并且程序的主要框架课本上有给出,但在组织程序结构和深入了确上学到了很多,加深对编译原理的理解,掌握编译程序的实现方法和技术。巩固了前面所学的知识。7.程序源代码词法分析器#include “stdafx.h“#include “Word.h“/构造函数,对数据成员初始化,并将关键字以及运算符读入Word:Word()/打开关键字文件fstream keywordfile(“keyword.t
3、xt“);if(!keywordfile)couttempwordtempencodetempretempvalue;keywordlist.push_back(tempword);keywordencode.push_back(tempencode);keywordre.push_back(tempre);keywordcodevalue.push_back(tempvalue);/关闭关键字文件keywordfile.close();for(int i=0;itempwordtempencodetempretempvalue;signlist.push_back(tempword);sig
4、nencode.push_back(tempencode);signre.push_back(tempre);signcodevalue.push_back(tempvalue);/关闭符号文件signwordfile.close();for(int i=0;i=a )return true;else if(s=A)return true;elsereturn false;bool Word:digit() if(s=0)return true;return false;/按token数组中的字符串中的前五项(即判别其是否为保留字),若是保留字则返回它的编码int Word:reserve()
5、int leng;/记录token数组中单词的长度for(int i=0;itempre;chartostring.close();indentityre.push_back(tempre);tempword=“标识符“;tempencode=6;tempvalue=indentityre.size();indentitylist.push_back(tempword);indentityencode.push_back(tempencode);indentitycodevalue.push_back(tempvalue);fstream indentityfile(“indentitywor
6、d.txt“);if(!indentityfile) couttempconstre;chartoint.close();constlist.push_back(tempword);tempword=“常数“;tempencode=7;tempvalue=indentityre.size();constencode.push_back(tempencode);constre.push_back(tempconstre);constvalue.push_back(tempvalue);fstream constdigit(“constdigit.txt“);if(!constdigit)cout
7、s;while(s= )files;switch(s)case a;case b:case c:case d:case e:case f:case g:case h:case i:case j:case k:case l:case m:case n:case o:case p:case q:case r:case s:case t:case u:case v:case w:case x:case y:case z:while(letter()|digit()concatentation();/将当前读入的字符送入token数组files;/继续读字符,直到字符不为数字或字母为止/扫描指针回退一
8、个字符file.seekg(-1,ios:cur);code=reserve();if(!code) buildlist();elsecouts;/继续读字符,直到字符不为数字为止/扫描指针回退一个字符file.seekg(-1,ios:cur);buildlist();break;case +:concatentation();signinfor();break;case -:concatentation();signinfor();break;case *:concatentation();signinfor();break;case s;if(s!=)/扫描指针回退一个字符file.se
9、ekg(-1,ios:cur);signinfor();elseconcatentation();signinfor();break;case =:concatentation();files;if(s!=)/扫描指针回退一个字符file.seekg(-1,ios:cur);signinfor();elseconcatentation();signinfor();break;case ;:concatentation();signinfor();break;case #:cout#include#includetypedef structchar R;char r;int flag;array
10、;typedef struct char E;char e;charLode;typedef structcharLode *base;int top;charstack;char str8080,arr8080,brr8080;array F20;int m,kk,p,ppp,FF=1;char r10;int crr2020,FLAG=0;char ccrr1120,ccrr2201;void Initstack(charstack s.top=-1;void push(charstack s.bases.top.E=w.E;s.bases.top.e=w.e;void pop(chars
11、tack w.e=s.bases.top.e;s.top-;int IsEmpty(charstack s)if(s.top=-1)return 1;else return 0;int IsLetter(char ch)if(ch=Afor(i=0;i;stri3=#;stri4=str00;stri5=#;stri6=0;cout“;cout#include #include #include #include #define STACK_INIT_SIZE 50#define STACKINCREMENT 5#define ERROR 0#define OVERFLOW -2#define
12、 TRUE 1#define FALSE 0#define OK 1#define NULL 0void sub_E();void sub_F();void sub_T();void sub_G();void GEQ(char m);void PRINT();typedef struct Stackchar *base;char *top;int stacksize;Stack;int num=0;char QT104,T=A,c;struct Stack SEM;struct initStack(Stack s)s.base=(char *)malloc(STACK_INIT_SIZE*si
13、zeof(char);if(!s.base)exit(OVERFLOW);s.top=s.base;s.stacksize=STACK_INIT_SIZE;return OK;/初始化堆栈char pop(Stack if(s.top=s.base) printf(“栈中已无元素!“);exit(ERROR);e=*-s.top;return e;/出栈struct push(Stack if(!s.base)exit(OVERFLOW);s.top=s.base+s.stacksize;s.stacksize+=STACKINCREMENT;*s.top+=e;return OK;/入栈vo
14、id main()initStack(SEM);printf(“-表达式应由小写字母、运算符及小括号组成,并以“#“ 结束-n“);printf(“请输入表达式 :“);c=getchar();sub_E();if(c=#)PRINT();elseprintf(“无结束符或漏写运算符!“);exit(0);getchar();void sub_E()sub_T();R1: if(c=+)c=getchar();sub_T();GEQ(+);goto R1;else if(c=-)c=getchar();sub_T();GEQ(-);goto R1;else ;void sub_T()sub_G
15、();R4: if(c=*) c=getchar();sub_F();GEQ(*);goto R4;else if(c=/)c=getchar();sub_F();GEQ(/);goto R4;void sub_F()sub_G();R5: if(c=) c=getchar();sub_G();GEQ();goto R5;void sub_G()if(c=aelseprintf(“t%c“,QTi1);if(QTi2=A)printf(“t%c%d“,t,QTi2-A+1);elseprintf(“t%c“,QTi2);if(QTi3=A)printf(“t%c%d“,t,QTi3-A+1);elseprintf(“t%c“,QTi3);printf(“)n“);