在我的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之前确实包含它。我该怎么办?
答案 0 :(得分:1)
[应该是评论,但我需要间距和空白才能阅读。当所有人都澄清时,将编辑以使其成为真正的解决方案]
Edit1:新conf 那么让我们澄清一下你应该拥有的文件:
C ++代码样式/ yacc_parser.yy
:包含%union
C ++代码样式/ yacc_parser.hh
和yacc_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 ++?为什么不只有一种语言?