2011-04-05 55 views
0

在我YACC文件,我有這樣的:'YYSTYPE' 沒有成員

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

這是我萊克斯文件(請注意,它包括由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定義和萊克斯輸出文件不INC在使用YYSTYPE之前使用它。我該怎麼辦?

+0

什麼是您的YYSTYPE定義? – 2011-04-05 13:37:19

+0

@ M'vy你是什麼意思?我發佈了它! – mtk358 2011-04-05 13:42:05

+0

所以%union是在頭文件中?只是想確定這一點。 – 2011-04-05 13:48:37

回答

1

[應該是一個評論,但我需要間距和空白是可讀的。將編輯,使它真正的解決方案時,都將被澄清]

EDIT1:新配置 因此,讓我們澄清了一下文件,你必須有:

C++代碼風格/ yacc_parser.yy:包含%工會

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命令

產生。然後編譯&鏈接:gcc -Wall lex_lexer.c yacc_parser.cc應該生成的可執行文件。

既然你混合使用C和C++代碼,我幾乎可以肯定你需要在某個地方使用extern "C" { ... }來將你的聯合作爲C類型而不是C++。這可能解釋爲什麼你的C代碼無法找到結構成員。

也許

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

我的信息,你爲什麼C和C++的混合?爲什麼不只是一種語言?

+0

我的配置與你所描述的完全不同。我有yacc_parser.y(這是C++,我不知道它應該是.y還是.yy或者它是否重要)。 yacc_parser.hh和yacc_parser.cc由yacc生成,而lex_lexer.c(C,不是C++)由lex_lexer.l中的lex生成。我使用CMake來構建。但我不知道如何發佈CMake文件(因爲Stack Overflow不像討論論壇那樣工作)。 – mtk358 2011-04-05 14:07:21

+0

已編輯。我猜pastebin可以用於代碼共享的目的。 – 2011-04-05 14:25:42

+0

關於混合C和C++:http:// ds9a。nl/lex-yacc/cvs/lex-yacc-howto.html#s5 yacc_parser.y:http://pastebin.com/2rMAtWBJ lex_lexer.l:http://pastebin.com/BtXzRL3p – mtk358 2011-04-05 14:56:20