语法分析递归文法.doc
文本预览下载声明
实验二:自顶向下的语法分析:递归下降法
1、实验目的:编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。
2、实验要求:
文法(教材199页)
(1)把词法分析作为语法分析的子程序实现(5分)
(2)独立的语法分析程序(4分)
(3)输入串以‘#’结束,输出成功(success)或出错(error)、指出出错位置(行、列以及错误类型)
#include stdio.h
#include string.h
char prog[80], token[8];
char ch;
int syn, p, m, n, sum, kk=0;
char *rwtab[6]={begin, if, then, while, do, end};
void scaner();
void lrparser();
void yucu();
void statement();
void expression();
void term();
void factor();
void main()
{
label:
p=0;
printf(Please input string:\n);
do
{
scanf(%c, ch);
prog[p++]=ch;
}while(ch!=#); //当遇到#,结束输入
p=0;
scaner();
lrparser();
}
void scaner()
{
for(n=0; n8; n++) token[n]=NULL;
ch=prog[p++];
while(ch== ||ch==\n) ch=prog[p++];
m=0;
if((ch=Ach=Z) || (ch=ach=z))
{
while((ch=Ach=Z) || (ch=ach=z)||(ch=0ch=9))
{
token[m++]=ch;
ch=prog[p++];//将prog数组的字母复制到ch数组中
}
token[m++]=\0; //把token的末尾设置结束符\0
p--;//标记到当前token数组中不是字母的当前位置
syn=10; //标记字母的对应码
for(n=0; n6; n++)
{
if(strcmp(token, rwtab[n])==0) //判断token对应rwtab中的哪一个,并进行对应赋对应码
{
syn=n+1;
break;
}
}
}
else if(ch=0ch=9)
{
sum=0;
while(ch=0ch=9)
{
sum=sum*10+ch-0; //number用来记录所对应的数字
ch=prog[p++];
}
p--;
syn=11; //标记数字的对应码
}
else
{
switch(ch)
{
case :
m=0;
token[m++]=ch;
ch=prog[p++];
if(ch==)
{
syn=21; //标记的对应码
token[m++]=ch;
}
else if(ch===)
{
syn=22; //标记=的对应码
token[m++]=ch;
}
else
{
syn=20; //标记的对应码
p--;
}
break;
case :
token[m++]=ch;
ch=prog[p++];
if(ch===)
{
syn=24; //标记=的对应码
token[m++]=ch;
}
else
{
syn=23; //标记的对应码
p--;
}
break;
case ::
token[m++]=ch;
ch=prog[p++];
if(ch===)
{
syn=18; //标记:=的对应码
token[m++]=ch;
}
else
{
syn=17; //标记:的对应码
p--;
}
break;
case +:
syn=13; //标记+的对应码
token[m++]=ch;
break;
case -:
syn=14; //标记-的对应码
token[m++]=ch;
break;
case *:
syn=15; //标记*的对应码
token[m++]=ch;
break;
case /:
显示全部