当前位置:文档之家› C语言编译器的设计与实现.

C语言编译器的设计与实现.

C语言编译器的设计与实现01计算机4班18号任春妍2号陈俊我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。

编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分:(1) 词法分析部分(2) 语法分析处理及四元式生成部分(3) 输出显示部分一.词法分析器设计由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。

词法分析器的功能是输入源程序,输出单词符号。

我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)#define ACC -2#define syl_if 0#define syl_else 1#define syl_while 2#define syl_begin 3#define syl_end 4#define a 5#define semicolon 6#define e 7#define jinghao 8#define s 9#define L 10#define tempsy 11#define EA 12#define EO 13#define plus 14#define times 15#define becomes 16#define op_and 17#define op_or 18#define op_not 19#define rop 20#define lparent 21#define rparent 22#define ident 23#define intconst 241.读取函数readline( )、readch( )词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件”source.dat ”中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行readch( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从source.dat 中读取下一行至输入缓冲区。

2.扫描函数scan( )扫描函数scan( )的功能是滤除多余空格并对主要单词进行分析处理,将分析得到的二元式存入二元式结果缓冲区。

3.变量处理find()变量处理中首先把以字母开头的字母数字串存到spelling[ ]数组中,然后进行识别。

识别过程是先让它与保留关键字表中的所有关键字进行匹配,若获得成功则说明它为保留关键字,即将其内码值写入二元式结果缓冲区;否则说明其为变量,这时让它与变量名表中的变量进行匹配(变量匹配函数find ()),如果成功,则说明该变量已存在并在二元式结果缓冲区中标记为此变量(值填为该变量在变量名表中的位置),否则将该变量登记到变量名表中,再将这个新变量存入二元式缓存数组中。

4.数字识别number( )数字识别将识别出的数字填入二元式结果缓存数组。

5.显示函数显示函数的功能在屏幕上输出词法分析的结果(即二元式序列程序),同时给出二元式个数及源程序行数统计。

二.语法分析器设计语法分析器的核心是三张SLR 分析表以及针对这三张SLR 分析表进行语义加工的语义动作。

编译程序中语法分析处理及四元式生成部分主要是以二元式作为输入,并通过SLR 分析表对语法分析处理过程进行控制,使四元式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。

在处理if 和while 语句时,需要进行真值或假值的拉链和返填工作,以便转移目标的正确填入。

