Ошибка компиляции. Как разобрать имя переменной с помощью lex / yacc?

0

В моем файле 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
  • 2
    Вы уверены, что не пропустите ни одного ; в других соседних кусках кода? Этот конкретный кусок выглядит хорошо.
  • 1
    Если ошибка произошла в фазе компиляции C, вы можете попытаться просмотреть файл, сгенерированный win_flex, чтобы четко знать, где его нашел C, и по ним вернуться к источнику lex.
Показать ещё 1 комментарий
Теги:
lex
yacc

1 ответ

0
Лучший ответ

Я нашел решение этой проблемы. Член yylval должен соответствовать декларации объединения следующим образом, в файле lex:

[a-zA-Z][a-zA-Z0-9]* { yylval->str = _strdup(yytext); return id; }

... и в файле yacc:

%union
{
    char *str;
...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню