编译原理上机报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理课程设计
课设题目:函数绘图语言解释器
负责人:
学号:
专业:计算机科学与技术
指导老师:**
起止时间:2015 年4月至2015年5月
目录
一任务与目的 (3)
二软件设计 (3)
2.1软件的总体结构与模块划分 (3)
2.1.1词法分析器 (3)
2.1.2语法分析器 (3)
2.1.3语义分析器 (4)
2.2关键算法与重要数据结构 (4)
2.2.1词法分析器 (4)
2.2.2语法分析器 (6)
2.2.3语义分析器 (10)
三测试例程设计与测试结果分析 (12)
例程一 (12)
绘图语言: (12)
结果: (12)
例程二 (13)
绘图语言: (13)
结果: (14)
四总结与体会 (14)
一任务与目的
任务:为简单的函数绘图语言编写一个解释器。该解释器接受用绘图语言编写的简单的源程序,经过语法和语义分析后,直接将源程序所规定的图形显示在显示屏或者显示窗口上。
目的:通过自己动手编写解释器,掌握语言翻译,特别是语言识别的基本方法。
二软件设计
2.1软件的总体结构与模块划分
本软件用C语言实现,通过词法分析器、语法分析器和语义分析器三个部分来逐步解析写入文本中的函数绘图语言,并最终通过opengl画出来。
2.1.1词法分析器
主要工作:
1.滤掉源程序中的无用成分;
2.输出记号供语法分析器使用;
3.识别非法输入,并将其标记为“出错记号”。
2.1.2语法分析器
主要工作:
1.设计函数于存绘图语言的文法,适合递归下降分析;
2.设计语法树的节点结构,用放表达式的语法树;
3.设计递归下降子程序,分析句子并构造表达式的语法树;
4.设计测试程序和测试用例,以检验分析器是否正确。
2.1.3语义分析器
语法制导翻译的基本思想是,根据语法分析所得到的语言结构加入相应的语义动作,以实现设计者所希望的目标。对于递归下降子程序,就是在各子程序中的适当位置嵌入相应的语义函数。绘图语言的语义由两大部分组成:表达式值的计算和图形的绘制。由于在语法分析阶段已经为表达式构造了语法树,因此表达式的计算十分简单,只要从分析树的根节点出发,对分析树进行一次深度优先遍历即可得到表达式的值。
2.2关键算法与重要数据结构
2.2.1词法分析器
主要函数:
void cinit()
{
//COS(-T *( (10/7)-1)),
int i;
//tokenstr[mem].lexeme =TokenBuffer; 记号的字符指针指向字符缓冲区
char word;
while(word=GetChar()) // 从源文件中读取一个字符
{
if(tokenstr[mem].type==ERRTOKEN)//
break;
if(tokenstr[mem].type==NNTOKEN)//
break;
if(word==' '||word=='\n')
{
if(isalpha(TokenBuffer[0]))
{
output1();
for(i=0;i TokenBuffer[i]=0; num=0; } if(isdigit(TokenBuffer[0])) { output2(); for(i=0;i TokenBuffer[i]=0; num=0; } continue; }// 空格、TAB、回车等字符的过滤 if(isalpha(word)) { if(isdigit(TokenBuffer[0])) { output2(); for(i=0;i TokenBuffer[i]=0; num=0; } AddCharTokenString(word); } // 识别ID else if(isdigit(word)||word=='.') { /*if(isalpha(TokenBuffer[0])) { output1(); for(i=0;i TokenBuffer[i]=0; num=0; }*/ AddCharTokenString(word); } // 识别数字常量 else { if(isalpha(TokenBuffer[0])) { output1(); for(i=0;i TokenBuffer[i]=0; num=0; } if(isdigit(TokenBuffer[0])) { output2(); for(i=0;i TokenBuffer[i]=0; num=0; } switch(word) { case ';': {tokenstr[mem++].type=SEMICO;}break; case '(': {tokenstr[mem++].type =L_BRACKET;}break;