当前位置:首页 » 编程软件 » 编译原理实验分析子程序

编译原理实验分析子程序

发布时间: 2025-07-16 19:28:06

‘壹’ 编译原理全部的名词解释

书上有别那么懒!。。。。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法。
V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式。
2、一般,快速编译程序直接生成目标代码。
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言。
(2)便于移植,便于修改,便于进行与机器无关的优化。
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏。
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性。(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式。
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组。
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈。
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据)。
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。
优化原则:等价原则:经过优化后不应改变程序运行的结果。
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
合算原则:以尽可能低的代价取得较好的优化效果。
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。

给我分数啊。。。

‘贰’ 编译原理试题

习题一、单项选择题
1、将编译程序分成若干个“遍”是为了 。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2、构造编译程序应掌握 。
a.源程序 b.目标语言
c.编译方法 d.以上三项都是
3、变量应当 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、编译程序绝大多数时间花在 上。
a.出错处理 b.词法分析
c.目标代码生成 d.管理表格
5、 不可能是目标代码。
a.汇编指令代码 b.可重定位指令代码
c.绝对指令代码 d.中间代码
6、使用 可以定义一个程序的意义。
a.语义规则 b.词法规则
c.产生规则 d.词法规则
7、词法分析器的输入是 。
a.单词符号串 b.源程序
c.语法单位 d.目标程序
8、中间代码生成时所遵循的是- 。
a.语法规则 b.词法规则
c.语义规则 d.等价变换规则
9、编译程序是对 。
a.汇编程序的翻译 b.高级语言程序的解释执行
c.机器语言的执行 d.高级语言的翻译
10、语法分析应遵循 。
a.语义规则 b.语法规则
c.构词规则 d.等价变换规则
解答
1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3、对编译而言,变量既持有左值又持有右值,故选c。
4、编译程序打交道最多的就是各种表格,因此选d。
5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。
6、词法分析遵循的是构词规则,语法分析遵循的是语法规则,中间代码生成遵循的是语义规则,并且语义规则可以定义一个程序的意义。因此选a。
7、b 8、c 9、d 10、c
二、多项选择题
1、编译程序各阶段的工作都涉及到 。
a.语法分析 b.表格管理 c.出错处理
d.语义分析 e.词法分析
2、编译程序工作时,通常有 阶段。
a.词法分析 b.语法分析 c.中间代码生成
d.语义检查 e.目标代码生成
解答
1.b、c 2. a、b、c、e
三、填空题
1、解释程序和编译程序的区别在于 。
2、编译过程通常可分为5个阶段,分别是 、语法分析 、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是 ,最后阶段的输出为 程序。
4、编译程序是指将 程序翻译成 程序的程序。 解答
是否生成目标程序 2、词法分析 中间代码生成 3、源程序 目标代码生成 4、源程序 目标语言
一、单项选择题
1、文法G:S→xSx|y所识别的语言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的语言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限状态自动机能识别 。
a. 上下文无关文法 b. 上下文有关文法
c.正规文法 d. 短语文法
4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立 。
a. 若f(a)>g(b),则a>b b.若f(a)<g(b),则a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是无二义的,则它的任何句子α 。
a. 最左推导和最右推导对应的语法树必定相同
b. 最左推导和最右推导对应的语法树可能不同
c. 最左推导和最右推导必定相同
d. 可能存在两个不同的最左推导,但它们对应的语法树相同
6、由文法的开始符经0步或多步推导产生的文法符号序列是 。
a. 短语 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
则句型P+T+i的句柄和最左素短语为 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、设文法为:S→SA|A
A→a|b
则对句子aba,下面 是规范推导。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
则FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、产生正规语言的文法为 。
a. 0型 b. 1型 c. 2型 d. 3型
11、采用自上而下分析,必须 。
a. 消除左递归 b. 消除右递归 c. 消除回溯 d. 提取公共左因子
12、在规范归约中,用 来刻画可归约串。
a. 直接短语 b. 句柄 c. 最左素短语 d. 素短语
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按该文法G归约,其值为 。
a. 23 B. 42 c. 30 d. 17
14、规范归约指 。
a. 最左推导的逆过程 b. 最右推导的逆过程
c. 规范推导 d. 最左归约的逆过程
[解答]
1、选c。
2、选a。
3、选c。
4、虽然a与b没有优先关系,但构造优先函数后,a与b就一定存在优先关系了。所以,由f(a)>g)(b)或f(a)<g(b)并不能判定原来的a与b之间是否存在优先关系:故选c。
5、如果文法G无二义性,则最左推导是先生长右边的枝叶:对于d,如果有两个不同的是了左推导,则必然有二义性。故选a。
6、选c。
7、由图2-8-1的语法树和优先关系可以看出应选b。

8、规范推导是最左推导,故选d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此选c。
10、d 11、c 12、b 13、b 14、b
二、多项选择题
1、下面哪些说法是错误的 。
a. 有向图是一个状态转换图 b. 状态转换图是一个有向图
c.有向图是一个DFA d.DFA可以用状态转换图表示
2、对无二义性文法来说,一棵语法树往往代表了 。
a. 多种推导过程 b. 多种最左推导过程 c.一种最左推导过程
d.仅一种推导过程 e.一种最左推导过程
3、如果文法G存在一个句子,满足下列条件 之一时,则称该文法是二义文法。
a. 该句子的最左推导与最右推导相同
b. 该句子有两个不同的最左推导
c. 该句子有两棵不同的最右推导
d. 该句子有两棵不同的语法树
e.该句子的语法树只有一个
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不产生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的语法分析中,应从 开始分析。
a. 句型 b. 句子 c. 以单词为单位的程序
d. 文法的开始符 e. 句柄
6、对正规文法描述的语言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文无关文法 d.右线性文法 e.左线性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空题
1、文法中的终结符和非终结符的交集是 。词法分析器交给语法分析器的文法符号一定是 ,它一定只出现在产生式的 部。
2、最左推导是指每次都对句型中的 非终结符进行扩展。
3、在语法分析中,最常见的两种方法一定是 分析法,另一是 分析法。
4、采用 语法分析时,必须消除文法的左递归。
5、 树代表推导过程, 树代表归约过程。
6、自下而上分析法采用 、归约、错误处理、 等四种操作。
7、Chomsky把文法分为 种类型,编译器构造中采用 和 文法,它们分别产生 和 语言,并分别用 和 自动机识别所产生的语言。
解答 1、空集 终结符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、语法 分析
6、移进 接受
7、4 2 型 3型 上下文无关语言 正规语言 下推自动机 有限
四、判断题
1、文法 S→aS|bR|ε描述的语言是(a|bc)* ( )
R→cS
2、在自下而上的语法分析中,语法树与分析树一定相同。 ( )
3、二义文法不是上下文无关文法。 ( )
4、语法分析时必须先消除文法中的左递归。 ( )
5、规范归约和规范推导是互逆的两个过程。 ( )
6、一个文法所有句型的集合形成该文法所能接受的语言。 ( )
解答 1、对 2、错 3、错 4、错 5、错 6、错
五、简答题
1、句柄 2、素短语 3、语法树 4、归约 5、推导
[解答]
1、句柄:一个句型的最左直接短语称为该句型的句柄。
2、素短语:至少含有一个终结符的素短语,并且除它自身之外不再含任何更小的素短语。
3、语法树:满足下面4个条件的树称之为文法G[S]的一棵语法树。
①每一终结均有一标记,此标记为VN∪VT中的一个符号;
②树的根结点以文法G[S]的开始符S标记;
③若一结点至少有一个直接后继,则此结点上的标记为VN中的一个符号;
④若一个以A为标记的结点有K个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,XK,则A→X1,X2,…,XK,必然是G的一个产生式。
4、归约:我们称αγβ直接归约出αAβ,仅当A→γ 是一个产生式,且α、β∈(VN∪VT)*。归约过程就是从输入串开始,反复用产生式右部的符号替换成产生式左部符号,直至文法开始符。
5、推导:我们称αAβ直接推出αγβ,即αAβÞαγβ,仅当A→ γ 是一个产生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,则我们称这个序列是从α1至α2的一个推导。若存在一个从α1αn的推导,则称α1可推导出αn。推导是归约的逆过程。
六、问答题
1、给出上下文无关文法的定义。
[解答]
一个上下文无关文法G是一个四元式(VT,VN,S, P),其中:
●VT是一个非空有限集,它的每个元素称为终结符号;
●VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=Φ;
●S是一个非终结符号,称为开始符号;
●P是一个产生式集合(有限),每个产生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。开始符号S至少必须在某个产生式的左部出现一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?
[解答]
(1)由于产生式左部存在终结符号,且所有产生式左部符号的长度均小于等于产生式右部的符号长度,所以文法G[S]是Chomsky1型文法,即上下文有关文法。
(2)按产生式出现的顺序规定优先级由高到低(否则无法推出句子),我们可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
于是得到文法G[S]生成的语言L={anbncn|n≥1}
3、按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求该语言对应的上下文无关文法首先应有S→aSb型产生式,以保证b的个数不少于a的个数;其次,还需有S→Sb或S→bS型的产生式,用以保证b的个数多于a的个数;也即所求上下文无关文法G[S]为:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)写出句子acabcbbdcc的最左推导过程。
【解答】(1)分别画出对应两句型的语法树,如图2-8-2所示
句柄:AaB Bd

图2-8-2 语法树
(2)句子acabcbbdcc的最左推导如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、对于文法G[S]:
S→(L)|aS|a L→L, S|S
(1)画出句型(S,(a))的语法树。(2)写出上述句型的所有短语、直接短语、句柄和素短语。
【解答】
(1)句型(S,(a))的语法树如图2-8-3所示

(2)由图2-8-3可知:
①短语:S、a、(a)、S,(a)、(S,(a));
②直接短语:a、S;
③句柄:S;
④素短语:素短语可由图2-8-3中相邻终结符之间的优先关系求得,即;

因此素短语为a。
6、考虑文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
证明T*P↑(T*F)是该文法的一个句型,并指出直接短语和句柄。
【解答】
首先构造T*P↑(T*F)的语法树如图2-8-4所示。

由图2-8-4可知,T*P↑(T*F)是文法G[T]的一个句型。
直接短语有两个,即P和T*F;句柄为P。

一、单项选择题
1、词法分析所依据的是 。
a. 语义规则 b. 构词规则 c. 语法规则 d. 等价变换规则
2、词法分析器的输出结果是 。
a. 单词的种别编码 b. 单词在符号表中的位置
c. 单词的种别编码和自身值 d. 单词自身值
3、正规式M1和M2等价是指 。
a. M1和M2的状态数相等 b. M1和M2的有向弧条数相等
c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向弧条数相等
4、状态转换图(见图3-6-1)接受的字集为 。

