搜档网
当前位置:搜档网 › 基于FlexBison的高级解释器设计及实现

基于FlexBison的高级解释器设计及实现

基于FlexBison的高级解释器设计及实现
基于FlexBison的高级解释器设计及实现

课程设计3 基于Flex/Bison的高级解释器设计及实现

3.1 需求分析

3.1.1 问题定义

1.使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,过程,

循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。

2.重点学习抽象语法树的用法,它具有强大而简单的数据结构来表示分析。

3.1.2 功能描述

1.计算器具体需要实现的功能:

a)变量命名;

b)实现赋值功能;

c)实现比较表达式(大于、小于、等于等等)

d)实现if/then/else和do/while的流程控制;

e)用户可以自定义函数;

f) 简单的错误恢复机制。

2. 编写 Flex/Bison源文件,实现C 语言的语法分析功能,最后上机调试。

3. 要求编写一个测试程序:

首先自定义两个函数sq和avg,sq函数使用Newton方法来迭代计算平方根;avg函数计算两个数值的平均值。

利用定义好的函数进行计算,得到计算结果并显示出来。

4.根据习题1的要求,修改fb3-2相关代码;

实现实现以下自定义函数,并保存为fb3-3。

函数示例:

let sq(n){e=1; while (|((t=n/e)-e)>.001) do {e=avg(e,t);}}

let avg(a,b){(a+b)/2;}

let max(a,b) { if(a>b) then a; else b; }

let max3(a,b,c) { if(a>b) then { if(a>c) then a; else c; }

else { if(b>c) then b; else c; } }

3.1.3 开发环境及工具介绍

1、Window环境下载Visual Studio之后,利用其命令提示窗口进行操作。下载并安装Flex。

2、vs2010的编译器cl.exe。

3、flex:词法分析器

Flex是用来生成程序的工具,他们所生成的程序能够处理结构化输入,最初的Flex是用来生成编译器的,但是后来他们被证明在其他领域也非常有效。Flex是一个SourceForge项目。其依赖于GNU m4宏处理器。Linux和BSD都应该有m4,对于Windos用户来说,Flex被包含在Cygein Linux模拟环境中。

什么是FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个C 函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。例如在规则中可以这样定义:如果遇到一个换行字符\n,那么就把行计数器的值加一。Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。

4、bison:语法分析器

GNU bison 是属于 GNU 项目的一个语法分析器生成器。Bison 把一个关于“向前查看从左到右最右”(LALR) 上下文无关文法的描述转化成可以分析该文法的 C 或 C++ 程序。它也可以为二义文法生成“通用的从左到右最右”(GLR)语法分析器。

Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。一旦你精通Bison,你可以用它生成从简单的桌面计算器到复杂的程序设计语言等等许多语言的分析器。

Bison 基本上与 Yacc 兼容,并且在 Yacc 之上进行了改进。它经常和Flex (一个自动的词法分析器生成器)一起使用。

此软件的源代码是可自由获得的,在 GPL 下发布。

3.2 系统概要设计

3.2.1 系统体系结构

本实验计算器系统是基于抽象语法树的改进的计算器,在fb3-3.h 的文件中实现声明部分,在fb3-3.l 文件中实现计算器对应的词法分析,在fb3-3.y 文件实现计算器的语法语义分析部分,在fb3-3funcs.c 文件对应的是相应的计算器的C 语言的代码。之后利用Visual Studio 命令提示实现计算器的功能。结构图如下:

声明部分计算器词法分析语法语义分析C 语言代码fb3-3.funcs.c

fb3-3.y

fb3-3.l

fb3-3.h

图3-1 系统体系结构图

计算器系统流程图:

开始

计算式

词法分析器读取

标识符

语法分析器处理

判断节点类型

建立相应节点

求值

输出结果

释放

结束

图3-2 系统流程图

3.2.2 系统模块划分

(1)fb3-3.h文件头声明部分

我们要做开始声明部分,在.h 头文件中我们可以用以下语句来定义抽象语法树的struct ast {int nodetype;struct ast *l;struct ast *r;}; 且所有

节点都有公共的初始 nodetype。而删除和释放抽象语法树可以用语句 void treefree(struct ast *)来实现即可。常量使用 numval,符号引用使用 symref 赋值使用 symasgn,它有一个指向被赋值符号的指针和使用抽象语法树表示的值;

(2)fb3-3.l文件词法分析部分

词法分析器中设计六个比较操作符都返回一个带有字面值以便于区分的CMP 记号,其中这六个关键字和四个内置函数通过文字模式加以识别,它们放在通用模式之前以便于在通用模式之前进行匹配;利用符号表进行词法分析,其中符号表中记录输入中使用的名称以及常用的符号。在这部分需要注意与C语言的交叉使用,对于每一类的词法分析须严格按照正则表达式来实现。

(3)fb3-3.y文件语法分析部分

语法分析器的设计,其中在语法分析器的最后提供了小部分错误恢复机制,这让我们有可能在错误发生时把语法分析器恢复到可以继续工作的状态;在这一部分我们为每个表达式建立了抽象语法树,以抽象语法树为单位进行计算,并打印出结果,并释放语法树。在这一部分需考虑移进/规约冲突和操作符的优先级,一定要在此代码中区分语句(stmt)和表达式(exp)。

(4)fb3-3funcs.c文件C语言代码部分

在这一部分的文件中语法分析器及.y文件需要调用其中的函数,创建语法树节点、分配节点进行填充、遍历抽象语法树。最后还要加一个辅助函数,正如《flex 与 bison》中所讲的一样,例程 treefree 的扩展版本会递归的遍历一颗抽象语法树并释放这棵树的所有节点。本计算器的核心例程是 eval,它用来计算分析器中构造的抽象语法树。我们采用深度优先遍历算法来计算表达式的值;

3.2.3系统的数据流图

在系统中,用户在输入要计算的内容后,先进行词法分析和语法分析,之后再判断用户要计算的类型是哪种四则运算,系统运算之后将结果返回给用户,数据流图如下: 用户计算器

词法分析

语法语义分析

