专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »C语言教程 » 递归下降分析器:PL/0语法分析器(递归子程序法) »正文

递归下降分析器: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条 分0页

发表评论

  • 昵称:
  • 内容: