PL/0语法分析器(递归子程序法)
点击次数:41 次 发布日期:2008-12-01 12:51:25 作者:源代码网
|
源代码网推荐//程序不足之处:语言中对分程序的定义中没有包含常量的定义说明。错误处理能力不是很强。 源代码网推荐/*各个符号和产生式说明 源代码网推荐对应的函数 产生式 产生式的开始符号集合 源代码网推荐void S();程序 S-->F. p,m,e,k,q,g,n,r,f,.,;, 源代码网推荐void F();分程序 F-->B(Y|GY)|G(Y|BY)|Y p,m,e,k,q,g,n,r,f,.,;, 源代码网推荐void B();变量说明部分 pe(,e)*; p 源代码网推荐void G();过程说明部分 CF;|CF;G m 源代码网推荐void Y();语句 Y-->eaA|kToY|qToY|ge|n(e(,e)*)|r(e(,e)*)|fY(;Y)*j|<空> e,k,q,g,n,r,f,.,;, 源代码网推荐void C();过程首部 C-->me; m 源代码网推荐void A();表达式 A-->(+|-|<空>)N|A(+|-)N +,-,e,d,( 源代码网推荐void N();项 N-->I|N(*|/)I e,d,( 源代码网推荐void I();因子 I-->e|d|(A) e,d,( 源代码网推荐void X();关系运算符 X-->#|<|>|b #,<,>,b 源代码网推荐void T();//条件 T-->AXA|lA +,-,e,d,(,l 源代码网推荐其中终结符的含义均为二元式中的类别码所代表的单词 源代码网推荐(+,+);(-,-);(*,*);(/,/);((,();(),));(,,,);(;,;);(.,.);(#,#);(=,=);(>,>);(<,<);(:=,a);(>=,b); 源代码网推荐(<=,c);(数字,d);(标识符,e);(begin,f);(call,g);(const,h);(do,i);(end,j);(if,k);(odd,l); 源代码网推荐(procedure,m);(read,n);(then,o);(var,p);(while,q);(write,r); 源代码网推荐*/ 源代码网推荐/*测试数据: 源代码网推荐(PROCEDURE,m)(P,e)(;,;) 源代码网推荐(VAR,p)(D,e)(;,;) 源代码网推荐(PROCEDURE,m)(Q,e)(;,;) 源代码网推荐(VAR,p)(X,e)(;,;) 源代码网推荐(BEGIN,f) 源代码网推荐(READ,n)((,()(X,e)(),))(;,;) 源代码网推荐(D,e)(:=,a)(X,e)(;,;) 源代码网推荐(WHILE,q)(X,e)(<,<)(0,d) 源代码网推荐(DO,i)(CALL,g)(P,e)(;,;) 源代码网推荐(END,j)(;,;) 源代码网推荐(BEGIN,f) 源代码网推荐(WRITE,r)((,()(D,e)(),))(;,;) 源代码网推荐(CALL,g)(Q,e)(;,;) 源代码网推荐(END,j)(;,;) 源代码网推荐(BEGIN,f) 源代码网推荐(CALL,g)(P,e)(;,;) 源代码网推荐(END,j)(.,.) 源代码网推荐//请将以上数据存为b.c(上面为词法分析的结果) 源代码网推荐*/ 源代码网推荐#include <stdio.h> 源代码网推荐#include <stdlib.h> 源代码网推荐#include <conio.h> 源代码网推荐#include <string.h> 源代码网推荐char token; 源代码网推荐char tempword[25]; 源代码网推荐FILE *op; 源代码网推荐int row; 源代码网推荐void error(int wnum); 源代码网推荐char word(); 源代码网推荐void S();//程序 源代码网推荐void F();//分程序 源代码网推荐void B();//变量说明部分 源代码网推荐void G();//过程说明部分 源代码网推荐void Y();//语句 源代码网推荐void C();//过程首部 源代码网推荐void A();//表达式 源代码网推荐void N();//项 源代码网推荐void I();//因子 源代码网推荐void X();//关系运算符 源代码网推荐void T();//条件 源代码网推荐 源代码网推荐struct infoword 源代码网推荐{ 源代码网推荐 char word[25]; 源代码网推荐 char type; 源代码网推荐 int row; 源代码网推荐 int error; 源代码网推荐 infoword *next; 源代码网推荐 infoword *pre; 源代码网推荐}; 源代码网推荐infoword *head,*cur; 源代码网推荐infoword *point; 源代码网推荐 源代码网推荐void filltable(char *str,char t) 源代码网推荐{ 源代码网推荐 //infoword newnode; 源代码网推荐 int i=0; 源代码网推荐 infoword *newnode=new infoword; 源代码网推荐 strcpy(newnode->word,str); 源代码网推荐 newnode->type=t; //putchar(q); 源代码网推荐 newnode->row=row; 源代码网推荐 newnode->error=i; 源代码网推荐 newnode->pre=NULL; 源代码网推荐 newnode->next=NULL; 源代码网推荐 if(head==NULL) 源代码网推荐 { 源代码网推荐 point=head=newnode;//初始化point和head指针 源代码网推荐 cur=newnode;//初始化cur指针 源代码网推荐 } 源代码网推荐 else 源代码网推荐 { 源代码网推荐 newnode->pre=cur; 源代码网推荐 cur->next=newnode; 源代码网推荐 cur=newnode; 源代码网推荐 } 源代码网推荐} 源代码网推荐char find(char *str) 源代码网推荐{ 源代码网推荐 infoword *tempp;//puts(str); 源代码网推荐 tempp=head; 源代码网推荐 while(tempp&&strcmp((tempp->word),str))tempp=tempp->next; 源代码网推荐 if(tempp==NULL)return NULL; 源代码网推荐 else return tempp->type; 源代码网推荐} 源代码网推荐int compare(char *str,char t) 源代码网推荐{ 源代码网推荐 char a; 源代码网推荐 a=find(str); 源代码网推荐 if(a) 源代码网推荐 if(a==t) 源代码网推荐 return 1;//类型为要求类型 源代码网推荐 error(44);//找到但不是要求类型 源代码网推荐 error(42);//未找到 源代码网推荐 return 0; 源代码网推荐} 源代码网推荐 源代码网推荐 源代码网推荐char word()//return a char 源代码网供稿. |
