ZJFC-1240

      一个比较直白的上下文无关语法分析,传说中是使用编译原理的算法(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;
}
posted @ 2008-07-29 15:59  Hdu-Lost  阅读(274)  评论(0)    收藏  举报