В моем файле lex у меня есть:
[a-zA-Z][a-zA-Z0-9]*
{
yylval.val = _strdup(yytext); // <- error here
yylval.length = yylen;
return id;
}
... для синтаксического анализа текста, такого как "myid2"
Это вызывает ошибку компиляции:
error C2143: syntax error : missing ';' before '='
Как это сделать правильно, чтобы я мог передать идентификатор в виде символьной строки (char *) в файле yacc?
Я использую win_flex и win_bison.
UPDATE: я помещал операторы в одну строку в файл lex:
[a-zA-Z][a-zA-Z0-9]* { yylval.val = _strdup(yytext); yylval.length = yylen; return id; }
Теперь я получаю ошибки компиляции:
error C2039: 'length' : is not a member of 'YYSTYPE'
error C2039: 'val' : is not a member of 'YYSTYPE'
error C2065: 'yylen' : undeclared identifier
Я нашел решение этой проблемы. Член yylval должен соответствовать декларации объединения следующим образом, в файле lex:
[a-zA-Z][a-zA-Z0-9]* { yylval->str = _strdup(yytext); return id; }
... и в файле yacc:
%union
{
char *str;
...
}
;
в других соседних кусках кода? Этот конкретный кусок выглядит хорошо.