编译原理(递归下降分析程序)

编译原理 (递归下降分析程序)

 
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
int i=0;
string nexttoken;
char ch;
void A();
void A1();
void read()
{
      ch= nexttoken[++i];
}
void error()
{
      cout<<"不是本文法的句型!!"<<endl;
      exit(1);
}                                   
void S()
{
      read();
      if(ch=='(')
      {
             read();
             A();
             
             if (ch==')') goto L;
             else error();
      }
      else  if(ch!='a') error();
      else { read();A();
      if(ch=='b') goto L;
      else error();}
L:read();
 return;
 
 
}
void A()
{
      if(ch== 'e') {read();goto L;}
      if(ch!= 'd') error();
      S();
L:A1();
 return;
 
}
void A1()
{
L:if(ch=='d'){ read();goto L;}
 else if(ch=='b') goto L1;
 else if(ch==')') goto L1;
 else error();
L1:return;
  
}
void main()
{
      try
      {
             cout<<"Please input the string: "<<endl;
             cin>>nexttoken;
             ch=nexttoken[i];
             S();
             cout<<"为本文法的句型!"<<endl;
      }
      catch(char)
      {
             cout<<"输入出错!"<<endl;
      }
}
//(aeb)正确
 


递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
#include <stdio.h> #include<dos.h> #include<stdlib.h> #include<string.h> #define MAXSIZE 100 #define SIZE 50 #define EMPTY 14 char LAnalysisStr[MAXSIZE]; //Left Analysis String char stack[SIZE]; //A Stack char expression[SIZE]; //Expression that inputed by user char G_Expression[SIZE]; //Generate Expression char symbol; //current char of expression int Index_exp; //The index of Expression int current_Index; //current index of expression char state = 0; //whether the Syntax is starting int LIndex; //The Index of Left Analysis String int AnalyseTrace[SIZE]; //Record the trace of Syntax Analyse int Index_Trace; //Syntax Analysiser Function Definate Below ... int E_Start(); int G_Syntax(); int T_Syntax(); int S_Syntax(); int F_Syntax(); //************************************************ /*************************************** Describe:Append append[] to String test[] after Index @Param: char test[], char append[] @Return: void @note: Never using this fuction ! *****************************************/ void append(char test[], char append[]) { int i = 0; int Index = 0; while(LAnalysisStr[Index]!= '\0')Index++; while(append[i]!= '\0') { test[Index] = append[i]; Index++; i++; } // name of 'LIndex' can not modify LIndex = Index; } /*************************************** Describe:Modify the Generate expression @Param: char pre, char substance[] @Return: void *****************************************/ void modify(char pre, char substance[]) { int i = 0; int j = 0; int k = 0; char temp[SIZE]; strcpy(temp, G_Expression); //copy G_Expression to temp string puts(G_Expression); while((temp[i]!= pre) && (i < SIZE)) i++; //i is now point to the index of [pre] for(j = i,k = 0; j < strlen(substance) + i; j++, k++) temp[j] = substance[k]; //pre is instead of substance for(k = i + 1; k < strlen(G_Expression); k++,j++) temp[j] = G_Expression[k]; //The rest of G_Expression is copy to temp temp[j] = '\0'; //temp is end of '\0' strcpy(G_Expression, temp); // copy temp to G_Expression } /*************************************** Describe:Printing the Trace of the Syntax Analyser @Param: void @Return: void *****************************************/ void PrintTrace() { int i = 0; while(AnalyseTrace[i] != 0) { switch(AnalyseTrace[i]) { case 1: modify('E',"TG"); break; case 2: modify('T',"FS"); break; case 3: modify('G',"+TG"); break; case 4: modify('G',"-TG"); break; case 5: modify('S',"*FS"); break; case 6: modify('S',"/FS"); break; case 7: modify('F',"(E)"); break; case 8: modify('F',"i"); break; case 9: modify('G',"@"); break; case 10: modify('S',"@"); break; } i++; printf("%c\n",25); } puts(G_Expression); } /*************************************** Describe:Geting Expression that inputed by user; @Param: void @Return: void *****************************************/ void GetExpression() { char in; printf("Input Expression below <end of '#'>:\n"); Index_exp = 0; in = getchar(); while(in != '#') { expression[Index_exp++] = in; in = getchar(); } } /*************************************** Describe:Printing Expression that inputed by user; @Param: void @Return: void *****************************************/ void PrintExpression() { int i = 0; printf("You have inputed below:\n"); for(i = 0; i < Index_exp; i++) printf("%c",expression[i]); printf("\n"); printf("********************************************************\n"); printf("| \t%c Analysing... %c\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("Syntax | Analysing String | Analysing char | Rest Expression String\n"); } /*************************************** Describe:Printing Expression that analysis @Param: void @Return: void *****************************************/ void PrintAnalysisExpression() { int i = 0; for(i = 0; i <= current_Index; i++) printf("%c",expression[i]); printf("\t"); } /*************************************** Describe:Printing Expression that wait to be analysed @Param: void @Return: void *****************************************/ void PrintRestExpression() { int i; printf("\t\t"); for(i = current_Index; i < Index_exp; i++) { printf("%c",expression[i]); } printf("\n"); } int G_Syntax() { if(expression[current_Index] == '+') { printf("[G -> +TG]\t\t"); AnalyseTrace[Index_Trace++] = 3; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // T_Syntax & G_Syntax if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} //return to E_Start return 1; } else if(expression[current_Index] == '-') { printf("[G -> -TG]\t\t"); AnalyseTrace[Index_Trace++] = 4; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // T_Syntax & G_Syntax if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} //return to E_Start return 1; } else { printf("G -> %c\t\t\t",EMPTY); AnalyseTrace[Index_Trace++] = 9; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); } } /**************************************** Describe: S gernerate syntax @Param: void @Return: int *****************************************/ int S_Syntax() { if(expression[current_Index] == '*') { printf("[S -> *FS]\t\t"); AnalyseTrace[Index_Trace++] = 5; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; } else if(expression[current_Index] == '/') { printf("[S -> /FS]\t\t"); AnalyseTrace[Index_Trace++] = 6; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; } else { printf("S -> %c\t\t\t",EMPTY); AnalyseTrace[Index_Trace++] = 10; PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); return 1; } return 1; } /*************************************** Describe: T gernerate syntax @Param: void @Return: int *****************************************/ int F_Syntax() { if(expression[current_Index] == '(') { AnalyseTrace[Index_Trace++] = 7; printf("[F -> (E)]\t\t"); PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // Get next char in expression return 1; } else if(expression[current_Index] == 'i') { AnalyseTrace[Index_Trace++] = 8; printf("[F -> i]\t\t"); PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); PrintRestExpression(); current_Index++; // Get next char in expression return 1; } else return 0; } /*************************************** Describe: T gernerate syntax @Param: void @Return: int *****************************************/ int T_Syntax() { printf("[T -> FS]\t\t"); AnalyseTrace[Index_Trace++] = 2; if(state) { PrintAnalysisExpression(); printf("%c\t",expression[current_Index]); } else {printf("\t%c\t",expression[current_Index]);} PrintRestExpression(); //LAnalysisStr[LIndex++] = ''; state = 1; if(!F_Syntax()) // F_Syntax fail then return {return 0;} if(!S_Syntax()) {return 0;} return 1; } /*************************************** Describe: E gernerate syntax @Param: void @Return: int *****************************************/ int E_Start() { current_Index = 0; // Current Index of Expression printf("[E -> TG]\t\t"); printf("\t%c\t",expression[current_Index]); PrintRestExpression(); AnalyseTrace[Index_Trace++] = 1; if(!T_Syntax()) {return 0;} if(!G_Syntax()) {return 0;} else {return 1;} return 0; } /*************************************** Describe: Main @Param: void @Return: void *****************************************/ main() { GetExpression(); PrintExpression(); if(E_Start() == 1) { printf("********************************************************\n"); printf("| \t%c Trace of Analysing %c\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); G_Expression[0] = 'E'; PrintTrace(); printf("********************************************************\n"); printf("| \t%c ACCEPT! %c\t\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("\n\n\tPress any key to quit\n"); getchar(); } else { printf("********************************************************\n"); printf("| \t%c ERROR %c\t\t\t\t|\n",EMPTY,EMPTY); printf("********************************************************\n"); printf("\n\t[Press any key to quit]\n"); getchar(); }/*end of if*/ getchar(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值