У 'YYSTYPE' нет участника - PullRequest
       28

У 'YYSTYPE' нет участника

0 голосов
/ 05 апреля 2011

В моем файле 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 Ответ

1 голос
/ 05 апреля 2011

[должен быть комментарий, но мне нужны пробелы и пробелы, чтобы их можно было прочитать. Буду редактировать, чтобы было реальное решение, когда все прояснится]

Edit1: новый конф Итак, давайте немного уточним файл, который у вас будет:

Стиль кода 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 ++. Это может объяснить, почему вы не можете найти член структуры в коде.

Может быть

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

для моей информации, зачем вам смесь C и C ++? почему не только один язык?

...