我有一種語言,其中的一切的語義是一個字符數組或數組數組。所以,我有以下YYSTYPE:是不是有一個好的野牛實踐沒有語義價值,但使用行動的副作用?
typedef struct _array {
union {
char *chars; // start of string
void *base; // start of array
};
unsigned n; // number of valid elements in above
unsigned allocated; // number of allocated elements for above
} array;
#define YYSTYPE array
和我可以附加字符數組到數組的數組與
void append(YYSTYPE *parray, YYSTYPE *string);
假設語法(SSCCE)爲:
%token WORD
%%
array : WORD
| array WORD
;
所以我接受一連串的單詞。對於每個單詞,語義值都變成了這個字符數組,然後我想將這些每一個都附加到數組的數組中,以用於整個序列。
有設計的動作幾種可能的方式:
有
array
符號有array
類型的語義值。如果我這樣做,那麼array WORD
的行動將不得不復制$1
到$$
這是緩慢的,所以我不喜歡這一點。有
array
符號具有類型array *
的語義值。現在的動作爲array WORD
,我可以加入數組*$1
,然後設置$$
等於$1
。但我不喜歡這個有兩個原因。首先,語義不是指向array
的指針,而是array
。其次,對於規則array : WORD
的行動,我將不得不以malloc
的結構,這是緩慢的。是的,'append'有時會做malloc
,但是如果我分配的不夠頻繁,出於性能原因,我想避免任何不必要的malloc
。忘掉試圖對符號
array
語義價值可言,並使用全局變量:static YYSTYPE g_array;
YYSTYPE *g_parray = &g_array;
,然後,該操作將只使用
append(g_parray, word_array)
整個語法的工作方式,我不需要多於一個g_array
。以上是我能想到的最快的。但它是非常糟糕的設計 - 大量的全局變量,沒有語義值,相反,所有事情都是通過對全局變量的副作用發生的。
所以,我個人不喜歡他們中的任何一個。野牛通常被接受的最佳做法是什麼?
你的第一種方法是像我的第三個辦法,只是沒有全局,我會採取我的答案,謝謝。你的第二種方法與我的第二種方法非常相似。 –