2

当我将 list* 指针嵌入到 bison 解析器中时,编译器会报告一个错误,即 'list' 没有命名类型。这是一些必要的部分;如果您需要,我可以发布所有代码。我正在使用最新版本的野牛和 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; 

}
[ \t\r]                      
%%

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("%s\n", 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
4

1 回答 1

2

很明显,您的词法分析器代码(即 parser.l)没有#include <list>using namespace std;

顺便说一句,如果你厌倦了 flex 和 bison 的怪癖,那么看看Lemon作为 bison 的替代品,它很简单而且非常好,它也有助于你在 '%union 中使用指针的情况'。还可以看看Ragel作为 flex 的替代品,它更复杂但更出色。

于 2013-03-23T08:52:59.653 回答