Fix for virtual

git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk/SWIG@991 626c5289-ae23-0410-ae9c-e8d60b6d4f22
This commit is contained in:
Dave Beazley 2001-01-10 22:29:21 +00:00
commit e6595219a4
2 changed files with 20 additions and 10 deletions

View file

@ -352,7 +352,7 @@ yylex1(void) {
if (strcmp(yytext,"public") == 0) return(PUBLIC); if (strcmp(yytext,"public") == 0) return(PUBLIC);
if (strcmp(yytext,"protected") == 0) return(PROTECTED); if (strcmp(yytext,"protected") == 0) return(PROTECTED);
if (strcmp(yytext,"friend") == 0) return(FRIEND); if (strcmp(yytext,"friend") == 0) return(FRIEND);
if (strcmp(yytext,"virtual") == 0) return(lparse_yylex()); if (strcmp(yytext,"virtual") == 0) return(VIRTUAL);
if (strcmp(yytext,"operator") == 0) return(OPERATOR); if (strcmp(yytext,"operator") == 0) return(OPERATOR);
if (strcmp(yytext,"throw") == 0) return(THROW); if (strcmp(yytext,"throw") == 0) return(THROW);
if (strcmp(yytext,"inline") == 0) return(lparse_yylex()); if (strcmp(yytext,"inline") == 0) return(lparse_yylex());

View file

@ -223,7 +223,7 @@ static int promote(int t1, int t2) {
%token <tok> CONST ENUM EXTERN SIZEOF STATIC STRUCT TYPEDEF UNION %token <tok> CONST ENUM EXTERN SIZEOF STATIC STRUCT TYPEDEF UNION
/* C++ keywords */ /* C++ keywords */
%token <tok> CLASS FRIEND OPERATOR PRIVATE PROTECTED PUBLIC TEMPLATE THROW %token <tok> VIRTUAL CLASS FRIEND OPERATOR PRIVATE PROTECTED PUBLIC TEMPLATE THROW
/* Objective C keywords */ /* Objective C keywords */
%token <tok> OC_INTERFACE OC_END OC_PUBLIC OC_PRIVATE OC_PROTECTED OC_CLASS OC_IMPLEMENT OC_PROTOCOL %token <tok> OC_INTERFACE OC_END OC_PUBLIC OC_PRIVATE OC_PROTECTED OC_CLASS OC_IMPLEMENT OC_PROTOCOL
@ -890,20 +890,26 @@ function_decl : storage_spec type declaration LPAREN parms RPAREN cpp_const sta
} }
/* A C++ destructor */ /* A C++ destructor */
| NOT ID LPAREN parms RPAREN cpp_end { | storage_spec NOT ID LPAREN parms RPAREN cpp_end {
$$ = new_node("c:destructor",$2.filename,$2.line); $$ = new_node("c:destructor",$3.filename,$3.line);
Setattr($$,ATTR_NAME,$2.text); Setattr($$,ATTR_NAME,$3.text);
if ($6.text) { if ($7.text) {
Setattr($$,"code",$6.text); Setattr($$,"code",$7.text);
} }
if (pure_virtual) { if (pure_virtual) {
SetInt($$,"abstract",1); SetInt($$,"abstract",1);
pure_virtual = 0; pure_virtual = 0;
} }
if ($1.ivalue) {
Setattr($$,ATTR_STORAGE,$1.text);
}
} }
| NOT ID LPAREN parms RPAREN cpp_const SEMI { | storage_spec NOT ID LPAREN parms RPAREN cpp_const SEMI {
$$ = new_node("c:destructor",$2.filename,$2.line); $$ = new_node("c:destructor",$3.filename,$3.line);
Setattr($$,ATTR_NAME,$2.text); Setattr($$,ATTR_NAME,$3.text);
if ($1.ivalue) {
Setattr($$,ATTR_STORAGE,$1.text);
}
} }
; ;
@ -942,6 +948,10 @@ storage_spec : EXTERN {
$$.ivalue = 1; $$.ivalue = 1;
$$.text = NewStringf("extern \"%s\"", $2.text); $$.text = NewStringf("extern \"%s\"", $2.text);
} }
| VIRTUAL {
$$.ivalue = 1;
$$.text = NewString("virtual");
}
| STATIC { | STATIC {
$$.ivalue = 1; $$.ivalue = 1;
$$.text = NewString("static"); $$.text = NewString("static");