LINUX.ORG.RU

Переменная yylval Flex++/Bison++


0

1

Никак не могу разобраться как передать значение токена через переменную 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» почему-то не компилируется, компиляция останавливается на полуслове.

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.