a. 以 0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合
c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合
5、词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此, 。
a. 词法分析器应作为独立的一遍 b. 词法分析器作为子程序较好
c. 词法分析器分解为多个过程,由语法分析器选择使用 d. 词法分析器并不作为一个独立的阶段
解答 1、b 2、c 3、c 4、d 5、b
二、多项选择题
1、在词法分析中,能识别出 。
a. 基本字 b. 四元式 c. 运算符
d. 逆波兰式 e. 常数
2、令∑={a,b},则∑上所有以b开头,后跟若干个ab的字的全体对应的正规式为 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空题
1、确定有限自动机DFA是 的一个特例。
2、若二个正规式所表示的 相同,则认为二者是等价的。
3、一个字集是正规的,当且仅当它可由 所 。
解答 1、NFA 2、正规集 3、DFA(NFA)所识别
四、判断题
1、一个有限状态自动机中,有且仅有一个唯一终态。 ( )
2、设r和s分别是正规式,则有L(r|s)=L(r)|L(s)。 ( )
3、自动机M和M′的状态数不同,则二者必不等价。 ( )
4、确定的自动机以及不确定的自动机都能正确地识别正规集。 ( )
5、对任意一个右线性文法G,都存在一个NFA M,满足L(G)=L(M)。 ( )
6、对任意一个右线性文法G,都存在一个DFA M,满足L(G)=L(M)。 ( )
7、对任何正规表达式e,都存在一个NFA M,满足L(G)=L(e)。 ( )
8、对任何正规表达式e,都存在一个DFA M,满足L(G)=L(e)。 ( )
解答 1 、2、3、错 4、5、6、7、8、正确
五、基本题
1、设M=({x,y}, {a,b}, f,x,{y})为一非确定的有限自动机,其中f定义如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
试构造相应的确定有限自动机M′。
解答:对照自动机的定义M=(S,Σ,f,S0,Z),由f的定义可知f(x,a)、f(y,b)均为多值函数,所以是一非确定有限自动机,先画出NFA M相应的状态图,如图3-6-2所示。

用子集法构造状态转换矩阵表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
将转换矩阵中的所有子集重新命名而形成表3-6-4所示的状态转换矩阵。
表3-6-4 状态转换矩阵
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其状态转换图如图3-6-5所示。

将图3-6-5的DFA M′最小化。首先,将M′的状态分成终态组{1,2}与非终态组{0};其次,考察{1,2}。由于{1,2}a={1,2}b={2}⊂{1,2},所以不再将其划分了,也即整个划分只有两组{0},{1,2}:令状态1代表{1,2},即把原来到达2的弧都导向1,并删除状态2。最后,得到如图3-6-6所示化简DFA M′。

2、对给定正规式b*(d|ad)(b|ab)+,构造其NFA M;
解答:首先用A+=AA*改造正规式得:b*(d|ad)(b|ab)(b|ab)*;其次,构造该正规式的NFA M,如图3-6-7所示。

‘叁’ 学计算机专业要看哪些专业书

学计算机专业要看哪些专业书

计算机专业是一个大的门类,主要看你想学哪个专业方向。如果想学广告设计方面,可以从平面设计photoshop开始学;如果想学网络技术方面,可以选择一些网页编辑、动画方面的书缉;如果想学程序设计方面可以选java等方面书……
学习计算机读哪些书有什么用
1,高等数学:为了及格,同时帮助概率及格
2,概率:为了证明高等数学可以帮助及格
3,线性代数:如果你学习计算机图形学,就是opengl/direct3d的话,里面的3d模型的空间坐标用矩阵来表示的,如果你需要把它们进行投影,叠加,移动,就需要矩阵乘法/变换/转置等等,所以还是很有用的
4,离散数学:主要是给你打下计算机数据模型的理论基础。里面包含集合,数,图,等等,更重要的是如果你以后要搞研究,研究0错误程序,就是完全没有bug的程序,就需要用它上面的推导理论来对程序经行证明。如果你要通过系统分析员,这个也是要考试的
5,数字电路/计算机组成/计算机技术:如果你是一个很深入的程序员,你会问:为什么浏览器可以显示那么多东西->有语言->语言是怎么开发的->高级语言->高级语言怎么完成的->汇编->汇编怎么来的->固化/机器语言->机器语言如何能操纵计算机->在节拍电路的干预下,内部芯片的结构把0/1字符串译码,操作累加器,总线,内存做不同的操作那好,这个过程差一个东西都不可以,如果你只学习里面的高级语言部分,那岂不是神龙见首不见尾,感觉很不爽???所以你要能自己做一个计算机出来才好!
数字电路是学习门电路组成的,就是如何把流动的电信号保持下来,同时让他们有规律地变化

计算机组成是让你用门电路来设计内存/cup/时钟等等

计算机技术是让你综合学到的东西,做一个简单的计算机出来。

有了哪些知识,当然还要包括编译原理,软件工程,操作系统,数据库,网络,你学习其他的语言,什么vc/vb/deliphi等等,每种语言不超过3个月你就是高手。你要学windows程序,要用api,只需要15天就可以作出像模像样的东西。当然,我这里是指语言本身而言。有了这些基础和语言掌握的熟练,你想学数据库编程,好,复习一下数据库的课程,查阅一下sql的语法,1天就有眉目了。你要学网络编程,选择一种库,看看文档,明白函数的用法,也就是一两天的问题。等你做出点东西,有了信心,你也就有了经验。这个时候去明白j2ee/. 等等的frame work,就很容易了。参看以下design pattern,你也就胸有成竹,做个小组长也可以。再过几年,有了机会,说不定就当了manager,等了到了三十多岁,你不想干软件了,你有计算机组成的基础,找几个高手带你一下,你可以去做单片机的汇编语言编程,可以去做embeded system
所以,学好了基础,也就是厚积薄发,后面你想怎么发展都可以!

学了数字电路才知道,原来很神秘的电脑是由一些触发器,逻辑门组成的,把它们集成再集成,就成了电脑了,译码器,全加器,计数器......
CMOS不过就是一种存储器,BIOS不过就是面向硬件的一种已编好的子程序,(和C的库函数差不多,我认为)学好了汇编,我可以自己编(还让我花了30人民币,买了一本CMOS设置书,认为它很高深莫测)

不学好C,怎么学好WINDOWS程序设计,怎么能做一个优秀的程序设计人员
不学好前人花几十年时间总结出来的数据结构,你的进步能有多快,那是让你踩在巨人的肩膀上。(你要是天才,我就没话说了,不过要是学了,你会更天才)

这是我自己经历的一点学习基础课的过程,它给我解疑释惑,当然这些问题在行家眼里可能不值一哂,但它是每一个新手必经的过程。
更为关键的是,基础课给了我们最核心的知识,让我们能在离开学校后有继续学习的能力。它给了我们一个知识结构,让我们能在他的基础上扩充,把新的东西加入自己的知识框架中,这是基础课重要的意义所在。很多人提到基础学好之后,学习新东西很快,就是这个道理。
不可否认的是,基础课很枯燥,很费劲。但这要看你怎么去看它,你想一想,学好了他,就能抓到计算机的本质,能让他对你俯首帖耳,这难道还不够激动人心吗?老在别人的基础之上作设计,却不懂所以然,不闷吗?
既然讨论的题目是给在校大学生一点建议,那我也说一点儿。

先说技术层面的,在学好专业课的基础上看一些学校里不讲的新知识,新技术,能促进你的融会贯通,但不可本末倒置。

再说最关键的,最想说的,请在校的学生们珍惜你的时光,不要都去打了游戏,谈了恋爱,时光宝贵,机会难得。
我经常对自己说,如果再让我上一次学,我会......
可是不会了,我只好对自己说,如果我现在再不学,就会......
于是我努力去学,边工作,边学习,舍不得丢掉一节课,在校的学生们可能无法体会听老师讲课的幸福,自学时怎么也搞不清的东西,老师一句话就茅塞顿开,老师那清晰的思路也让你受益匪浅(在这里应该感谢那些老师们,虽然他们有些时候的简略很让人恼火)。但越学,心里越没底,有太多的东西我都没学好,更有很多东西根本就不知道,正所谓皓首穷经。
我不时的咒骂自己的懒惰,也许是过于愚笨,努力不够,学习计算机也有三年多了,直到现在,我才觉得自己开始了解计算机,才明确了方向。
我从文科转入这一专业,而且也不小了,就凭着我对计算机有着强烈的兴趣。他是人类智慧的体现,程序设计更是一种艺术,他能让我们的才华得到充分发挥,我会继续努力下去的,虽然有些迟了,但为了不更迟。
希望在校的学生们能多珍惜一些时间,不要比我还迟。

下来如果觉得自己接受能力强的话就可以开始学c语言了(注意不是C++),如果感觉有困难也可以先学Pascal过度一下。还有很重要的一点就是千万不要一开始就学VB,DELPHI,VC之类的东西,这些东西在一开始学会对你造成很坏的影响。有可能会把你引入另外一个错误的学习方向而忽略了真正应该掌握的东西。学C主要是学过程话的程序设计,学会把自己的程序分成许多的函数(或过程),养成良好的编程习惯。这时可以多看一下高人的程序,不一定要懂意思,主要是学会别人程序的格式(比如变量如何起名,怎么划分函数)。除开掌握基本的控制流语句外,应该学习一些很简单的I/O函数和数学函数。C的学习主要是你舍弃原来BASIC程序那种把所有语句积成一大堆的风格,要学会使用函数,提高代码重用性。对于指针之类的东西如果实在看不懂可以先不去管,到后面会有办法。当你能够比较自如的用C编写一些小的计算程序时,你就可以开始你的数据结构的学习了(数学的学习主要是在学校,自己要多用心)。数据结构你可以一点一点漫漫看,并不需要专门空出一段时间来专门研究,这样的目的是让你能够很好的掌握它,要学会用数据结构的知识来规范自己的程序设计和提高程序的效率。学完C我认为接着最好学习汇编。这个或许有许多人都会反对,然而我个人认为这样是很好的。从最基本的DOS汇编开始,买本《IBM PC汇编程序设计》(清华黄皮)一定要一点一点吃透,实在看不懂就跳,反复的严读是一定可以看懂的。汇编是一定要掌握的,因为它涉及到很多最基本的知识。掌握了汇编和对I/O有了个很彻底的认识后,应该去学编译原理。这个东西并不要精通,但是一定要知道,在大脑里要有一个这样的概念,这对你对程序语言的控制能力都有很大的帮助。这样最基本的学习就算完成了。一般智力正常的人前一段东西应该都是可以掌握的。接着后面的学习就要看你自身的造化了。这个时候你应该研究一下数据结构,不要分散自己学习的注意力,要知道数据结构是异常重要的(相信我,绝对没错)如果你觉得自己已经对于树,连表,堆栈之类的东西和排序,递归之类的算法已经十分清楚,就可以开始学习C++了。学习前一定要有个正确的认识,那就是C和C++是两个不同的东西。学习C++是为了学习面向对象的程序设计,这个时候你对于指针应该也能够掌握了(有汇编的基础),主要抓住C++和C相比的一些新特性,对于多态之类的特性要注意理解掌握,如果没有搞懂就坚决不要往下学习。一些基本的概念掌握以后可以看一些别人设计的程序,学习别人怎么利用面向对象的方法来设计程序的。这个东西也是人之间拉开档次的一个环节,可以和数据结构放在同等重要的地位。我就见过有的人都大学毕业了还搞不懂virtual到底是怎么一回事情。其实我认为学到这里你已经为你成为一个优秀的程序员打下了很好的基础,你已经能够应用C++,懂得面向对象程序设计,对数据结构掌握很好,掌握汇编和编译原理。接下来的学习就是基于操作系统平台的了,一般是先学windows(Microsoft毕竟是老大),先学win32 api,搞请windows基本消息机制和原理,有汇编基础基本上不会碰到什么困难。
其实只要会了API,其余什么MFC,VCL都是囊中之物了,都不过是对于API的封装而已。VC,C++Builder都可轻松拿下,这只是开发工具的问题。以后的OLE(ActiveX),.NET,数据库就要看自己的发展方向而定了。我在这里强调的是前面的基本能力的学习,后面操作平台虽然知识体系庞大,然而毕竟比较死,更好掌握。最后编程能力的高低主要还是有以下几点决定:1。编程的习惯 2。数学能力(包括逻辑思维,分析问题的能力) 3。对数据结构的认识能力 4。经验的多少(包括多使用语言的掌握能力)
学习编程的道路是充满艰辛,漫长而曲折的,作者罗列了一堆自己知道的编程方面的知识,并且给出了一个具体的顺序,所谓先学什么,后学什么;没学会什么,就一定不要去学另一个什么.....其中很多内容有一些道理。但是总是难逃片面。