进行计算用户

输入计算数据进行词法分析

进行语法分析

计算

运算结果返回用户 图3-3 系统数据流图

3.3 详细设计与实现

3.3.1 fb3-3..h 文件模块的设计与实现

在这部分中,主要是对整个系统中的头文件的说明。首先我们要做开始声明部分,在.h 头文件中我们可以用以下语句来定义抽象语法树的节点,且所有节点都有公共的初始nodetype 。而删除和释放抽象语法树可以用语句voidtreefree (struct ast *) 来实现即可。常量使用numval, 符号引用使用symref 赋值使用symasgn, 它有一个指向被赋值符号的指针和使用抽象语法树表示的值;在代码的一开始是说明与词法分析器的接口,其中的变量yylineno 来自词法分析器,接下来的部分用于构造抽象语法树,抽象语法树有多个节点组成,每个节点都有一个节点类型。不同的节点可以有不同的域,但是在这个文件中有八种不同类型的指针。之后一部分是对抽象语法树的操作,首先用eval 遍历抽象语法树,返

回它所代表的表达式的值,之后删除和释放抽象语法树。下一部分是对符号表的声明,其中symbol为变量名,func为函数体,syms为虚拟参数列表。之后建立一个符号列表,并将其作为参数列表。在这个计算器中,每个符号都有一个变量和一个用户自定义函数。value域用来保存符号的值,func域指向用抽象语法树表达的该函数的用户代码,而sym域指向任意多个虚拟参数的链表,这些参数也是符号。函数newsymlist和symlistfree创建和释放符号。

下面抽象语法树的声明:

struct ast *newast(int nodetype, struct ast *l, struct ast *r);

struct ast *newcmp(int cmptype, struct ast *l, struct ast *r);

struct ast *newfunc(int functype, struct ast *l);

struct ast *newcall(struct symbol *s, struct ast *l);

struct ast *newref(struct symbol *s);

struct ast *newasgn(struct symbol *s, struct ast *v);

struct ast *newnum(double d);

struct ast *newflow(int nodetype, struct ast *cond, struct ast *tl, struct ast *tr);

开始

建立符号表

建立固定大小

的符号表

声明符号表

声明词法分

析器接口

声明抽象语法树

结束

图3-4 声明文件流程图

词法分析器中设计六个比较操作符都返回一个带有字面值以便于区分的CMP 记号,其中这六个关键字和四个内置函数通过文字模式加以识别,它们放在通用模式之前以便于在通用模式之前进行匹配; 该词法分析器能够实现基本的词法分析功能如行数、关键字个数、单词个数以及简单注释等的判别。这部分流程图

开始

识别运算符号

处理浮点数

单一字符操作符

比较操作符

关键字

内置函数

名字

结束

图3-5 词法分析程序流程图

这一部分主要是进行语法和语义分析。语法分析器的设计,其中在语法分析器的最后提供了小部分错误恢复机制,这让我们有可能在错误发生时把语法分析器恢复到可以继续工作的状态;在在代码的一开始%union定义了很多种符号值,符号值可以是符号表中特定用户符号、符号列表、比较子类型和函数记号的指针。FUNC表示内置函数,它的值确定了具体的某个函数,另外6个保留字,从IF到Let。记号CMP是6种比较操作符之一,它的值确定了具体的操作符。优先级声明列表从新的CMP和=操作符开始,%start声明定义了顶层规则。

接下的部分区分了stmt和exp,语句是一个控制流或者是一个表达式。每当规则匹配到一条语句时,他将调用相应的程序去创建合适的抽象语法树。且list的定义是右递归的。新的CMP规则处理6种比较操作符,它使用CMP的值来判断当前的操作符,还有一条赋值规则来创建赋值节点。

这一部分的程序流程图如下图所示:

开始

定义符号值

声明记号

规定计算语法

表达式的语法

顶层规划

结束

图3-6 语法部分流程图

在这一部分,用C 语言进行创建抽象语法树和符号列表的过程,代码中对每一个节点进行分配,然后基于节点类型恰当地填充各个域,利用treefree 递归地遍历一棵抽象语法树,同时释放这棵树的所有节点。计算器的核心是函数eval ,他计算语法分析器中构造的抽象语法树。最后还要加一个辅助函数,正如《flex 与bison 》中所讲的一样,例程treefree 的扩展版本会递归的遍历一颗抽象语法树并释放这棵树的所有节点。本计算器的核心例程是eval ,它用来计算分析器中构造的抽象语法树。我们采用深度优先遍历算法来计算表达式的值;

double

eval(struct ast *a)

