当前位置:文档之家› (完整版)系统软件开发实践报告

(完整版)系统软件开发实践报告

计算机科学与技术学院系统软件开发实践报告*名:***学号:********专业:计算机科学与技术班级:计科12-1班指导教师:**2015年 4月摘要操作系统和编译原理是大学计算机专业的必修课程。

在这些课程的教学教程中,容易偏重于理论的介绍,而忽视了实践环节。

本课程设计是在完成C++程序设计、数据结构、操作系统、编译技术教学后所进行的,全面综合训练学生的系统软件开发能力关键字:编译系统、Flex、Bison、操作系统、启动、内存管理目录1 借助Flex进行词法分析 (2)1.1实验内容 (2)1.2 实验要求 (2)1.3 程序代码 (2)1.4 实验结果 (4)2 借助Flex/Bison进行语法分析 (5)2.1 实验内容 (5)2.2 实验要求 (5)2.3 程序代码 (5)2.4 实验步骤 (5)2.5 实验结果 (7)3 Flex/Bison综合实验 (7)3.1 实验内容 (7)3.2 计算器具体需要实现的功能 (7)3.3 实验要求 (7)3,4 程序代码 (8)3.5 实验结果 (11)4(操作系统实验)lib0:熟悉实验环境 (11)4.1 实验目的 (11)4.2 实验环境搭建 (11)4.3 GCC编译练习 (12)4.4 GDB调试练习 (12)5(操作系统实验)lib1:启动操作系统 (13)5.1 实验目的 (13)5.2 实验内容 (14)5.3 实验步骤 (14)5.4 操作系统启动过程 (15)5.5 实模式与保护模式 (16)6(操作系统实验)lib2:物理内存管理 (16)6.1 实验目的 (16)6.2 实验内容 (16)6.3 ………………………………………………………………7实验体会……………………………………………………………………8参考文献……………………………………………………………………1借助Flex进行词法分析1.1实验内容给定C语言的一个子集,具体内容如下:1. 下面是语言的关键字:else if switch for int float return void while 所有的关键字都是保留字,并且必须是小写。

2. 下面是专用符号:+ - * / < <= > >= == != = ; , ( ) [ ] { } /* */3. 其他标记是标识符(ID)和数字(NU ),通过下列正则表达式定义:ID = letter letter*NUM = digit digit*letter = a|..|z|A|..|Zdigit = 0|..|9注:小写和大写字母是有区别的。

4. 空格由空白、换行符和制表符组成。

空格通常被忽略,除了它必须分开ID、NUM 关键字。

5. 注释用通常的C语言符号/* . . . */围起来。

注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。

注释不能嵌套1.2实验要求编写 LEX 源文件,实现C 语言子集的词法分析功能,最后上机调试。

要求编写一个测试程序,以给定的测试文件作为输入,输出运行结果到输出文件中1.3程序代码Lex.l源码:%{#include <stdio.h>#include <stdlib.h>#include <string.h>int yywrap();int lineno=1;%}delim [ \t]ws {delim}+letter [A-Za-z]digit [0-9]id {letter}+number {digit}+enter [ \n]spchar ("{"|"}"|"["|"]"|"("|")"|";"|"="|","|"+"|"-"|"*"|"/"|"<"|"<="|">"|">="|"=="|" !=")comment \/\*(\*[^/]|[^*])*\*\/kwd (else|if|switch|for|int|float|return|void|while)%%{ws} {}{comment} {}{enter} {lineno++;}{kwd} {fprintf(yyout,"%d行\tkeywod\t%s\n",lineno,yytext);}{spchar} {fprintf(yyout,"%d行\tspchar\t%s\n",lineno,yytext);}{id} {fprintf(yyout,"%d行\tidenti\t%s\n",lineno,yytext);}{number} {fprintf(yyout,"%d行\tnumber\t%s\n",lineno,yytext);}.%%int yywrap() {return 1;}int main(void){char infilename[100];printf("输入文件名:");scanf("%s",infilename);yyin = fopen(infilename,"r");yyout = fopen("out","w");yylex();return 0;}测试程序:1-1.cpp#include<iostream>using namespace std;int main() {int a;int d=123456;float b=123.45;int e=9;a=(1+2-1)*4/2;if(a>b)cout<<"a>b"<<endl;else cout<<"a<=b"<<endl;cout<<a<<endl;cout<<b<<endl;cout<<"Welcome to c++"<< endl;return 0;}1.4实验结果实验结果输出到.out文件中,截图示例:2借助Flex/Bison进行语法分析2.1实验内容利用附录提供的C语言文法的相关参考资料,利用Yacc/Bison编写一个C语言分析器。

具体内容:1)利用语法分析器生成工具Bison编写一个语法分析程序,与词法分析器结合能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子2)利用附录提供的C语言文法的相关参考资料,利用Yacc/Bison编写一个C语言分析器。

2.2 实验要求1)编写 Bison源文件,实现C 语言的语法分析功能,最后上机调试。

2)要求编写一个测试程序,以给定的测试文件作为输入,输出运行结果到输出文件中。

2.3程序代码由于本实验的lex源文件和yacc源文件代码较长而且在“实验附录:C语言相关文法”文件夹中已经给出相关源码的链接,由于报告篇幅限制不再贴出源码Test.测试文件源码:void main(){ int i = 0;int j = 0;}void t1(){ int i = 0;}typedef unsigned int uint;uint xx;uint yy;2.4实验步骤1、flex -l input.lexbison -d cgrammar-new.y (产生头文件和.c文件)2、comment函数调用yyinput,编译会有链接错误,解决方法一,将lex.yy.c中的yyinput函数定义拷贝一份到input.lex, 重命名为my_yyinput,或者将lex.yy.c中的#ifdef __cplusplusstatic int yyinput()#elsestatic int input()#endif改为static int yyinput()上述问题出现的情形:词法分析器的后缀名为.c, 而不是.cpp3、cgrammar-new.tab.c中如下程序段/*----------.| yyparse. |`----------*/#ifdef YYPARSE_PARAM# if defined (__STDC__) || defined (__cplusplus)int yyparse (void *YYPARSE_PARAM)# elseint yyparse (YYPARSE_PARAM)void *YYPARSE_PARAM;# endif#else /* ! YYPARSE_PARAM */#if defined (__STDC__) || defined (__cplusplus)intyyparse (void)#elseintyyparse () ;#endif#endif改为int yyparse () 或者 int yyparse (void)4、lex.yy.c中,将下面语句注释if ( ! yyin )yyin = stdin;5、解析之前,设置yyin为输入文件指针extern FILE *yyin;if(!(yyin = fopen(filename,"r"))) {printf("the file not exist\n");exit(0);}2.5实验结果实验结果输出到.out文件中,截图示例:3 Flex/Bison综合实验3.1实验内容使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,过程,循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。

重点学习抽象语法树的用法,它具有强大而简单的数据结构来表示分析结果3.2计算器具体需要实现的功能变量命名;实现赋值功能;实现比较表达式(大于、小于、等于等等)实现if/then/else 和do/while的流程控制;用户可以自定义函数;简单的错误恢复机制3.3实验要求编写 Flex/Bison源文件,实现C 语言的语法分析功能,最后上机调试。

要求编写一个测试程序:1)首先自定义两个函数sq和avg,sq函数使用Newton方法来迭代计算平方根;avg函数计算两个数值的平均值。

相关主题