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

Pascal语言编译器的设计与实现

Pascal语言编译器的设计与实现我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。

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

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

我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值)#define ACC -2 #define sy_if 0 #define sy_then 1 #define sy_else 2 #define sy_while 3 #define sy_begin 4 #define sy_do 5 #define sy_end 6 #define a 7 #define semicolon 8 #define e 9 #define sharp 10 #define S 11 #define L 12 #define tempsy15 #define EA 18 //E and #define EO 19 //E or#define plus 34 #define subtract 35 #define times 36 #define divide 37 #define bexxes 38 #define op_and 39 #define op_or 40 #define op_not 41 #define rop 42#define lparent 48 #define rparent 49 #define ident 56 #define intconst 57函数说明 1.读取函数 readline( )、readchar ( ) 词法分析包含从源文件读取字符的操作,但频繁的读文件操作会影响程序执行效率,故实际上是从源程序文件””中读取一行到输入缓冲区,而词法分析过程中每次读取一个字符时则是通过执行 readchar ( )从输入缓冲区获得的;若缓冲区已被读空,则再执行readline( )从中读取下一行至输入缓冲区。

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

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

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

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

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

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

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

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

1. 控制语句的 SLR 分析表1 设计过程如下:将扩展文法G’0) S’ S1)S if e then S else S 2)S while e do S 3)S begin L end 4)S a 5)L S 6)L S;L用∈_CLOSURE方法构造LR(0)项目规范簇为:I0: S’·SS ·if e then S else S S ·while e do S S ·begin L endS · a ; I1: S’ S·I2: S if·e then S else S I3: S while ·e do S I4: S begin·L end L ·S L ·S;L S ·if e then S else SS ·while e do S S ·begin L end S · aI5: S a·I6: S if e·then S else S I7: S while e·do S I8: S begin L·end I9: L S·L S·;LI10: S if e then · S else SS · if e then S else S S · while e do S S · begin L endI11: S while e do ·SS · if e then S else S S ·while e do S S · begin L end S · aI12: S begin L end · I13: L S; ·LL ·S L ·S;LS ·if e then S else S S ·while e do S S ·begin L end S ·aI14: S if e then S·else S I15: S while e doS· I16: L S;L·I17: S if e then S·else SS ·if e then S else S S ·while e do SS ·begin L end S ·aI18: S if e then S else S·构造文法G’中非终结符的FOLLOW集如下:FOLLOW(L) = { end }FOLLOW(S) = {else , ; ,end,#}在LR项目规范簇中,只有I9有“移进――归约”冲突, L S· L S·L 因为FOLLOW(L) ∩ FIRST(L) = ∮所以可以用SLR方法解决以上冲突,最后我们得到的SLR分析表如下: If 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 S2 S2 S2 S2 S2 S2static int /*0*/ /*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/then S10 else R4 R3 S17 R2 R1 while begin S3 S3 S3 S3 S3 S3 S4 S4 S4 S4 S4 S4 ACTION do S11 end R3 S12 R5 R3 R2 R6 R1 a S5 S5 S5 S5 S5 S5 ; R4 S13 R3 R2 R1 e S6 S7 # ACC R4 R3 R2 R1 S 1 9 14 15 9 18 GOTO L 8 16action[19][13]={{2,-1,-1,3,4,-1,-1,5,-1,-1,10,1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,ACC,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,6,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,-1,-1},{2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,8},{-1,-1,104,-1,-1,-1,104,-1,104,-1,104,-1,-1},{-1,10,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,11,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,12,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,105,-1,13,-1,-1,-1,-1},/*10*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,14,-1}, /*11*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,15,-1}, /*12*/ {-1,-1,103,-1,-1,-1,103,-1,103,-1,103,-1,-1}, /*13*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,9,16}, /*14*/ {-1,-1,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1}, /*15*/ {-1,-1,102,-1,-1,-1,102,-1,102,-1,102,-1,-1}, /*16*/ {-1,-1,-1,-1,-1,-1,106,-1,-1,-1,-1,-1,-1}, /*17*/ {2,-1,-1,3,4,-1,-1,5,-1,-1,-1,18,-1}, /*18*/ {-1,-1,101,-1,-1,-1,101,-1,101,-1,101,-1,-1}};其中,前 9 列为 action 值,后 2 列为 goto 值;0~16 表示 17 个移进状态;-1表示出错;ACC 表示分析成功;而 100~106 对应归约产生式:2. 算术表达式的 LR 分析表 2 设计如下:0) S’ E 1) E E+E 2) E E*E 3) E (E)4) E i I 0 1 2 3 4 5 6 7 8 9 10 11 12 13 S3 S3 S3 S3 S3 S3 + S4 R4 S4 R1 R2 R3 R6 R5 - S11 R4 S11 R1 R2 R3 R6 R5 * S5 R4 S5 S5 R2 R3 R6 S5 ACTION / S10 R4 S10 S10 R2 R3 R6 S10 ( S2 S2 S2 S2 S2 S2 ) R4 S9 R1 R2 R3 R6 R5 # ACC R4 R1 R2 R3 R6 R5 GOTO E 1 6 7 8 12 13static int action1[14][9]= /*0*/ {{3,-1,-1,-1,-1,2,-1,-1,1}, /*1*/ {-1,4,11,5,10,-1,-1,ACC,-1}, /*2*/ {3,-1,-1,-1,-1,2,-1,-1,6}, /*3*/ {104,104,104,104,104,104,104,104,-1}, /*4*/ {3,-1,-1,-1,-1,2,-1,-1,7}, /*5*/ {3,-1,-1,-1,-1,2,-1,-1,8},/*6*/ {-1,4,11,5,10,-1,9,-1,-1}, /*7*/ {101,101,101,5,10,101,101,101,-1}, /*8*/ {102,102,102,102,102,102,102,102,-1}, /*9*/ {103,103,103,103,103,103,103,103,-1}, /*10*/ {3,-1,-1,-1,-1,2,-1,-1,12}, /*11*/ {3,-1,-1,-1,-1,2,-1,-1,13}, /*12*/ {106,106,106,106,106,106,106,106,-1}, /*13*/{105,105,105,5,10,105,105,105,-1}};3.布尔表达式的 SLR 分析表3 设计如下: 1) S’ B 2)B i3) B i rop i 4) B ( B ) 5) B NOT B 6) A B AND 7) B AB 8) O B OR 9) B OB i 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 S1 S3 S1 S1 S1 S1 R5 R7 Rop S2 ( S4 S4 S4 S4 S4 R5 R7 ACTION ) R1 R2 R4 S12 R3 R6 R8 NOT S5 S5 S5 S5 S5 R5 R7 AND R1 R2 S9 S9 R3 S9 S9 S9 OR R1 R2 S10 S10 R3 S10 S10 S10 # R1 R2 R4 R3 ACC R6 R8 B 13 11 6 14 15 GOTO A 7 7 7 7 7 O 8 8 8 8 8 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,105,-1,-1,-1}, /*10*/{107,-1,107,-1,107,-1,-1,107,-1,-1,-1}, /*11*/ {-1,-1,-1,12,-1,9,10,-1,-1,-1,-1}, /*12*/ {-1,103,-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 分析表的当前状态为归约状态时,则在调用与该状态对应的产生式进行归约的同时,调用相应的语义子程序进行有关的翻译工作。

相关主题