{

double v;

if(!a) {

yyerror("internal error, null eval");

return 0.0;

}

switch(a->nodetype) {

/* constant */

case 'K': v = ((struct numval *)a)->number; break;

/* name reference */

case 'N': v = ((struct symref *)a)->s->value; break;

/* assignment */

case '=': v = ((struct symasgn *)a)->s->value =

eval(((struct symasgn *)a)->v); break;

/* expressions */ If 语句

==语句块语句块

a 10 hong\n Printf piyo\n

Printf

图3-7 语法分析树图

例如:分析 fred = 14 + 23 - 11 + 7 statement

Name

fred =+expression

expression Number

7

expression -Number

11

expression +Number

23

Number

14

图3-8 抽象语法树

3.4 系统分析与测试

3.4.1 测试用例设计

(1)简单的计算器,只能进行简单的四则运算,如(1+2)-(2*6)、1+2-3*2/5;

C:\GnuWin32\bin>fb3-1.tab.exe

> |-1

= 1

> |123

= 123

> (1+2)-(2*6)

= -9

> 1+2-3*2/5

= 1.8

>

(2)使用内置函数sqrt(n)、 exp(n) ,log(n)

C:\GnuWin32\bin>fb3-2.tab.exe

> sqrt(10)

= 3.162

> exp(2)

= 7.389

> log(7.389)

= 2

(3)定义函数sq(n)、avg(a, b),用于计算平方根

C:\GnuWin32\bin>fb3-2.tab.exe

> let sq(n)=e=1; while |((t=n/e)-e)>.001 do e=avg(e,t);;

Defined sq

> let avg(a,b)=(a+b)/2;

Defined avg

> sq(10)

= 3.162

> sq(10)-sqrt(10)

= 0.000178

(4)第二次的改进的计算器,可以进行自定义函数的运算,而且语法更加贴近C语言;

定义函数sq(n)、avg(a, b),用于计算平方根

C:\GnuWin32\bin>fb3-2.tab.exe

> let avg(a,b){(a+b)/2;}

Defined avg

> let sq(n){e=1; while (|((t=n/e)-e)>.001) do {e=avg(e,t);}}

Defined sq

> sq(10);

= 3.162

> sq(10)-sqrt(10);

= 0.000178

定义函数max(a,b) ,用于求a,b的最大值

C:\GnuWin32\bin>fb3-2.tab.exe

> let max(a,b) { if(a>b) then a; else b; }

Defined max

> max(4,5);

= 5

> max(1,5);

= 5

> max(9,5);

= 9

定义函数max3(a,b,c) ,用于求a,b,c的最大值

> let max3(a,b,c) { if(a>b) then { if(a>c) then a; else c; } else { if(b>c) then

b; else c; } }

Defined max3

> max3(3,4,5);

= 5

> max3(3,9,5);

= 9

> max3(10,9,5);

= 10

4.2 测试结果

1.执行计算任务

定义函数sq(n)、avg(a, b),用于计算平方根

2.执行计算任务:

增加新的内置函数pow(a,n)计算一个数a的n次方

3.执行计算任务:

定义函数max(a,b) ,用于求a,b的最大值

3.执行计算任务:

定义函数max3(a,b,c) ,用于求a,b,c的最大值

结论

本文工作和成果

使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,过程,循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。本次实验我实现了一个基本计算器的功能,可以进行基本的四则运算,在一开始不会添加自定义函数的操作,在老师和同学的帮助下,实现了自定义函数的功能,使其语法规则变得比较简单明了。

系统不足与展望

本系统的不足是计算器的内置函数中只有简单的四则运算,没有其他类似于三角函数计算的函数,希望通过之后的进一步学习,可以实现这一功能。

习题07_Shell编程

习题07_Shell编程 一、单选 1. 下面哪个命令是用来定义shell的全局变量( D )。 A. exportfs B. alias C. exports D. export 2.在Shell脚本中,用来读取文件内各个域的内容并将其赋值Shell变量的命令是(D )。 A. fold B. join C. tr D. read 3. 当字符串用双引号(’’)括起来时,SHELL将(C )。 A. 解释引号内的特殊字符 B. 执行引号中的命令 C. 不解释引号内的特殊字符 D. 结束进程 4. 以下哪个环境变量表示当前路径( B )。 A. PATH B. PWD C. HOME D. ROOT 5. shell不仅是(用户命令的解释器),它同时也是一种功能强大的编程语言,(bash )是Linux的缺省shell。 6. 编写的Shell程序运行前必须赋予该脚本文件(执行)权限。 7. 对于Shell脚本程序,若输入参数数量多于9个,则程序遍历每个参数可通过使用(shift )命令实现。 8. 为脚本程序指定执行权的命令及参数是( chmod a+x filename )。 9. 在shell编程时,使用方括号表示测试条件的规则是:方括号两边必有(空格)。 10. 输入了Shell命令的部分字符后按( tab )键可补全其余部分。 11.改变命令提示符的环境变量是(PS1 )。 11. grep -E '[Hh]enr(y|ietta)' file的功能是:(在文件File中查找Henry、henry、Henrietta或henrietta)。 12. 如下为命令终端下的一个截图: 则,以下两句的执行结果是:(the home path is $HOME )。 path=‘the home path is $HOME’ echo $path 13. 以下为程序名为prog的程序内容。则sh prog a b c d的执行结果为( C )。 set A B C D shift shift echo $1 三、简答 1. 下面给出了一个SHELL程序,试对其行后有#(n)形式的语句进行解释,并说明程序完成的功能。

24种设计模式的定义和使用场合

一.创建型模式(Creational): 简单工厂模式(simpleFactory)发音:['simpl] ['f?kt(?)r?] 定义: 提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口,抽象类,也可以是具体的类. 1.抽象工厂(AbstractFactory)发音: ['?bstr?kt] 定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 使用场合: 1.如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话书,希望一个系统只是知道产品的接口,而不关心实现的时候. 2.如果一个系统要由多个产品系列中的一个来配置的时候.换句话说,就是可以,就是可以动态地切换产品簇的时候. 3.如果强调一系列相关产品的接口,以便联合使用他们的时候 2.建造者模式(Builder)发音: ['b?ld?] 定义: 将复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 使用场合: 1.如果创建对象的算法,应该独立于该对象的组成部分以及它们的装配方式时 2.如果同一个构建过程有着不同的表示时 3.工厂方法模式(Factory Method) 定义: 为创建对象定义一个接口,让子类决定实例化哪个类.工厂方法让一个类的实例化延迟到了子类. 使用场景: 1.客户类不关心使用哪个具体类,只关心该接口所提供的功能. 2.创建过程比较复杂,例如需要初始化其他关联的资源类,读取配置文件等. 3.接口有很多具体实现或者抽象类有很多具体子类时, 4.不希望给客户程序暴露过多的此类的内部结构,隐藏这些细节可以降低耦合度. 5.优化性能,比如缓存大对象或者初始化比较耗时的对象. 4.原型模式(Prototype Method)发音: ['pr??t?ta?p] 定义: 使用原形实例指定将要创建的对象类型,通过复制这个实例创建新的对象. 应用场合: 1.如果一个系统想要独立于它想要使用的对象时,可以使用原型模式,让系统只面向接口编程,在系统需要新的对象的时候,可以通过克隆原型来得到. 2.如果需要实例化的类是在运行时刻动态指定时,可以使用原型模式,通过克隆原型来得到需要的实例.

全国高等教育自学考试高级语言程序设计

全国高等教育自学考试高级语言程序设计 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

2001年10月全国高等教育自学考试高级语言程序设计(一) 试卷 第一部分选择题 一、单项选择题 (本大题共20小题,每小题1分,共20分) 在每小题列出的四个选项中只有一个选项是符合题目要求的,请将正确选项前的字母填在题后的括号内。 1. C语言程序编译时,程序中的注释部分【】 A. 参加编译,并会出现在目标程序中 B. 参加编译,但不会出现在目标程序中 C. 不参加编译,但会出现在目标程序中 D. 不参加编译,也不会出现在目标程序中 2. 下列表达式的值为0的是【】 A. 3﹪5 B. 3/ C. 3/5 D. 3<5 3. 正确的C语言用户自定义标识符是【】 A. print B. float C. when?

D. random﹪2 4. 设int a = 3;则表达式a<1&& - - a>1的运算结果和a的值分别是【】 A. 0和2 B. 0和3 C. 1和2 D. 1和3 5. 下列叙述中,正确的是【】 A. 引用带参的宏时,实际参数的类型应与宏定义时的形式参数类型相一致 B. 宏名必须用大写字母表示 C. 宏替换不占用运行时间,只占编译时间 D. 在程序的一行上可以出现多个有效的宏定义 6. 下列保留字中用于构成循环结构的是【】 A. if B. while C. switch D. default 7. 与语句if(a>b)if(c>d)x = 1;else x = 2;等价的是【】 A. if(a>b){if(c>d) x = 1;else x = 2;} B. if(a>b){if(c>d) x = 1;} else x = 2;

《高级语言程序设计》复习题及答案

一、选择题 1.以下叙述正确的是( ): A)在C程序中,main函数必须位于程序的最前面 B) C程序的每行只能写一条语句 C) C语言使用库函数实现输入输出操作 D)注释中的拼写错误会影响编译结果 2、以下说法中正确的是() A) C语言程序总是从第一个的函数开始执行 B) C语言程序总是从main()函数开始执行 C)在C语言程序中,要调用的函数必须在main()函数中定义 D)C语言程序中的main()函数必须放在程序的开始部分 3、下列选项种说法正确的是( ) A)函数由声明部分和执行部分两部分组成 B)语言中main函数一定在程序的开始部分 C)C语言程序总是从第一个定义的函数开始执行 D)C程序的每行中只能写一条语句 4、设有说明:int a;float b; char c; double d; 则表达式1.3*a+2*b*c+d*(int) 2.6 值的类型为( )。 A)doubleB) char C) floatD) int 5、C语言的标识符只能由字母、数字和下划线三种字符组成,且第一个字符( ) A)必须为字母 B)必须为下划线 C)必须为字母或下划线 D)可以是字母、数字和下划线中任一种字符 6、以下不正确的C语言标识符是( )。 A) ABC B) abc C)a_bc D) void 7、下列运算符中优先级最高的是( ) A)< B)+ C)&& D)!= 8、以下选项中属于C语言中合法关键字的是( ) A)Float B)abc C)int D)CASE 9、若x、i、j和k都是int型变量,计算下面表达式后,x的值为( ) x=(i=4,j=16,k=32) A)4 B)16 C)32 D)52 10、在C语言中,要求数据必须是整型的运算符是( ) A)/ B)+ + C)!=D) % 11、若整型变量x的值为8,则下列表达式中值为1的表达式是 A)x+=x-=x B) x%=x-1 C) x%=x%=3 D) x/=x+x 12、若w=1,x=2,y=3,z=4,则条件表达式“w > x? w : y< z ? y : z”的值是( ) A)4 B)3 C)2 D)1 13、有以下程序,程序运行后的输出结果是。 main() {inti=1,j=2,k=3; if(i++==1&&(++j==3||k++==3)) printf("%d %d %d\n",i,j,k); }