从入门到精通一类的东西看的太多了,难道真的凭借一本书就能从一个电脑盲编程精通的专家了么。我郑重的建议那些想“速成”高手的人,放弃你的想法吧。一个计算机专业的本科生,要花上4年时间才能毕业,需要学习的专业知识岂是一朝一夕就能掌握的。就算去除一些公共课所占用的时间,我觉得要入计算机行业这个“门”,至少需要两年的时间。两年后才能说,对计算机有一些了解了,知道了计算机的基本组成原理,对时钟晶振,中断芯片有一定了解,用汇编简单控制8259编程。也知道了一些计算机程序设计语言方面的原理,掌握了一俩门传统的样板编程语言,了解了i++和++i对于VC的编译器来说意味着什么,有了一些数据结构方面的认识,能把现实生活中的一些问题用程序模拟出来。

但这一切也不过是刚刚入门而已,只是打基础。至于以后再学习Windows系统原理,消息机制,掌握这个类库,那个类库;抑或是研究linux内核,进而了解嵌入式系统开发工具和方法,那要看个人喜好了。我只是举几个例子,但是随便那个,要敢说自己已经完全掌握,至少还要几年吧。

如果上面的东西中有的已经很精通了,可以称为专家了,那么恭喜你,你可以考虑把这些东西再总结,提升一个层次,从系统架构角度回顾一下要实现某个需求,通常需要使用什么技术,多少人,多长时间来开发,成本多少,收益多少,风险又有多少,还可以总结出一些控制软件开发进度的方法,生成软件的方法,人们把这些方法归纳起来叫做软件工程。而你,也应该是一个项目经理了吧。

如果这些东西都学会了,再次恭喜你,你可以考虑能不能把现有的客户拉到自己身边来,找个人给自己投资,成立自己的软件公司。成为浩浩荡荡的软件创业者中微不足道的一员。

自学了VB,VC,数据结构,离散,操作系统,数据库原理等。
开学以来做完了数字图像处理的所有的实验--有个别实验还是很难的。我从paperVC++被逼--也算是熟练(离精通差远了)而系里其他的同学却没有一个自己全部编出来的,都是抄书的。但并不能说明他们的计算机水平都差,比起编程水平,我更佩服那些真正计算机专家--尽管他们不编程。但是他们的研究成果往往大大帮助我们编程,很多编程思想都是他们过去的研究成果!我们就算编出来了--也就是说明我们有点小聪明,但决不可以和系统完备的大智慧相比!就像我们可以利用数学定理计算一些复杂的数学题目一样,这没什么了不起--真正了不起了还是那些定理提出者,和证明者。这一个学期前我一直想好好地把编程好好学学,可是越来越觉得数学功底不足(当然不仅仅只高数)。现在真佩服那些数学家!真正的计算机专家!过去学数据结构时,八皇后,背包,搜索--一直令人头疼,好像懂,但不爽,记不住。在一个专家(图灵奖获得者)的看似简单思想的指引下--这些算法统一到了一起-------一切似乎都那么明了!显然如果你编程的话也提高编成的水平。还有记得学数据库原理,开始那段自己在没有规则指引的条件下想理清楚各种事物的关系时,是那么的混乱。而有了armstrong公理系统的三条规则---世界就一下子变得清晰!--这个最好的程序员能做到吗,他也只能每次遇到具体问题,每次发挥它聪明去理关系,也难保不出错,还要累死大量脑细胞!
既然读研究生,重点在思想。但我有自知之明,我们那么好的功底,也许以后就是编编程序,难弄出这种精华的东西,但是注重思想的学习-会对学具体知识起到巨大指导作用。所以我不会觉得编程水平低的就不行--很可能比程序高手的价值高很多倍!
但迫于个人造诣和以后就业的压力,还是把流行技术性的东西掌握一下好。
说到底,要想成为优秀的程序员,还是要注重基本理论的学习。

终于点到题目上来了。大多数的人都希望自己的东西能够马上跑起来,变成钱。这种想法对一个已经进入职业领域的程序员或者项目经理来说是合理的,而且IT技术进步是如此的快,不跟进就是失业。但是对于初学者来说(尤其是时间充裕的大中专在校生),这种想法是另人费解的。一个并未进入到行业竞争中来的初学者最大的资本便是他有足够的时间沉下心来学习基础性的东西,学习why 而不是how。时髦的技术往往容易掌握,而且越来越容易掌握,这是商业利益的驱使,为了最大化的降低软件开发的成本。但在IT领域内的现实就是这样,越容易掌握的东西,学习的人越多,而且淘汰得越快。每一次新的技术出来,都有许多初学者跟进,这些初学者由于缺乏必要的基础而使得自己在跟进的过程中花费大量的时间,而等他学会了,这种技术也快淘汰了。基础的课程,比方数据结构,操作系统原理等等虽然不能让你立马就实现一个linux(这是许多人嘲笑理论课程无用的原因),但它们能够显着的减少你在学习新技术时学习曲线的坡度。而且对于许多关键的技术(比方Win32 SDK 程序的设计,DDK的编程)来说甚至是不可或缺的。

一个活生生的例子是我和我的一个同学,在大一时我还找不到开机按纽,他已经会写些简单的汇编程序了。我把大二的所有时间花在了汇编,计算机体系结构,数据结构,操作系统原理等等这些课程的学习上,而他则开始学习HTML和VB,并追赶ASP的潮流。大三的时候我开始学习Windows 操作系统原理,学习SDK编程,时间是漫长的,这时我才能够用VC开发出象模象样的应用程序。我曾一度因为同学的程序已经能够运行而自己还在学习如何创建对话框而懊恼不已,但临到毕业才发现自己的选择是何等的正确。和我谈判的公司开出的薪水是他的两倍还多。下面有一个不很恰当的比方:假设学习VB编程需要4个月,学习基础课程和VC的程序设计需要1年。那么如果你先学VB,再来学习后者,时间不会减少,还是1年,而反过来,如果先学习后者,再来学VB,也许你只需要1个星期就能学得非常熟练。
几个重要的基础课程

计算机操作系统原理-我们的开发总是在特定的操作系统上进行,如果不是,只有一种可能:你在自己实现一个操作系统。无论如何,操作系统原理是必读的。这就象我们为一个芯片制作外围设备时,芯片基本的工作时序是必需了解的。这一类书也很多,我没有发现哪一本书非常出众。只是觉得在看完了这些书后如果有空就应该看看《Inside Windows 2000》(微软出版社,我看的是E文版的,中文的书名想必是Windows 2000 技术内幕之类吧)。关于学习它的必要性,ZDNET上的另一篇文章已经有过论述。

数据结构和算法-这门课程能够决定一个人程序设计水平的高低,是一门核心课程。我首选的是清华版的(朱战立,刘天时)。很多人喜欢买C++版的,但我觉得没有必要。C++的语法让算法实现过程变得复杂多了,而且许多老师喜欢用模块这一东西让算法变得更复杂。倒是在学完了C版的书以后再来浏览一下C++的版的书是最好的。

软件工程-这门课程是越到后来就越发现它的重要,虽然刚开始看时就象看马哲一样不知所云。我的建议是看《实用软件工程》(黄色,清华)。不要花太多的时间去记条条框框,看不懂就跳过去。在每次自己完成了一个软件设计任务(不管是练习还是工作)以后再来回顾回顾,每次都会有收获。

Windows 程序设计-《北京大学出版社,Petzold着》我建议任何企图设计Windows 程序的人在学习VC以前仔细的学完它。而且前面的那本《Inside Windows 2000》也最好放到这本书的后面读。在这本书中,没有C++,没有GUI,没有控件。有的就是如何用原始的C语言来完成Windows 程序设计。在学完了它以后,你才会发现VC其实是很容易学的。千万不要在没有看完这本书以前提前学习VC,你最好碰都不要碰。我知道的许多名校甚至都已经用它作为教材进行授课。可见其重要。

上面的几门课程我认为是必学的重要课程(如果你想做Windows 程序员)。

对于其它的课程有这样简单的选择方法:如果你是计算机系的,请学好你所有的专业基础课。如果不是,请参照计算机系的课程表。如果你发现自己看一本书时无法看下去了,请翻到书的最后,看看它的参考文献,找到它们并学习它们,再回头看这本书。如果一本书的书名中带有“原理”两个字,你一定不要去记忆它其中的细节,你应该以一天至少50页的速度掌握其要领。尽可能多的在计算机上实践一种理论或者算法。

你还可以在CSDN上阅读到许多书评。这些书评能够帮助你决定读什么样的书。

日三省乎己
每天读的书太多,容易让人迷失方向。一定要在每天晚上想想自己学了些什么,还有些什么相关的东西需要掌握,自己对什么最感兴趣,在一本书上花的时间太长还是不够等等。同时也应该多想想未来最有可能出现的应用,这样能够让你不是追赶技术潮流而是引领技术潮流。同时,努力使用现在已经掌握的技术和理论去制作具有一定新意的东西。坚持这样做能够让你真正成为一个软件“研发者”而不仅仅是一个CODER。

把最多的时间花在学习上
这是对初学者最后的忠告。把每个星期玩SC或者CS的时间压缩到最少,不玩它们是最好的。同时,如果你的ASP技术已经能够来钱,甚至有公司请你 *** 的话,这就证明你的天份能够保证你在努力的学习之后取得更好的收益,你应该去做更复杂的东西。眼光放长远一些,这无论是对谁都是适用的。

相信你已经能够决定是否学习C#或者什么时候去学它了。

学计算机专业的需要看哪些书籍呢?

高中起点计算机本科:
1. 计算机科学与技术专业:C语言程序设计、计算机组成原理、数据结构、操作系统、
微机原理及汇编语言、计算机网络、计算机系统结构、软件工程、面向对象程序设计等。
2. 计算机软件专业:面向对象程序设计、计算机组成原理、操作系统、数据结构、计算
机网络、软件工程、编译原理、分布式系统、软件项目管理、Oracle数据库系统等。
3. 电子商务专业:管理学原理、电子商务、物流管理、计算机网络、供应链管理、电子商务平台及核心技术、国际商务管理、电子商务案例分析、商务网站建设等。
专科起点计算机本科:
1. 计算机科学与技术专业:计算机组成原理、数据结构、面向对象程序设计、操作系统、计算机系统结构、软件工程、数据库原理及应用、计算机网络、嵌入式系统与结构等。
2. 计算机软件专业:操作系统、数据结构、面向对象程序设计、计算机原理及系统结构、数据库系统、JAVA程序设计、计算机网络、软件工程、中间件技术、信息系统集成等。
3. 电子商务专业:管理学原理、数据库原理及应用、管理信息系统、金融学、电子商务平台及核心技术、物流管理、计算机网络、人力资源管理、供应链管理等。

自考计算机专业该看哪些书呢

自考计算机专业的科目你可以到当地的自学考试办公室买一本《自学考试报考指南》,里面你所在省的所有自考专业及科目都有!

学计算机专业的都有哪些专业书本?

c语言 c++ java(谭浩强的不错) ~~~~~~~~~~~~~~~操作系统,数据结构,linux,软件基础,计算机网络(自顶向下那本不错)~~~~~~~~~~~~~

