**算符優先系列之(二)算符優先關係表**
time limit: 1000 ms memory limit: 65536 kib
problem description
學過編譯原理的菊苣們都知道算符優先文法,作為乙個有點深度的分析方法,我們怎麼能只止步於理論呢,實踐才是王道哦。
已知文法g[s]的表示式,求算符優先關係表。因為某些特殊的原因,我們在這規定一下輸入輸出格式。
已知文法g[s]為:
s`->#s#(拓展文法,不是題目給出的文法)
s->a|@|(t)
t->t,s|s
表示式算符優先關係表中從左到右(從上到下)的順序為從表示式文法中從左到右從上到下的順序即為
a @ ( ) , # (我們預設把#放在最右邊或者最下邊)
input
多組輸入。第一行輸入乙個n,表示表示式的個數,接下來n行每行乙個表示式(記得還有乙個要在自己程式中新增的拓展文法哦)
output
根據上述的格式,輸出算符優先關係表(輸出的格式用水平製表符\t)
sample input
2 s->a|@|(t)
t->t,s|s
sample output
a @ ( ) , #
a > > >
@ > > >
( < < < = <
) > > >
, < < < > >
hint
source
#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)
return0;}
int site(char c)
}void get_firstvt(char s,int t)
if(!firstflag[i]) else
if(str[i][j+1]!=s)
for(jj=0; jjfor(tt=0; ttif(firstvt[i][tt]==firstvt[ii][jj])
break;
}if(tt==k) }}
}}
}firstvt[i][k]='\0';
fcnt[i]=k;
firstflag[i]=1;
}}void output_firstvt(int t)
}void get_lastvt(char s,int t)
if(!lastflag[i]) else
if(str[i][j]!=s)
for(jj=0; jjfor(tt=0; ttif(lastvt[i][tt]==lastvt[ii][jj])
break;
}if(tt==k) }}
}}
}lastvt[i][k]='\0';
lcnt[i]=k;
lastflag[i]=1;
}}void output_lastvt(int t)
}void get_table(int t,int cnt)
}nstr[x][y]='\0';
x++;
y=0;
}//對於s1->#s#;
char a='#';
cmp[site(a)][site(a)]='=';
for(i=0; i0]; i++)
for(i=0; i0]; i++)
//對於初始的文法
for(i=0; ifor(j=3; nstr[i][j+1]!='\0'; j++)
for(jj=0; jj1])]='>';
}if(is_fin(nstr[i][j])&&!is_fin(nstr[i][j+1]))
for(jj=0; jj'<';}}
}for(i=0; fin[i]!='\0'; i++)
printf("\t%c",fin[i]);
puts("");
for(i=0; i"%c\t",fin[i]);
for(j=0; jif(cmp[i][j]!=0)
printf("%c\t",cmp[i][j]);
else
printf(" \t");
}puts("");
}}void output(int i,int j,char *str)
int isdx(char c)
void exchange()
}mstr[ecnt][mcnt]='\0';
if(strlen(mstr[ecnt])!=0)
ecnt++;
}}int main()
for(int i=0; ifor(int j=0; str[i][j]!='\0'; j++)
}fin[cnt++]='#';
fin[cnt]='\0';
output_firstvt(t);
output_lastvt(t);
get_table(t,cnt);
}return
0;}
算符優先系列之 二 算符優先關係表
problem description 學過編譯原理的菊苣們都知道算符優先文法,作為乙個有點深度的分析方法,我們怎麼能只止步於理論呢,實踐才是王道哦。已知文法g s 的表示式,求算符優先關係表。因為某些特殊的原因,我們在這規定一下輸入輸出格式。已知文法g s 為 s s 拓展文法,不是題目給出的文法...
算符優先分析
算符優先分析 time limit 1000 ms memory limit 65536 kib problem description 演算法優先分析法是一種不太規範的自下而上分析方法,分析速度快,特別適用於表示式的分析。為了便於大家理解和實踐算符優先分析法,本題目先給出乙個算符優先文法,請大家構...
算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸入串動作 i i i 移進 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 歸約 n i 移進 n i 歸約 n i 移進 n i 移進 n i 歸約 n...