自考高级语言程序设计复习题

2013年海南省衔接课程考试 高级语言程序设计复习题 一、单项选择题(在每小题列出的四个选项中只有一个是符合题目要求的,请将其代码填在题后的括号内。错选或未选均无分。) 1、在以下给出的表达式中,与while E中的E不等价的表达式是()。 A)(!E=0) B)(E>0||E<0) C)(E==0) D)(E!=0) 2、若x和y是代表整型数,以下表达式中不能正确表示数学关系|x-y|<10的是()。 A)abs(x-y)<10 B)x-y>-10&&x-y<10 C) @(x-y)<-10||!(y-x)>10 D)(x-y)*(x-y)<100 3、以下能够正确判断char型变量c是否为大写字母的表达式是()。 A) (‘A’<=c)AND (‘Z’>=c) B)(‘A’<=c)& (‘Z’>=c) C)(‘A’<=c) && (‘Z’>=c) D)以上答案都不对 4、下列叙述正确的是()。 A) break语句只能用于switch语句 B)在switch语句中必须使用default C) break语句必须与switch语句中的case配对 D)在switch语句中,不一定使用break语句 5、以下选项中,不能看作一条语句的是()。 A){ ;} B)a=0,b=0,c=0; C) if(a>0); D)if(b==0) m=1;n=2; 6、以下程序段中与语句k=a>b?(b>c?1:0):0)功能等价的是()。 A) if(a>b&&(b>c)) k=1; B) if(((a>b)||(b>c)) k=1; else k=0; else k=0; C)if(a<=b) k=0; D)if(a>b) k=1; else if(b<=c) k=1; else if(b>c) k=1; else k=0; 7、若有以下程序: main() { int y=10; while(y--); printf(“y=%d\n”,y); }

最全批处理命令学习资料【完美版】

