递归下降文法C语言实验报告,递归下降语法分析器实验报告.doc

递归下降语法分析器实验报告

编译原理实验报告

题目: 递归下降语法分析器

学 院 计算机科学与技术

专 业 xxxxxxxxxxxxxxxx

学 号 xxxxxxxxxxxx

姓 名 宁剑

指导教师 xx

20xx年xx月xx日

递归下降语法分析器

一、实验目的?

???? 了解语法分析的内部工作原理,通过在本次实验中运用一定的编程技巧,掌握对表达式进行处理的一种方法。

算术表达式的文法可以是可以根据需要适当改变:

→E+E|E-E|E*E|E/E|(E)|i

??? ?根据递归下降分析法或预测分析法 ,对表达式进行语法分析 ,判断一个表达式是否正确 。

(1) 准备:1. 阅读课本有关章节,确定算术表达式的文法(设计出预测分析表2. 考虑好设计方案;3. 设计出模块结构 、测试数据,初步编制好程序。

(2) 上机调试,发现错误,分析错误,再修改完善。教师根据学生的设计方案与学生进行探讨,以修改方案和代码 。

(3)改造后的文法:E→E+T|E-T|T

T→TF|T/F|F

F→F^|P

P→c |id| (E)

四、实验环境?

计算机 VC++软件#include

#include

#include

#include

#include

void error();

void terror();

void Scanner();

char sym=' ';

int i=0;

char strToken[30]={""};

FILE *in;

void E();

void E1();

void F();

void Retract(char str[30]){

for(int j=0;j<30;j++){

str[j]=0;

}

}

void Scanner(){

sym=fgetc(in);

if (isspace(sym)){

while(1){

if(isspace(sym)){

sym=fgetc(in);

}

else break;

}

}

if(isdigit(sym)){

while(1){

if (isdigit(sym)){

strToken[i]=sym;

i++;

sym=fgetc(in);

}

else{

printf("%s",strToken);

i=0;

Retract(strToken);

fseek(in,-2,1);

sym=fgetc(in);

break;

}

}

}

else{

if(sym=='+'){

printf("+");

}

else if(sym=='-'){

printf("-");

}

else if(sym=='*'){

printf("*");

}

else if(sym=='/'){

printf("/");

}

else if(sym=='^'){

printf("^");

}

else if(sym=='('){

printf("(");

}

else if(sym==')'){

printf(")");

}

}

}

void F(){

if(isdigit(sym)){

Scanner();

}

else if (sym=='('){

Scanner();

E();

if(sym==')'){

Scanner();

}

else error();

}

else terror();

}

void T1(){

if(sym=='*'||sym=='/'||sym=='^'){

Scanner();

F();

T1();

}

}

void T(){

F();

T1();

}

void E1(){

if (sym=='+'||sym=='-'){

Scanner();

T();

E1();

}

}

void E(){

T();

E1();

}

void error(){

printf("\nThis is a wrong phrase!\n");

exit(0);

}

void terror(

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值