问题:我们有以下枚举声明:
enum yytokentype
{
ID = 258,
SEMI = 259,
NUMBER = 260,
DECIMAL = 261,
SENTENCE = 262,
LETTER = 263,
ASSIGN = 264,
//etc... }
现在我们得到一个字符串,其值可以是" ID"," SEMI"," NUMBER"等等。我们必须在enum yytokentype中将对应于该字符串的整数存储在一个单独的整数数组中。我不知道如何在C中执行此操作。对于C#有一些答案,但我在此严格要求C. TIA。
答案 0 :(得分:2)
所以你想将字符串映射到枚举值?然后一个带有字符串和枚举的简单结构数组就可以了:
struct map_structure
{
const char *name;
enum yytokentype value;
} mapping[] = {
{ "ID", ID },
{ "SEMI", SEMI },
.
.
.
};
然后,如果您有字符串"ID"
,只需遍历数组mapping
以查找具有相同字符串的条目,并获得您的值。
答案 1 :(得分:1)
通过使用预处理器宏来#stringize枚举,可以避免一些输入。
#define TOKEN(val) {#val, val}
struct ttable {
const char* name;
enum yytokentype value;
};
stuct ttable TheTable = {
TOKEN(ID),
TOKEN(SEMI),
...
}
这仍然需要使表与枚举保持同步。
如果您只想输入一次枚举,那么预处理器就会变得更加棘手。此技术生成TOKEN
项的列表,然后使用它两次,每个项的TOKEN
宏的定义不同。
#define TOKENSET \
TOKEN(ID,256), \
TOKEN(SEMI,257)
#define TOKEN(n,v) n = v
enum tokentype {
TOKENSET
};
#undef TOKEN
#define TOKEN(n,v) {#n, n}
struct table{
const char* name;
enum tokentype val;
} TheTable[] = {
TOKENSET
};
非常仔细地考虑节省一些额外打字的短期利益与明年的维护程序员可能的混淆,后者很可能是你。
答案 2 :(得分:0)
由于您似乎正在使用yacc
样式的解析器生成器,将输入令牌转换为令牌号的传统方法是将其与通过lex
或工作创建的词法扫描器配对类似于flex
。此类扫描程序使用正则表达式来识别标记,并允许您插入代码以向解析器报告正确的标记号(和标记值)。