[英]Context-free grammar in C
我分配了一個程序,用C編寫一個程序,該程序使用以下上下文無關的語法顯示許多(n <50)個有效的上下文無關的語法字符串:
S -> AA|0
A -> SS|1
我幾乎沒有關於如何執行此操作的概念,但是在對它們進行越來越多的分析之后,它們都不對。
目前,我正計划制作一個數組,並隨機更改[..., S, S, ...]
或[..., 1, ...]
[..., A, ...]
[..., 1, ...]
直到只有0和1,然后檢查是否已經隨機生成了相同的事物。
我仍然不確定這是否是正確的方法,而且我仍然不確切地知道該怎么做或在哪里保留最終用語,因為基本形式將是不同長度的字符數組。 另外,在C中,二維字符數組等於字符串數組嗎?
這有任何意義嗎,這是正確的方法嗎? 還是我錯過了什么?
您可以在每次需要決定某件事時簡單地做出隨機決定。 例如:
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"
。
嘗試將無上下文語法視為一組規則,使您可以使用某種語言生成新的字符串。 例如,第一個規則:
S -> AA | 0
您如何用這種語言生成單詞S? 一種方法是使用隨機生成字符串“ 0”或兩個串聯的A字的函數。
同樣,要實施第二條規則:
A -> SS | 1
編寫一個函數,該函數隨機生成“ 1”或兩個串聯的S字。
你問了幾個問題...
關於問題: C中的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.
注意:盡管這些形式中的每一個都是有效的,並且在正確使用時非常有用,但最好注意每種形式在實踐中的行為會有差異 。 (請閱讀鏈接以獲取有關此內容的精彩討論)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.