2013-10-27 26 views
0

如何方便地测试形式语法是否为regular如何测试语法是否正常(使用库或框架)?

基本上,我寻找现有库或框架,其提供这样的功能。

阿库应该从一些相对通用的语言,例如可调用C/C++/Python的/哈斯克尔。为此提供命令行工具的框架也可以。

软件应该是开源的,并支持某种形式的BNF语法输入。

+0

我认为写一个代码来验证是非常容易的,语法是规则的。 –

+0

@GrijeshChauhan,是啊...我认为这是很容易写我自己的链表,栈,排序算法,拓扑排序算法,红黑树,哈希表等实现,但我很高兴有 - 说 - std :: list,std :: stack,std :: sort,boost图,std :: map,std :: unordered_map等等。它不是重新发明轮子,从而节省开发,调试和测试的时间。 – maxschlepzig

+0

我同意Chauhan ..你会花更多的时间搜索和实现一个库,而不是写自己的代码,你只需要检查每个生产中可以(最多)只有一个非终端,这个非终端只应该放置在生产的最右边。 – Qsebas

回答

-2

这里是一个Python代码,返回,如果一个语法规则(工作了右和左正规文法):

#!/usr/local/bin/python2.7 

termials = ['a'] 
nonterminals = ['S'] 
grammar = [('S',['a', 'S']), ('S',['a']) ]; 
regular = True 
leftRG = False 
rightRG = False 
for leftSide, rightSide in grammar: 
    for nonterminal in nonterminals: 
    if not(leftRG or rightRG): 
     if len(rightSide) > 1: 
     if (nonterminal in rightSide[0]): 
      leftRG = True 
     elif (nonterminal in rightSide[-1]): 
      rightRG = True 
     else: 
      regular = regular and not (nonterminal in rightSide) 
    if rightRG: 
     regular = regular and not (nonterminal in rightSide[:-1]) 
    if leftRG: 
     regular = regular and not (nonterminal in rightSide[1:]) 
print regular 

注意:请记住,如果一个非正规文法识别正规语言,这个例程将返回False,因为不可能在多项式时间内决定规则性。

+0

你说在多项式时间内决定正则性是不可能的。更强大的结果存在:无论任意语法(例如CFG)是否识别正规语言(证明:Greibach定理),都是不确定的。干杯! – Martijn

相关问题