南航金城c语言试卷,南航金城学院编译原理课程设计杨阳教的.doc

南航金城学院编译原理课程设计杨阳教的.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 <=

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值