算符優先系列之 二 算符優先關係表

2021-08-20 12:10:54 字數 3405 閱讀 6591

**算符優先系列之(二)算符優先關係表**
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...