/ / Prečo je yylval null? - bizón, yacc, lex, flex-lexer

Prečo je yylval null? - bizón, yacc, lex, flex-lexer

Snažím sa napísať môj prvý analyzátor pomocou Flex & Bison. Pri analýze čísiel sa snažím zachrániť ich hodnoty yylval štruktúra. Problém je, yylval je null, keď lexer dosiahne číslo, čo spôsobí poruchu segmentácie.

(Súvisiaci bod zmätok: prečo je to vo väčšine príkladov Flex (napr. tu) yylval je štruktúra, skôr ako ukazovateľ štruktúry? Nemohol som dostať yylval ktorý sa má rozpoznať v test.l bez %option bison-bridge, a táto možnosť bola vykonaná yylval ukazovateľ. Tiež som sa snažil inicializovať yylval v main test.y, ale yylval = malloc(...) udáva nesúlad typu - akoby yylval je nie ukazovateľ ...?)

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

%%
...

Príkaz build:

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

odpovede:

7 pre odpoveď č. 1

Za normálnych okolností, yylval je globálna štruktúra a nie ukazovateľ a ak ju odstránite %option bison-bridge z vášho súboru test.l, to je to, čo dostanete (budete musieť zmeniť yylval->real na yylval.real ako aj na to, aby fungovala.

Na %option bison-bridge v flexi je mienené, aby zodpovedal až %define api.pure in bison, ktorý používa odlišné API na komunikáciu medzi yyparse a yylex (yylval sa stáva ukazovateľom argumentu na yylex namiesto globálneho var).

Takže vašim základným problémom je nekompatibilné API medzi flexom a bizonom - v BOTE alebo NEITHERE musíte uviesť čistý api / bison-bridge - ak to urobíte v jednom a nie v druhom, veci sa zlomia.