一:批处理文件 批处理文件是扩展名为·bat或·cmd的文本文件,包含一条或多条命令,由DOS或Windows系统内嵌的命令解释器来解释运行。 批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。 二:常用命令: 1.echo 和 @: @ #关闭单行回显 echo off #从下一行开始关闭回显 @echooff #从本行开始关闭回显,一般批处理第一行都是这个echo on #从下一行开始打开回显 echo #显示当前是echo off 状态还是 echo on 状态echo. #输出一个”回车换行”,空白行 #(同echo, echo; echo+ echo[ echo]echo /echo") 2.errorlevel echo???%errorlevel% 每个命令运行结束,可以用这个命令行格式查看返回码 默认值为0,一般命令执行出错会设 errorlevel 为1 目录操作类命令: 3.dir?显示磁盘目录命令 dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 dirc:/a:d #显示 C 盘当前目录中的目录 dir c: /a:-d #显示 C 盘根目录中的文件 dir c:" /b/p #/b只显示文件名,/p分页显示 dir c:" /b/p#/w不显示详细信息 dir *.exe /s #显示当前目录和子目录里所有的.exe文件 4.以树形显示当前路径文件夹结构 tree /f #显示每个文件夹中文件的名字。 5.md 建立子目录 md d:"a"b"c#如果 d:"a 不存在,将会自动创建中级目录 #如果命令扩展名被停用,则需要键入mkdir "a" b"c 6.cd?改变当前目录(进入) cd \#进入根目录 cd#显示当前目录 cd /d d:\sdk #可以同时更改盘符和目录 cd .. #返回上一级目录

基于FlexBison的高级解释器设计及实现

课程设计3 基于Flex/Bison的高级解释器设计及实现 3.1 需求分析 3.1.1 问题定义 1.使用flex和bison开发了一个具有全部功能的桌面计算器,能够支持变量,过程, 循环和条件表达式,使它成为一个虽然短小但是具有现实意义的编译器。 2.重点学习抽象语法树的用法,它具有强大而简单的数据结构来表示分析。 3.1.2 功能描述 1.计算器具体需要实现的功能: a)变量命名; b)实现赋值功能; c)实现比较表达式(大于、小于、等于等等) d)实现if/then/else和do/while的流程控制; e)用户可以自定义函数; f) 简单的错误恢复机制。 2. 编写 Flex/Bison源文件,实现C 语言的语法分析功能,最后上机调试。 3. 要求编写一个测试程序: 首先自定义两个函数sq和avg,sq函数使用Newton方法来迭代计算平方根;avg函数计算两个数值的平均值。 利用定义好的函数进行计算,得到计算结果并显示出来。 4.根据习题1的要求,修改fb3-2相关代码; 实现实现以下自定义函数,并保存为fb3-3。 函数示例: let sq(n){e=1; while (|((t=n/e)-e)>.001) do {e=avg(e,t);}} let avg(a,b){(a+b)/2;} let max(a,b) { if(a>b) then a; else b; } let max3(a,b,c) { if(a>b) then { if(a>c) then a; else c; }

else { if(b>c) then b; else c; } } 3.1.3 开发环境及工具介绍 1、Window环境下载Visual Studio之后,利用其命令提示窗口进行操作。下载并安装Flex。 2、vs2010的编译器cl.exe。 3、flex:词法分析器 Flex是用来生成程序的工具,他们所生成的程序能够处理结构化输入,最初的Flex是用来生成编译器的,但是后来他们被证明在其他领域也非常有效。Flex是一个SourceForge项目。其依赖于GNU m4宏处理器。Linux和BSD都应该有m4,对于Windos用户来说,Flex被包含在Cygein Linux模拟环境中。 什么是FLEX?它是一个自动化工具,可以按照定义好的规则自动生成一个C 函数yylex(),也成为扫描器(Scanner)。这个C函数把文本串作为输入,按照定义好的规则分析文本串中的字符,找到符合规则的一些字符序列后,就执行在规则中定义好的动作(Action)。例如在规则中可以这样定义:如果遇到一个换行字符\n,那么就把行计数器的值加一。Flex文件就是一个文本文件,内容包括定义好的一系列词法规则。 4、bison:语法分析器 GNU bison 是属于 GNU 项目的一个语法分析器生成器。Bison 把一个关于“向前查看从左到右最右”(LALR) 上下文无关文法的描述转化成可以分析该文法的 C 或 C++ 程序。它也可以为二义文法生成“通用的从左到右最右”(GLR)语法分析器。 Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。一旦你精通Bison,你可以用它生成从简单的桌面计算器到复杂的程序设计语言等等许多语言的分析器。 Bison 基本上与 Yacc 兼容,并且在 Yacc 之上进行了改进。它经常和Flex (一个自动的词法分析器生成器)一起使用。 此软件的源代码是可自由获得的,在 GPL 下发布。

《高级语言程序设计》答案

1. 输入两个整数,要求用两个函数求出其最大公约数和最小公倍数,最大公约数和最小公倍数都在主函数中输出。#include int main() { int i,j,t; int max(int,int); int min(int,int); scanf("%d%d",&i,&j); if(i int main() { int max4(int,int,int,int); //对max4的函数声明 int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); //输入4个数 printf("max=%d\n",max4(a,b,c,d));//调用4个数中的最大者 return 0; } int max4(int a,int b,int c,int d) //定义max4函数 { int max2(int,int); //对max2的函数声明 return max2(max2(max2(a,b),c),d); //调用max2把作为函数值带回main函数} int max2(int a,int b) { return(a>b?a:b); //返回条件表达式的值,即a和b中的大者 } 3. 用递归调用的方法求5!。 #include int main() { int fac(int); int n; scanf("%d",&n);

【模式】32设计模式

【关键字】模式 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片来整体描述一下: 二、设计模式的六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类等,后面的具体设计中我们会提到这点。 1、单一职责原则 不要存在多于一个导致类变更的原因,也就是说每个类应该实现单一的职责,如若不然,就应该把类拆分。 2、里氏替换原则(Liskov Substitution Principle) 里氏代换原则(Liskov Substitution Principle LSP)面向东西设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。—— From Baidu 百科 历史替换原则中,子类对父类的方法尽量不要重写和重载。因为父类代表了定义好的结构,通过这个规范的接口与外界交互,子类不应该随便破坏它。 3、依赖倒转原则(Dependence Inversion Principle) 这个是开闭原则的基础,具体内容:面向接口编程,依赖于抽象而不依赖于具体。写代码时用到具体类时,不与具体类交互,而与具体类的上层接口交互。 4、接口隔离原则(Interface Segregation Principle) 这个原则的意思是:每个接口中不存在子类用不到却必须实现的方法,如果不然,就要将接口拆分。使用多个隔离的接口,比使用单个接口(多个接口方法集合到一个的接口)要好。 5、迪米特法则(最少知道原则)(Demeter Principle)

