我正在為編程語言定義詞法分析器。其中一部分涉及擁有一個關鍵字和標記表:
#define FOREACH_KEYWORD(V) \
V(And, and) \
V(Else, else) \
V(False, false) \
V(If, if) \
V(Or, or) \
V(True, true)
#define FOREACH_TOKEN(V) \
V(Plus) \
V(Minus) \
V(Times) \
V(Div) \
FOREACH_KEYWORD(V)
這些宏旨在像這樣使用:
const char *kTokenTypeNames[] = {
#define STR(NAME) #NAME,
FOREACH_TOKEN(STR)
#undef STR
};
// which would ideally expand to
const char *kTokenTypeNames[] = {
"Plus", "Minus", "Times", "Div", "And", "Else", "False", "If", "Or", "True",
};
并且關鍵字應該包含在令牌串列中。上面的偽代碼不起作用,因為兩個不同的V宏引數具有不同的元數。我希望任何必須處理令牌的宏只需要 1 個引數,而任何處理關鍵字的宏都需要 2 個引數。我不想讓所有的東西都是可變引數。我覺得應該可以添加一些間隙宏來使這種組合成為可能,但我還沒有足夠聰明來實作這一點。
我想,總的來說:我希望能夠采用 N 的 X 宏并將其減少到某個 M,其中 M 小于 N。
我怎樣才能做到這一點?
uj5u.com熱心網友回復:
當一個串列包含另一個串列時,我不確定為什么您認為這兩個串列應該是兩個而不是一個。要么制作一份清單,要么制作兩個單獨的清單。
如果您制作兩個單獨的串列并FOREACH_KEYWORD(V)在FOREACH_TOKEN串列中洗掉,那么您可以簡單地進行兩個單獨的宏呼叫:
const char *kTokenTypeNames[] = {
#define STR1(NAME) #NAME,
#define STR2(NAME, dummy) #NAME,
FOREACH_TOKEN1(STR1)
FOREACH_KEYWORD(STR2)
};
uj5u.com熱心網友回復:
鑒于您的規格,我認為這就是您要尋找的。
#define AB_TO_A(A,B) (A)
#define EVAL(...) __VA_ARGS__
#define FOREACH_KEYWORD(V) \
V(And, and) \
V(Else, else) \
V(False, false) \
V(If, if) \
V(Or, or) \
V(True, true)
#define FOREACH_TOKEN(V) \
V(Plus) \
V(Minus) \
V(Times) \
V(Div) \
EVAL(FOREACH_KEYWORD(V AB_TO_A))
const char *kTokenTypeNames[] = {
#define STR(NAME) #NAME,
FOREACH_TOKEN(STR)
#undef STR
};
Coliru 演示在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380470.html
上一篇:在陣列中插入元素的代碼錯誤
