当前位置:文档之家› 系统软件实践综合报告

系统软件实践综合报告

系统软件开发实践报告姓名:xxx学号:xxxxx专业:计算机科学与技术班级:xxxxxx指导老师:xxx2016年4月目录1.前三周Flex&Bison1借助Flex进行词法分析1.1实验内容………………………………………………..1.2实验要求………………………………………………..1.3程序代码………………………………………………..1.4实验结果…………………………………………….....2借助Bison进行语法分析2.1实验内容…………………………………………….2.2实验要求……………………………………………..2.3实验步骤……………………………………………..2.4实验代码…………………………………………….2.5实验结果…………………………………………….3Flex/Bison综合实验3.1实验内容……………………………………………...........3.2计算器具体需要实现的功能………………………..3.3实验要求………………………………………………………3.4 实验步骤………………………………………………………4.实验体会....................................................................2.后三周操作系统1.lib0:熟悉实验环境1.1实验目的…………………………………………………………………1.2实验环境搭建………………………………………………………….1.3GCC编译练习…………………………………………………………..1.4GDB调试练习………………………………………………………….2. lib1:启动操作系统2.1实验目的…………………………………………………………………2.2实验内容…………………………………………………………………2.3实验步骤………………………………………………………………….2.4操作系统启动过程………………………………………………….2.5实模式与保护模式………………………………………………….3.实验体会..........................................................................1. 前三周Flex&Bison实验1借助Flex进行词法分析1.1实验内容先是flex(1)代码如下:%{•int nchar, nword, nline;•%}•%%•\n { nline++; nchar++; }•[^ \t\n]+ { nword++, nchar += yyleng; }•. { nchar++; }•%%•void main()•{•yylex();•printf("%d\t%d\t%d\n", nchar, nword, nline);•}•int yywrap()•{•return 1;•}生成lex1.yy.c•1、进入flex安装目录•> cd C:\GnuWin32\bin•2、调用flex.exe•> flex.exe -o"lex1.yy.c" lex1.l5、调用VS2008编译器cl.exe6、6、调用lex1.yy.exe7、Cpp代码如下:#include iostreamusing namespace stdint maincout "Hello! "<<endlcout "Welcome to c++! " endlReturn最后会显示出104 17 6.第二个实验为给定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 源码:%{#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;}测试程序源代码:# include <iostream>using namespace std;int main(){cout<<"Hello"<<endl;cout<<"Welcome to c++"<<endl;return 0;}1.4实验结果Windows环境运行结果按照Flex练习1Windows环境下的操作步骤执行,实验结果输出到out文件中,截图如下:Windows环境下运行结果Linux环境运行结果按照Flex练习1Linux环境下的操作步骤执行,实验结果输出到out文件中,截图如下:Linux环境下运行结果2借助Bison进行语法分析2.1 实验内容利用附录提供的C语言文法的相关参考资料,利用Yacc/Bison编写一个C语言分析器。

具体内容:利用语法分析器生成工具Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。

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

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

2.3 实验步骤(1)拷贝input.lex与cgrammar-new.y至安装目录下图2.1 拷贝input.lex与cgrammar-new.y后安装目录界面(2)打开命令行图2.2 打开命令行界面(3)生成lex.yy.c cgrammar-new.tab.h cgrammar-new.tab.c Flex.exe -l input.lexBison0exe -d cgrammar-new.y图2.3 生成lex.yy.c cgrammar-new.tab.h cgrammar-new.tab.c界面图2.4 生成lex.yy.c cgrammar-new.tab.h cgrammar-new.tab.c后安装目录界面(4)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, 而不是.cpp (5)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)(6)lex.yy.c中,将下面语句注释if ( ! yyin )yyin = stdin;(7)解析之前,设置yyin为输入文件指针extern FILE *yyin;if(!(yyin = fopen(filename,"r"))) {printf("the file not exist\n");exit(0);}2.4 实验代码test.c测试文件源码如下:/**/void main(){int i = 0;int j = 0;}void t1(){int i = 0;}/**/typedef unsigned int uint;uint xx;uint yy;2.5 实验结果实验结果输出到out文件中,截图如下:图2.5 out文件截图图2.6 out文件截图3Flex/Bison综合实验1 实验内容(1)使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,过程,循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。

相关主题