server常见命令

实验10 Windows 2003 server常见命令 【实验目的】 1.通过本实验,学生可以使用Windows 2003提供的命令实现网络故障的检测和日常管理。【实验内容】 1.利用Windows 2003提供的命令,进行IP地址配置 2.利用Windows 2003提供的命令,测试网络的连通性 3 利用Windows 2003提供的命令,设置文件夹共享 【实验器材】 1.硬件:服务器1台、工作站2台、交换机1台。 2.软件:windows 2003 server操作系统1套、其它Windows操作系统1套。 【预备知识】 在Windows 2003 server的网络环境下,出现网络故障时,我们通常要通过命令来进行故障检查,下面就介绍几个常见的命令。 1.CMD 说明:打开一个新的命令解释器。 执行方法:在点“开始”→“运行”,在命令行中输入“CMD”。 2.Hostname 说明:显示当前计算机的名称。 语法:hostname 3.Ipconfig 说明:显示所有的TCP/IP配置值,如本机IP地址、默认网关、子网掩码、DNS服务器等。 语法: Ipconfig [/all | /renew | /reelease] /All完整显示TCP/IP配置值 /Release释放DHCP配置参数 /Renew重建DHCP配置参数 4.Nbtstat 说明:显示协议统计和当前使用的NBT的TCP/IP连接,用此命令可以查看指定计算机的MAC

地址。 语法: nbtstat [-a 计算机名] [ -A 计算机的IP地址] 例如,命令: nbtstat –A 192.168.0.1 显示局域网内远端IP地址为192.168.0.1的计算机的网络信息,如MAC地址。 5.Net 说明:这条命令允许用户通过命令提示符对网络、用户、组和服务的很多方面进行监控、启动、停止和更改。如可以在网络中发送消息、查看本机的共享资源的详细资料。 1) Net send :向用户或计算机发送消息。 语法: Net send <计算机名/用户名>消息内容 2) Net share:创建/删除/显示共享 语法: Net share [共享名/d ] /[共享名=共享文件夹路径] 例如,命令: Net share mysharefile=d:\file 将本机目录“d:\file”设置共享,共享名为mysharefile。 6.Ping 说明:检验TCP/IP连接和显示连接统计。用此命令可以检测与目标计算机的TCP/IP的连通性,也可以在知道目标计算机的名称或域名的情况下,来查看其IP地址。 语法: Ping [-t ] [-a] 目标计算机名或IP地址。 -t Ping直到中断 -a 解析地址到计算机名。 7.Tracert 说明:通过TCP/IP跟踪目的地的路由。 语法: Tracert [-d] 目标计算机名 -d 不解析地址到计算机名。

软件体系结构与设计模式笔记

第1章软件体系结构概述 ?SEI软件体系结构讨论群定义如下:一个程序/系统构件的结构,它们之间的相互关系,以及在设计和交付的整个过程中的原则和指导方针。 ?Mary Shaw和David Garlan认为软件体系结构包括构成系统的设计元素的描述,设计元素的交互,设计元素组合的模式,以及在这些模式中的约束。 ?软件体系结构包括构件(Component)、连接件(Connector)和约束(Constrain)或配置(Configuration)三大要素。 ?国内普遍接受的定义:软件体系结构包括构件、连接件和约束,它是可预制和可重构的软件框架结构。 ?构件是可预制和可重用的软件部件,是组成体系结构的基本计算单 元或数据存储单元 ?连接件也是可预制和可重用的软件部件,是构件之间的连接单元 ?构件和连接件之间的关系用约束来描述 ?软件体系结构= 构件+ 连接件+ 约束 软件体系结构的优势容易理解、重用、控制成本、可分析性 第2章软件体系结构风格 ?软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。 ?体系结构风格定义了一个系统家族,即一个体系结构定义一个词汇表和一组约束。 词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。 ?体系结构风格反映了领域中众多系统所共有的结构和语义特性,并指导如何将各个模块和子系统有效地组织成一个完整的系统。 ?数据流风格: 批处理序列; 管道/过滤器。 ?调用/返回风格:主程序/子程序;面向对象风格;层次结构。 ?独立构件风格:进程通讯;事件系统。 ?虚拟机风格:解释器;基于规则的系统。 ?仓库风格:数据库系统;超文本系统;黑板系统。 ?过程控制环路 ?C/S风格体系结构有三个主要组成部分:数据库服务器、客户应用程序和网络。 ?B/S风格浏览器/Web服务器/数据库服务器。 优点:C/S体系结构具有强大的数据操作和事务处理能力,模型思想简单,易于人们理解和接受。将大的应用处理任务分布到许多通过网络连接的低成本计算机上,以节约大量费用。缺点:开发成本较高、客户端程序设计复杂、信息内容和形式单一、用户界面风格不一,使用繁杂不利于推广使用、软件移植困难、软件维护和升级困难、新技术不能轻易应用 优点:基于B/S体系结构的软件,系统安装、修改和维护全在服务器端解决。 缺点:B/S体系结构缺乏对动态页面的支持能力,没有集成有效的数据库处理功能。 B/S体系结构的系统扩展能力差,安全性难以控制。 采用B/S体系结构的应用系统,在数据查询等响应速度上,要远远低于C/S体系结构。 B/S体系结构的数据提交一般以页面为单位,数据的动态交互性不强,不利于在线事务处理(OLTP)应用。 第3章软件需求与架构 ?需求的基本概念 ?IEEE (1997) ?(1) 用户解决问题或达到目标所需的条件或能力

2020年10月全国高级语言程序设计(一)自考试题及答案解析.docx

