南航金城学院编译原理课程设计杨阳教的
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;