从非递归上下文无关语法生成有限语言的算法

时间:2017-02-20 14:59:55

标签: algorithm testing grammar

我正在搜索算法,从非递归的无上下文语法生成完整的有限语言。该应用程序是为测试自动化生成一组可能的场景。

EBNF中的语法示例(S是起始规则):

S = Sender, Receiver;
Sender = Human | Machine;
Human = "user-type-1" | "user-type-2"
Machine = Access, Protocol;
Access = "internal" | "external";
Protocol = "soap" | "smtp";
Receiver = "local" | "remote";

应该产生一组句子,如:

user-type-1 local
internal soap local
external smtp remote

到目前为止,我发现的示例和文献都是基于递归语法的随机生成示例。但我的问题更简单。 欢迎提供出版物的所有提示,名称或链接。

谢谢,

S上。

2 个答案:

答案 0 :(得分:0)

一种方法是用编程语言定义语法,然后编写代码来迭代所有可能性。您的语法是使用变量和三个结构指定的:lit(x)表示像"local"这样的文字,alt(a, b, c, ...)代表其中一个替代a,{{1}的选择},b,...和c代表来自seq(a, b, ..., z)的一件事的序列,与来自a的一件事连接在一起。依此类推。

这是你那种形式的语法。

b

这里有一些完整的(Python)代码,它使用精心挑选的Protocol = alt(lit("soap"), lit("smtp")) Receiver = alt(lit("local"), lit("remote")) Access = alt(lit("internal"), lit("external")) Human = alt(lit("user-type-1"), lit("user-type-2")) Machine = seq(Access, Protocol) Sender = alt(Human, Machine) S = seq(Sender, Receiver) altseq定义,使每个生产规则成为生成其所有可能性的函数:

lit

答案 1 :(得分:0)

您可以递归地生成一个树,其分支将根据语法规则表示派生,其叶子将表示语法语言中的单词。恢复整个有限语言就像在生成叶子时保存叶子一样简单。

将每个节点表示为符号的有序集合(终端或非终端)。对于每个非终结符,递归地下降到一组新的节点,其中每个可能的替换都进行。继续,直到列表中只包含终端符号,然后输出与节点对应的符号的有序串联。您的初始节点始终为trusts/2。例如:

trust_direct(X, Y)