Никак не могу разобраться как передать значение токена через переменную yylval. Пробую так:
файл «scanner.l»
%option c++
%option noyywrap
LETTER [A-Za-z]
DIGIT [0-9]
WORD ({LETTER}|_)({LETTER}|{DIGIT}|_)*
%{
//#define debug
#include<sstream>
#include <stdio.h>
#include "parser.h"
#include <cstdlib>
%}
%%
{WORD} {
#ifdef debug
printf("WORD | %s\n",yytext);
#else
yylval->string = yytext;
return Parser::T_WORD;
#endif
}
. ;
<<EOF>> {
yyterminate();
}
%%
файл «parser.y»
%name Parser
%define LSP_NEEDED
%define MEMBERS \
virtual ~Parser() {} \
private: \
yyFlexLexer lexer;
%define LEX_BODY {return lexer.yylex();}
%define ERROR_BODY {cerr << "error encountered at line: "\
<<lexer.lineno()<<" last word parsed:"<<lexer.YYText()<<"\n";}
%header{
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <FlexLexer.h>
using namespace std;
%}
%union {
char * string;
}
%token <string> T_WORD
%type <int> wrds wrd
%start wrds
%%
wrds
: /* empty */
| wrds wrd { return 1; }
;
wrd
: T_WORD { printf("WORD%s\n",$1); }
;
%%
файл «test.cpp»
#include "parser.h"
#include <iostream>
using namespace std;
int main(int argc, char ** argv)
{
Parser parser;
while(parser.yyparse()!=0)
;
}
makefile
program:
flex++ -d -oscanner.cpp scanner.l
bison++ -d -hparser.h -o parser.cpp parser.y
g++ -c parser.cpp
g++ -c scanner.cpp
g++ -c test.cpp
g++ -o test test.o parser.o scanner.o
Пишет «yylval не объявлено», и это понятно нужно передать эту переменную в yylex. Так вот как это сделать я не знаю. Прошу подсказать, что нужно добавить. Можно просто прислать пример на 0x47@mail.ru. Заранее спасибо.
P.S. Что странно: пример, который идет вместе с bison в папке «/usr/share/doc/bison++/Example» почему-то не компилируется, компиляция останавливается на полуслове.