1、语法分析程序报告基本语法分析程序报告 姓名:牛添识 班级:软件94 学号:091610721. 程序设计语言文法的形式化描述pascal语言子集文法-:=-if then | if then else -| -| -|true|false2. 单词种别定义(1) 保留字Program(1),begin(2),end(3),var(4),interger(5),if(6),then(7)else(8),do(9),while(10) (2) 标识符(11)(3) 整形常数(12)(4) 界符,运算符 +(13) -(14) ,( (15), )(16),=(17),(18),(19) ;(20)
2、(分号,语句结束时使用),(21)(定义变量时分隔多个变量) :(22)(冒号,定义变量时使用) :=(23)(冒号+等号,赋值号) *(24)乘 , /(25)除3. 语法分析程序 #include#include fstream.h#includeclass Queue private: char ptr128; int head; int tail; public: void copy(Queue *queue) queue-head=head; queue-tail=tail; for(int i=head;iptri=ptri; bool Find(int t) for(int i=
3、head;i0) return false; return true; ;class Pro_Processprivate: int sta_stack;public : Pro_Process() sta_stack=0; public: void Process(char * ptr) char * temp2=ptr; while(int)* temp2!=0)/去掉/和/* if(sta_stack!=0)/进入夹逼注释阶段 /寻找下一个标记符号 if(int)*temp2=*&(int)*(temp2+1)=/)/寻找到 sta_stack-; *temp2=32; *(temp2+
4、1)=32; if(int)*temp2=/&(int)*(temp2+1)=*) sta_stack+; *temp2=32; *(temp2+1)=32; else/否则在注释中置为空格 *temp2=32; else/正常进行阶段 if(int)*temp2=/) if(int)*(temp2+1)=/) Pro_process1(temp2); return ; if(int)*(temp2+1)=*) *temp2=32; sta_stack+; temp2+; private: /* 将当前符号置为0 * */ void Pro_process1(char * temp2) *te
5、mp2=0; ;class Two_pass private: char ptr20; int index; int state;/确定返回的是否带有字符串,如果有为1;没有为0; public : bool equal(char * p) int temp=strcmp(ptr,p); if(temp=0)/strcmp字符串匹配成功为0 return true; return false; bool equal(int para) if(para=index) return true; return false; public : Two_pass() index=0; void Two_
6、copy(char * p,int dex) state=1; int count=0; while(*p!=0) ptrcount=*p; count+; p+; ptrcount=0; index=dex; void Two_copy(int dex)/ 返回值没有字符串 index=dex; state=0; if(1=index) strcpy(ptr,program); if(2=index) strcpy(ptr,begin); if(3=index) strcpy(ptr,end); if(4=index) strcpy(ptr,var); if(5=index) strcpy(
7、ptr,integer); if(6=index) strcpy(ptr,if); if(7=index) strcpy(ptr,then); if(8=index) strcpy(ptr,else); if(9=index) strcpy(ptr,do); if(10=index) strcpy(ptr,while); if(13=index) strcpy(ptr,+); if(14=index) strcpy(ptr,-); if(15=index) strcpy(ptr,(); if(16=index) strcpy(ptr,); if(17=index) strcpy(ptr,=);
8、 if(18=index) strcpy(ptr,); if(19=index) strcpy(ptr,=a&ch=A&ch=0&chTwo_copy(strToken,11); return true; else pass-Two_copy(code); return true; else if(isDigit() while(isDigit() Concat(); Getchar(); Append(); pass-Two_copy(strToken,12); return true; else if(ch=+) pass-Two_copy(13); Getchar(); return t
9、rue; if(ch=-) pass-Two_copy(14); Getchar(); return true; if(ch=() pass-Two_copy(15); Getchar(); return true; if(ch=*) pass-Two_copy(24); Getchar(); return true; if(ch=/) pass-Two_copy(25); Getchar(); return true; if(ch=) pass-Two_copy(16); Getchar(); return true; if(ch=) pass-Two_copy(17); Getchar()
10、; return true; if(ch=) pass-Two_copy(18); Getchar(); return true; if(ch=Two_copy(19); Getchar(); return true; if(ch=;) pass-Two_copy(20); Getchar(); return true; if(ch=,) pass-Two_copy(21); Getchar(); return true; if(ch=:) Getchar(); if(ch=) pass-Two_copy(23); Getchar(); return true; else pass-Two_c
11、opy(22); return true; / return false; ;class AnalyseMachineprivate: Two_pass SYM; AccidenceAnalyse sss; bool sysmbol;private: Queue Errorqueue;/错误队列 Queue Rightqueue;/正确队列public: AnalyseMachine() sysmbol=true; public : bool getCorretMess() return sysmbol; private: bool ADVANCE() return sss.Process(&
12、SYM); public: void test() int i=0; while (ADVANCE() i+; private: bool getNextLine()/取到本行分号;返回true,如果文件尾返回false if(SYM.equal(20) return true; else while(sss.Process(&SYM) if(SYM.equal(20) return true; return false;/文件尾 public: bool Z()/如果有句子,继续分析,返回true,否则为文件尾,返回false sysmbol=true; Errorqueue.clear()
13、;/错误消息队列清空 Rightqueue.clear();/正确队列清空 if(false=ADVANCE() return false; if(SYM.equal(6)/if 语句 Rightqueue.pushQueue(10); A(); getNextLine(); else if(SYM.equal(11)/赋值语句 I(); getNextLine(); else if(SYM.equal(10)/循环语句 Rightqueue.pushQueue(2); L(); getNextLine(); else ERROR(); if(sysmbol=false) coutfalse; else couttrue; return true; private:/赋值语句 void I() Rightqueue.pushQueue(3); if(SYM.equal(11)/标识符 J(); if(SYM.equal(23)/赋值号 ADVANCE(); else ERROR(); return ; D();/ /* if(SYM.equal(20) else ERROR(); */
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1