生成函数语法树编译原理
Ⅰ 锘虹路缂栬疟铡熺悊
娣卞叆鎺㈢储缂栬疟铡熺悊锛氢粠锘虹鍒伴珮绾цВ鏋
涓銆佺紪璇戠▼搴忕殑濂ョ
缂栬疟鍣锛岃繖搴ч氩线链哄櫒璇瑷镄勬ˉ姊侊纴灏嗘簮浠g爜镄勯瓟娉曡浆鍖栦负链哄櫒鑳界悊瑙g殑鎸囦护銆傚畠镄勬梾绋嫔垎涓哄叚姝ワ细璇嶆硶鍒嗘瀽锛埚皢婧愪唬镰佸垎鍓蹭负涓涓涓鍙璇嗗埆镄勫崟鍏冿级銆佽娉曞垎鏋愶纸瑙f瀽浠g爜缁撴瀯锛夈佽涔夊垎鏋愶纸璧嬩篑姣忎釜绗﹀彿镒忎箟锛夈佷腑闂翠唬镰佺敓鎴愶纸涓哄悗缁浼桦寲锅氩嗳澶囷级銆佷唬镰佷紭鍖栵纸鎻愬崌鏁堢巼锛夊拰鐩镙囦唬镰佺敓鎴愶纸鐢熸垚链缁埚彲镓ц屾枃浠讹级銆傜紪璇戣繃绋嫔阀濡栾繍鐢ㄨ〃镙肩$悊锛屽墠绔璁捐℃椂鐩镙囨満镞犲叧锛岃屽悗绔璁捐″垯绱у瘑缁戝畾鐩镙囧钩鍙扮壒镐с
浜屻佽В閲婄▼搴忎笌缂栬疟绋嫔簭镄勫樊寮
涓庣紪璇戠▼搴忎笉钖岋纴瑙i喷鍣ㄩ愯屾墽琛屾簮浠g爜锛屼笉鐢熸垚鍙镓ц屾枃浠讹纴杩欎娇寰楄В閲婄▼搴忚槠铹舵槗浜庤皟璇曪纴浣嗛熷害杈冩参涓斿崰鐢ㄥ唴瀛樿缉澶с
涓夈佽娉曚笌鏂囨硶镄勬ˉ姊
璇瑷镄勮掴锲剧敱璇娉曞拰璇涔夊叡钖屾瀯寤恒备笂涓嬫枃镞犲叧鏂囨硶锛屽傚悓璇瑷镄勯氱敤璇娉曡勫垯锛屾槸鎻忚堪鍜岀悊瑙h瑷缁撴瀯镄勫叧阌宸ュ叿銆
锲涖佺粓缁撶︿笌闱炵粓缁撶︾殑瀵嗙爜
缁堢粨绗︼纴濡傚悓璇瑷镄勫熀链鍏幂礌锛岄潪缁堢粨绗﹀垯鏄鐢辩粓缁撶﹀拰鏂囨硶瑙勫垯缁勫悎钥屾垚镄勬娊璞℃傚康锛屽叡钖屾瀯鎴愪简璇瑷镄勫熀鐭炽
浜斻丒BNF锛氭墿灞旷殑璇娉曟弿杩扮
EBNF锛圗xtended Backus-Naur Form锛夋槸涓绉嶅己澶х殑绗﹀彿琛ㄧず娉曪纴鐢ㄤ簬娓呮榈瀹氢箟澶嶆潅璇瑷缁撴瀯锛屾棤璁烘槸绠鍗旷被鍨嬭缮鏄镊瀹氢箟绫诲瀷锛岄兘鍙阃氲繃瀹幂簿鍑嗗畾涔夈
鍏銆佹帰绱㈣瑷镄勭﹀彿涓栫晫
阃氲繃瀛楁瘝琛▄0, 1}锛屾垜浠鍙浠ユ瀯阃犲嚭濡00銆10杩欐牱镄勭﹀彿涓层备覆杩炴帴銆佸箓杩愮畻鍜岄泦钖堣繍绠楋纴濡侫={a, b}脳B={c, d} = {ac, ad, bc, bd}锛屽𪾢绀轰简绗﹀彿涓茬殑涓板瘜镐с傞棴鍖呮傚康鎻绀轰简镓链夋湁闄愰暱涓茬殑闆嗗悎鐗规с
涓冦佹枃娉旷殑鏋勯犱笌瑙f瀽
鏂囨硶鐢遍潪缁堢粨绗﹂泦銆佺粓缁撶﹂泦銆佽勫垯闆嗗拰璇嗗埆绗︾粍鎴愶纴濡俛->b锛屾枃娉曚功鍐欎负G[S]銆傛帹瀵间笌瑙勭害灞旷ず浜呜瑷鏋勯犵殑阃昏緫锛屽彞鍨嫔拰璇瑷鍒欐槸鏂囨硶浣灭敤镄勪綋鐜帮纴涔斿嗘柉锘哄洓鍨嬫枃娉曞𪾢绀轰简阃掑綊鍜屼笂涓嬫枃鐩稿叧镐х殑涓嶅悓灞傛°
鍏銆佽娉曟爲锛氲瑷镄勭粨鏋勪箣缇
璇娉曟爲鐘瑰傜紪璇戠殑钃濆浘锛屾疮涓鑺傜偣镙囱颁负V绗﹀彿锛屼粠镙硅妭镣笋鍑哄彂锛岄伒寰鐗瑰畾瑙勫垯锛岀洿瑙傛彮绀哄彞鍨嬫帹瀵肩殑缁撴瀯銆
涔濄佽勮寖鎺ㄥ间笌鍙ュ瀷鍒嗘瀽
瑙勮寖鎺ㄥ肩‘淇濊В鏋愯繃绋嬬殑鍞涓镐э纴娑堥櫎浜屼箟镐э纴钥屽彞鍨嫔垎鏋愬垯阃氲繃镊涓婅屼笅鎴栬嚜涓嬭屼笂镄勬柟娉曪纴楠岃瘉绗﹀彿涓叉槸钖︾﹀悎鏂囨硶銆
鍗併佺Щ杩-褰掔害鍒嗘瀽涓庝紭鍏埚垎鏋愭硶
绉昏繘-褰掔害鍒嗘瀽灏呜緭鍏ラ愪釜瑙f瀽锛岀畻绗︿紭鍏埚垎鏋愬垯镙规嵁杩愮畻绗︿紭鍏堢骇鍐冲畾镎崭綔椤哄簭銆备笁绉崭紭鍏埚叧绯诲畾涔変简鍒嗘瀽镄勭簿缁嗘ラわ纴浠庣亩鍗曚紭鍏埚埌绠楃︿紭鍏堬纴鏁堢巼鍜岄傜敤锣冨洿钖勫纾銆
鍗佷竴銆丩R鍒嗘瀽鍣锛氲В鏋愮殑寮哄ぇ宸ュ叿
LR鍒嗘瀽鍣ㄦ槸瑙f瀽澶嶆潅鏂囨硶镄勫己澶ф﹀櫒锛屽畠阃氲繃ACTION琛ㄥ拰GOTO琛锛屼互鍙婃枃娉旷﹀彿鍜岀姸镐佺殑宸у欑$悊锛岀‘淇濊В鏋愮殑楂樻晥鍜屽嗳纭镐с
鍗佷簩銆佹爤鍦ㄨВ鏋愪腑镄勮掕壊
镙埚湪褰掔害銆佹帴鍙楀拰鎶ラ敊杩囩▼涓镓婕斿叧阌瑙掕壊锛屽綊绾︽椂璋冩暣鐘舵侊纴鎺ュ弹镞剁‘璁ゅ紑濮嬶纴阌栾镞跺垯鍙戝嚭璀﹀憡銆侺R鍒嗘瀽鍣ㄧ殑鍏抽敭鍦ㄤ簬鍒嗘瀽琛ㄧ殑鏋勫缓锛屽喅瀹氢简瑙f瀽鍣ㄧ殑镐ц兘鍜屾g‘镐с
鍗佷笁銆丩R(0)鍒嗘瀽镄勭簿濡欎箣澶
娲诲墠缂DFA镄勬瀯寤猴纴阃氲繃姝h勮〃杈惧纺鍜岄”鐩闆呜勮寖镞忥纴鎻绀轰简LR(0)鍒嗘瀽镄勬繁灞傞昏緫锛屽畠鍦ㄧ亩鍖栧啿绐佸勭悊镄勫悓镞讹纴鍏奸【浜嗗瓨鍌ㄦ晥鐜囧拰瑙f瀽鑳藉姏銆
缂栬疟铡熺悊镄勬梾绋嬫繁鍏ヨ屼赴瀵岋纴姣忎竴鐜鑺傞兘濡傚悓璇瑷镄勬瀯阃犱箰璋憋纴浜ょ粐鍑鸿$畻链虹戝︾殑浜ゅ搷涔愮珷銆备粠锘虹镄勮勫垯瑙f瀽锛屽埌楂樼骇镄勫垎鏋愭柟娉曪纴姣忎竴绔犻兘涓虹悊瑙d唬镰佽儗钖庣殑阃昏緫鎻愪緵浜嗗叧阌镄勬ˉ姊併
Ⅱ 编译原理简单吗
编译原理主要是讲了编译器的实现。
那什么是编译器呢?
编译器就是将 源程序→编译器 →目标机器代码的程序
本文将用一段最简单的代码进行说明
1 + 2 + 3
第一步. 词法分析
当代码从文件中被读入到编辑器时,将会进行词法分析
示例中的代码最终会转换为(下面为伪代码)
1 ADD 2 ADD 3
第二步. 语法分析
这一步编译器将会把词法分析的结果转换成AST(abstract syntax tree, 抽象语法树)
所有的操作数将会作为子节点,所有的操作符将会作为父节点。(不知道的同学可以看一下树的生成)
1 + 2 + 3 对应的树
3. 生成目标代码
对上面的树进行后序遍历,将会得到下面的伪代码
((1 2 +) 3 +)
生成的汇编伪代码为
START:
MOV VALUE, 0//初始化结果为0
ADD VALUE, 1
ADD VALUE, 2//(1 2 +)的汇编伪代码
ADD VALUE, 3
RET VALUE
END
最终汇编代码会被编译成机器代码,在计算机上执行。
下面为一般情况下的编译流程
1. 词法分析(生成代码对应的token序列,使用正则表达式)
2. 语法分析(生成AST)
3. 语义分析(对代码的语法进行检查)
4. 代码生成(生成可执行的代码)
Ⅲ 编译原理全部的名词解释
书上有别那么懒!.
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序.解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句.
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序).
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的.):文法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)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块.
给我分数啊.
Ⅳ 编译原理笔记9:语法分析树、语法树、二义性的消除
语法分析树和语法树不是一种东西 。习惯上,我们把前者叫做“具体语法树”,其能够体现推导的过程;后者叫做“抽象语法树”,其不体现过程,只关心最后的结果。
语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。
定义:对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:
推导,有最左推导和最右推导,这两种推导方式在推导过程中的分析树可能不同,但因最终得到的句子是相同的,所以最终的分析树是一样的。
分析树能反映句型的推导过程,也能反映句型的结构。然而实际上,我们往往不关心推导的过程,而只关心推导的结果。因此,我们要对 分析树 进行改造,得到 语法树 。语法树中全是终结符,没有非终结符。而且语法树中没有括号
定义:
说白了,语法树这玩意,就一句话: 叶子全是操作数,内部全是操作符 ,树里没有非终结符也不能有括号。
语法树要表达的东西,是操作符(运算)作用于操作数(运算对象)
举俩例子吧:
【例】: -(id+id) 的语法树:
【例】:-id+id 的语法树:
显然,我们从上面这两个语法树中,直接就能观察出来它们的运算顺序。
【例】:句型 if C then s1 else s2
二义性问题:一个句子可能对应多于一棵语法树。
【例】: 设文法 G: E → E+E | E*E | (E) | -E | id
则,句子 id+id*id、id+id+id 可能的分析树有:
在该例中,虽然 id+id+id 的 “+” 的结合性无论左右都不会影响结果。但万一,万一“+”的含义变成了“减法”,那么左结合和右结合就会引起很大的问题了。
我们在这里讲的“二义性”的“义”并非语义——我们现在在学习的内容是“语法分析器”,尚未到需要研究语言背后含义的阶段。
我们现在讲的“二义性”指的是一个句子对应多种分析树。
二义性的体现,是文法对同一句子有不止一棵分析树。这种问题由【句子产生过程中的某些推导有多于一种选择】引起。悬空 else 问题就可以很好地体现这种【超过一种选择】带来的二义性问题,示例如下。
看下面这么个例子。。
(其实,我感觉这个其实比较像是“说话大喘气”带来的理解歧义问题。。。)上面的产生式中并没体现出来该咋算分一块,所以两种完全不同的句子结构都是合法的。
二义性问题是有救的,大概有以下这三种办法:
这些办法的核心,其实都是将优先级和结合性说明白。
核心:把优先级和结合性说明白
既然要说明白,那就不能让一个非终结符可以直接在当次推导中能推出会带来优先级和结合性歧义的东西。(对分析树的一个内部节点,不会有出现在其下面的分支是相同的非终结符的情况。如果有得选,那就有得歧义了。没得选才能确定地一路走到黑)
改写为非二义文法的二义文法大概有下面这几个特点:
改写的关键步骤:
【例】改写下面的二义文法为非二义文法。图右侧是要达成的优先级和结合性
改写的核心其实就两句话:
所以能够得到非终结符与运算的对应关系(因为不同的运算有不同的优先级,我们想要引入多个优先级就要引入多个新的非终结符。这样每个非终结符就可以负责一个优先级的运算符号,也就是说新的非终结符是与运算有关系的了。因此这里搞出来了“对应关系”四个字)如下:
优先级由低到高分别是 +、 、-,而距离开始符号越近,优先级越低。因此在这里的排序也可以+ -顺序。每个符号对应一层的非终结符。根据所需要的结合性,则可确定是左递归还是右递归,以确定新的产生式长什么样子
【例】:规定优先级和结合性,写出改写的非二义文法
我们已经掌握了一种叫做【改写】的工具,能让我们消除二义性。接下来我们就要用这个工具来尝试搞搞悬空 else 问题!
悬空 else 问题出现的原因是 then 数量多于 else,让 else 有多个可以结合的 then。在二义文法中,由于选哪两个 then、else 配对都可以,故会引起出现二义的情况。在这里,我们规定 else 右结合,即与左边最靠近的 then 结合。
为改写此文法,可以将 S 分为完全匹配(MS)和不完全匹配(UMS)两类。在 MS 中体现 then、else 个数相等即匹配且右结合;在UMS 中 then、else 不匹配,体现 else 右结合。
【例】:用改写后的文法写一个条件语句
经过检查,无法再根据文法写出其他分析树,故已经消除了二义性
虽然二义文法会导致二义性,但是其并非一无是处。其有两个显着的优点:
在 Yacc 中,我们可以直接指定优先级、结合性而无需自己重写文法。
left 表示左结合,right 表示右结合。越往下的算符优先级越高。
嗯就这么简单。。。
我们其实可以把语言本身定义成没有优先级和结合性的。。然后所有的优先、结合都交由括号进行控制,哪个先算就加括号。把一个过程的结束用明确的标志标记出来。
比如在 Ada 中:
在 Pascal 中,给表达式加括号:
Ⅳ 编译原理
编译原理是计算机科学中的一慎昌门重要课程,主要研究如段配何将高级程序语言转化为机器语言宽燃扒的过程。它涉及到多个领域,如语言学、数学、计算机硬件和操作系统等。编译器是实现这一过程的关键工具,它可以将程序源代码转化为可执行的机器代码。
Ⅵ 如何由文法推导语法树(编译原理)
语法树,是针对上下文无关文法,用来表示一个句型的生成过程的一种描述手段。
对于给定的句型,依据文法构造它的语法树,是语法分析的任务。
编译原理课程中重点学习的各种语法分析方法,都是解决语法树的构造的具体分析方法。
在学习并掌握各种语法分析方法之前,一般只能依据直觉印象,通过猜测、拼凑等手段,去试着推演,凑出符合要求的句型的语法树。所以这个阶段练习用的题目一般也不很复杂,通过多多练习也能找到一些技巧(其实主要是后面将要学习的自顶向下语法分析中的一些原则)。
对于给定的文法,有一些句型可能能构建出两棵甚至多棵结构不同的语法树,结果不一定是唯一的。这样的文法就是所谓的二义性文法。
对于非二义性文法而言,任意一个句型的语法树都是唯一的。
Ⅶ 编译原理 学的是什么
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。虽然只有少数人从事编译方面的工作,但是这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。 目前各个大学使用的教材机械工业出版社、国防工业出版社出版的《编译原理》。
编译原理课程
这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的 必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪 50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟 编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间 诞生不少名着的相关数论。
Ⅷ 编译原理
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象[1]。
中文名
编译原理[1]
外文名
Compilers: Principles, Techniques, and Tools[1]
领域
计算机专业的一门重要专业课[1]
快速
导航
编译器
编译原理课程
编译技术的发展
编译的基本流程
编译过程概述
基本概念
编译原理即是对高级程序语言进行翻译的一门科学技术, 我们都知道计算机程序由程序语言编写而成, 在早期计算机程序语言发展较为缓慢, 因为计算机存储的数据和执行的程序都是由0、1代码组合而成的, 那么在早期程序员编写计算机程序时必须十分了解计算机的底层指令代码通过将这些微程序指令组合排列从而完成一个特定功能的程序, 这就对程序员的要求非常高了。人们一直在研究如何如何高效的开发计算机程序, 使编程的门槛降低。[2]
编译器
C语言编译器是一种现代化的设备, 其需要借助计算机编译程序, C语言编译器的设计是一项专业性比较强的工作, 设计人员需要考虑计算机程序繁琐的设计流程, 还要考虑计算机用户的需求。计算机的种类在不断增加, 所以, 在对C语言编译器进行设计时, 一定要增加其适用性。C语言具有较强的处理能力, 其属于结构化语言, 而且在计算机系统维护中应用比较多, C语言具有高效率的优点, 在其不同类型的计算机中应用比较多。[3]
C语言编译器前端设计
编译过程一般是在计算机系统中实现的, 是将源代码转化为计算机通用语言的过程。编译器中包含入口点的地址、名称以及机器代码。编译器是计算机程序中应用比较多的工具, 在对编译器进行前端设计时, 一定要充分考虑影响因素, 还要对词法、语法、语义进行分析。[3]
1 词法分析[3]
词法分析是编译器前端设计的基础阶段, 在这一阶段, 编译器会根据设定的语法规则, 对源程序进行标记, 在标记的过程中, 每一处记号都代表着一类单词, 在做记号的过程中, 主要有标识符、关键字、特殊符号等类型, 编译器中包含词法分析器、输入源程序、输出识别记号符, 利用这些功能可以将字号转化为熟悉的单词。[3]
2 语法分析[3]
语法分析是指利用设定的语法规则, 对记号中的结构进行标识, 这包括句子、短语等方式, 在标识的过程中, 可以形成特殊的结构语法树。语法分析对编译器功能的发挥有着重要影响, 在设计的过程中, 一定要保证标识的准确性。[3]
3 语义分析[3]
语义分析也需要借助语法规则, 在对语法单元的静态语义进行检查时, 要保证语法规则设定的准确性。在对词法或者语法进行转化时, 一定要保证语法结构设置的合法性。在对语法、词法进行检查时, 语法结构设定不合理, 则会出现编译错误的问题。前端设计对精确性要求比较好, 设计人员能够要做好校对工作, 这会影响到编译的准确性, 如果前端设计存在失误, 则会影响C语言编译的效果。[3]
Ⅸ 编译原理
编译原理):利用编译程序从源语言编写的源程序产生目标程序的过程; 用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。
编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成
(9)生成函数语法树编译原理扩展阅读:
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。
编译程序的语法规则可用上下文无关文法来刻画。语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。
而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。