编译原理词法语法语义分析器设计打印版
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++]; // 遍历