递归下降分析器:PL/0语法分析器(递归子程序法)来源: 发布时间:星期四, 2008年9月25日 浏览:24次 评论:0
//程序功能:PL/0语言语法分析程序,检测pl/0源程序的语法是否正确
//程序不足之处:语言中对分程序的定义中没有包含常量的定义说明。错误处理能力不是很强。 /*各个符号和产生式说明 对应的函数 产生式 产生式的开始符号集合 voidS();程序 S-->F. p,m,e,k,q,g,n,r,f,.,;, voidF();分程序 F-->B(Y|GY)|G(Y|BY)|Y p,m,e,k,q,g,n,r,f,.,;, voidB();变量说明部分 pe(,e)*; p voidG();过程说明部分 CF;|CF;G m voidY();语句 Y-->eaA|kToY|qToY|ge|n(e(,e)*)|r(e(,e)*)|fY(;Y)*j|<空>e,k,q,g,n,r,f,.,;, voidC();过程首部 C-->me;m voidA();表达式 A-->(+|-|<空>)N|A(+|-)N+,-,e,d,( voidN();项 N-->I|N(*|/)Ie,d,( voidI();因子 I-->e|d|(A)e,d,( voidX();关系运算符 X-->#|<|>|b#,<,>,b voidT();//条件 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> chartoken; chartempword[25]; FILE*op; introw; voiderror(intwnum); charword(); voidS();//程序 voidF();//分程序 voidB();//变量说明部分 voidG();//过程说明部分 voidY();//语句 voidC();//过程首部 voidA();//表达式 voidN();//项 voidI();//因子 voidX();//关系运算符 voidT();//条件 structinfoword { charword[25]; chartype; introw; interror; infoword*next; infoword*pre; }; infoword*head,*cur; infoword*point; voidfilltable(char*str,chart) { //infowordnewnode; inti=0; infoword*newnode=newinfoword; 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; } } charfind(char*str) { infoword*tempp;//puts(str); tempp=head; while(tempp&&strcmp((tempp->word),str))tempp=tempp->next; if(tempp==NULL)returnNULL; elsereturntempp->type; } intcompare(char*str,chart) { chara; a=find(str); if(a) if(a==t) return1;//类型为要求类型 error(44);//找到但不是要求类型 error(42);//未找到 return0; } charword()//returnachar 0
相关文章
读者评论
发表评论 |