Почему yylval null? - PullRequest
       63

Почему yylval null?

3 голосов
/ 22 июня 2011

Я пытаюсь написать свой первый парсер с Flex & Bison.При разборе чисел я пытаюсь сохранить их значения в структуре yylval.Проблема в том, что yylval равно нулю, когда лексер достигает числа, что вызывает ошибку сегментации.

(Смежный вопрос: почему в большинстве примеров Flex (например, здесь ) yylval является структурой, а не указателем на структуру? Я не могполучить yylval для распознавания в test.l без %option bison-bridge, и этот параметр сделал указатель yylval .Также я попытался инициализировать yylval в main test.y, но yylval = malloc(...) дает типнесоответствие - как будто yylval это не указатель ...?)

test.l

%{
    #include <stdio.h>
    #include <stdlib.h>
    #include "svg.tab.h"
%}

%option bison-bridge
%option noyywrap

%%

[0-9]+  { yylval->real = atof(yytext); return REAL; }

. { return *yytext; }

%%

test.y:

%{
    #include <stdio.h>
    void yyerror(char *);   
%}

%union {
    double real;
}

%token <real> REAL

%%
...

Команда построения:

bison -d test.y && flex test.l && gcc lex.yy.c test.tab.c

1 Ответ

7 голосов
/ 22 июня 2011

Обычно yylval - это глобальная структура, а не указатель, и если вы удалите %option bison-bridge из файла test.l, это то, что вы получите (вам нужно изменить yylval->real на yylval.real а также чтобы это работало).

Значение %option bison-bridge в flex соответствует до %define api.pure в зубре, который использует другой API для связи между yyparse и yylex (yylval становится аргументом-указателем для yylex вместо глобального var).

Таким образом, ваша основная проблема - несовместимый API между flex и bison - вам нужно указать чистый api / bison-bridge в ОБА или НИ И НЕ, - если вы делаете это в одном, а не в другом, вещи ломаются.

...