大学计算机专业应该看哪些书

作为过来人,我建议你应该先好好保持英语,至于计算机专业方面的书籍,现在没必要去看,看看计算机概论就够了,了解计算机的构造,现在可以想想你要走什么方向,计算机领域很广,要是全部按照学校的授课方式,你什么都要去学,但是后果是你什么都不精通,找工作没有丝毫用处。建议你选好具体方向,然后专门研究那个方向,当然,知识嘛,多多益善,但是要有主次

非计算机专业自学计算机编程入门需要看哪些书?

首先计算机基础要弄清楚,如果对计算机很熟悉,这个可以跳过。
之后是最重要的,就是C语言。基本上计算机编程都是C语言,有的就算不是,一理通百理,学好了C语言,其他的都不在话下。这个是最重要的。
然后是数据库,这个和C语言来说,就相当简单了。

急!计算机专业考公务员的话考些什么内容,还有要看哪些专业书??

国家公务员考试科目:
1. 内容。公共科目包括行政职业能力测验和申论两科。有关情况详见《中央机关及其直属机构2016年度考试录用公务员公共科目考试大纲》。
报考中央对外联络部、外交部、教育部、商务部、国家外国专家局、全国友协、中国贸促会等部门日语、法语、俄语、西班牙语、阿拉伯语、德语、朝鲜语(韩语)等7个非通用语职位的人员,还将参加外语水平考试,考试大纲请在相关招录部门网站查询。
报考中国银监会及其派出机构、中国证监会及其派出机构特殊专业职位的人员,还将参加专业考试,考试大纲请在考录专题网站,中国银监会、中国证监会网站分别查询。
省公务员考试:大多数省份是考公共科目包括行政职业能力测验和申论两科。

辽宁移动计算机专业面试需要看哪些书,计算机专业面试主要考哪些题?万分感谢!

本人广东移动员工。数据库、还有JAVA和C++语言很重要!另外,掌握基本的测试原理和技术也会帮助不少。
移动校招录取的学历一般要求研究生以上,当然大牛的本科生也会考虑!
移动目前最缺牛的系统架构师!不是哪个省缺,我能告诉你全网都缺!
所以如果有系统项目经验,会加分不少!
希望能帮到你!

非计算机专业学习JAVA看哪些书

零基础学Java》和 《JAVA编程基础、应用与实例》

要学计算机专业需要了解哪些知识?需要看哪些书?

计算机也有很多专业,比如软件工程、硬件方面的、网络工程、或者是综合的计算机科学与技术。等等。看书,想计算机体系结构,操作系统什么的。

‘肆’ 编译原理题目

习题一、单项选择题
1、将编译程序分成若干个“遍”是为了 。
a.提高程序的执行效率
b.使程序的结构更加清晰
c.利用有限的机器内存并提高机器的执行效率
d.利用有限的机器内存但降低了机器的执行效率
2、构造编译程序应掌握 。
a.源程序 b.目标语言
c.编译方法 d.以上三项都是
3、变量应当 。
a.持有左值 b.持有右值
c.既持有左值又持有右值 d.既不持有左值也不持有右值
4、编译程序绝大多数时间花在 上。
a.出错处理 b.词法分析
c.目标代码生成 d.管理表格
5、 不可能是目标代码。
a.汇编指令代码 b.可重定位指令代码
c.绝对指令代码 d.中间代码
6、使用 可以定义一个程序的意义。
a.语义规则 b.词法规则
c.产生规则 d.词法规则
7、词法分析器的输入是 。
a.单词符号串 b.源程序
c.语法单位 d.目标程序
8、中间代码生成时所遵循的是- 。
a.语法规则 b.词法规则
c.语义规则 d.等价变换规则
9、编译程序是对 。
a.汇编程序的翻译 b.高级语言程序的解释执行
c.机器语言的执行 d.高级语言的翻译
10、语法分析应遵循 。
a.语义规则 b.语法规则
c.构词规则 d.等价变换规则
解答
1、将编译程序分成若干个“遍”是为了使编译程序的结构更加清晰,故选b。
2、构造编译程序应掌握源程序、目标语言及编译方法等三方面的知识,故选d。
3、对编译而言,变量既持有左值又持有右值,故选c。
4、编译程序打交道最多的就是各种表格,因此选d。
5、目标代码包括汇编指令代码、可重定位指令代码和绝对指令代码3种,因此不是目标代码的只能选d。
6、词法分析遵循的是构词规则,语法分析遵循的是语法规则,中间代码生成遵循的是语义规则,并且语义规则可以定义一个程序的意义。因此选a。
7、b 8、c 9、d 10、c
二、多项选择题
1、编译程序各阶段的工作都涉及到 。
a.语法分析 b.表格管理 c.出错处理
d.语义分析 e.词法分析
2、编译程序工作时,通常有 阶段。
a.词法分析 b.语法分析 c.中间代码生成
d.语义检查 e.目标代码生成
解答
1.b、c 2. a、b、c、e
三、填空题
1、解释程序和编译程序的区别在于 。
2、编译过程通常可分为5个阶段,分别是 、语法分析 、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是 ,最后阶段的输出为 程序。
4、编译程序是指将 程序翻译成 程序的程序。 解答
是否生成目标程序 2、词法分析 中间代码生成 3、源程序 目标代码生成 4、源程序 目标语言
一、单项选择题
1、文法G:S→xSx|y所识别的语言是 。
a. xyx b. (xyx)* c. xnyxn(n≥0) d. x*yx*
2、文法G描述的语言L(G)是指 。
a. L(G)={α|S+ ⇒α , α∈VT*} b. L(G)={α|S*⇒α, α∈VT*}
c. L(G)={α|S*⇒α,α∈(VT∪VN*)} d. L(G)={α|S+ ⇒α, α∈(VT∪VN*)}
3、有限状态自动机能识别 。
a. 上下文无关文法 b. 上下文有关文法
c.正规文法 d. 短语文法
4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立 。
a. 若f(a)>g(b),则a>b b.若f(a)<g(b),则a<b
c. a~b都不一定成立 d. a~b一定成立
5、如果文法G是无二义的,则它的任何句子α 。
a. 最左推导和最右推导对应的语法树必定相同
b. 最左推导和最右推导对应的语法树可能不同
c. 最左推导和最右推导必定相同
d. 可能存在两个不同的最左推导,但它们对应的语法树相同
6、由文法的开始符经0步或多步推导产生的文法符号序列是 。
a. 短语 b.句柄 c. 句型 d. 句子
7、文法G:E→E+T|T
T→T*P|P
P→(E)|I
则句型P+T+i的句柄和最左素短语为 。
a.P+T和i b. P和P+T c. i和P+T+i d.P和T
8、设文法为:S→SA|A
A→a|b
则对句子aba,下面 是规范推导。
a. SÞSAÞSAAÞAAAÞaAAÞabAÞaba
b. SÞSAÞSAAÞAAAÞAAaÞAbaÞaba
c. SÞSAÞSAAÞSAaÞSbaÞAbaÞaba
d. SÞSAÞSaÞSAaÞSbaÞAbaÞaba
9、文法G:S→b|∧(T)
T→T,S|S
则FIRSTVT(T) 。
a. {b,∧,(} b. {b,∧,)} c.{b,∧,(,,} d.{b,∧,),,}
10、产生正规语言的文法为 。
a. 0型 b. 1型 c. 2型 d. 3型
11、采用自上而下分析,必须 。
a. 消除左递归 b. 消除右递归 c. 消除回溯 d. 提取公共左因子
12、在规范归约中,用 来刻画可归约串。
a. 直接短语 b. 句柄 c. 最左素短语 d. 素短语
13、有文法G:E→E*T|T
T→T+i|i
句子1+2*8+6按该文法G归约,其值为 。
a. 23 B. 42 c. 30 d. 17
14、规范归约指 。
a. 最左推导的逆过程 b. 最右推导的逆过程
c. 规范推导 d. 最左归约的逆过程
[解答]
1、选c。
2、选a。
3、选c。
4、虽然a与b没有优先关系,但构造优先函数后,a与b就一定存在优先关系了。所以,由f(a)>g)(b)或f(a)<g(b)并不能判定原来的a与b之间是否存在优先关系:故选c。
5、如果文法G无二义性,则最左推导是先生长右边的枝叶:对于d,如果有两个不同的是了左推导,则必然有二义性。故选a。
6、选c。
7、由图2-8-1的语法树和优先关系可以看出应选b。