??????????????????????精品自学考料推荐?????????????????? 全国 2018 年 10 月高等教育自学考试 高级语言程序设计(一)试题 课程代码: 00342 一、单项选择题(本大题共20 小题,每小题 1 分,共 20 分) 在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括 号内。错选、多选或未选均无分。 1.下列不正确的转义字符是() . A. ′ ′ B. ′ ″ C. ′ \086′ D. ′ \0′ 2.下列运算符中,优先级最高的是() A. [] B.++ C.% D.&& 是 C 语言保留字的是 () 3.下列标识符中,不. A. char B. while C. min D. default 4.下列数据中,不.是 C 语言常量的是 () A. ′ \n′ B. ″ a″ C. e-2 D. 012 5.若定义了 int a; char b; float c ;,则表达式a*b-c 的类型是 () A. float B. int C. char D. double 6.若定义了 int a, x,y;,则下列语句中不.正确的是 () A. x=3 ,y=5 ; B. ++x ; C. x=y+=x*30 ; D. a=y+x=30 ; 7.调用函数时,若实参是一个数组名,则向函数对应的形参传送的是() A. 数组的长度 B.数组的首地址 C. 数组第一个元素的值 D. 整个数组元素的值 8.在 C 语言中,函数返回值的类型是由() A. 定义的函数类型决定 B.return 语句中表达式的类型决定 C.调用该函数的主调函数类型决定 D. 调用该函数时系统状态决定 9.若定义了 int b [][ 3]={ 1,2, 3,4, 5, 6, 7};,则 b 数组第一维的长度是 () A. 2 B. 3 C. 4 D.无确定值 1

命令行解释器使用命令语法

使用命令语法 语法按必须键入命令及其带有参数的顺序出现。下面的xcopy 命令范例显示各种语法文本格式: xcopy Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:mm-dd-yyyy]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a|/m}] [/n] [/o] [/x] [/exclude:file1[+[file2]][+[file3]] [{/y|/-y}] [/z] 下表说明如何解释不同的文本格式。 格式化图例 格式含义 斜体用户必须提供的信息 粗体用户必须像显示的一样准确键入的元素 省略号(...) 可在命令行中重复多次的参数在括号([]) 之间可选项目 在大括号({}) 之间;将选项用竖线(|) 隔开。例如:{even|odd} 用户必须从中只选择一个选项的选项组 Courier 字体代码或程序输出 使用多个命令和条件处理符号 使用条件处理符号可以从单个命令行或脚本运行多个命令。通过条件处理符号运行多个命令时,条件处理符号右边的命令根据条件处理符号左边的命令结果来发挥作用。例如,只有在前一个命令失败的情况下,才可能需要运行一个新命令。或者,只有在前一个命令成功时才可能需要运行一个新命令。 可以使用下表列出的特殊字符来传递多个命令。 字符语法定义 & [...] command1 & command2 用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。 && [...] command1 && command2 只有在符号&& 前面的命令成功时,才用于运行该 符号后面的命令。Cmd.exe 运行第一个命令,然后 只有在第一个命令运行成功时才运行第二个命令。 || [...] command1 || command2 只有在符号|| 前面的命令失败时,才用于运行符号|| 后面的命令。Cmd.exe 运行第一个命令,然后只有在第一个命令未能运行成功(接收到大于零的错误代码)时才运行第二个命令。 ( ) [...] (command1 & command2) 用来分组或嵌套多个命令。 ; 或 者, command1 parameter1;parameter2 用来分隔命令参数。 注意 “与”符号(&)、管道符号(|) 以及括号() 是特殊字符,将它们作为参数传递时,必须在其前面加上转义字符(^) 或引号。 如果某个命令成功完成操作,则该命令就返回零(0) 退出代码或不返回任何退出代码。有关退出代码的详细信息,请参阅Microsoft Windows Resource Kit。 嵌套命令行解释器 通过在命令提示符打开Cmd.exe 新的实例,可以在Cmd.exe 内嵌套命令行解释器。默认

23种设计模式的通俗理解

23种设计模式的通俗理解【转】 1、FACTORY 工厂方法 追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory 工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。 2、BUILDER 抽象工厂 MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱 你”builder。(这一定比美军在伊拉克用的翻译机好卖)建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。 3、FACTORY METHOD 建造者模式 请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。 4、PROTOTYPE 原型模式 跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。 5、SINGLETON 单态模式 俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事) 单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。[b:9ceca65206]结构型模式[/b:9ceca65206] 6、ADAPTER 适配器模式 在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我) 适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,

高级语言程序设计自考模拟10

[模拟] 高级语言程序设计自考模拟10 单项选择题在每小题列出的四个备选项中只有一个是符合题目要求的。 第1题: 下列不属于面向机器语言的是( ) A.符号语言 B.二进制语言 C.汇编语言 D.C语言 参考答案:D 答案解析: 第2题: 设int b=2;表达式(b<<2)/(b>>1)的值是( ) A.2 B.4 C.6 D.8 参考答案:D 答案解析: 左移位运算移一位相当于乘2,右移位运算右移一位相当于除2。 第3题: 设置变量定义为:int a=0x53;int b=6;,求表达式~a|b的值(假定现有计算机字长为16)( ) A.82 B.-82 C.72 D.-72 参考答案:B 答案解析: 因计算机字长为16.故a的二制表示是0000000001010011,b的二进制表示是0000000000000110。运算符"~"自右向左结合,运算符"|"是自左向右结合;且运算符"~"的优先级高于运算符"|"的优先级,则进行计算的顺序是"(~a)|b"。最终计算结果是1111111101010010(十进制值为-82)。 第4题:

