设计一个给定文法和对应的FIRSTVT和LASTVT集,能依据依据文法和FIRSTVT和LASTVT生成算符优先分析表

loading 分享 2026-9-3 下载文档

实验二 算符优先分析器

#include \#include \#include \

char data[20][20]; //算符优先关系 char s[100]; //模拟符号栈s char lable[20]; //文法终极符集 char input[100]; //文法输入符号串 char string[20][10]; //用于输入串的分析 int k; char a;

int j; char q; int r; //文法规则个数

int r1; //转化后文法规则个数 char st[10][30]; //用来存储文法规则

char first[10][10]; //文法非终结符FIRSTVT集 char last[10][10]; //文法非终结符LASTVT集 int fflag[10]={0}; //标志第i个非终结符的FIRSTVT集是否已求出 int lflag[10]={0}; //标志第i个非终结符的LASTVT集是否已求出 int deal(); //对输入串的分析

int zhongjie(char c); //判断字符c是否是终极符

int xiabiao(char c); //求字符c在算符优先关系表中的下标 void out(int j,int k,char *s); //打印s栈

void firstvt(char c); //求非终结符c的FIRSTVT集 void lastvt(char c); //求非终结符c的LASTVT集 void table(); //创建文法优先关系表 void main() {

int i,j,k=0;

printf(\请输入文法规则数:\ scanf(\

printf(\请输入文法规则:\\n\ for(i=0;i

scanf(\存储文法规则,初始化FIRSTVT集和LASTVT集*/

first[i][0]=0; /*first[i][0]和last[i][0]分别表示st[i][0]非终极

符的FIRSTVT集和LASTVT集中元素的个数*/

last[i][0]=0; }

for(i=0;i

for(j=0;st[i][j]!='\\0';j++)

{

if(st[i][0]<'A'||st[i][0]>'Z') {

printf(\不是算符文法!\\n\ exit(-1); }

if(st[i][j]>='A'&&st[i][j]<='Z') {

if(st[i][j+1]>='A'&&st[i][j+1]<='Z') {

printf(\不是算符文法!\\n\ exit(-1); } } } }

for(i=0;i

for(j=0;st[i][j]!='\\0';j++) {

if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|')

lable[k++]=st[i][j]; } }

lable[k]='#';

lable[k+1]='\\0'; table();

printf(\每个非终结符的FIRSTVT集为:\\n\输出每个非终结符的FIRSTVT集 for(i=0;i

printf(\ for(j=0;j

printf(\ }

printf(\ }

printf(\每个非终结符的LASTVT集为:\\n\输出每个非终结符的LASTVT集 for(i=0;i

printf(\

for(j=0;j

printf(\ }

printf(\ }

printf(\算符优先分析表如下:\\n\

for(i=0;lable[i]!='\\0';i++) printf(\

printf(\ for(i=0;i

printf(\ for(j=0;j

printf(\ }

printf(\ }

printf(\请输入文法输入符号串以#结束:\

scanf(\

deal(); }

void table() {

char text[20][10]; int i,j,k,t,l,x=0,y=0; int m,n; x=0;

for(i=0;i

firstvt(st[i][0]); lastvt(st[i][0]); }

for(i=0;i

text[x][y]=st[i][0]; y++;

for(j=1;st[i][j]!='\\0';j++) {

if(st[i][j]=='|') {

text[x][y]='\\0';

x++; y=0;

text[x][y]=st[i][0]; y++;

text[x][y++]='-'; text[x][y++]='>'; } else {

text[x][y]=st[i][j]; y++; } }

text[x][y]='\\0'; x++; y=0; } r1=x;

printf(\转化后的文法为:\\n\

for(i=0;i

printf(\}

for(i=0;i

后的转化文法,用于最后的规约)*/

{

string[i][0]=text[i][0];

for(j=3,l=1;text[i][j]!='\\0';j++,l++) string[i][l]=text[i][j]; string[i][l]='\\0'; }

for(i=0;i

for(j=1;text[i][j+1]!='\\0';j++) {

if(zhongjie(text[i][j])&&zhongjie(text[i][j+1])) {

m=xiabiao(text[i][j]); n=xiabiao(text[i][j+1]); data[m][n]='='; }


设计一个给定文法和对应的FIRSTVT和LASTVT集,能依据依据文法和FIRSTV.doc 将本文的Word文档下载到电脑
搜索更多关于: 设计一个给定文法和对应的FIRSTVT和LASTVT集,能依 的文档
相关推荐
相关阅读