8、规范推导是最左推导,故选d。
9、由T→T,…和T→(… 得FIRSTVT(T))={(,,)};
由T→S得FIRSTVT(S)⊂FIRSTVT(T),而FIRSTVT(S)={b,∧,(};即
FIRSTVT(T)={b,∧,(,,}; 因此选c。
10、d 11、c 12、b 13、b 14、b
二、多项选择题
1、下面哪些说法是错误的 。
a. 有向图是一个状态转换图 b. 状态转换图是一个有向图
c.有向图是一个DFA d.DFA可以用状态转换图表示
2、对无二义性文法来说,一棵语法树往往代表了 。
a. 多种推导过程 b. 多种最左推导过程 c.一种最左推导过程
d.仅一种推导过程 e.一种最左推导过程
3、如果文法G存在一个句子,满足下列条件 之一时,则称该文法是二义文法。
a. 该句子的最左推导与最右推导相同
b. 该句子有两个不同的最左推导
c. 该句子有两棵不同的最右推导
d. 该句子有两棵不同的语法树
e.该句子的语法树只有一个
4、有一文法G:S→AB
A→aAb|ε
B→cBd|ε
它不产生下面 集合。
a. {anbmcndm|n,m≥0} b. {anbncmdm|n,m>0}
c. {anbmcmdn|n,m≥0} d. {anbncmdm|n,m≥0}
e. {anbncndn|n≥0}
5、自下而上的语法分析中,应从 开始分析。
a. 句型 b. 句子 c. 以单词为单位的程序
d. 文法的开始符 e. 句柄
6、对正规文法描述的语言,以下 有能力描述它。
a.0型文法 b.1型文法 c.上下文无关文法 d.右线性文法 e.左线性文法
解答 1、e、a、c 2、a、c、e 3、b、c、d 4、a、c 5、b、c 6、a、b、c、d、e
三、填空题
1、文法中的终结符和非终结符的交集是 。词法分析器交给语法分析器的文法符号一定是 ,它一定只出现在产生式的 部。
2、最左推导是指每次都对句型中的 非终结符进行扩展。
3、在语法分析中,最常见的两种方法一定是 分析法,另一是 分析法。
4、采用 语法分析时,必须消除文法的左递归。
5、 树代表推导过程, 树代表归约过程。
6、自下而上分析法采用 、归约、错误处理、 等四种操作。
7、Chomsky把文法分为 种类型,编译器构造中采用 和 文法,它们分别产生 和 语言,并分别用 和 自动机识别所产生的语言。
解答 1、空集 终结符 右
2、最左
3、自上而上 自下而上
4、自上而上
5、语法 分析
6、移进 接受
7、4 2 型 3型 上下文无关语言 正规语言 下推自动机 有限
四、判断题
1、文法 S→aS|bR|ε描述的语言是(a|bc)* ( )
R→cS
2、在自下而上的语法分析中,语法树与分析树一定相同。 ( )
3、二义文法不是上下文无关文法。 ( )
4、语法分析时必须先消除文法中的左递归。 ( )
5、规范归约和规范推导是互逆的两个过程。 ( )
6、一个文法所有句型的集合形成该文法所能接受的语言。 ( )
解答 1、对 2、错 3、错 4、错 5、错 6、错
五、简答题
1、句柄 2、素短语 3、语法树 4、归约 5、推导
[解答]
1、句柄:一个句型的最左直接短语称为该句型的句柄。
2、素短语:至少含有一个终结符的素短语,并且除它自身之外不再含任何更小的素短语。
3、语法树:满足下面4个条件的树称之为文法G[S]的一棵语法树。
①每一终结均有一标记,此标记为VN∪VT中的一个符号;
②树的根结点以文法G[S]的开始符S标记;
③若一结点至少有一个直接后继,则此结点上的标记为VN中的一个符号;
④若一个以A为标记的结点有K个直接后继,且按从左至右的顺序,这些结点的标记分别为X1,X2,…,XK,则A→X1,X2,…,XK,必然是G的一个产生式。
4、归约:我们称αγβ直接归约出αAβ,仅当A→γ 是一个产生式,且α、β∈(VN∪VT)*。归约过程就是从输入串开始,反复用产生式右部的符号替换成产生式左部符号,直至文法开始符。
5、推导:我们称αAβ直接推出αγβ,即αAβÞαγβ,仅当A→ γ 是一个产生式,且α、β∈(VN∪VT)*。如果α1Þα2Þ…Þαn,则我们称这个序列是从α1至α2的一个推导。若存在一个从α1αn的推导,则称α1可推导出αn。推导是归约的逆过程。
六、问答题
1、给出上下文无关文法的定义。
[解答]
一个上下文无关文法G是一个四元式(VT,VN,S, P),其中:
●VT是一个非空有限集,它的每个元素称为终结符号;
●VN是一个非空有限集,它的每个元素称为非终结符号,VT∩VN=Φ;
●S是一个非终结符号,称为开始符号;
●P是一个产生式集合(有限),每个产生式的形式是P→α,其中,P∈VN,
α∈(VT∪VN)*。开始符号S至少必须在某个产生式的左部出现一次。
2、文法G[S]:
S→aSPQ|abQ
QP→PQ
bP→bb
bQ→bc
cQ→cc
(1)它是Chomsky哪一型文法?
(2)它生成的语言是什么?
[解答]
(1)由于产生式左部存在终结符号,且所有产生式左部符号的长度均小于等于产生式右部的符号长度,所以文法G[S]是Chomsky1型文法,即上下文有关文法。
(2)按产生式出现的顺序规定优先级由高到低(否则无法推出句子),我们可以得到:
SÞabQÞabc
SÞaSPQÞaabQPQÞaabPQQÞaabbQQÞaabbcQÞaabbcc
SÞaSPQÞaaSPQPQÞaaabQPQPQÞaaabPQQPQÞaaabPQPQQÞaaaPPQQQÞ
aaabbPqqqÞaaabbQQQÞaaabbbcQQÞaaabbbccQÞaaabbbccc
……
于是得到文法G[S]生成的语言L={anbncn|n≥1}
3、按指定类型,给出语言的文法。
L={aibj|j>i≥1}的上下文无关文法。
【解答】
(1)由L={aibj|j>i≥1}知,所求该语言对应的上下文无关文法首先应有S→aSb型产生式,以保证b的个数不少于a的个数;其次,还需有S→Sb或S→bS型的产生式,用以保证b的个数多于a的个数;也即所求上下文无关文法G[S]为:
G[S]:S→aSb|Sb|b
4、有文法G:S→aAcB|Bd
A→AaB|c
B→bScA|b
(1)试求句型aAaBcbbdcc和aAcbBdcc的句柄;
(2)写出句子acabcbbdcc的最左推导过程。
【解答】(1)分别画出对应两句型的语法树,如图2-8-2所示
句柄:AaB Bd

图2-8-2 语法树
(2)句子acabcbbdcc的最左推导如下:
SÞaAcBÞaAaBcBÞacaBcBÞacabcBÞacabcbScAÞacabcbBdcA
ÞacabcbbdcAÞacabcbbdcc
5、对于文法G[S]:
S→(L)|aS|a L→L, S|S
(1)画出句型(S,(a))的语法树。(2)写出上述句型的所有短语、直接短语、句柄和素短语。
【解答】
(1)句型(S,(a))的语法树如图2-8-3所示

(2)由图2-8-3可知:
①短语:S、a、(a)、S,(a)、(S,(a));
②直接短语:a、S;
③句柄:S;
④素短语:素短语可由图2-8-3中相邻终结符之间的优先关系求得,即;

因此素短语为a。
6、考虑文法G[T]:
T→T*F|F
F→F↑P|P
P→(T)|i
证明T*P↑(T*F)是该文法的一个句型,并指出直接短语和句柄。
【解答】
首先构造T*P↑(T*F)的语法树如图2-8-4所示。

由图2-8-4可知,T*P↑(T*F)是文法G[T]的一个句型。
直接短语有两个,即P和T*F;句柄为P。

一、单项选择题
1、词法分析所依据的是 。
a. 语义规则 b. 构词规则 c. 语法规则 d. 等价变换规则
2、词法分析器的输出结果是 。
a. 单词的种别编码 b. 单词在符号表中的位置
c. 单词的种别编码和自身值 d. 单词自身值
3、正规式M1和M2等价是指 。
a. M1和M2的状态数相等 b. M1和M2的有向弧条数相等
c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向弧条数相等
4、状态转换图(见图3-6-1)接受的字集为 。

a. 以 0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合
c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合
5、词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此, 。
a. 词法分析器应作为独立的一遍 b. 词法分析器作为子程序较好
c. 词法分析器分解为多个过程,由语法分析器选择使用 d. 词法分析器并不作为一个独立的阶段
解答 1、b 2、c 3、c 4、d 5、b
二、多项选择题
1、在词法分析中,能识别出 。
a. 基本字 b. 四元式 c. 运算符
d. 逆波兰式 e. 常数
2、令∑={a,b},则∑上所有以b开头,后跟若干个ab的字的全体对应的正规式为 。
a. b(ab)* b. b(ab)+ c.(ba)*b
d. (ba)+b e. b(a|b)
解答 1、a、c、e 2、a、b、d
三、填空题
1、确定有限自动机DFA是 的一个特例。
2、若二个正规式所表示的 相同,则认为二者是等价的。
3、一个字集是正规的,当且仅当它可由 所 。
解答 1、NFA 2、正规集 3、DFA(NFA)所识别
四、判断题
1、一个有限状态自动机中,有且仅有一个唯一终态。 ( )
2、设r和s分别是正规式,则有L(r|s)=L(r)|L(s)。 ( )
3、自动机M和M′的状态数不同,则二者必不等价。 ( )
4、确定的自动机以及不确定的自动机都能正确地识别正规集。 ( )
5、对任意一个右线性文法G,都存在一个NFA M,满足L(G)=L(M)。 ( )
6、对任意一个右线性文法G,都存在一个DFA M,满足L(G)=L(M)。 ( )
7、对任何正规表达式e,都存在一个NFA M,满足L(G)=L(e)。 ( )
8、对任何正规表达式e,都存在一个DFA M,满足L(G)=L(e)。 ( )
解答 1 、2、3、错 4、5、6、7、8、正确
五、基本题
1、设M=({x,y}, {a,b}, f,x,{y})为一非确定的有限自动机,其中f定义如下:
f(x,a)={x,y} f(x,b)={y}
f(y,a)=φ f(y,b)={x,y}
试构造相应的确定有限自动机M′。
解答:对照自动机的定义M=(S,Σ,f,S0,Z),由f的定义可知f(x,a)、f(y,b)均为多值函数,所以是一非确定有限自动机,先画出NFA M相应的状态图,如图3-6-2所示。

用子集法构造状态转换矩阵表3-6-3所示。
I Ia Ib
{x} {x,y} {y}
{y} — {x,y}
{x,y} {x,y} {x,y}
将转换矩阵中的所有子集重新命名而形成表3-6-4所示的状态转换矩阵。
表3-6-4 状态转换矩阵
a b
0 2 1
1 — 2
2 2 2
即得到M′=({0,1,2}, {a,b}, f,0, {1,2}),其状态转换图如图3-6-5所示。

将图3-6-5的DFA M′最小化。首先,将M′的状态分成终态组{1,2}与非终态组{0};其次,考察{1,2}。由于{1,2}a={1,2}b={2}⊂{1,2},所以不再将其划分了,也即整个划分只有两组{0},{1,2}:令状态1代表{1,2},即把原来到达2的弧都导向1,并删除状态2。最后,得到如图3-6-6所示化简DFA M′。

2、对给定正规式b*(d|ad)(b|ab)+,构造其NFA M;
解答:首先用A+=AA*改造正规式得:b*(d|ad)(b|ab)(b|ab)*;其次,构造该正规式的NFA M,如图3-6-7所示。
求采纳为满意回答。

‘伍’ 编译原理课程设计

%{

/* FILENAME: C.Y */

%}
#define YYDEBUG_LEXER_TEXT (yylval) /* our lexer loads this up each time */
#define YYDEBUG 1 /* get the pretty debugging code to compile*/
#define YYSTYPE char * /* interface with flex: should be in header file */
/* Define terminal tokens */
/* keywords */
%token AUTO DOUBLE INT STRUCT
%token BREAK ELSE LONG SWITCH
%token CASE ENUM REGISTER TYPEDEF
%token CHAR EXTERN RETURN UNION
%token CONST FLOAT SHORT UNSIGNED
%token CONTINUE FOR SIGNED VOID
%token DEFAULT GOTO SIZEOF VOLATILE
%token DO IF STATIC WHILE
/* ANSI Grammar suggestions */
%token IDENTIFIER STRINGliteral
%token FLOATINGconstant INTEGERconstant CHARACTERconstant
%token OCTALconstant HEXconstant
/* New Lexical element, whereas ANSI suggested non-terminal */
%token TYPEDEFname /* Lexer will tell the difference between this and
an identifier! An identifier that is CURRENTLY in scope as a
typedef name is provided to the parser as a TYPEDEFname.*/
/* Multi-Character operators */
%token ARROW /* -> */
%token ICR DECR /* ++ -- */
%token LS RS /* << >> */
%token LE GE EQ NE /* <= >= == != */
%token ANDAND OROR /* && || */
%token ELLIPSIS /* ... */
/* modifying assignment operators */
%token MULTassign DIVassign MODassign /* *= /= %= */
%token PLUSassign MINUSassign /* += -= */
%token LSassign RSassign /* <<= >>= */
%token ANDassign ERassign ORassign /* &= ^= |= */
%start translation_unit
%%
/* CONSTANTS */
constant:
INTEGERconstant
| FLOATINGconstant
/* We are not including ENUMERATIONconstant here because we
are treating it like a variable with a type of "enumeration
constant". */
| OCTALconstant
| HEXconstant
| CHARACTERconstant
;

string_literal_list:
STRINGliteral
| string_literal_list STRINGliteral
;
/************************* EXPRESSIONS ********************************/
primary_expression:
IDENTIFIER /* We cannot use a typedef name as a variable */
| constant
| string_literal_list
| '(' comma_expression ')'
;
postfix_expression:
primary_expression
| postfix_expression '[' comma_expression ']'
| postfix_expression '(' ')'
| postfix_expression '(' argument_expression_list ')'
| postfix_expression {} '.' member_name
| postfix_expression {} ARROW member_name
| postfix_expression ICR
| postfix_expression DECR
;
member_name:
IDENTIFIER
| TYPEDEFname
;
argument_expression_list:
assignment_expression
| argument_expression_list ',' assignment_expression
;
unary_expression:
postfix_expression
| ICR unary_expression
| DECR unary_expression
| unary_operator cast_expression
| SIZEOF unary_expression
| SIZEOF '(' type_name ')'
;
unary_operator:
'&'
| '*'
| '+'
| '-'
| '~'
| '!'
;
cast_expression:
unary_expression
| '(' type_name ')' cast_expression
;
multiplicative_expression:
cast_expression
| multiplicative_expression '*' cast_expression
| multiplicative_expression '/' cast_expression
| multiplicative_expression '%' cast_expression
;
additive_expression:
multiplicative_expression
| additive_expression '+' multiplicative_expression
| additive_expression '-' multiplicative_expression
;
shift_expression:
additive_expression
| shift_expression LS additive_expression
| shift_expression RS additive_expression
;
relational_expression:
shift_expression
| relational_expression '<' shift_expression
| relational_expression '>' shift_expression
| relational_expression LE shift_expression
| relational_expression GE shift_expression
;
equality_expression:
relational_expression
| equality_expression EQ relational_expression
| equality_expression NE relational_expression
;
AND_expression:
equality_expression
| AND_expression '&' equality_expression
;
exclusive_OR_expression:
AND_expression
| exclusive_OR_expression '^' AND_expression
;
inclusive_OR_expression:
exclusive_OR_expression
| inclusive_OR_expression '|' exclusive_OR_expression
;
logical_AND_expression:
inclusive_OR_expression
| logical_AND_expression ANDAND inclusive_OR_expression
;
logical_OR_expression:
logical_AND_expression
| logical_OR_expression OROR logical_AND_expression
;
conditional_expression:
logical_OR_expression
| logical_OR_expression '?' comma_expression ':'
conditional_expression
;
assignment_expression:
conditional_expression
| unary_expression assignment_operator assignment_expression
;
assignment_operator:
'='
| MULTassign
| DIVassign
| MODassign
| PLUSassign
| MINUSassign
| LSassign
| RSassign
| ANDassign
| ERassign
| ORassign
;
comma_expression:
assignment_expression
| comma_expression ',' assignment_expression
;
constant_expression:
conditional_expression
;
/* The following was used for clarity */
comma_expression_opt:
/* Nothing */
| comma_expression
;
/******************************* DECLARATIONS *********************************/
/* The following is different from the ANSI C specified grammar.
The changes were made to disambiguate typedef's presence in
declaration_specifiers (vs. in the declarator for redefinition);
to allow struct/union/enum tag declarations without declarators,
and to better reflect the parsing of declarations (declarators
must be combined with declaration_specifiers ASAP so that they
are visible in scope).
Example of typedef use as either a declaration_specifier or a
declarator:
typedef int T;
struct S { T T;}; /* redefinition of T as member name * /
Example of legal and illegal statements detected by this grammar:
int; /* syntax error: vacuous declaration * /
struct S; /* no error: tag is defined or elaborated * /
Example of result of proper declaration binding:
int a=sizeof(a); /* note that "a" is declared with a type in
the name space BEFORE parsing the initializer * /
int b, c[sizeof(b)]; /* Note that the first declarator "b" is
declared with a type BEFORE the second declarator is
parsed * /
*/
declaration:
sue_declaration_specifier ';'
| sue_type_specifier ';'
| declaring_list ';'
| default_declaring_list ';'
;
/* Note that if a typedef were redeclared, then a declaration
specifier must be supplied */
default_declaring_list: /* Can't redeclare typedef names */
declaration_qualifier_list identifier_declarator {} initializer_opt
| type_qualifier_list identifier_declarator {} initializer_opt
| default_declaring_list ',' identifier_declarator {} initializer_opt
;

declaring_list:
declaration_specifier declarator {} initializer_opt
| type_specifier declarator {} initializer_opt
| declaring_list ',' declarator {} initializer_opt
;

declaration_specifier:
basic_declaration_specifier /* Arithmetic or void */
| sue_declaration_specifier /* struct/union/enum */
| typedef_declaration_specifier /* typedef*/
;

type_specifier:
basic_type_specifier /* Arithmetic or void */
| sue_type_specifier /* Struct/Union/Enum */
| typedef_type_specifier /* Typedef */
;

declaration_qualifier_list: /* const/volatile, AND storage class */
storage_class
| type_qualifier_list storage_class
| declaration_qualifier_list declaration_qualifier
;

type_qualifier_list:
type_qualifier
| type_qualifier_list type_qualifier
;

declaration_qualifier:
storage_class
| type_qualifier /* const or volatile */
;

type_qualifier:
CONST
| VOLATILE
;

basic_declaration_specifier: /*Storage Class+Arithmetic or void*/
declaration_qualifier_list basic_type_name
| basic_type_specifier storage_class
| basic_declaration_specifier declaration_qualifier
| basic_declaration_specifier basic_type_name
;

basic_type_specifier:
basic_type_name /* Arithmetic or void */
| type_qualifier_list basic_type_name
| basic_type_specifier type_qualifier
| basic_type_specifier basic_type_name
;

sue_declaration_specifier: /* Storage Class + struct/union/enum */
declaration_qualifier_list elaborated_type_name
| sue_type_specifier storage_class
| sue_declaration_specifier declaration_qualifier
;

sue_type_specifier:
elaborated_type_name /* struct/union/enum */
| type_qualifier_list elaborated_type_name
| sue_type_specifier type_qualifier
;

typedef_declaration_specifier: /*Storage Class + typedef types */
typedef_type_specifier storage_class
| declaration_qualifier_list TYPEDEFname
| typedef_declaration_specifier declaration_qualifier
;

typedef_type_specifier: /* typedef types */
TYPEDEFname
| type_qualifier_list TYPEDEFname
| typedef_type_specifier type_qualifier
;

storage_class:
TYPEDEF
| EXTERN
| STATIC
| AUTO
| REGISTER
;

basic_type_name:
INT
| CHAR
| SHORT
| LONG
| FLOAT
| DOUBLE
| SIGNED
| UNSIGNED
| VOID
;

elaborated_type_name:
aggregate_name
| enum_name
;

aggregate_name:
aggregate_key '{' member_declaration_list '}'
| aggregate_key identifier_or_typedef_name
'{' member_declaration_list '}'
| aggregate_key identifier_or_typedef_name
;

‘陆’ 如何才能编写程序,需要什么

简单的说,编程就是为了借助于计算机来达到某一目的或解决某个问题,而使用某种程序设计语言编写程序代码,并最终得到结果的过程。
计算机虽然功能十分强大。可以供你上网、打游戏、管理公司人事关系等等,但是没有程序,它就等于是一堆废铁,不会理会我们对它下达的“命令”。于是,我们要驯服它,只有通过一种方式——程序,这也是我们和计算机沟通的唯一方式。

那程序到底是什么呢?
程序也就是指令的集合,它告诉计算机如何执行特殊的任务。

打个比方说,它好比指导你烹调菜品的菜谱或指挥行驶一路到达目的地的交警(或者交通路标)。没有这些特殊的指令,就不能执行预期的任务。计算机也一样,当你想让计算机为你做一件事情的时候,计算机本身并不能主动为我们工作,因此我们必须对它下达指令,而它根本不会也不可能听懂人类自然语言对事情的描述,因此我们必须使用程序来告诉计算机做什么事情以及如何去做?甚至对最简单的任务也需要指令,例如如何取得击键,怎样在屏幕上放一个字母,怎样在磁盘中保存文件等等。
这么麻烦,连这些东西编程都要考虑!怪不得人家说编程好难!你错了,其实许多这样的指令都是现成的,包含在处理芯片中内置于操作系统中,因此我们不必担心它们工作,他们都是由处理器和操作系统来完成的,并不需要我们来干预这些过程。

上面讲到的计算机本身不会主动的做任何事情。因此我们要通过程序的方式来让计算机为我们“效劳”。而这个过程就是我们“编”出来的。编程可以使用某一种程序设计语言来实现,按照这种语言的语法来描述让计算机要做的事情。

我们这里所讲的语法和外语中的语法完全两码事,这里讲的语法只是读你的程序书写做出一写规定而已。

写出程序后,再由特殊的软件将你的程序解释或翻译成计算机能够识别的“计算机语言”,然后计算机就可以“听得懂”你的话了,并会按照你的吩咐去做事了。因此,编程实际上也就是“人给计算机出规则”这么一个过程。
随计算机语言的种类非常的多,总的来说可以分成机器语言,汇编语言,高级语言三大类。
电脑每做的一次动作,一个步骤,都是按照已经用计算机语言编好的程序来执行,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。

计算机所能识别的语言只有机器语言,即由构成的代码。但通常人们编程时,不采用机器语言,因为它非常难于记忆和识别。

目前通用的编程语言有两种形式:汇编语言和高级语言。

汇编语言的实质和机器语言是相同的,都是直接对硬件操作,只不过指令采用了英文缩写的标识符,更容易识别和记忆。它同样需要编程者将每一步具体的操作用命令的形式写出来。

汇编程序的每一句指令只能对应实际操作过程中的一个很细微的动作,例如移动、自增,因此汇编源程序一般比较冗长、复杂、容易出错,而且使用汇编语言编程需要有更多的计算机专业知识,但汇编语言的优点也是显而易见的,用汇编语言所能完成的操作不是一般高级语言所能实现的,而且源程序经汇编生成的可执行文件不仅比较小,而且执行速度很快。

高级语言是目前绝大多数编程者的选择。和汇编语言相比,它不但将许多相关的机器指令合成为单条指令并且去掉了与具体操作有关但与完成工作无关的细节,例如使用堆栈、寄存器等,这样就大大简化了程序中的指令。由于省略了很多细节,所以编程者也不需要具备太多的专业知识。

高级语言主要是相对于汇编语言而言,它并不是特指某一种具体的语言,而是包括了很多编程语言,如目前流行的VB、VC、FoxPro、Delphi等,这些语言的语法、命令格式都各不相同。

(1)解释类:执行方式类似于我们日常生活中的“同声翻译”,应用程序源代码一边由相应语言的解释器“翻译”成目标代码(机器语言),一边执行,因此效率比较低,而且不能生成可独立执行的可执行文件,应用程序不能脱离其解释器,但这种方式比较灵活,可以动态地调整、修改应用程序。

(2)编译类:编译是指在应用源程序执行之前,就将程序源代码“翻译”成目标代码(机器语言),因此其目标程序可以脱离其语言环境独立执行,使用比较方便、效率较高。但应用程序一旦需要修改,必须先修改源代码,再重新编译生成新的目标文件(*.OBJ)才能执行,只有目标文件而没有源代码,修改很不方便。现在大多数的编程语言都是编译型的,例如Visual Basic、Visual C++、Visual Foxpro、Delphi等。
这个问题其实很简单。前面我们讲到,程序是人与计算机进行沟通的唯一方式,因此我们要让计算机为我们服务,就必须有程序,而程序从哪里来?当然是由我们编写出来了。或许你又会问到另一个问题:现在要什么程序有什么程序,我干嘛还要编程呢?这你就错了,现在的程序虽然很多,需要什么样的程序直接到网上不需要很长时间就可以找到类似的,而且有可能就是你所需要的。但是,就好比去买衣服,虽然卖衣服的到处都是,但是哪一件是为你“量身定做”的呢!
程序还能够做很多事情不同的程序可以完成不同的事情。从大的方面到管理国家的财务,小的方面管理家庭的帐务。

又如,如果你想要你的计算机能播放动画,那么你的计算机中也要有相应的动画播放程序,下面所示的就是一个F1ssh动画播放器。我们将会在后面的章节具体讲述这个程序的编制过程。
随着计算机的飞速发展,总会有那么一天将不会编程的人列为“文盲”。你不希望吧?那么就好好的学习一种程序设计语言吧。

编程会过时吗

编程会过时吗?这个问题,让我先问你一个问题:计算机会消失吗?这两者答案是一样的。知道了计算机会不会消失,就知道了编程会不会过时。

编程工具会过时,而编程却不会过时

计算机系统由可以看见的硬倒:系统和看不见的软件系统组成。要使计算机能够正常的工作,仅仅有硬件系统是不行的,没有软倒系统(即没有程序)的计算机可以说只是—堆废铁,什么事情都干不了。例如当你撰写—篇文章的时候,你需要在操作系统中用文字编辑软件来实现文字的输入,但如果没有这些文字输入软件的话,你是否想过如何向计算机中输入文章呢?很难想象出如何在一个没有任何软件的计算机(我们称之为裸机)上进行文字的输入。而这些软件其实就是通常我们所说的程序。

编程会过时吗?我们从另一个角度来考虑这个问题,计算机有——天会消失吗?如果有一天当世界上所有的事情处理都用不到计算机了,那么计算机将会很快的消失,那时编程不仅过时了,而且也会随之消失了。但是计算机会消失吗?当然不会,如今计算机应用到每一领域,为人类的发展做出了不可估量的贡献。试想一下如果有一天全世界的计算机突然消失了,那么这个世界将变成什么样子,或许和全世界都停电了一样恐怖,甚至还会有更大的损失。计算机的存在必须要有软件系统来维持。因此编程永远不会、也不可能会过时。

计算机程序设计语言发展到今天,已经从最原始的机器语言发展到如今可视化的集成开发环境,甚至集多种语言在同一开发平台上,像微软的NET平台。回头看看程序设计语言的发展史,不难看出对于编程来说,只会出现编程工具的过时,不会出现编程本身的过时。

不断变化的技术需要不断变化的程序员

从二十世纪60年代以后,计算机得到了突飞猛进的发展。似乎历史上没有任何一门科学的发展速度超过了计算机的发展,无论硬件、软件、还是网络都以惊人的速度向前发展。计算机的硬件发展速度遵循“摩尔定律”每十八个月速度翻一倍(实际现在已超过了这个速度)。 软件的发展速度和硬件一样,二十世纪九十年代中国的软件业还不是很成熟,而现在大大小小 的软件企业四处耸立,共享软件网上随处可见。不断发展的技术需要不断变化的程序员,例如,如今Visual Basic可以快速构Windows下的应用程序,程序设计方面的技术不断发展着,不断引进新的概念、新的方法,如从结构化的C开始,当面向对象的思想被提出后,出现了C++,微软在C++的基础上为使用户构建win32应用程序更加方便,推出了Visual C++。这也就需要程序员也要不断的更新自己的技术。

计算机科学与别的学科很不一样,不像语言学、历史学那样,几乎是永久不变的东西。计算机科学要求不断的更新自己的知识,否则很快就会被淘汰,即便是编程亦是如此。

编写程序是一件很有趣的事情,因为编写程序可以干很多高级的事情。例如我们在后面的章节中介绍如何使用Visual Basic编写Flash动画播放器,以及如何编写下载软件管理器等。如果你愿意的话,你完全可以编写出比这些更高级的程序来。

随着计算机软件业的发展,诞生了“程序员”这个职位。于是便形成了一种理念,编写程 序的人就是程序员,因此编程是程序员的事情。但程序员并不是一开始就是程序员,他们也是从现在我们的位置慢慢成为程序员的。

编写程序是一件很有趣的事情,因为编写程序可以干很多高级的事情。例如我们在后面的章节中介绍如何使用Visual Basic编写Flash动画播放器,以及如何编写下载软件管理器等。如果你愿意的话,你完全可以编写出比这些更高级的程序来。

编程也可以作为——种爱好或兴趣,如果你对它感兴趣学起来就容易多了!因为如果对编程感兴趣的话,就会多看些有关方面的书、多编些小程序上机实践,这些对于学习编程的帮助是非常大的,而且随着学习的进程不断的推进就会觉得它并不是很困难,相反却是很容易的。

总之,在学习编程时一定要坚持不懈,只要有信心、有毅力就一定能学好;不能因为一些似是而非的观念就动摇了自己的信心。

我们一起来编程

面对摆在面前的计算机该如何操作,相信这个问题已经不再是困扰大家的首要问题了。现在软件的种类那么多,在选用的时候“电脑发烧友”的心里是否也想过有一天自己能编写一款属于自己的软件呢?想学习编程的朋友在选择程序语言时会不会因为不知道如何选择而大感头痛呢?在不知如何下手的时候,朋友们的心中是不是会产生“我是不是可以编程”的思想呢?但是又有哪个程序员是不经过学习就能成功的呢!其实编写程序并不是人们所想象的那么困难、那么复杂,每个有心致力于学习计算机的朋友都是可以尝试的!

选择适合自己的程序语言的必要性

目前常用的基本程序语言的种类比较繁多,比较简单的有:Pascal、c语言、qBasic、 Fortran、Visual Basic等等。但前几种都是在DOS下进行编程的工具,Visual Basic是在 Windows下进行应用程序设计的编程工具,现在一般的计算机用户几乎都不再使用DOS了,因此我们通常会选择Visual Basic作为初学者的编程工具。Visual Basic是Windows应用程序设计中最容易上手的编程工具,学习步骤也比较容易被初学者接受。对于刚开始学习编程的初学者来说,还是选择Visual Basic,学习编程语言不能想象着一步登天,一步一个脚印的学习才是最佳方法。

坚定自己学习编写程序的信心

编写程序并不是具有专业知识的人员才有的专利,每个学习计算机的人都可以编写程序,每个人的灵感不同,在编写程序的思路和作法上又有区别。但共同的想法就是编写成功的程序。学习编程是一个漫长的过程,其中要付出艰辛的努力和汗水,不过成功者的喜悦又不是别人所能体会的。克服学习中的困难,努力去实践,要有一个思想:别人能做到的事情自己也一定可以做到。计算机的普及让更多的人有了学习的机会,也让更多的人参与到编程人员的队伍中来,每个人都有编程的权利,机遇给予每个人都是平等的。拿出自己必胜的信心,在编程的道路工勇于进取,相信成功就会在眼前。
三、我可以编程吗
随着计算机软件业的发展,诞生了“程序员”这个职位。于是便形成了一种理念,编写程 序的人就是程序员,因此编程是程序员的事情。但程序员并不是一开始就是程序员,他们也是从现在我们的位置慢慢成为程序员的。

编写程序是一件很有趣的事情,因为编写程序可以干很多高级的事情。例如我们在后面的章节中介绍如何使用Visual Basic编写Flash动画播放器,以及如何编写下载软件管理器等。如果你愿意的话,你完全可以编写出比这些更高级的程序来。

编程也可以作为——种爱好或兴趣,如果你对它感兴趣学起来就容易多了!因为如果对编程感兴趣的话,就会多看些有关方面的书、多编些小程序上机实践,这些对于学习编程的帮助是非常大的,而且随着学习的进程不断的推进就会觉得它并不是很困难,相反却是很容易的。

总之,在学习编程时一定要坚持不懈,只要有信心、有毅力就一定能学好;不能因为一些似是而非的观念就动摇了自己的信心。

四、我们一起来编程

面对摆在面前的计算机该如何操作,相信这个问题已经不再是困扰大家的首要问题了。现在软件的种类那么多,在选用的时候“电脑发烧友”的心里是否也想过有一天自己能编写一款属于自己的软件呢?想学习编程的朋友在选择程序语言时会不会因为不知道如何选择而大感头痛呢?在不知如何下手的时候,朋友们的心中是不是会产生“我是不是可以编程”的思想呢?但是又有哪个程序员是不经过学习就能成功的呢!其实编写程序并不是人们所想象的那么困难、那么复杂,每个有心致力于学习计算机的朋友都是可以尝试的!

选择适合自己的程序语言的必要性

目前常用的基本程序语言的种类比较繁多,比较简单的有:Pascal、c语言、qBasic、 Fortran、Visual Basic等等。但前几种都是在DOS下进行编程的工具,Visual Basic是在 Windows下进行应用程序设计的编程工具,现在一般的计算机用户几乎都不再使用DOS了,因此我们通常会选择Visual Basic作为初学者的编程工具。Visual Basic是Windows应用程序设计中最容易上手的编程工具,学习步骤也比较容易被初学者接受。对于刚开始学习编程的初学者来说,还是选择Visual Basic,学习编程语言不能想象着一步登天,一步一个脚印的学习才是最佳方法。

坚定自己学习编写程序的信心

编写程序并不是具有专业知识的人员才有的专利,每个学习计算机的人都可以编写程序,每个人的灵感不同,在编写程序的思路和作法上又有区别。但共同的想法就是编写成功的程序。学习编程是一个漫长的过程,其中要付出艰辛的努力和汗水,不过成功者的喜悦又不是别人所能体会的。克服学习中的困难,努力去实践,要有一个思想:别人能做到的事情自己也一定可以做到。计算机的普及让更多的人有了学习的机会,也让更多的人参与到编程人员的队伍中来,每个人都有编程的权利,机遇给予每个人都是平等的。拿出自己必胜的信心,在编程的道路工勇于进取,相信成功就会在眼前。
一、计算机语言的发展过程

到目前为止,世界上公布的程序设计语言有上千种之多,常用的也有三十来种,为了有21于正确选择和使用它们,下面我们做一个简单介绍。

(1)汇编语言:

它是依赖于具体计算机的语言,用它编写出的程序,执行效率高,但是只在一些特殊要求或特殊的场合才使用它。

(2)高级语言:

大家可能都听过使用高级语言进行程序设计,但由于对其并不了解,所以总认为这些是很高深的东西。其实并非如此,学习了后面的章节,相信同学会产生编程原来不过如此。

但计算机是不懂得自然语言的(可以理解为高级语言),而高级语言设计出来的程序如何让计算机去执行呢?其实很简单,看了下图后相信大家会明白许多。

现在我们就向大家介绍几种常见的高级语言:

Fortran语言是科学和工程计算中使用的主要编程语言。目前国内使用版本多数是Fortran 66和Fortran77两种。Fortran语言的主要缺点是不能直接支持结构化编程。

Cob0l语言是商业数据处理中广泛使用的语言。由于它本身结构上的特点,使得它能有效的支持与商业处理有关的、范围广泛的过程技术。它的缺点是不简洁。

Algol语言是所有结构化语言的先驱,具有丰富的过程和数据结构。但是,这种语言并没有被广泛采用,主要是由于它本身的历史原因所造成的。

Basic语言是一种解释执行的会话语言。由于它简单易学的特点,它被广泛应用在微型计算机系统中。

PL//1语言是一个用途广泛的语言。能支持通常的科学工程和商业应用,能描述复杂的数据结构、多重任务处理、复杂的输入输出和表格处理等。

Pascal语言是70年代初期发展起来的结构化程序设计语言,具有特别丰富的数据结构类型。它自问世后,得到了众人的赞赏,也得到了软件开发者的广泛支持。Pascal语言已用于科学、工程和系统程序设计中。我们教育部计算机专业教育会议曾把Pascal语言定为计算机专业程序设计语言。

C语言是作为UNIX操作系统的主要使用语言。由于UNIX操作系统的成功,现在C语言也得到了广泛的使用。C语言是有经验的软件工程师设计的,它具有很强的功能,以及高度的灵活性。它和其他的结构化语言一样,能提供丰富的数据类型、广泛使用的指针以及—组很丰富的计算和数据处理使用的运算符。

C++语言是C语言的扩充。在1980年,贝尔实验室的Bjarne Strotstrup博士及其同事开始对C语言进行改进和扩充,最初被称为“带类的C”,1983年才取名为C++。以及不断完善和发展,成为目前的C++语言。一方面,它将C语言作为它的子集,使它能够与C语言兼容。使许多C语言代码不经修改就可以为C++语言所用以及用C语言编写的众多库函数和和实用软件可以直接用于C++语言中;另一方面。C++语言支持面向对象的程序设计这是它对C语言最重要的改进。

‘柒’ 递归下降分析方法是一种(50)方法。

【答案】:B
本题考查编译原理知识点。递归下降法(RecursiveDescentMethod),是指对文法的每一非终结符号,都根据相应产生式各候选式的结构,为其编写一个子程序(或函数),用来识别该非终结符号所表示的语法范畴。递归下降法是一种语法分析方法,下降即自上而下之意。本题选择B选项。

‘捌’ 编译原理试题·

Lex和Yacc应用方法(一).初识Lex
草木瓜 20070301
Lex(Lexical Analyzar 词法分析生成器),Yacc(Yet Another Compiler Compiler
编译器代码生成器)是Unix下十分重要的词法分析,语法分析的工具。经常用于语言分
析,公式编译等广泛领域。遗憾的是网上中文资料介绍不是过于简单,就是跳跃太大,
入门参考意义并不大。本文通过循序渐进的例子,从0开始了解掌握Lex和Yacc的用法。

一.Lex(Lexical Analyzar) 初步示例
先看简单的例子(注:本文所有实例皆在RetHat Linux下完成):
一个简单的Lex文件 exfirst.l 内容:
%{
#include "stdio.h"
%}
%%
[\n] ;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在命令行下执行命令flex解析,会自动生成lex.yy.c文件:
[root@localhost liweitest]flex exfirst.l
进行编译生成parser可执行程序:
[root@localhost liweitest]cc -o parser lex.yy.c -ll
[注意:如果不加-ll链结选项,cc编译时会出现以下错误,后面会进一步说明。]
/usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start':
../sysdeps/i386/elf/start.S:77: undefined reference to `main'
/tmp/cciACkbX.o(.text+0x37b): In function `yylex':
: undefined reference to `yywrap'
/tmp/cciACkbX.o(.text+0xabd): In function `input':
: undefined reference to `yywrap'
collect2: ld returned 1 exit status

创建待解析的文件 file.txt:
title
i=1+3.9;
a3=909/6
bcd=4%9-333
通过已生成的可执行程序,进行文件解析。
[root@localhost liweitest]# ./parser < file.txt
Var : title
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
到此Lex用法会有个直观的了解:
1.定义Lex描述文件
2.通过lex,flex工具解析成lex.yy.c文件
3.使用cc编译lex.yy.c生成可执行程序

再来看一个比较完整的Lex描述文件 exsec.l :

%{
#include "stdio.h"
int linenum;
%}
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}
进行解析编译:
[root@localhost liweitest]flex exsec.l
[root@localhost liweitest]cc -o parser lex.yy.c
[root@localhost liweitest]./parser < file.txt
----- Lex Example -----
Var : i
Unknown : =
Int : 1
Op : +
Float : 3.9
Unknown : ;
Var : a3
Unknown : =
Int : 909
Op : /
Int : 6
Var : bcd
Unknown : =
Int : 4
Op : %
Int : 9
Op : -
Int : 333
Line Count: 4
这里就没有加-ll选项,但是可以编译通过。下面开始着重整理下Lex描述文件.l。

二.Lex(Lexical Analyzar) 描述文件的结构介绍
Lex工具是一种词法分析程序生成器,它可以根据词法规则说明书的要求来生成单词识
别程序,由该程序识别出输入文本中的各个单词。一般可以分为<定义部分><规则部
分><用户子程序部分>。其中规则部分是必须的,定义和用户子程序部分是任选的。

(1)定义部分
定义部分起始于 %{ 符号,终止于 %} 符号,其间可以是包括include语句、声明语句
在内的C语句。这部分跟普通C程序开头没什么区别。
%{
#include "stdio.h"
int linenum;
%}
(2) 规则部分
规则部分起始于"%%"符号,终止于"%%"符号,其间则是词法规则。词法规则由模式和
动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分是由C语言语句组
成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单
词存放在yytext[]字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。
类似yytext这些预定义的变量函数会随着后面内容展开一一介绍。动作部分如果有多
行执行语句,也可以用{}括起来。
%%
title showtitle();
[\n] linenum++;
[0-9]+ printf("Int : %s\n",yytext);
[0-9]*\.[0-9]+ printf("Float : %s\n",yytext);
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
[\+\-\*\/\%] printf("Op : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
A.规则部分的正则表达式
规则部分是Lex描述文件中最为复杂的一部分,下面列出一些模式部分的正则表达式字
符含义:
A-Z, 0-9, a-z 构成模式部分的字符和数字。
- 指定范围。例如:a-z 指从 a 到 z 之间的所有字符。
\ 转义元字符。用来覆盖字符在此表达式中定义的特殊意义,
只取字符的本身。

[] 表示一个字符集合。匹配括号内的任意字符。如果第一个字
符是^那么它表示否定模式。例如: [abC] 匹配 a, b, 和C
的任何一个。

^ 表示否定。
* 匹配0个或者多个上述模式。
+ 匹配1个或者多个上述模式。
? 匹配0个或1个上述模式。
$ 作为模式的最后一个字符时匹配一行的结尾。
{ } 表示一个模式可能出现的次数。 例如: A{1,3} 表示 A 可
能出现1次或3次。[a-z]{5} 表示长度为5的,由a-z组成的
字符。此外,还可以表示预定义的变量。

. 匹配任意字符,除了 \n。
( ) 将一系列常规表达式分组。如:{Letter}({Letter}|{Digit})*
| 表达式间的逻辑或。
"一些符号" 字符的字面含义。元字符具有。如:"*" 相当于 [\*]。
/ 向前匹配。如果在匹配的模式中的"/"后跟有后续表达式,
只匹配模版中"/"前面的部分。如:模式为 ABC/D 输入 ABCD,
时ABC会匹配ABC/D,而D会匹配相应的模式。输入ABCE的话,
ABCE就不会去匹配ABC/D。

B.规则部分的优先级

规则部分具有优先级的概念,先举个简单的例子:

%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
%%
此时,如果输入内容:
[root@localhost liweitest]# cat file1.txt
AAAAAAA
[root@localhost liweitest]# ./parser < file1.txt
THREE
TWO
ONE
Lex分析词法时,是逐个字符进行读取,自上而下进行规则匹配的,读取到第一个A字符
时,遍历后发现三个规则皆匹配成功,Lex会继续分析下去,读至第五个字符时,发现
"AAAA"只有一个规则可用,即按行为进行处理,以此类推。可见Lex会选择最长的字符
匹配规则。
如果将规则
AAAA {printf("THREE\n");};
改为
AAAAA {printf("THREE\n");};
./parser < file1.txt 输出结果为:
THREE
TWO

再来一个特殊的例子:
%%
title showtitle();
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
%%
并输入title,Lex解析完后发现,仍然存在两个规则,这时Lex只会选择第一个规则,下面
的则被忽略的。这里就体现了Lex的顺序优先级。把这个例子稍微改一下:
%%
[a-zA-Z][a-zA-Z0-9]* printf("Var : %s\n",yytext);
title showtitle();
%%
Lex编译时会提示:warning, rule cannot be matched.这时处理title字符时,匹配
到第一个规则后,第二个规则就无效了。
再把刚才第一个例子修改下,加深下印象!
%{
#include "stdio.h"
%}
%%
[\n] ;
A {printf("ONE\n");};
AA {printf("TWO\n");};
AAAA {printf("THREE\n");};
AAAA {printf("Cannot be executed!");};
./parser < file1.txt 显示效果是一样的,最后一项规则肯定是会忽略掉的。

C.规则部分的使用变量
且看下面示例:
%{
#include "stdio.h"
int linenum;
%}
int [0-9]+
float [0-9]*\.[0-9]+
%%
{int} printf("Int : %s\n",yytext);
{float} printf("Float : %s\n",yytext);
. printf("Unknown : %c\n",yytext[0]);
%%
在%}和%%之间,加入了一些类似变量的东西,注意是没有;的,这表示int,float分
别代指特定的含义,在两个%%之间,可以通过{int}{float}进行直接引用,简化模
式定义。

(3) 用户子程序部分
最后一个%%后面的内容是用户子程序部分,可以包含用C语言编写的子程序,而这些子
程序可以用在前面的动作中,这样就可以达到简化编程的目的。这里需要注意的是,
当编译时不带-ll选项时,是必须加入main函数和yywrap(yywrap将下后面说明)。如:
...
%%
showtitle()
{
printf("----- Lex Example -----\n");
}
int main()
{
linenum=0;
yylex(); /* 进行Lex分析 */
printf("\nLine Count: %d\n",linenum);
return 0;
}
int yywrap()
{
return 1;
}

三.Lex(Lexical Analyzar) 一些的内部变量和函数
内部预定义变量:
yytext char * 当前匹配的字符串
yyleng int 当前匹配的字符串长度
yyin FILE * lex当前的解析文件,默认为标准输出
yyout FILE * lex解析后的输出文件,默认为标准输入
yylineno int 当前的行数信息
内部预定义宏:
ECHO #define ECHO fwrite(yytext, yyleng, 1, yyout) 也是未匹配字符的
默认动作

内部预定义的函数:
int yylex(void) 调用Lex进行词法分析
int yywrap(void) 在文件(或输入)的末尾调用。如果函数的返回值是1,就停止解
析。 因此它可以用来解析多个文件。代码可以写在第三段,这
样可以解析多个文件。 方法是使用 yyin 文件指针指向不同的
文件,直到所有的文件都被解析。最后,yywrap() 可以返回1
来表示解析的结束。

lex和flex都是解析Lex文件的工具,用法相近,flex意为fast lexical analyzer generator。
可以看成lex的升级版本。

相关更多内容就需要参考flex的man手册了,十分详尽。

四.关于Lex的一些综述
Lex其实就是词法分析器,通过配置文件*.l,依据正则表达式逐字符去顺序解析文件,
并动态更新内存的数据解析状态。不过Lex只有状态和状态转换能力。因为它没有堆栈,
它不适合用于剖析外壳结构。而yacc增加了一个堆栈,并且能够轻易处理像括号这样的
结构。Lex善长于模式匹配,如果有更多的运算要求就需要yacc了。

热点内容
编程课线下 发布:2025-07-17 01:02:51 浏览:369
忘了电脑用户名和密码怎么办 发布:2025-07-17 01:00:26 浏览:612
长江存储上海分公司 发布:2025-07-17 01:00:24 浏览:838
c语言text 发布:2025-07-17 00:51:49 浏览:427
安卓如何设置某个软件不锁屏 发布:2025-07-17 00:48:59 浏览:506
安卓数据移除密码输哪里 发布:2025-07-17 00:33:28 浏览:49
白岩松访问8问 发布:2025-07-17 00:33:28 浏览:460
非人学园压缩 发布:2025-07-16 23:44:40 浏览:401
楼梯第一算法 发布:2025-07-16 23:27:58 浏览:116
城市数据库sql 发布:2025-07-16 23:23:47 浏览:531