一个比较直白的上下文无关语法分析,传说中是使用编译原理的算法(CYK)进行语法分析的,本人因此查了好多书,晚上看了好久,还是不能明白,诶,难道智力有限.....对于一个不教编译原理这门课的学校....实在无语了,太郁闷了,看书都看不懂.参照了月光和sunny大牛的程序,自己思考了很久,仿照着写了一遍,效率还不错,可惜就是这么一大堆的递归让人很晕,虽然根据题意能解释得通,但还是不能把握全局,郁闷啊郁闷~~~
以下是这题AC的代码
#include <iostream>
using namespace std;

const long MAXN=300;

char key[MAXN];

char List[MAXN][MAXN];
char Set[MAXN][MAXN];

long len;
bool isSet(long,long);

bool isElement(long b,long e)


{
if (b>e)

{
return 0;
}
if (b==e)

{
return 1;
}

return isSet(b,e);


}


bool isList(long b,long e)


{
if (List[b][e])

{
return 'y'==List[b][e];
}

List[b][e]='n';

long i;
for (i=b+1;i<e;++i)

{
if (key[i]==','&&isElement(b,i-1)&&isList(i+1,e))

{
List[b][e]='y';
return 1;
}
}

if (isElement(b,e))

{
List[b][e]='y';
}

return 'y'==List[b][e];
}

bool isElist(long b,long e)


{
if (b>e)

{
return 1;
}
return isList(b,e);
}


bool isSet(long b,long e)


{
if (Set[b][e])

{
return Set[b][e]=='y';
}

if (b<e&&key[b]=='{'&&key[e]=='}')

{
Set[b][e]=isElist(b+1,e-1)?'y':'n';
}
else

{
Set[b][e]='n';
}
return Set[b][e]=='y';

};



int main()


{
long T;
scanf("%ld",&T);
long f=1;
while (T--)

{
memset(List,0,sizeof(List));
memset(Set,0,sizeof(Set));
scanf("%s",key);
len=strlen(key);
printf("Word #%ld: %sSet\n",f,isSet(0,len-1)?"":"No ");
++f;
}
return 0;
}