编译原理词法语法语义分析器设计打印版

  • 格式:docx
  • 大小:150.27 KB
  • 文档页数:33

下载文档原格式

  / 33
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理词法语法语义分析器设计打印版编译原理课程设计报告

小组成员:

2010年06月24日

一. 任务及要求

课程设计要实现的内容:

) 设计符号表(1

确定符号表的组织方式,一般应包括名字栏和信息栏,其中名字栏作为关键字。要考虑能够存储有关名字的信息,并可以高效地完成如下操作:

a. 查找: 根据给定的名字,在符号表中查找其信息。如果该名字在符号表中不

存在,则将其加入到符号表中,否则返回指向该名字的指针;

b. 删除: 从符号表中删除给定名字的表项。

(2) 设计词法分析器

设计各单词的状态转换图,并为不同的单词设计种别码。将词法分析器设计成

供语法分析器调用的子程序。功能包括:

a. 能够拼出语言中的各个单词;

b. 将拼出的标识符填入符号表;

c. 返回( 种别码,属性值) 。

(3) 语法分析

要求用递归下降分析法、预测分析法或SLR分析法,实现对表达式、各种说明

语句、控制语句进行语法分析。

若语法正确,则输出一棵语法树

若语法错误,要求指出出错性质和出错位置(行号)。出错处理应设计成一个出错处理子程序。

1(词法分析器产生下述小语言的单词序列

这个小语言的所有的单词符号,以及它们的种别编码和内部值如下表:

单词符号种别编码助记符内码值DIM 1 $DIM - IF 2 $IF - DO 3 $D0 -

STOP 4 $STOP- END 5 $END -标识符6 $ID - 常数(整)7 $INT 内部字符串= 8 $ASSIGN 标准二进形式+ 9 $PLUS - * 10 $STAR - ** 11 $POWER - ,12 $COMMA - ( 13 $LPAR - )14 $RPAR -

2010022220

朱恒恒

2010022226

刘穗清

2( 语法分析器能识别由大于>小于<加+ 减- 乘* 除/ 括号() 赋值=操作数所组成的算术表达式,其文法如下:

使用的算法可以是:预测分析法;递归下降分析法;算符优先分析法;LR分析法等。

(1) A->EB

(2) B- >>EB|vEB|&

(3) E->TG

⑷G->+TG|- TG|£

(5) T->FS

(6) S- >*FS|/FS| &

(7) F->(E)|i |i=E

2010022211

吴晓凯

3 具体的种别编码和内部值:

单词符号种别编码单词值

int 1

char 2

float 3

if 4

else 5

do 6

while 7

printf 8

main 9

标识符100 内部字符串常数(整) 200 二进制数值表示= = 401 = 402

>= 403

> 404

<= 405

< 406

!= 407

! 408

409 +=

410 ++

411 +

412 -=

413 - -

414 -

415 *=

416 *

417 /=

418 /

419 A

501 ;

( 502

) 503

[ 504

] 505

{ 506

} 507

508 :

“ 509 %= 510

% 511 , 512 # 513 @ 514 空格515 $ 0

4. 流程图主流程图

幵妳

输出单词二元组・

扫描程序流程图:

(a) ,标识符词法分析流程图

(b) ,数字(整)词法分析流程图

(c) ,其他字符流程图

吏眞初始优

读取下一牛字符■

J W

拼成标识

符,.

* FLAG 为对应关饉宇的单

词种别丙,itaif^s -

返回*

(a)

始化

读取下一个字符

-

拼成数字

FLAG=2D0^

开如

谨取下一个宇符,

是否需垂继续读

赋値血申鬥網为对应羌犍字的单词种别码」

返回*

(b) (c)

主流程图

刘穗清2010022226

5. First/Follow

First(A)={( ,i} Follow(A)={#} First(B)={>,<, £} Follow(B)={#}

First(E)={(,i} Follow(E)={>,<,),#} First(F)={(,i} Follow(F)={*,(,+,-}

First(G)={+,- , £} Follow(G)={>,<,),#} First(T)={c,i} Follow(T)={+, - ,>,<,),#} First(S)={*,(, & } Follow(S)={+, -,>,<,),#}

吴晓凯2010022211

6.源程序

//#include "stdafx.h"

#in clude

#include

using namespace std;

#include

#include

#include

int i,j,k,flag,number,status; /*status which is use to judge the string is keywords or not!*/

char ch;

char words[10] = {" "};

char program[500];

int flags[500]; // 存储输入句子

string cnt[500];// 标识符

int temp=0; // 数组下标

int is_right; // 判断输出信息

int Scan(char program[])

{

char *keywords[13] = {"void","main","if","then","break","int","char","float","include","for", "while","printf"

,"scanf"}; // 关键字

number=0;

status=0;

j=0;

ch=program[i++]; // 遍历