admin 管理员组文章数量: 1086019
2025年1月2日发(作者:批量修改文件名的一部分)
====Word行业资料分享--可编辑版本--双击可删====
1.
实验目的
构造文法的语法分析程序实验要求,
2.
3.
4.
实验要求
采用预测分析法对输入的字符串进行语法分析。
实验环境
V
实验原理
对文法G进行语法分析,文法G如下所示:
*0. S→a */
*1. S→^
*2. S→(T)
*3. T→SW *
*4. W→,SW
*5. W→ε;
5.
软件设计与编程
#include
#include
#include
char str[100]; //存储待分析的句子
const char T[ ] = "a^(),#"; //终结符,分析表的列符
const char NT[ ] = "STW"; //非终结符,分析表的行符
/*指向产生式右部符号串*/
const char *p[] = {
/*0. S→a */ "a",
/*1. S→^ */ "^",
/*2. S→(T) */ "(T)",
/*3. T→SW */ "SW",
/*4. W→,SW */ ",SW",
/*5. W→ε; */ ""
};
//设M[i][j]=x,通过p[M[i][j]]=p[x]获取右部符号串。
const int M[][6] = {
/* a ^ ( ) , # */
/*S*/ { 0, 1, 2, -1, -1, -1 },
/*T*/ { 3, 3, 3, -1, -1, -1 },
/*W*/ { -1, -1,-1, 5, 4, -1 }
};
void init()//输入待分析的句子
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
{
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)
{
int i,j=0;
int flag=1,flag2=0;
char A; //设置指示句子的当前字符
char stack[20]= {'#','S'}; //栈赋初值
int top = 1 ; //设置栈顶指针
char X = ' ' ; //存储栈顶字符
init();
A=str[0];
printf("t步数t分析栈t输入串t所用规则n"); //在屏幕上输出列表标题
while ( 1 )
{
printf("nt(%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("tAccn");
}
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
else printf("tERRORn");
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()>%cn",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()>%cn",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()>%cn",c);
exit(0);
}
bool isNT(char c) //是否是非终结符
源-于-网-络-收-集
====Word行业资料分享--可编辑版本--双击可删====
{
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.
程序测试结果
源-于-网-络-收-集
版权声明:本文标题:编译原理-语法分析程序设计(预测分析法) 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1735864861a1698155.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论