использовать yylval в зубров, чтобы восстановить строку - PullRequest
4 голосов
/ 26 ноября 2010

Привет, я не понимаю, как получить символ *, когда я читаю определенный токен ... Я смотрю на разных сайтах, и они предоставляют предложения, но не полные, я имею в виду, например, отсутствует объявление yylval и yytext или как преобразовать типы и т. Д.

Что нужно в .l файле? Что нужно в .y файле?

Что у меня есть

в .l файле:

{WORD}      { yylval = strdup(yytext);return T_ValidWord;}

в .y файле:

%union{
  char *str;
}

%token<str> T_ValidWord

%%

element:
T_OpenTag T_ValidWord ele1 {printf("%s", $2);}
; 

Ошибка:

xml.lex: In function ‘yylex’:
xml.lex:34: error: incompatible types when assigning to type ‘YYSTYPE’ from type ‘char *’

Еще одна вещь, которая смутила меня: В некоторых местах я вижу

yylval->something = yytext
yylval.something = yytext
yylval = yytext

В руководстве по бизону скажите, что yylval - это макрос, я понимаю, что макрос - это текст, замененный другим текстом, но в этой ситуации я действительно не понимаю.

1 Ответ

13 голосов
/ 26 ноября 2010

yylval является YYSTYPE типа объединения.Измените свое назначение в сканере на yylval.str = strdup(yytext).

yylval - это объединение, которое вы можете либо объявить, либо бизон объявит автоматически.По умолчанию бизон yylval бесполезен.Вы объявляете yylval, используя %union { ... } в вашем парсере, потому что вам может понадобиться вернуть другие значения из сканера в парсер.Например, когда вы сопоставляете число в своем сканере, вы захотите вернуть токен, такой как T_NUM.Но вы, скорее всего, также хотите получить значение этого числа, которое пригодится в yylval.Используя yylval, если у вас есть целочисленное поле, вы можете просто сделать yylval.num = atoi(yytext) внутри вашего сканера, а затем использовать это поле num в парсере.

yytext - это массив символов, который действует как буфер длявход в настоящее время анализируется.Вы не можете объявить yytext, и вы не должны.

Когда вы используете bison для компиляции анализатора в файл .tab.c, используйте флаги bison -d -t для отладки символов и файла заголовка.Заголовочный файл будет называться * .tab.h.Включите это в свой сканер, чтобы вам нужно было только один раз объявить имена токенов и правильно использовать yylval.

...