一、 实验目的
编制一个语法分析程序,实现对词法分析程序所列出的单词序列进行语法检查和分析。
二、 实验内容和要求
实验内容:做一个可以对以下语法的分析程序
Ssd|a
Hsf-|&
Kf+Dg|&
Mf|*LM
&(空串);
实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。
- 3. 主要程序段及其解释:
#include<stdio.h>
#include<string.h>
char prog[800],token[20];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
main()
{
p=0;
printf(" Please input the source code: ");
do
{
ch= getchar();
prog[p++]=ch;
}while(ch='#');
p=0;
do
{
scaner();
switch(syn)
{
case 11: printf(" (%d,%d)",syn,sum);break;
case -1: printf(" (%s, )",token);break;
default: printf(" (%d,%s)",syn,token);
}
}while(syn!=0);
printf(" Token Over. ");
system("pause");
p=0;
scaner();
E();
if(syn==0)
printf(" Syntax success. ");
else printf(" Syntax fall. ");
}
scaner()
{
for(n=0;n<20;n++) token[n]=NULL;
m=0;
sum=0;
ch=prog[p++];
while(ch=' ')
{
ch=prog[p++];
if(ch>='a'&&ch<='z')
{
while(ch>='a'&&ch<='z'||ch>='0'&&ch<='9')
{
token[m++]=ch;
ch=prog[p++];
}
syn=10;p--;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;
break;
}
}
else
if(ch>='0'&&ch<='9')
{
while(ch>='0'&&ch<='9')
{
sum=sum*10+(ch-'0');
ch=prog[p++];
}syn=11;p--;
}
else
switch(ch)
{
case'<':token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;token[m++]=ch;
}
else if(ch='=')
{
syn=22;token[m++]=ch;
}
else
{
sum=20;p--;
}
break;
case'>':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;token[m++]=ch;
}
else
{
syn=23;p--;
}
break;
case':':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;token[m++]=ch;
}
else
{
syn=17;p--;
}
break;
case'+':syn=13;token[0]=ch;break;
case'-':syn=14;token[0]=ch;break;
case'*':syn=15;token[0]=ch;break;
case'/':syn=16;token[0]=ch;break;
case'=':syn=25;token[0]=ch;break;
case';':syn=26;token[0]=ch;break;
case'(':syn=27;token[0]=ch;break;
case')':syn=28;token[0]=ch;break;
case'#':syn=0;token[0]=ch;break;
default:syn=-1;token[0]=ch;
}
}
E()
{
printf("E ");
T();
E1();
}
E1()
{
printf("E1");
if(syn==13)
{
scaner();
T();
E1();
}
else
{
if(syn!=28&&syn!=0)error();
}
}
T()
{
printf("T");
F();
T1();
}
T1()
{
printf{"T1"};
if(syn==15)
{
scaner();
F();
T1();
}
else
{
if(syn!=28&&syn!=13)error();
}
}
F()
{
printf("F");
if(syn==27)
{
scaner();
E();
if(syn==28)scaner();
else error();
}
else if(syn==11||syn==10) scaner();
}
error()
{
printf(" (%d,%s)Syntax Error! ",syn,token);
}
}
四、 实验总结
首先,要明白实验的目的,这个可以让我们了解什么是LL1语法;其次,要写出分析表然后写出实验输出的分析过程;接着写代码;最后显示实验结果。