文法分析程序
实验一、××实验
专业 姓名 学号
一、 实验目的
编制一个语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。
二、 实验内容和要求
实验内容:做一个可以对以下语法的分析程序
SàMH|a
HàLS-|&
Kà+ML|&
Là/H
MàK|*LM
&(空串);
实验要求:在上机(一)词法分析的基础上,采用递归子程序法或其他适合的语法分析方法,实现其语法分析程序。要求编译后能检查出语法错误。
三、 实验方法、步骤及结果测试
- 1. 源程序名:压缩包文件(rar或zip)中
源程序名×××.c
可执行程序名:×××.exe
- 2. 原理分析及流程图
- 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"};
M();
scaner();
error();
S();
L();
H();
K();
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 {syn=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;
}
}
error()
{
printf("错误");
}
S()
{printf("S ");
if (syn==10) {
scaner();
}
else{
M();
H();
}
}
H()
{printf("H ");
if (syn!=10 && syn !=13 &&syn!=14 &&syn!=15 && syn!=0)
error();
else {
L();
S();
scaner();
}
}
L()
{printf("L ");
scaner();
H();
}
M()
{printf("F ");
if (syn==15) {
scaner();
L();
M();
}
else
K();
}
K()
{printf("K ");
if (syn==13) {
scaner();
M();
L();
}
else{
if(syn!=10 && syn!=11 && syn!=0)
error();
}
}
main()
{
p=0;
printf("\n Please input the source code: \n");
do{
ch=getchar();
prog[p++]=ch;
}while (ch!='#');
p=0;
scaner();
S();
if(syn==0)
{
printf("\n分析成功");
}
else
printf("\n分析失败);
}
- 4. 运行结果及分析
一般必须配运行结果截图,结果是否符合预期及其分析。
(截图需根据实际,截取有代表性的测试例子)
错误语句:
正确语句:
四、 实验总结
实验前首先要明白实验的目的了解什么是LL1语法实验前首先要写出分析表然后写出实验输出的分析过程然后再写代码分析实验结果。