编译原理实验报告--递归子程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译原理实验
姓名:尹莉
学号:E31314022 专业:13级网络工程
语法分析器1
一、实现方法描述
所给文法为G【E】;
E->TE’
E’->+TE’|空
T->FT’
T’->*FT’|空
F->i|(E)
递归子程序法:
首先计算出五个非终结符的first集合follow集,然后根据五个产生式定义了五个函数。定义字符数组vocabulary来存储输入的句子,字符指针ch指向vocabulary。从非终结符E函数出发,如果首字符属于E的first集,则依次进入T函数和E’函数,开始递归调用。在每个函数中,都要判断指针所指字符是否属于该非终结符的first集,属于则根据产生式进入下一个函数进行调用,若first集中有空字符,还要判断是否属于该非终结符的follow集。以分号作为结束符。
二、实现代码
头文件shiyan3.h
#include
#include
#include
using namespace std;
#define num 100
char vocabulary[num];
char *ch;
void judge_EE();
void judge_T();
void judge_TT();
void judge_F();
源文件
#include"shiyan3.h"
void judge_E()
{
if(*ch==';')
{
cout<<"该句子符合此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } else if(*ch=='('||*ch=='i') { judge_T(); judge_EE(); } else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } } { if(*ch==';') { cout<<"该句子符合此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } if(*ch=='+') { ch++; judge_T(); judge_EE(); } else if(*ch=='#'||*ch==')') return; else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } } void judge_T() { if(*ch==';') { cout<<"该句子符合此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } if(*ch=='('||*ch=='i') { judge_F(); judge_TT(); } else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } } void judge_TT() { if(*ch==';') { cout<<"该句子符合此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } if(*ch=='*') { ch++; judge_F(); judge_TT(); } else if(*ch==')'||*ch=='+'||*ch=='#') return; else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } } void judge_F() { if(*ch==';') { cout<<"该句子符合此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } if(*ch=='(') { ch++; judge_E(); if(*ch==')') { ch++; } else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0); } } else if(*ch=='i') { ch++; //cout<<*ch; } else { cout<<"该句子不匹配此文法!"< int a=0; cout<<"按1结束程序"< cin>>a; if(a==1) exit(0);