如何方便地测试形式语法是否为regular?如何测试语法是否正常(使用库或框架)?
基本上,我寻找现有库或框架,其提供这样的功能。
阿库应该从一些相对通用的语言,例如可调用C/C++/Python的/哈斯克尔。为此提供命令行工具的框架也可以。
软件应该是开源的,并支持某种形式的BNF语法输入。
如何方便地测试形式语法是否为regular?如何测试语法是否正常(使用库或框架)?
基本上,我寻找现有库或框架,其提供这样的功能。
阿库应该从一些相对通用的语言,例如可调用C/C++/Python的/哈斯克尔。为此提供命令行工具的框架也可以。
软件应该是开源的,并支持某种形式的BNF语法输入。
这里是一个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,因为不可能在多项式时间内决定规则性。
你说在多项式时间内决定正则性是不可能的。更强大的结果存在:无论任意语法(例如CFG)是否识别正规语言(证明:Greibach定理),都是不确定的。干杯! – Martijn
我认为写一个代码来验证是非常容易的,语法是规则的。 –
@GrijeshChauhan,是啊...我认为这是很容易写我自己的链表,栈,排序算法,拓扑排序算法,红黑树,哈希表等实现,但我很高兴有 - 说 - std :: list,std :: stack,std :: sort,boost图,std :: map,std :: unordered_map等等。它不是重新发明轮子,从而节省开发,调试和测试的时间。 – maxschlepzig
我同意Chauhan ..你会花更多的时间搜索和实现一个库,而不是写自己的代码,你只需要检查每个生产中可以(最多)只有一个非终端,这个非终端只应该放置在生产的最右边。 – Qsebas