C中的无上下文语法

时间:2013-11-27 16:24:35

标签: c context-free-grammar

我有一个用C语言编写的程序,它使用以下无上下文语法显示一个有效的,无上下文的语法字符串数(n <50):

S -> AA|0
A -> SS|1

我几乎没有关于如何做到这一点的概念,但经过越来越多的分析后,其中没有一个是正确的。

目前,我打算制作一个数组并随机更改[..., A, ...][..., S, S, ...]的{​​{1}},直到只有0和1,然后检查是否已经存在同样的事情随机生成。

我仍然不相信这是否是正确的方法,我仍然不知道如何做到这一点或在哪里保留最后的单词,因为基本形式将是一个不同长度的字符数组。另外,在C中,是一个字符的二维数组,等于字符串数组?

这是否有意义,这是一种正确的方法吗?或者我错过了什么?

3 个答案:

答案 0 :(得分:2)

每次需要决定某事时,您都可以随意做出决定。例如:

function A():
  if (50% random chance)
    return "1"
  else
    return concat(S(), S())

function S():
  if (50% random chance)
    return "0"
  else
    return concat(A(), A())

多次调用S()会给我这些输出:

"0"
"00110110100100101111010111111111001111101011100100011000000110101110000110101110
 10001000110001111100011000101011000001101111000110110011101010111111111011010011
 10000000101111100100011011010000000101000111110010001000101001100110100111111111
 1001010011"
"11"
"10010010101111010111101"

语法的所有有效字符串。请注意,您可能需要稍微调整一下随机机会。此示例很有可能生成非常小的字符串,如"11"

答案 1 :(得分:0)

尝试将无上下文语法看作一组允许您在语言中生成新字符串的规则。例如,第一条规则:

S -> AA | 0

你怎么能用这种语言生成一个单词?一种方法是使用一个函数随机生成字符串“0”或两个A字,连接。

同样,要实施第二条规则:

A -> SS | 1

编写一个随机生成“1”或两个S字连接的函数。

答案 2 :(得分:0)

你问了几个问题......
关于问题: BT中的BTW,是字符串的二维数组吗?

是。

以下是声明字符串数组的方法,每个示例在使用方面表现出不同的灵活性:

char **ArrayOfStrings;  //most flexible declaration - 
                        //pointer to pointer, can use `calloc()` or `malloc()` to create memory for
                        //any number of strings of any length (all strings will have same length) 

char *ArrayOfStrings[10]; //somewhat flexible - 
                          //pointer to array of 10 strings, again can use  `c(m)alloc()` to allocate memory for 
                          //each string to have any lenth (all strings will have same length)

ArrayOfStrings[5][10]; //Not flexible - (but still very useful)
                       //2 dimensional array of 5 strings, each with space for up to 9 chars + '\0' 
                       //Note:  In C, by definition, strings must always be NULL terminated.

注意: 虽然这些表单中的每一个都有效,并且在正确使用时非常有用,但最好注意 {{3}每个人在实践中的表现方式。 。 (阅读链接以便对此进行讨论)