博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译原理实验之语法分析(算符优先分析算法(C语言))
阅读量:2029 次
发布时间:2019-04-28

本文共 2979 字,大约阅读时间需要 9 分钟。

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;const int inf=0x3f3f3f3f;const double pi= acos(-1.0);const double esp=1e-6;using namespace std;const int Maxn=110;const int maxn=20;char str[maxn][Maxn];//输入文法char st[maxn];//输入串char stac[maxn];//模拟栈的数组char nstr[maxn][maxn];//储存转化文法char mstr[maxn][maxn];char fin[maxn];//存储终结符char firstvt[maxn][maxn],lastvt[maxn][maxn];char cmp[maxn][maxn];//存储表中的比较符int firstflag[maxn],lastflag[maxn];//非终结符的firstvt,lastvt是否求出int fcnt[maxn],lcnt[maxn];//非终结符firsvt和lastvt的个数int is_fin(char c) { //判断终结符 for(int i=0; fin[i]!='\0'; i++) { if(fin[i]==c) return 1; } return 0;}int site(char c) { //求在表中的下标 for(int i=0; fin[i]!='\0'; i++) { if(fin[i]==c) return i; }}void get_firstvt(char s,int t) { //求s非终结符的firstvt值 int i,j,ii,jj,tt; for(i=0; i
#S#; char a='#'; cmp[site(a)][site(a)]='='; for(i=0; i
='A'&&c<='Z') return 1; return 0;}void exchange(){ int ecnt=0; for(int i=0;i<10;i++){ int mcnt=0; for(int j=3;nstr[i][j]!='\0';j++){ if(isDX(nstr[i][j])&&strlen(nstr[i])!=4) mstr[ecnt][mcnt++]='N'; else if(!isDX(nstr[i][j])) mstr[ecnt][mcnt++]=nstr[i][j]; else{ break; } } mstr[ecnt][mcnt]='\0'; if(strlen(mstr[ecnt])!=0) ecnt++; }}int get_process(char *st)//{ exchange(); int len=strlen(st); int t=0;//栈内元素的个数 int i=0,j; int bz=1; stac[0]='#'; while(st[i]!='\0'){ if(is_fin(stac[t])) j=t; else j=t-1; int a=site(stac[j]); int b=site(st[i]); if(cmp[a][b]=='<'||cmp[a][b]=='='){ printf("\t%d",bz++); output(0,t,stac); printf("\t%c",cmp[a][b]); printf("\t%c",st[i]); output(i+1,len-1,st); printf("\t移进"); puts(""); t++; stac[t]=st[i]; i++; } else if(cmp[a][b]=='>'){ printf("\t%d",bz++); output(0,t,stac); printf("\t%c",cmp[a][b]); printf("\t%c",st[i]); output(i+1,len-1,st); printf("\t归约"); puts(""); int ii,jj,kk; int flag=0; for(ii=t;ii>=0;ii--){ for(jj=0;jj
=0;kk--){ if(stac[ii]==mstr[jj][kk]){ ii--; kkn++; } else break; } if(strlen(mstr[jj])==kkn){ t=ii+1; stac[t++]='N'; stac[t]='\0'; t--; flag=1; break; } else{ ii=ii+kkn; } } if(!flag){ printf("\t错误"); return 0; } else{ if(t==1&&st[i]=='#'){ printf("\t%d",bz++); output(0,t,stac); printf("\t="); printf("\t%c",st[i]); output(i+1,len,st); printf("\t接受"); return 1; } break; } } } }}int main() { int T; int cnt=0;//终结符的个数 memset(firstflag,0,sizeof(firstflag)); memset(lastflag,0,sizeof(lastflag)); memset(cmp,0,sizeof(cmp)); scanf("%d",&T); for(int i=0; i
'Z')&&(str[i][j]!='-'&&str[i][j]!='>')&&str[i][j]!='|') fin[cnt++]=str[i][j]; } } fin[cnt++]='#'; fin[cnt]='\0'; printf("输出文法的Firstvt集和Lastvt集\n"); output_firstvt(T); output_lastvt(T); printf("输出算符优先关系表\n"); get_table(T,cnt); printf("请输入输入串\n"); scanf("%s",st); printf("输出输入串的分析过程\n"); printf("PS:分析过程每一列从左到右依次是:步骤 栈 有限关系 当前符号 剩余输入串 移进或规约\n\n"); get_process(st); return 0;}/*2T->T,S|SS->a|@|(T)(a,a)#3B->BoT|TT->TaF|FF->nF|(B)|t|fntofat#*/

这里写图片描述

你可能感兴趣的文章
Asp.net Web.Config - 配置元素 trace
查看>>
Visual Studio .Net 调试
查看>>
Asp.net Web.Config - 配置元素 httpCookies
查看>>
创建、修改、删除数据库,表语法
查看>>
Asp.net Web.Config - 配置元素 caching
查看>>
SQL Server存储机制
查看>>
SQL Server索引 (原理、存储)聚集索引、非聚集索引、堆 <第一篇>
查看>>
SQL Server索引语法 <第四篇>
查看>>
SQL Server索引设计 <第五篇>
查看>>
Linq to object 技巧、用法集锦
查看>>
SQL Server 视图
查看>>
SQL Server索引的维护 - 索引碎片、填充因子 <第三篇>
查看>>
SQL 脚本
查看>>
SQL Server日期时间函数
查看>>
SQL Server 字符串函数
查看>>
SQL Server文本和图像函数
查看>>
SQL Server数学函数
查看>>
SQL Server常用元数据函数
查看>>
T-SQL运算符
查看>>
MVC部署 - 错误集锦
查看>>