南航金城学院编译原理课程设计杨阳教的.doc
产生式
主程序:
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-> idF-> 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. 能对输入的一段文本程序输出其词法成分的各种别编码和属性值(对关键字,输出其种别编码,属性值为空;对常量,输出其种别编码和常量的值;对变量,输出其种别编码和变量名)。
要求用递归下降分析法、LL(1)分析法或SLR(1)分析法,对词法分析的结果进行语法分析。(实现对标识符表的插入和查找,见(3))
若语法正确,则输出一棵语法树。
若语法错误,则报错。
(3)设计标识符表,并实现一定的语义分析(可选)
标识符表应至少包括名字栏和数据类型栏。在语法分析中:
对在声明语句中出现的关于标识符的声明,如果该名字在符号表中不存在,则将其加入到符号表中,并将数据类型填入。若名字已经存在被声明过,则报错。
对一般语句中出现的标识符,可以查找标识符表,若标识符不在表中,则报错。
验收要求
有标识符表的构造说明文档(可选)
有种别编码表的说明文档
有词法分析的DFA图
若使用了递归下降分析法需要有根据产生式构造的first/follow集、若使用了LL(1)分析法需要有预测分析表,若使用了SLR(1)分析法需要有SLR(1)分析表
有可执行的源程序,能输出词法分析的结果、语法分析的语法树(和标识符表)
源程序:#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 <=