2013-03-23 3 views
2

리스트 포인터를 bison 파서에 포함하면 컴파일러에서 'list'가 유형을 지정하지 않는다는 오류를보고합니다. 여기 몇 가지 필요한 작품입니다; 필요한 경우 모든 코드를 게시 할 수 있습니다. 나는 bison과 flex의 최신 버전을 사용하고 있습니다.flex 및 bison : C++ 클래스

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 
+0

하지만 나는 누군가가리스트와 사용자 정의 클래스 포인터를 사용하는 것을 보았다. –

+0

여기에 컴파일러 오류가 없습니다. 문제를 재현하는 최소한의 완전한 예제를 게시하십시오. –

+0

컴파일러에'.c' 파일을 C++로 쓰고 싶다면'-x C++'라고 말할 필요가 있습니다. –

답변

2

글쎄 그것은 꽤 분명 당신 렉서 코드 (예 : parser.l)를 사용하면이 flex와 들소의 단점들로 공급받을 경우 #include <list> 또는 BTW

using namespace std;, 다음 걸릴없는 것 bison 대신에 Lemon을 보시면 간단하고 꽤 좋으며 '% union'에서 포인터를 사용하는 상황에 도움이 될 것입니다. 플렉스의 대체품으로 Ragel을 살펴보세요. 더 복잡하지만 훌륭합니다.

+0

그러나 권장 코드를 렉서 코드에 추가 한 후에도 오류는 계속보고됩니다. –

+1

'#include '앞에 그 파일을 추가해야합니다. 그 이유는 잘못된 정의가 그 파일에 있기 때문입니다. BTW 인수 목록없이'list'를 사용하고 있습니다. –

관련 문제