C中的无上下文语法

Context-free grammar in C

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

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

我对如何做这件事没有什么概念,但在越来越多地分析之后,没有一个是正确的。

目前,我正计划做一个数组,随机改变[..., S, S, ...][..., 1, ...][..., A, ...],直到只有0和1,然后检查是否已经随机生成了相同的东西。

我仍然不确定这是否是正确的方法,我仍然不知道该如何做,也不知道在哪里保存最后的单词,因为基本形式是不同长度的字符数组。同样,在C语言中,二维字符数组是否等于字符串数组?

这有什么意义吗?这是一种合适的方法吗?还是我错过了什么?


每次你需要做决定的时候,你只需做一个随机的决定。例如:

1
2
3
4
5
6
7
8
9
10
11
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()可以得到以下输出:

1
2
3
4
5
6
7
"0"
"00110110100100101111010111111111001111101011100100011000000110101110000110101110
 10001000110001111100011000101011000001101111000110110011101010111111111011010011
 10000000101111100100011011010000000101000111110010001000101001100110100111111111
 1001010011"

"11"
"10010010101111010111101"

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


你问了几个问题…关于问题:btw在c中,二维字符数组是否等于字符串数组?

对。

以下是声明字符串数组的方法,每个示例都显示了不同的使用灵活性:

1
2
3
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)

1
2
3
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)

1
2
3
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.

注:尽管这些表格中的每一个都是有效的,并且在正确使用时非常有用,但最好注意到它们在实践中的行为方式存在差异。(请阅读链接以获得有关此问题的良好讨论)


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

1
S -> AA | 0

在这种语言中,如何生成单词s?一种方法是使用一个随机生成字符串"0"或两个串联的单词的函数。

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

1
A -> SS | 1

编写一个随机生成"1"或连在一起的两个s字的函数。