编译原理算符优先矩阵的构造

【编译原理算符优先矩阵的构造】算符优先法中算符优先矩阵的构造需要求出firstTerm以及lastTerm,由于这个是在预测分析法上进行修改的,结构体的定义并未进行修改,其中包含该非终结符a以及其对应的first(即为firstTerm)和follow(即为lastTerm),输入格式如下(以#结束输入)
Z::=E
E::=T|E+T
T::=F|T*F
F::=(E)|i
#

#include using namespace std; //判断终结符和非终结符 返回1是非终结符 返回0是终结符 int Norterminal(char c) { if(c>='A'&&c<='Z') return 1; else if(c!=':'&&c!='='&&c!='<'&&c!='>'&&c!=' '&&c!='|') return 0; } struct GRAM { //$代表空 stringa; string first; string follow; }; struct LIST { int num; string s; }; int main() { GRAM gram[50]; string grammer; cout<<"请输入文法(以#结束)"< strN; cin>>grammer; //输入规则 strN.push_back(grammer); char str[10][80]; const char *ch = "|"; char *result; vector strN1; //存处理过“|”规则的 for(int i=0; i>grammer; strN.push_back(grammer); /*处理转换的规则形式输入部分*/ for(int h=0; h=0; i--) { for(unsigned l=0; l1; l++) { if(gram[l].a[0]==strN1[i][0]) { for(unsigned h=0; h1; h++) { if(strN1[i][4]==gram[h].a[0]&&strN1[i][4]!=strN1[i][0]) {gram[l].first+=gram[h].first; string ustr(gram[l].first); sort(ustr.begin(), ustr.end()); ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() ); gram[l].first=ustr; break; } } } }} cout<<"firstTerm集合为:"<=0; i++) {if(strN1[i].find("::")==-1) { string add=""; add=add+strN1[i-1][0]+"::="+strN1[i]; strN1[i]=add; } cout=0; i--) { for(unsigned l=0; l1; l++) { if(gram[l].a[0]==strN1[i][0]) { for(unsigned h=0; h1; h++) { int k=strN1[i].length(); if(Norterminal(strN1[i][k-1])) {for(unsigned h1=0; h11; h1++) if(gram[h1].a[0]==strN1[i][k-1]) { gram[l].follow+=gram[h1].follow; string ustr(gram[l].follow); sort(ustr.begin(), ustr.end()); ustr.erase(unique(ustr.begin(), ustr.end()), ustr.end() ); gram[l].follow=ustr; break; }} } } }} cout<<"lastTerm集合为:"<=0; i--) { for(int k=0; k1if(Norterminal(strN1[i][k])) { if(!Norterminal(strN1[i][k-1])&&!Norterminal(strN1[i][k+1])) { cout<1]<1]<"<<"|"; } cout<

运行结果如下:
编译原理算符优先矩阵的构造
文章图片

    推荐阅读