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ď č. 1Za 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.