为了判定两个字符串是否相等应当使用( ) A.if(s1==s2) B.if(s1=s2) C.if(strcmp(s1,s2)==0) D.if(strcmp(s1,s2)=0) 参考答案:C 答案解析: 第5题: 设char c[5]={'a','b','\0','C','\0');则printf("%s",c);的输出是( ) A.'a''b' B.ab C.abc D."ab\0c" 参考答案:B 答案解析: 第6题: 以下程序的运行结果是( ) #include<stdio.h>main() { int a[]={1,2,3,4,5,6,7,8,9,10,11,12};int *p=&a[5],*q=NULL;printf("%d%d\n",*p,*q);} A.运行后报错 B.6 0 C.6 12 D.5 5 参考答案:A 答案解析: #include<stdio.h> main() { int a[]={1,2.3.4,5,6,7,8,9,10,11,12}; int*p=&a[5],*q=NULL; printf("%d%d\n",*P,*q);/*被置空的指针不能参与"*"运算*/ } 第7题: 当执行以下程序段时( ) do{y--;}while(--y) printf("%d\n",y--); A.循环体将执行一次 B.循环体将执行两次 C.循环体将执行无限次 D.系统将提示有语法错误

操作系统shell命令解析器

一.程序概述 1.完成的任务 在Linux环境下编写一个简单的命令解释器即定义一个命令使它具有Linux中某些 命令的功能,可以实现获取用户输入的指令、可解析指令、可执行命令等功能,以 此来熟悉Linux编程环境,加强对Linux命令的理解及函数的运用。 2.遇到的困难及解决的问题 在程序设计过程中,遇到的困难主要有以下几个:一、系统函数调用问题;二、对 文件的操作;三、复制文件。 通过查阅Linux c函数库后,知道了如何调用系统函数,并解决了对文件的操作;而 文件的复制,则采用了如下思想:打开一个输入文件,创建一个输出文件,建立一 个BUF大小的缓冲区;然后在判断输入文件未完的循环中,每次读入多少就向输出 文件中写入多少,直到输入文件结束。 二.概念原理 1.基本概念 为用户提供了输入命令和参数,以此向Linux内核发送请求以便运行程序的界面系 统级程序。下图为Linux、UNIX系统层次结构图: 2.原理 解释用户输入的命令行,提交到系统内核处理,并将结果返回给用户。 三.详细设计 1.总体设计 运行程序后,首先初始化,显示系统有的命令,然后通过用while(1)循环,连续的 获取用户输入的命令,一直到用户输入quit退出循环,接着程序结束。 2.主要函数及功能 2.1 int init() 显示系统命令等信息。 int init()//初始化 { cout<<"*****************欢迎使用GPLinux*********************"<

shell命令解释器实验报告

实验报告实验名称:实现一个shell命令解释器 学员: 学号: 年级: 专业:所属学院:计算机学院指导教员:职称: 实验室:实验日期:

目录 1.功能描述 (3) 2.主要数据结构 (3) 3.主要程序流程图 (4) 4.主要功能实现方法和系统调用 (4) 4.1初始化环境 (4) 4.2打印提示符,获取用户输入 (5) 4.3解析命令 (5) 4.4执行命令 (5) 4.4.1内部命令 (5) 4.4.2外部命令 (5) 4.4.3重定向功能 (6) 4.4.4管道功能 (6) 5.测试结果 (7) 6.心得体会 (10)

1.功能描述 本实验完成了一个shell命令解释器,实现了shell的解释命令功能,实现了内部命令(包括自定义命令)、外部命令、重定向功能和多管道等功能。具体功能描述如下: 1)内部命令: ●可以使用常用的如cd、echo、history、exit等命令 ●自定义命令 1)smile命令:打印出笑脸 2)myinfo命令:打印出作者信息和版本信息 2)外部命令:可实现cp、rm等所有外部命令。 3)重定向:通过输入重定向符号’<’ 或输出重定向’>’ ,把一行命令分成 两部分,前者为需要执行的命令,后者为一个重定向文件。输入重定向 是把文件内容作为输入传到前面的命令中,而输出重定向则是把命令的 结果传入重定向文件中。 4)管道:通过管道符号’|’ 把一条命令分成两部分,前一部分命令运行后, 将结果放入管道,后一部分命令从管道中取出该结果,作为输入继续执 行。最多可以实现10个管道。 2.主要数据结构 本程序主要使用字符数组进行命令、路径的存储与分析。

00342高级语言程序设计自考机考答案

高级语言程序设计(一)(00342) 一、选择题(共75小题,每题2分,共150分) 1-5 BBCDB 6-10 CBAAC 11-15 DACBC 16-20 BACAA 21-25 CCCBB 26-30 DACDD 31-35 CDCDC 36-40 DBADD 41-45 CACCD 46-50 BBCBB 51-55ABCDC 56-60BCBAA 61-65DCDCD 66-70CDBAA 71-75DBADD 二、判断题(共25小题,每题2分,共50分) 1-5 ????6-10 ????11-15 ????16-20 ????21-25 ???? 三、名词解释题(共25小题,每题4分,共100分) 1、答:所谓函数的调用,是指一个函数(调用函数)暂时中断本函数的运行,转而执行另一个函数(被调用函数)的过程。 2、答:计算机能直接识别和接受的二进制代码。 3、答:由.OBJ文件转化而成的.EXE文件,即计算机可以识别、执行的程序。 4、答:即一组计算机能识别和执行的指令。 5、答:在程序中要指定用到哪些数据以及这些数据的类型和数据的组织性形式,就是数据结构。 6、答:用一个符号代表一个常量,称为符号常量。 7、答:在计算机高级语言中,用来对变量、符号变量名、函数、数组、类型等命名的有效字符序列统称为标识符。 8、答:用关系运算符将两个数值或数值表达式连接起来的式子,称关系表达式。 9、答:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。 10、答:函数的首行(即函数首部)称为函数原型。 11、答:即要求计算机进行操作的步骤,可以用言语描述,也可以用流程图描述。 12、答:将已设计好的算法用计算机语言来表示,即根据已经细化的算法正确写出计算机程序。 13、答:如果一个变量在某个文件或函数范围内是有效的,就称该范围为该变量的作用域。 14、答:如果在程序中定义了一个函数,在编译时,编译系统为函数代码分配一段存储空间,这段存储空间的起始地址(又称入口地址),称为这个函数的指针。 15、答:一个数组,若其元素均为指针类型数据,称为指针数组。 16、答:所谓类型,就是对数据分配存储单元的安排,包括存储单元的长度(所占多少字节)

相关主题