Yacc-Struct为不完整或未知类型

时间:2016-01-17 21:49:14

标签: c struct yacc parse-tree

这是我的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) {...}; 

我收到错误:未知类型!我很高兴告诉我如何使这个结构对我的整个解析器可见。

1 个答案:

答案 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是什么,因为你把它包含在联合代码下面。

您没有编写完整的代码,因此我只能假设您已经完成了此操作。如果是这样的话,这就是你的答案。