当前位置:文档之家› 编译原理 C++编译器课程设计报告

编译原理 C++编译器课程设计报告

编译器的设计与分析学号: 1233050143 姓名:李博专业:计算机科学与技术 __ 课程:编译原理指导教师:闫红实验目的本实验设计的小型编译程序涉及到编译前端的三个阶段:词法分析、语法分析和语义分析生成中间代码((四元式),编译程序的重点放在中间代码生成阶段。

编译程序的输出结果包括词法分析后的二元式序列、变量名表;语法分析后的状态栈分析过程显示;语义分析生成中间代码后的四元式程序。

整个程序分为三个部分:(1)词法分析部分(2)语法分析、语义分析及四元式生成部分(3)输出显示部分实验要求:本程序仅考虑由下面产生式所定义的程序语句:S →if B then S else S | while B do S | begin L end | AL →S;L | SA →i:= EB →B∧B|B∨B|~B|(B)|I rop i|i其中,各个非终结符的含义是:S---语句L—语句串A—赋值句B---布尔表达式E---算术表达式各个终结符的含义:i---整型变量或常数,布尔变量或常数;rop---为六种关系运算符的代表;;---起语句分隔作用;:=---赋值符号~--逻辑非运算符;∧----逻辑与运算符;∨---逻辑或运算符;规定程序是由一条语句或由begin和end嵌套起来的复合语句组成的,并且规定的语句末加上#@表示程序结束。

下面是符合规定的程序示例:beginA:=A+B*C;C:=A+2;while A<C dowhile A>B doif M=N THEN C:=Delse while A<=D doA:=Dend#@实验内容:第一部分:词法分析一.词法分析的功能:输入:所给文法的源程序字符串输出:1.二元组(单词种别,单词符号的属性值)构成的序列2.关键字: { (相当于Pascal语言中的begin) , if ,else , while , }(相当于Pascal语言中的end ) 所有的关键字都是小写字母.3.运算符: + , - , * , / , = , < , <= , == , > , >= ,<> , && ,|| , !4.界符: 逗号,分号,左圆括号, 右圆括号, #5.常数: 在这里只涉及到int型常量6.其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter|digit)*NUM = digit digit *7.空格由空白,制表符和换行符组成,空格一般用来分隔ID,NUM,运算符,界符和关键字,词法分析阶段通常会被过滤掉。

二.词法分析程序设计3.自动机转换图三.程序实现数据结构:struct nTab{int tc;int fc;}nTab2[200];int Label = 0;struct rWords {char sp[10];int sy;};struct rWords ResWords[10] = {{"if",Sy_if},{"do",Sy_do},{"else",Sy_else},{"while",Sy_while},{"then",Sy_then},{"begin",Sy_begin},{"end",Sy_end},{"and",op_and},{"or",op_or},{"not",op_not}};struct aa{int sy1;int pos;}buf[1000],n,n1,E,sstack[100],ibuf[100],stack[1000]; void ReadLine( ){char ch1;Pline = Line;ch1 = cfile.get();while( ch1 != '\n'){*Pline = ch1;Pline ++;ch1 = cfile.get();}*Pline = '\0';Pline = Line;}void Readch( ){if (ch == '\0'){ReadLine( );Lnum ++;}ch = *Pline;Pline ++;}void Scan ( ){while (ch != '@'){switch(ch){case ' ':break;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':Identifer( );break;case '0':case '1':case '2':case '3':case '4':case '5':case '6':case '7':case '8':case '9':Number(); break;case '<':Readch( );if (ch =='=')buf[Count].pos = 0;else{if (ch == '>')buf[Count].pos = 4;else{buf[Count].pos = 1;Pline --;}}buf[Count].sy1 = rop;Count ++;break;case '>':Readch( );if (ch =='=')buf[Count].pos = 2;else{buf[Count].pos = 3;Pline --;}buf[Count].sy1 = rop;Count ++;break;case'(':buf[Count].sy1 = lParent;Count ++;break;case')':buf[Count].sy1 = rParent;Count ++;break;case'#':buf[Count].sy1 = JingHao;Count ++;break;case'+':buf[Count].sy1 = Plus;Count ++;break;case'*':buf[Count].sy1 = Times;Count ++;break;case':':Readch();if (ch =='=')buf[Count].sy1 = Becomes;Count ++;break;case'=':buf[Count].sy1 = rop;buf[Count].pos = 5;Count ++;break;case';':buf[Count].sy1 = Semicolon;Count ++;break;}Readch( );}buf[Count].sy1 = -1;}nt Find(char spe1[] ){int ss1 = 0;int ii = 0;while (ss1 == 0 && ii < nLength){if (!strcmp(spe1,nTab1[ii])) ss1 = 1;ii ++;}if (ss1 == 1)return ii - 1;elsereturn -1;}void Identifer( ){int i = 0,j,k = 0;int ss = 0;do{Spelling[k] = ch;k++;Readch( );} while((ch >= 'a' && ch <= 'z') || (ch >='0' && ch <= '9'));Pline --;Spelling [k] = '\0';while (ss == 0 && i < 10){if (!strcmp(Spelling,ResWords[i].sp)) ss = 1;i ++;}if (ss == 1)buf[Count].sy1 = ResWords[i - 1].sy;else{buf[Count].sy1 = ident;j = Find(Spelling);if (j == -1){buf[Count].pos = tt1;strcpy(nTab1[tt1],Spelling);tt1 ++;nLength ++;}elsebuf[Count].pos = j;}Count ++;for (k = 0; k < 10; k++)Spelling[k] =' ';}void Number( ){int iValue = 0;int digit;do{digit = ch -'0';iValue = iValue * 10 + digit;Readch( );} while (ch >= '0' && ch <= '9');buf[Count].sy1 = intConst;buf[Count].pos = iValue;Count ++;Pline --;}四.心得体会此次实验让我了解了如何设计、编制并调试词法分析程序,并加深了我对词法分析器原理的理解;熟悉了直接构造词法分析器的方法和相关原理,并学会使用c++语言直接编写词法分析器;同时更熟练的掌握用c++语言编写程序,实现一定的实际功能。

相关主题