'YYSTYPE'没有会员

时间:2011-04-05 12:29:44

标签: c++ c parsing yacc lex

在我的YACC文件中,我有这个:

%union {
    Node *node;
    FuncParamList *fParam;
    CallParamList *cParam;
    char *str;
    struct {
        char *name;
        Node *node;
    } nameNodePair;
}

这是我的Lex文件(请注意,它包含YACC生成的头文件):

%{
    #include "yacc_parser.hh"
%}

%%

if              return IF;
ei              return ELSEIF;
else            return ELSE;
endif           return ENDIF;
while           return WHILE;
loop            return LOOP;
func            return FUNC;
end             return END;

:=              return ASSIGN;
\.              return DOT;
,               return COMMA;
:               return COLON;
\(              return OPAREN;
\)              return CPAREN;

(\n|\r\n?)      { /* increment line count */ return LF; }
;               return LF;

[!?A-Za-z][!?A-Za-z0-9]         { yylval.str = yytext; return NAME; }
[0-9]+                          { yylval.str = yytext; return INTEGER; }

%%

但是我在编译时遇到了这个错误:

/home/michael/Projects/lang/lib/lex_lexer.l:26:9: error: ‘YYSTYPE’ has no member named ‘str’
/home/michael/Projects/lang/lib/lex_lexer.l:27:9: error: ‘YYSTYPE’ has no member named ‘str’

我确保YACC头文件包含YYSTYPE定义,并且Lex输出文件在使用YYSTYPE之前确实包含它。我该怎么办?

1 个答案:

答案 0 :(得分:1)

[应该是评论,但我需要间距和空白才能阅读。当所有人都澄清时,将编辑以使其成为真正的解决方案]

Edit1:新conf 那么让我们澄清一下你应该拥有的文件:

C ++代码样式/ yacc_parser.yy:包含%union

C ++代码样式/ yacc_parser.hhyacc_parser.cc:由yacc yacc_parser.yy命令生成

C代码样式/ lex_lexer.l:包含yacc_parser.h

C代码样式/ lex_lexer.c:由lex lex_lexer.l命令生成

然后编译& link:gcc -Wall lex_lexer.c yacc_parser.cc应生成可执行文件。

由于你混合使用C和C ++代码,我几乎可以肯定你需要在某个地方使用extern "C" { ... }将你的联合链接为C类而不是C ++。这可以解释为什么你的c代码找不到结构成员。

也许

%union {
    extern "C" {
    ...teh code...
    }
}

对于我的信息,你为什么要混合使用C和C ++?为什么不只有一种语言?

相关问题