1. 控制语句的SLR 分析表1 设计过程如下:将扩展文法G’0)S’→ S1)S → if e S else S2)S → while e S3)S → { L }4)S → a;5)L → S6)L → SL用∈_CLOSURE方法构造LR(0)项目规范簇为:I0:S’→·SS →·if e S else SS →·while e SS →·{ L }S →·a ;I2: S → if·e S else SI3: S → while ·e SI4: S → {·L}L →·SL →·SLS →·if e S else SS →·while e SS →·{ L }S →·a ;I5: S → a·;I6: S →if e ·S else SS →·if e S else SS →·while e SS →·{ L }S →·a ;I7: S→ while e ·SS →·if e S else SS →·while e SS →·{ L }S →·a ;I8: S →{ L·}I9: L →S·L → S·LL →·SLL →·SS →·if e S else SS →·while e SS →·{ L }S →·a ;I10: S → a ; ·I11: S → if e S ·else SI12: S → while e S·I13: S → { L }·I14: S → SL ·I15: S → if e S else SS →·if e S else SS →·while e SS →·{ L }S →·a ;I16: S →if e S else S ·构造文法G’中非终结符的FOLLOW集如下:1)FOLLOW(S’) = { # }2)S → if e S else S得FOLLOW(S) = { else }S → { L } 得FOLLOW(L) = { } }3) S’→ S 得FOLLOW(S) = {else , #}L → S 因为FIRST(S) = { { },所以FOLLOW(S) = {else , #, { }在LR(0)项目规范簇中,只有I9有“移进――归约”冲突,L →S·L → S·L因为FOLLOW(L) ∩FIRST(L) = ∮所以可以用SLR方法解决以上冲突,最后我们得到的SLR分析static int action[20][11]=/* 0 */{{ 2, -1, 3, 4, -1, 5, -1, -1, -1, 1, -1},/* 1 */ { -1, -1, -1, -1, -1, -1, -1, -1,ACC, -1, -1},/* 2 */ { -1, -1, -1, -1, -1, -1, -1, 6, -1, -1, -1},/* 3 */ { -1, -1, -1, -1, -1, -1, -1, 7, -1, -1, -1},/* 4 */ { 2, -1, 3, 4, -1, 5, -1, -1, -1, 9, 8},/* 5 */ { -1, -1, -1, -1, -1, -1, 10, -1, -1, -1, -1},/* 6 */ { 2, -1, 3, 4, -1, 5, -1, -1, -1, 11, -1},/* 7 */ { 2, -1, 3, 4, -1, 5, -1, -1, -1, 12, -1},/* 8 */ { -1, -1, -1, -1, 13, -1, -1, -1, -1, -1, -1},/* 9 */ { 2, -1, 3, 4,105, 5, -1, -1, -1, 9, 14},/* 10*/ { -1,104, -1, -1,104, -1, -1, -1,104, -1, -1},/* 11*/ { -1, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1},/* 12*/ { -1,102, -1, -1,102, -1, -1, -1,102, -1, -1},/* 13*/ { -1,103, -1, -1,103, -1, -1, -1,103, -1, -1},/* 14*/ { -1, -1, -1, -1,106, -1, -1, -1, -1, -1, -1},/* 15*/ { 2, -1, 3, 4, -1, 5, -1, -1, -1, 16, -1},/* 16*/ { -1,101, -1, -1,101, -1, -1, -1,101, -1, -1}};其中,前9 列为action 值,后2 列为goto 值;0~16 表示17 个移进状态(即Si);-1表示出错;ACC 表示分析成功;而100~106 对应7 个归约产生式:100S’→ S101S → if e S else S102S → while e S103S → { L }104S → a;105L → S106L → SL2. 算术表达式的LR 分析表2 设计如下:0)S’→ E1) E → E+E2) E → E*E3) E → (E)static int action1[10][7]=/* 0 */ {{ 3, -1, -1, 2, -1, -1, 1},/* 1 */ { -1, 4, 5, -1, -1,ACC, -1},/* 2 */ { 3, -1, -1, 2, -1, -1, 6},/* 3 */ { -1,104,104, -1,104,104, -1},/* 4 */ { 3, -1, -1, 2, -1, -1, 7},/* 5 */ { 3, -1, -1, 2, -1, -1, 8},/* 6 */ { -1, 4, 5, -1, 9, -1, -1},/* 7 */ { -1,101, 5, -1,101,101, -1},/* 8 */ { -1,102,102, -1,102,102, -1},/* 9 */ { -1,103,103, -1,103,103, -1}};3.布尔表达式的SLR 分析表3 设计如下:(过程略)1)S’→ B2) B → i3) B → i rop i4) B → ( B )5) B → ! B6) A → B &&7) B → AB8)O → B ||static int action2[16][11]=/* 0 */ {{ 1, -1, 4, -1, 5, -1, -1, -1, 13, 7, 8}, /* 1 */ { 1, 2, -1,101, -1,101,101,101, -1, -1, -1}, /* 2 */ { 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},/* 3 */ { -1, -1, -1,102, -1,102,102,102, -1, -1, -1},/* 4 */ { 1, -1, 4, -1, 5, -1, -1, -1, 11, 7, 8}, /* 5 */ { 1, -1, 4, -1, 5, -1, -1, -1, 6, 7, 8}, /* 6 */ { -1, -1, -1,104, -1, 9, 10,104, -1, -1, -1},/* 7 */ { 1, -1, 4, -1, 5, -1, -1, -1, 14, 7, 8}, /* 8 */ { 1, -1, 4, -1, 5, -1, -1, -1, 15, 7, 8}, /* 9 */ {105, -1,105, -1,105, -1, -1, -1, -1, -1, -1},/*10 */ {107, -1,107, -1,107, -1, -1, -1, -1, -1, -1},/*11 */ { -1, -1, -1, 12, -1, 9, 10, -1, -1, -1, -1},/*12 */ { -1, -1, -1,103, -1,103,103,103, -1, -1, -1},/*13 */ { -1, -1, -1, -1, -1, 9, 10,ACC, -1, -1, -1},/*14 */ { -1, -1, -1,106, -1, 9, 10,106, -1, -1, -1},/*15 */ { -1, -1, -1,108, -1, 9, 10,108, -1, -1, -1}};LR 分析表控制语义加工的实现:当扫描LR 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。

相关主题