리스트 포인터를 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
하지만 나는 누군가가리스트와 사용자 정의 클래스 포인터를 사용하는 것을 보았다. –
여기에 컴파일러 오류가 없습니다. 문제를 재현하는 최소한의 완전한 예제를 게시하십시오. –
컴파일러에'.c' 파일을 C++로 쓰고 싶다면'-x C++'라고 말할 필요가 있습니다. –