这是我的yacc file.y
的顶部%code requires {
struct Id {
char *var;
};
struct Commds;
struct Commd {
struct Id lhs;
};
struct Commds {
struct Commd commd;
struct Commds *next;
};
}
我在%union
中使用此代码为解析器定义了新类型。
%union {
char *id;
long long integer;
struct Id Identifier;
struct Commd Command;
struct Commds *Commands;
}
....
%type <Command> command
%type <Commands> commands
我在使用$$
- 美元属性时使用它没有问题,而解析树在从我的词法分析器评估标记时正在构建。不幸的是,我想在%{ codes %}
部分的其他方法中使用我在文件开头定义的结构。不幸的是,每当我定义这样的函数时:
void add(struct Commd cmd) {...};
我收到错误:未知类型!我很高兴告诉我如何使这个结构对我的整个解析器可见。
答案 0 :(得分:0)
这个错误通常是因为你有你的联合,代币和类型:
%union {
char *id;
long long integer;
struct Id Identifier;
struct Commd Command;
struct Commds *Commands;
}
....
%type <Command> command
%type <Commands> commands
在{% %}
括号中的C代码之前。你需要在{% %}
之后加上这个。基本上你说你的终端或非终端有类型struct Commd
,但是yacc不知道struct Commd
是什么,因为你把它包含在联合代码下面。
您没有编写完整的代码,因此我只能假设您已经完成了此操作。如果是这样的话,这就是你的答案。