您可以递归地生成一棵树,其分支将根据语法规则表示派生,其叶子将表示语法语言中的单词。恢复整个有限语言就像在生成叶子时保存叶子一样简单。
将每个节点表示为符号(终结符或非终结符)的有序集合。对于每个非终结符,递归地下降到一组新的节点,在那里进行所有可能的替换。继续,直到您的列表仅包含终端符号,然后输出与您的节点对应的符号的有序连接。您的初始节点将始终为[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";
[S]
[Sender, ",", Receiver]
[Human, ",", Receiver]
["user-type-1", ",", Receiver]
["user-type-1", ",", "local"] ***
["user-type-1", ",", "remote"] ***
["user-type-2", ",", Receiver]
["user-type-2", ",", "local"] ***
["user-type-2", ",", "remote"] ***
[Machine, ",", Receiver]
[Access, ",", Protocol, ",", Receiver]
["internal", ",", Protocol, ",", Receiver]
["internal", ",", "soap", ",", Receiver]
["internal", ",", "soap", ",", "local"] ***
["internal", ",", "soap", ",", "remote"] ***
["internal", ",", "smtp", ",", Receiver]
["internal", ",", "smtp", ",", "local"] ***
["internal", ",", "smtp", ",", "remote"] ***
["external", ",", Protocol, ",", Receiver]
["external", ",", "soap", ",", Receiver]
["external", ",", "soap", ",", "local"] ***
["external", ",", "soap", ",", "remote"] ***
["external", ",", "smtp", ",", Receiver]
["external", ",", "smtp", ",", "local"] ***
["external", ",", "smtp", ",", "remote"] ***