南航金城学院编译原理课程设计杨阳教的

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

产生式

主程序:

Program-> main () {DefList; StmtList}

定义变量:

DefList-> Def; DefList

DefList-> Def

Def-> Type IDList

Type-> int

Type-> float

IDList-> id, IDList

IDList-> id

定义语句:

StmtList-> Stmt; StmtList

StmtList-> Stmt;

赋值语句:

Stmt-> id:=E

条件分支语句

Stmt-> if (BE) {StmtList} else {StmtList}

算数表达式:

(1) 自上而下分析法(2) 自下而上分析法E-> TE’E-> T

E’-> +TE’E-> E+T

E’-> εT-> F

T-> FT’T-> T*F

T’-> *FT’F-> (E)

T’-> εF-> id

F-> (E) F-> num

F-> id F-> floatnum

F-> intnum

F-> floatnum

布尔表达式:

BE-> id < id

BE-> id > id

BE-> id = id

BE-> id < intnum

BE-> id > intnum

BE-> id = intnum

课程设计要实现的内容:

(1)设计词法分析器

设计各单词的状态转换图,并为不同的单词设计种别码。功能包括:

a. 能够拼出语言中的各个关键字、运算符和界符;

b. 能够识别出标识符和不同类型的常量;

c. 能对输入的一段文本程序输出其词法成分的各种别编码和属性值(对关键字,输出

其种别编码,属性值为空;对常量,输出其种别编码和常量的值;对变量,输出其种别编码和变量名)。

(2)语法分析

要求用递归下降分析法、LL(1)分析法或SLR(1)分析法,对词法分析的结果进行语法分析。(实现对标识符表的插入和查找,见(3))

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

若语法错误,则报错。

(3)设计标识符表,并实现一定的语义分析(可选)

标识符表应至少包括名字栏和数据类型栏。在语法分析中:

对在声明语句中出现的关于标识符的声明,如果该名字在符号表中不存在,则将其加入到符号表中,并将数据类型填入。若名字已经存在被声明过,则报错。

对一般语句中出现的标识符,可以查找标识符表,若标识符不在表中,则报错。

验收要求

1、有标识符表的构造说明文档(可选)

2、有种别编码表的说明文档

3、有词法分析的DFA图

4、若使用了递归下降分析法需要有根据产生式构造的first/follow集、若使用了LL(1)

分析法需要有预测分析表,若使用了SLR(1)分析法需要有SLR(1)分析表

5、有可执行的源程序,能输出词法分析的结果、语法分析的语法树(和标识符表)

源程序:#include

#include

using namespace std;

#include

#include

#include

int i,j,k,flag,number,status,m=0,n=0,d,dian;//d为在计算小数时除以0.1的次数

/*status which is use to judge the string is keywords or not!*/

char ch;

float number1;

char words[10] = {" "};

char program[500];

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

string cnt[500];//标识符

int temp=0; //数组下标

int is_right=1; //判断输出信息

char num[500];

//-----------------------词法分析-----------------------------

int Scan(char program[])

{

char *keywords[9] = {"int","char","float","if","else","do","while","printf","main"}; //关键字number=0;

status=0;

j=0;

ch=program[i++];

//遍历

while(ch==' '||ch=='\n') //跳过空字符(无效输入)

ch=program[i++];

if ((ch >= 'a') && (ch <= 'z' )) //字母

{

while ((ch >= 'a') && (ch <= 'z' ))

{

words[j++]=ch;

ch=program[i++];

}

i--;

words[j++] = '\0';

for (k = 0; k < 9; k++)

if (strcmp (words,keywords[k]) == 0) //判断是否为关键字switch(k)

{

case 0:{

flag = 1;

status = 1;

break;

}

case 1:{

flag = 2;

status = 1;

break;

}

case 2:{

flag = 3;

status = 1;

break;

}

case 3:{

flag = 4;

status = 1;

break;

}

case 4:{

flag = 5;

status = 1;

break;

}

case 5:{

flag = 6;

status = 1;

break;

}

case 6:{

flag = 7;

status = 1;

break;

}

case 7:{

flag = 8;

status = 1;

break;

相关文档
最新文档