2

リスト*ポインターをbisonパーサーに埋め込むと、コンパイラーは「リスト」が型を指定しないというエラーを報告します。ここにいくつかの必要な部分があります。必要に応じて、すべてのコードを投稿できます。最新バージョンの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; 

}
[ \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;

ところで、ヒントとして、フレックスとバイソンの癖にうんざりしている場合は、バイソンの代わりにレモンを見てください。シンプルでかなり良いです。また、'%unionでポインターを使用する状況にも役立ちます。 '。また、フレックスの代わりとしてRagelを見てください。これは、より複雑ですが素晴らしいものです。

于 2013-03-23T08:52:59.653 に答える