《编译原理》课程设计说明第1次_编译原理课程设计
《编译原理》课程设计说明第1次由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“编译原理课程设计”。
《编译原理》课程设计
《编译原理》课程设计
1.要求
完成一个简化C语言——TINY C语言的编译程序,最终能为用TINY C语言编写的源程序(后缀为.tny,已给sample.tny,用一般的文本编辑程序即可打开)生成目标代码,并在给定的虚拟机TM上运行得到运行结果。
TINY C语言中允许出现的字词: 整数、标识符;
算术运算符/关系运算符/赋值运算符/界符:+、-、*、/、=、
表达式:简单整型算术表达式、关系表达式 语句:
条件语句(IF THEN ELSE END) 循环语句(REPEAT UNTIL) 赋值语句(:=) 读写语句(READ WRITE) { }中可以有注释,但不能嵌套
2.步骤
1)、词法分析
2)、语法分析
3)、语义分析
4)、生成目标代码
3.源码构成 MAIN.C 主程序
GLOBALS.H 全局类型及变量(如Token类属及语法树结点的组成) UTIL.H、UTIL.C 各步骤的实用函数。如输出Token,生成语法树结点等 SCAN.C、SCAN.H 词法分析程序及其头文件 PARSE.C、PARSE.H 语法分析程序及其头文件 ANALYZE.C、ANALYZE.H 语义检查程序及其头文件 SYMTAB.C、SYMTAB.H 符号表生成程序及其头文件
CGEN.H、CGEN.C、CODE.C、CODE.H 目标代码生成程序及其头文件
《编译原理》课程设计
TM 编译sample.tny源程序后得到目标代码,在该虚拟机上运行得到结果
步骤1——词法分析
要求:填写getToken()函数,完成词法分析器scan.c。约定:
仅允许整数类型,不允许实数类型
标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则 整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始 由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉
识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’
typedef enum
{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */
ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=
=
+
*
/
()
;
} TokenType;
画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器
/****************************************************/ /* File: scan.c
*/ /* The scanner implementation for the TINY compiler
*/ /****************************************************/ #include “globals.h”
#include “util.h”
#include “scan.h”
typedef enum
{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;
《编译原理》课程设计
char tokenString[MAXTOKENLEN+1];static int getNextChar(void)
//获得下一字符 {实现请自己看scan.c文件} static void ungetNextChar(void)
//用于回吐字符 {实现请自己看scan.c文件}
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};
//定义保留字表
static TokenType reservedLookup(char * s)
//进行保留字的匹配 {实现请自己看scan.c文件}
/**********************************************/ /* the primary function of the scanner
*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;
TokenType currentToken;
//保存被识别Token的类属
StateType state = START;
//初始状态为START
int save;
//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符
while(state!= DONE)
//DONE状态表示已识别出一个Token
{ int c = getNextChar();
save = TRUE;
switch(state)
{ case START:
if(isdigit(c))
state = INNUM;
else if …… //此处请自己填写(字符、:、空格/tab/换行、{、算符及界符等)
break;
case INCOMMENT:
…//此处请自己填写,仅出现‘}’或EOF(注释未完结束程序)时才改变状态。
break;
case INASSIGN: …… //此处请自己填写,‘=’或其它(出现错误)
《编译原理》课程设计
break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
…… //此处请自己填写,不是字符则回吐,并进入DONE,且识别出一个ID
break;
case DONE: //不可能到
default: /* should never happen */
fprintf(listing,“Scanner Bug: state= %dn”,state);
state = DONE;
currentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
{ tokenString[tokenStringIndex] = ' ';
if(currentToken == ID)
currentToken = reservedLookup(tokenString);
}
}
---------end WHILE
if(TraceScan){
fprintf(listing,“t%d: ”,lineno);
printToken(currentToken,tokenString);
}
return currentToken;} /* end getToken */
编译原理课程报告学院: 信息工程学院专业: 软件工程 姓名: 赖杰学号: 09927212 指导老师: 朱文华完成时间: 2012.5.19编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造......
编译原理教学大纲2001,9周次课内学时课内安排(讲授内容)建议课外安排备注12编译原理概述阅读PL/0程序文本24介绍PL/0编译程序阅读PL/0程序文本32词法分析程序自动构造阅读PL......
《编译原理》课程培训心得体会天津科技大学 吴江红首先感谢全国高校教师网络培训中心为我们这些工作在教学第一线的教师提供一个提高自己教学水平、方法和能力的机会,使得我......
编译原理课程和助教工作总结时间如流水般,转眼,一学期将至,每个人为了能交上一份满意的答卷,无时无刻不在倾注着汗水,挥洒着热泪。掩卷长思,细细品味,这学期的点点滴滴不禁又浮上心......
一.实验序号:《编译原理》第一次实验二.实验题目:词法分析三.实验日期:2010.10四.实验环境(操作系统,开发语言)操作系统:Windows开发语言:C五.实验内容(实验要求)a) 将标识符的词法改......
