1. 实验目的
构造文法的语法分析程序实验要求,
2. 实验要求
采用预测分析法对输入的字符串进行语法分析。
3. 实验环境
VC++6.0
4. 实验原理
对文法 G 进行语法分析,文法 G 如下所示:
S→a */
*0.
S→^
*1.
S→(T)
*2.
*3.
T→SW *
*4. W→,SW
*5. W→ε;
5. 软件设计与编程
= "a^(),#";
//存储待分析的句子
#include
#include
#include
char str[100];
//终结符,分析表的列符
const char T[ ]
const char NT[ ] = "STW"; //非终结符,分析表的行符
/*指向产生式右部符号串*/
const char *p[] = {
/*0. S→a */
"a",
/*1.
S→^
*/
/*2. S→(T)
/*3. T→SW */
/*4.
/*5. W→ε;
};
//设 M[i][j]=x,通过 p[M[i][j]]=p[x]获取右部符号串。
const int M[][6] = {
a
0,
3,
-1, -1,-1,
(
2, -1, -1, -1 },
3, -1, -1, -1 },
-1 }
/*
/*S*/
/*T*/
/*W*/
W→,SW */
""
*/
"^",
*/
"(T)",
"SW",
",SW",
)
,
#
*/
^
1,
3,
{
{
{
5,
4,
};
void init()//输入待分析的句子
{
printf("请输入待分析的句子(以$结束):\n");
scanf("%s",str);
}
int lin(char c);//非终结符转换为行号
int col(char c);//终结转换为列号
bool isNT(char c);//isNT 判断是否是非终结符
bool isT(char c);//isT 判断是否是终结符。
void main(void)
{
{'#','S'};
//栈赋初值
//设置指示句子的当前字符
int i,j=0;
int flag=1,flag2=0;
char A;
char stack[20]=
int top = 1 ;
char X = ' ' ;
init();
A=str[0];
printf("\t 步数\t 分析栈\t 输入串\t 所用规则\n");//在屏幕上输出列表标题
while ( 1 )
{
//设置栈顶指针
//存储栈顶字符
printf("\n\t(%d)\t",++j); //输出当前执行步数
for ( i = 0 ; i <= top ; i++ )
{
//输出当前栈的内容(出栈前)
printf("%c",stack[i]);
}
printf("\t");
for ( i = flag-1 ; str[i]!='$' ; i++ )
{
printf("%c",str[i]);
}
if(flag2==1)
{
printf("\t%d",M[ lin(X) ][col(A)]);
flag2=0;
}
//出栈
X = stack[top--] ;
if (X=='#')//是结束符
{
if (X==A)//是结束符
{
printf("\tAcc\n");
}
else printf("\tERROR\n");
break;
}
else if (isT(X))//是终结符
{
A=str[flag++];
}
else if (isNT(X))//是否是非终结符
{
flag2=1;
//逆序入栈
for( i = strlen( p[ M[ lin(X) ][col(A)] ] ) - 1; i >= 0; i--)
{
stack[++top] = *(p[M[lin(X)][col(A)]] + i ) ;
}
}
else
{
printf("Error in main()>%c\n",X);
exit(0);
}
}
}
int lin(char c)
{
for(int i = 0; i < (int)strlen(NT); i ++ )
{
if (c == NT[i])
{
return i ;
}
}
printf("Error in lin()>%c\n",c);
exit(0) ;
}
int col(char c)
{
for (int i=0; i<(int)strlen(T); i ++ )
{
if (c == T[i])
return i;
}
printf("Error in col()>%c\n",c);
exit(0);
}
bool isNT(char c)
{
//是否是非终结符
for (int i = 0; i < (int)strlen(NT); i ++ )
{
if (c==NT[i])
return true;
}
return false;
}
bool isT(char c)
{
//是否是终结符(不包括'#')
for (int i = 0; i < (int)strlen(T) - 1; i ++ )
{
if (c == T[i])
{
return true;
}
}
return false;
}
6. 程序测试结果