flex and bison:C++ class

flex and bison:C++ class

本文关键字:C++ class bison and flex      更新时间:2023-10-16

当我在bison解析器中嵌入list*指针时,编译器报告一个错误,'list'没有命名类型。这里有一些必要的部件;如果你需要,我可以张贴所有的代码。我正在使用最新版本的bison和flex。

parser.l
%{
#include <stdlib.h>
#include <string.h>
#include "parser.tab.h"
extern void yyerror(const char *);
extern int yylex();
char* outchar;
char* mychars;
unsigned int line_number=1;
%}
%option nounput 
%option noyywrap
%option noinput
%%
"automaton"     {return AUTOMATON;}
"var"       {return VAR;}
"synclabs"  {return SYNCLABS;}
"initially"     {return INITIALLY;}
"loc"       {return LOC;}
"while"     {return WHILE;}
"wait"      {return WAIT;}
"when"      {return WHEN;}
"do"        {return DO;}
"sync"      {return SYNC;}
"goto"      {return GOTO;}
"end"       {return END;}
"forbidden"     {return FORBIDDEN;}
"true"      {return TRUE;}
"TRUE"      {return TRUE;}
"false"     {return FALSE;}
"FALSE"     {return FALSE;}
"="         {return EQ2;}
"=="        {return EQ;}
">="        {return GE;}
"<="        {return LE;}
"'"         {return PRIM;}
":="        {return ASSIGN;}
([0-9]+)(("."[0-9]+)?)((([eE])([+-]?)([0-9]+))?)  {yylval.mystring = strdup(yytext);   return INT;}
[-+<>*/&|(){}:;,.=!]|"["|"]" {return *yytext;}
(["$""?"a-zA-Z]|[_])("$"|"?"|[a-zA-Z]|[0-9]|[_]|[~])* { yylval.mystring =   strdup(yytext); return IDENT; }

"/*"([^*]|("*"+[^*/]))*"*"+"/" /* skip comment */
"//".*                         /* skip comment XS*/
"--".*                         /* skip comment */
[n] { ++line_number; 
}
[ tr]                      
%%
parser.y
%{
#include <stdio.h>
#include <stdlib.h>
#include<list>
using namespace std;
extern int yylex();
extern unsigned int line_number;
void yyerror(const char *msg)
{       
        printf("Parse error in line %d: ", line_number);
        printf("%sn", msg);
}
Automaton *aut; 
int var_count=0;
string *s;
%}
%union{
char * mystring;
list* s;
};

%token AUTOMATON
%token VAR
%token SYNCLABS
%token INITIALLY
%token LOC
%token WHILE
%token WAIT
%token WHEN
%token DO
%token SYNC
%token GOTO
%token END
%token ASSIGN
%token FORBIDDEN
%token TRUE
%token FALSE
%token <mystring> INT
%token <mystring> IDENT
//%nonassoc '(' ')'
%left  '&'
%left GE LE EQ EQ2
%left '+' '-'
%left '!'
%left '(' ')'
%left PRIM
%%  
program:
commands
;
%%
compile result:
g++ -O2 -w -c -I .  -g -O2 -o lex.yy.o lex.yy.c
In file included from parser.l:4:0:
parser.y:23:2: error: ‘list’does not name a type

很明显,你的lexer代码(即parser.l)没有#include <list>using namespace std;

BTW一个提示,如果你厌倦了flex和bison的古怪,那么看看柠檬作为bison的替代品,它很简单而且很好,它也会帮助你在"%union"中使用指针的情况。也可以看看Ragel作为flex的替代品,它更复杂,但更聪明。