import "ecdefs"
#define YYLTYPE Location
+#include "grammar.h"
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
#define POP_DEFAULT_ACCESS if(defaultMemberAccess > -1) defaultMemberAccess--;
-public void SetAST(OldList * list) { ast = list; }
-public OldList * GetAST() { return ast; }
-
-public void ParseEc()
-{
- yyparse();
-}
-
#define uint _uint
default:
External external;
Context context;
AsmField asmField;
+ Attrib attrib;
+ ExtDecl extDecl;
+ Attribute attribute;
Instantiation instance;
MembersInit membersInit;
exclusive_or_expression inclusive_or_expression logical_and_expression
logical_or_expression conditional_expression assignment_expression
constant_expression constant_expression_error
- anon_instantiation_expression anon_instantiation_expression_error
-
-%type <exp> postfix_expression_error unary_expression_error cast_expression_error
+ anon_instantiation_expression anon_instantiation_expression_error i18n_string
+ postfix_expression_error unary_expression_error cast_expression_error
multiplicative_expression_error additive_expression_error shift_expression_error
relational_expression_error equality_expression_error and_expression_error
exclusive_or_expression_error inclusive_or_expression_error logical_and_expression_error
common_unary_expression common_unary_expression_error
simple_unary_expression simple_unary_expression_error
database_open dbfield dbindex dbtable
-
+
%type <list> argument_expression_list expression expression_anon_inst expression_anon_inst_error enumerator_list type_qualifier_list
struct_declarator_list struct_declaration_list
declaration_specifiers identifier_list identifier_list_error initializer_list init_declarator_list
new_specifiers renew_specifiers asm_field_list
property_watch_list watch_property_list
dbindex_item_list dbfield_definition_list
- template_arguments_list template_parameters_list
+ template_arguments_list template_parameters_list attribs_list
%type <asmField> asm_field
%type <specifier> storage_class_specifier enum_specifier_compound enum_specifier_nocompound type_qualifier type_specifier class_specifier class_specifier_error
%type <enumerator> enumerator
%type <declarator> declarator direct_declarator direct_abstract_declarator abstract_declarator
direct_abstract_declarator_noarray abstract_declarator_noarray
- struct_declarator direct_declarator_function direct_declarator_function_start declarator_function_error direct_declarator_function_error declarator_function direct_declarator_nofunction
- declarator_nofunction
+ struct_declarator direct_declarator_function direct_declarator_function_start declarator_function_error direct_declarator_function_error declarator_function direct_declarator_nofunction // declarator_nofunction
+ direct_declarator_function_type_ok declarator_nofunction_type_ok direct_declarator_nofunction_type_ok declarator_function_type_ok direct_declarator_function_error_type_ok
+ direct_declarator_function_start_type_ok direct_declarator_type_ok declarator_type_ok declarator_function_error_type_ok
+ // tricky_declarator
%type <pointer> pointer
%type <initializer> initializer initializer_error initializer_condition initializer_condition_error
%type <initDeclarator> init_declarator init_declarator_error
%type <classFunction> instance_class_function_definition instance_class_function_definition_error instance_class_function_definition_start instance_class_function_definition_start_error
%type <_class> class class_error class_head
%type <classDef> struct_declaration struct_declaration_error
-%type <string> ext_decl string_literal ext_attrib base_strict_type_name
+%type <string> string_literal base_strict_type_name attribute_word
+%type <extDecl> ext_decl
+%type <attrib> attrib
+%type <attribute> attribute
%type <prop> property property_start property_body class_property class_property_start class_property_body
%type <propertyWatch> property_watch self_watch_definition
%type <dbtableEntry> dbindex_entry dbfield_entry
%type <dbindexItem> dbindex_item
%type <dbtableDef> dbtable_definition
+%type <context> compound_start class_entry
%token IDENTIFIER CONSTANT STRING_LITERAL SIZEOF
%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
%nonassoc IFX
%nonassoc ELSE
%token CLASS THISCLASS CLASS_NAME
-%token PROPERTY SETPROP GETPROP NEWOP RENEW DELETE EXT_DECL EXT_STORAGE IMPORT DEFINE VIRTUAL EXT_ATTRIB
+%token PROPERTY SETPROP GETPROP NEWOP RENEW DELETE EXT_DECL EXT_STORAGE IMPORT DEFINE VIRTUAL ATTRIB
%token PUBLIC PRIVATE
%token TYPED_OBJECT ANY_OBJECT _INCREF EXTENSION ASM TYPEOF
%token WATCH STOPWATCHING FIREWATCHERS WATCHABLE CLASS_DESIGNER CLASS_NO_EXPANSION CLASS_FIXED ISPROPSET
%token CLASS_DEFAULT_PROPERTY PROPERTY_CATEGORY CLASS_DATA CLASS_PROPERTY SUBCLASS NAMESPACE
%token NEW0OP RENEW0 VAARG
%token DBTABLE DBFIELD DBINDEX DATABASE_OPEN
-
+%token ALIGNOF ATTRIB_DEP __ATTRIB
%destructor { FreeIdentifier($$); } identifier
%destructor { FreePointer($$); } pointer
multiplicative_expression_error additive_expression_error shift_expression_error
relational_expression_error equality_expression_error and_expression_error
exclusive_or_expression_error inclusive_or_expression_error logical_and_expression_error
- logical_or_expression_error conditional_expression_error assignment_expression_error
-%destructor { FreeSpecifier($$); } storage_class_specifier external_storage_class_specifier type_qualifier type_specifier
- struct_or_union_specifier_compound struct_or_union_specifier_nocompound type ext_storage class_specifier class_specifier_error
- struct_or_union_specifier_compound_error struct_class struct_class_error
- enum_specifier_compound_error
+ logical_or_expression_error conditional_expression_error assignment_expression_error i18n_string
+%destructor { FreeSpecifier($$); } storage_class_specifier enum_specifier_compound enum_specifier_nocompound type_qualifier type_specifier class_specifier class_specifier_error
+ struct_or_union_specifier_compound struct_or_union_specifier_nocompound ext_storage type strict_type guess_type enum_class strict_type_specifier struct_class
+ struct_or_union_specifier_compound_error struct_class_error struct_decl
+ enum_specifier_compound_error enum_class_error external_storage_class_specifier
+ base_strict_type struct_head struct_entry
%destructor { FreeEnumerator($$); } enumerator
%destructor { FreeDeclarator($$); } declarator direct_declarator direct_abstract_declarator abstract_declarator
direct_abstract_declarator_noarray abstract_declarator_noarray
struct_declarator direct_declarator_function direct_declarator_function_start declarator_function_error direct_declarator_function_error declarator_function direct_declarator_nofunction
- declarator_nofunction
+ //declarator_nofunction
%destructor { FreeInitializer($$); } initializer initializer_error initializer_condition initializer_condition_error
%destructor { FreeInitDeclarator($$); } init_declarator init_declarator_error
class_function_definition_start_error virtual_class_function_definition_start virtual_class_function_definition_start_error
constructor_function_definition_start destructor_function_definition_start
instance_class_function_definition instance_class_function_definition_error instance_class_function_definition_start instance_class_function_definition_start_error
-%destructor { FreeClass($$); } class class_error
+%destructor { Context ctx = curContext; PopContext(ctx); FreeContext(ctx); delete ctx; } class_entry
+%destructor { Context ctx = curContext; PopContext(ctx); FreeContext(ctx); delete ctx; } class_decl
+%destructor { FreeClass($$); } class class_error class_head
%destructor { FreeClassDef($$); } struct_declaration struct_declaration_error
-%destructor { delete $$; } ext_decl string_literal
+%destructor { delete $$; } string_literal attribute_word base_strict_type_name
%destructor { FreeProperty($$); } property
%destructor { FreeList($$, FreeExpression); } argument_expression_list expression expression_error argument_expression_list_error
%destructor { FreeList($$, FreeEnumerator); } enumerator_list
-%destructor { FreeList($$, FreeSpecifier); } type_qualifier_list specifier_qualifier_list declaration_specifiers inheritance_specifiers _inheritance_specifiers
+%destructor { FreeList($$, FreeSpecifier); } type_qualifier_list specifier_qualifier_list declaration_specifiers inheritance_specifiers _inheritance_specifiers external_guess_declaration_specifiers external_guess_declaration_specifiers_error
+ guess_declaration_specifiers guess_specifier_qualifier_list
%destructor { FreeList($$, FreeDeclarator); } struct_declarator_list
%destructor { FreeList($$, FreeDeclaration); } declaration_list declaration_list_error
%destructor { FreeList($$, FreeInitializer); } initializer_list
%destructor { FreeList($$, FreeClassDef); } struct_declaration_list struct_declaration_list_error
%destructor { FreeList($$, FreeMemberInit); } default_property_list default_property_list_error data_member_initialization_list data_member_initialization_list_coloned data_member_initialization_list_error
%destructor { FreeList($$, FreeMembersInit); } members_initialization_list members_initialization_list_coloned members_initialization_list_error
+%destructor { PopContext($$); FreeContext($$); delete $$; } compound_start
+%destructor { FreeTemplateParameter($$); } template_parameter template_type_parameter template_identifier_parameter template_expression_parameter
+%destructor { FreeTemplateArgument($$); } template_argument template_type_argument template_identifier_argument template_expression_argument
+%destructor { FreeTemplateDataType($$); } template_datatype
+%destructor { FreeList($$, FreeTemplateParameter); } template_parameters_list
+%destructor { FreeList($$, FreeTemplateArgument); } template_arguments_list
%destructor { } declaration_mode
-
+%destructor { FreeAttrib($$); } attrib
+%destructor { FreeExtDecl($$); } ext_decl
+%destructor { FreeAttribute($$); } attribute
+%destructor { FreeList($$, FreeAttribute); } attribs_list
%start thefile
guess_type:
identifier '*'
{
+ $$ = null;
// if($1._class && !$1._class.name)
if($1._class)
{
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
}
| identifier '<'
{
+ $$ = null;
#ifdef PRECOMPILER
// if($1._class && !$1._class.name)
if($1._class)
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
#else
Location tmpLoc = yylloc; $$ = $2; yylloc = @1;
- Compiler_Error("Not a type: %s\n", $1.string);
+ Compiler_Error($"Not a type: %s\n", $1.string);
yylloc = tmpLoc; $2.badID = $1;
#endif
}
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
#else
Location tmpLoc = yylloc; $$ = $2; yylloc = @1;
- Compiler_Error("Not a type: %s\n", $1.string);
+ Compiler_Error($"Not a type: %s\n", $1.string);
yylloc = tmpLoc; $2.badID = $1;
#endif
}*/
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
goto yysetstate;
;
class_function_definition_start:
- guess_declaration_specifiers declarator_function
+ guess_declaration_specifiers declarator_function_type_ok
{ $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
| declarator_function
{ $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
;
virtual_class_function_definition_start:
- VIRTUAL guess_declaration_specifiers declarator_function
+ VIRTUAL guess_declaration_specifiers declarator_function_type_ok
{ $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
| VIRTUAL declarator_function
{ $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
;
class_function_definition_start_error:
- guess_declaration_specifiers declarator_function_error
+ guess_declaration_specifiers declarator_function_error_type_ok
{ $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
| declarator_function_error
{ $$ = MkClassFunction(null, null, $1, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
;
virtual_class_function_definition_start_error:
- VIRTUAL guess_declaration_specifiers declarator_function_error
+ VIRTUAL guess_declaration_specifiers declarator_function_error_type_ok
{ $$ = MkClassFunction($2, null, $3, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
| VIRTUAL declarator_function_error
{ $$ = MkClassFunction(null, null, $2, null); $$.isVirtual = true; $$.loc = @$; $$.id = ++globalContext.nextID; }
// In Instances, return type is required to distinguish from calling the function
instance_class_function_definition_start:
- declaration_specifiers declarator_function
+ declaration_specifiers declarator_function_type_ok
{ $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
- | declaration_specifiers declarator_nofunction
+ | declaration_specifiers declarator_nofunction_type_ok
{ $$ = MkClassFunction($1, null, MkDeclaratorFunction($2, null), null); $$.loc = @$; $$.id = ++globalContext.nextID; }
;
instance_class_function_definition_start_error:
- declaration_specifiers declarator_function_error
+ declaration_specifiers declarator_function_error_type_ok
{ $$ = MkClassFunction($1, null, $2, null); $$.loc = @$; $$.id = ++globalContext.nextID; }
;
data_member_initialization_list:
data_member_initialization { $$ = MkList(); ListAdd($$, $1); }
| data_member_initialization_list ',' data_member_initialization
- { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
| data_member_initialization_list_error ',' data_member_initialization
- { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
;
data_member_initialization_list_error:
data_member_initialization_error { $$ = MkList(); ListAdd($$, $1); }
| data_member_initialization_list ',' data_member_initialization_error
- { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
| data_member_initialization_list_error ',' data_member_initialization_error
- { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
| data_member_initialization_list ',' error
{ ((MemberInit)$1->last).loc.end = @2.end;
memberInit.realLoc.start = memberInit.loc.start = dummy.loc.start = @2.end;
memberInit.realLoc.end = memberInit.loc.end = dummy.loc.end = @2.end;
ListAdd($1, memberInit);
- }
+ }
+ $$ = $1;
}
|
data_member_initialization_list_error ',' error
memberInit.realLoc.start = memberInit.loc.start = dummy.loc.start = @2.end;
memberInit.realLoc.end = memberInit.loc.end = dummy.loc.end = @2.end;
ListAdd($1, memberInit);
- }
+ }
+ $$ = $1;
}
| ','
{
data_member_initialization_list_coloned:
data_member_initialization_list ';'
- { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; }
+ { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; $$ = $1; }
| data_member_initialization_list_error ';'
- { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; }
+ { if($1->last) ((MemberInit)$1->last).loc.end = @2.end; $$ = $1; }
;
members_initialization_list_coloned:
data_member_initialization_list_coloned { MembersInit members = MkMembersInitList($1); $$ = MkList(); ListAdd($$, members); members.loc = @1; }
| instance_class_function_definition { $$ = MkList(); ListAdd($$, MkMembersInitMethod($1)); ((MembersInit)$$->last).loc = @1; }
- | members_initialization_list_error data_member_initialization_list_coloned { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2; }
- | members_initialization_list_error instance_class_function_definition { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
- | members_initialization_list_coloned data_member_initialization_list_coloned { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2; }
- | members_initialization_list_coloned instance_class_function_definition { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
+ | members_initialization_list_error data_member_initialization_list_coloned { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2; $$ = $1; }
+ | members_initialization_list_error instance_class_function_definition { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+ | members_initialization_list_coloned data_member_initialization_list_coloned { MembersInit members = MkMembersInitList($2); ListAdd($$, members); members.loc = @2; $$ = $1; }
+ | members_initialization_list_coloned instance_class_function_definition { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
| ';' { MembersInit members = MkMembersInitList(MkList()); $$ = MkList(); ListAdd($$, members); members.loc = @1; }
| members_initialization_list_error ';'
- | members_initialization_list_coloned ';' { MembersInit members = MkMembersInitList(MkList()); ListAdd($$, members); members.loc = @2; }
+ | members_initialization_list_coloned ';' { MembersInit members = MkMembersInitList(MkList()); ListAdd($$, members); members.loc = @2; $$ = $1; }
;
members_initialization_list:
members_initialization_list_error:
instance_class_function_definition_error { $$ = MkList(); ListAdd($$, MkMembersInitMethod($1)); ((MembersInit)$$->last).loc = @1; }
- | members_initialization_list instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
- | members_initialization_list_error instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
- | members_initialization_list_coloned instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; }
- | members_initialization_list_coloned data_member_initialization_list_error { ListAdd($$, MkMembersInitList($2)); ((MembersInit)$$->last).loc = @2; }
+ | members_initialization_list instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+ | members_initialization_list_error instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+ | members_initialization_list_coloned instance_class_function_definition_error { ListAdd($$, MkMembersInitMethod($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
+ | members_initialization_list_coloned data_member_initialization_list_error { ListAdd($$, MkMembersInitList($2)); ((MembersInit)$$->last).loc = @2; $$ = $1; }
| data_member_initialization_list_error { $$ = MkList(); ListAdd($$, MkMembersInitList($1)); ((MembersInit)$$->last).loc = @1; }
| data_member_initialization_list error { $$ = MkList(); ListAdd($$, MkMembersInitList($1)); ((MembersInit)$$->last).loc = @2; }
;
instantiation_named:
instantiation_named_error '}'
- { $$.loc = @$; $$.insideLoc.end = @2.start; }
+ { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
| instantiation_named_error error '}'
- { $$.loc = @$; $$.insideLoc.end = @2.start; }
+ { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
;
instantiation_named_error:
instantiation_unnamed:
instantiation_unnamed_error '}'
- { $$.loc = @$; $$.insideLoc.end = @2.start; }
+ { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
| instantiation_unnamed_error error '}'
- { $$.loc = @$; $$.insideLoc.end = @2.start; }
+ { $$.loc = @$; $$.insideLoc.end = @2.start; $$ = $1; }
;
instantiation_unnamed_error:
default_property_list:
default_property { $$ = MkList(); ListAdd($$, $1); ((MemberInit)$$->last).loc = @$; }
- | default_property_list ',' default_property { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
- | default_property_list_error ',' default_property { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ | default_property_list ',' default_property { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
+ | default_property_list_error ',' default_property { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
;
default_property_list_error:
default_property_error { $$ = MkList(); ListAdd($$, $1); ((MemberInit)$$->last).loc = @$; }
- | default_property_list ',' default_property_error { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
- | default_property_list_error ',' default_property_error { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); }
+ | default_property_list ',' default_property_error { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
+ | default_property_list_error ',' default_property_error { ((MemberInit)$1->last).loc.end = @3.start; ListAdd($1, $3); $$ = $1; }
| default_property_list error
;
{ $1.issetStmt = $3; }
| property_body WATCHABLE
{ $1.isWatchable = true; }
- | property_body PROPERTY_CATEGORY string_literal
+ | property_body PROPERTY_CATEGORY i18n_string
{ $1.category = $3; }
;
property:
- property_body '}' { $1.loc.end = @2.end; }
+ property_body '}' { $1.loc.end = @2.end; $$ = $1; }
;
class_property_start:
struct_declaration_list:
struct_declaration { $$ = MkList(); ListAdd($$, $1); }
- | struct_declaration_list struct_declaration { ListAdd($1, $2); }
- | struct_declaration_list_error struct_declaration { ListAdd($1, $2); }
+ | struct_declaration_list struct_declaration { $$ = $1; ListAdd($1, $2); }
+ | struct_declaration_list_error struct_declaration { $$ = $1; ListAdd($1, $2); }
;
struct_declaration_list_error:
struct_declaration_error { $$ = MkList(); ListAdd($$, $1); }
| struct_declaration_list error
| struct_declaration_list_error error
- | struct_declaration_list struct_declaration_error { ListAdd($$, $2); }
- | struct_declaration_list_error struct_declaration_error { ListAdd($$, $2); }
+ | struct_declaration_list struct_declaration_error { $$ = $1; ListAdd($$, $2); }
+ | struct_declaration_list_error struct_declaration_error { $$ = $1; ListAdd($$, $2); }
;
template_datatype:
template_parameters_list:
template_parameter { $$ = MkList(); ListAdd($$, $1); }
- | template_parameters_list ',' template_parameter { ListAdd($1, $3); }
+ | template_parameters_list ',' template_parameter { $$ = $1; ListAdd($1, $3); }
;
template_argument:
template_arguments_list:
template_argument { $$ = MkList(); ListAdd($$, $1); }
- | template_arguments_list ',' template_argument { ListAdd($1, $3); }
+ | template_arguments_list ',' template_argument { $$ = $1; ListAdd($1, $3); }
;
class_entry:
CLASS
{
- PushContext();
+ if(curContext != globalContext)
+ PopContext(curContext);
+ $$ = PushContext();
};
class_decl:
- class_entry identifier { $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ class_entry identifier { $1; $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
| class_entry base_strict_type
{
- $$ = DeclClass(globalContext.nextID++, $2.name);
+ $1; $$ = DeclClass(globalContext.nextID++, $2.name);
$$.nameLoc = @2;
FreeSpecifier($2);
++defaultMemberAccess;
memberAccessStack[defaultMemberAccess] = privateAccess;
}
- | identifier class_entry identifier { $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
- | identifier class_entry base_strict_type { $$ = DeclClass(globalContext.nextID++, $3.name); FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ | identifier class_entry identifier { $2; $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ | identifier class_entry base_strict_type { $2; $$ = DeclClass(globalContext.nextID++, $3.name); FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
- | class_entry identifier '<' template_parameters_list '>' { $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); $$.templateParams = $4; FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ | class_entry identifier '<' template_parameters_list '>' { $1; $$ = DeclClassAddNameSpace(globalContext.nextID++, $2.string); $$.templateParams = $4; FreeIdentifier($2); $$.nameLoc = @2; memberAccessStack[++defaultMemberAccess] = privateAccess; }
| class_entry base_strict_type '<' template_parameters_list '>'
{
- $$ = DeclClass(globalContext.nextID++, $2.name);
+ $1; $$ = DeclClass(globalContext.nextID++, $2.name);
$$.templateParams = $4;
$$.nameLoc = @2;
FreeSpecifier($2);
++defaultMemberAccess;
memberAccessStack[defaultMemberAccess] = privateAccess;
}
- | identifier class_entry identifier '<' template_parameters_list '>' { $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); $$.templateParams = $5; FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
- | identifier class_entry base_strict_type '<' template_parameters_list '>' { $$ = DeclClass(globalContext.nextID++, $3.name); $$.templateParams = $5; FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ | identifier class_entry identifier '<' template_parameters_list '>' { $2; $$ = DeclClassAddNameSpace(globalContext.nextID++, $3.string); $$.templateParams = $5; FreeIdentifier($1); FreeIdentifier($3); $$.nameLoc = @3; $$.isRemote = true; memberAccessStack[++defaultMemberAccess] = privateAccess; }
+ | identifier class_entry base_strict_type '<' template_parameters_list '>' { $2; $$ = DeclClass(globalContext.nextID++, $3.name); $$.templateParams = $5; FreeIdentifier($1); $$.nameLoc = @3; $$.isRemote = true; FreeSpecifier($3); memberAccessStack[++defaultMemberAccess] = privateAccess; }
;
class:
class_error '}'
{
$$.loc = @$;
+ $$ = $1;
}
// Added this for unit classes...
| class_entry identifier ';'
{
- $$ = MkClass(DeclClassAddNameSpace(0, $2.string), null, null); FreeIdentifier($2);
+ $1; $$ = MkClass(DeclClassAddNameSpace(0, $2.string), null, null); FreeIdentifier($2);
POP_DEFAULT_ACCESS
PopContext(curContext);
}
| class_entry type ';'
{
- $$ = MkClass(DeclClass(0, $2.name), null, null); FreeSpecifier($2);
+ $1; $$ = MkClass(DeclClass(0, $2.name), null, null); FreeSpecifier($2);
POP_DEFAULT_ACCESS
PopContext(curContext);
}
{ $$ = MkExpBrackets($2); $$.loc = @$; }
;
+i18n_string:
+ string_literal { $$ = MkExpString($1); delete $1; $$.loc = @$; }
+ | '$' string_literal { $$ = MkExpIntlString($2, null); delete $2; $$.loc = @$; }
+ | '$' string_literal '.' string_literal { $$ = MkExpIntlString($4, $2); delete $2; delete $4; $$.loc = @$; }
+ ;
+
simple_primary_expression:
identifier { $$ = MkExpIdentifier($1); $$.loc = @$; }
| instantiation_unnamed { $$ = MkExpInstance($1); $$.loc = @$; }
| EXTENSION '(' type_name ')' initializer { $$ = MkExpExtensionInitializer($3, $5); $$.loc = @$; }
| EXTENSION '(' type_name ')' '(' type_name ')' initializer { $$ = MkExpExtensionInitializer($3, MkInitializerAssignment(MkExpExtensionInitializer($6, $8))); $$.loc = @$; }
| CONSTANT { $$ = MkExpConstant(yytext); $$.loc = @$; }
- | string_literal { $$ = MkExpString($1); delete $1; $$.loc = @$; }
+ | i18n_string
| '(' ')' { Expression exp = MkExpDummy(); exp.loc.start = @1.end; exp.loc.end = @2.start; $$ = MkExpBrackets(MkListOne(exp)); $$.loc = @$; yyerror(); }
| NEWOP new_specifiers abstract_declarator_noarray '[' constant_expression ']' { $$ = MkExpNew(MkTypeName($2,$3), $5); $$.loc = @$; }
| NEWOP new_specifiers abstract_declarator_noarray '[' constant_expression_error ']' { $$ = MkExpNew(MkTypeName($2,$3), $5); $$.loc = @$; }
argument_expression_list:
assignment_expression { $$ = MkList(); ListAdd($$, $1); }
| anon_instantiation_expression { $$ = MkList(); ListAdd($$, $1); }
- | argument_expression_list ',' assignment_expression { ListAdd($1, $3); }
- | argument_expression_list ',' anon_instantiation_expression { ListAdd($1, $3); }
+ | argument_expression_list ',' assignment_expression { $$ = $1; ListAdd($1, $3); }
+ | argument_expression_list ',' anon_instantiation_expression { $$ = $1; ListAdd($1, $3); }
;
argument_expression_list_error:
assignment_expression_error { $$ = MkList(); ListAdd($$, $1); }
| anon_instantiation_expression_error { $$ = MkList(); ListAdd($$, $1); }
- | argument_expression_list ',' assignment_expression_error { ListAdd($1, $3); }
- | argument_expression_list ',' anon_instantiation_expression_error { ListAdd($1, $3); }
- | argument_expression_list ',' { Expression exp = MkExpDummy(); exp.loc.start = @2.end; exp.loc.end = @2.end; ListAdd($1, exp); }
+ | argument_expression_list ',' assignment_expression_error { $$ = $1; ListAdd($1, $3); }
+ | argument_expression_list ',' anon_instantiation_expression_error { $$ = $1; ListAdd($1, $3); }
+ | argument_expression_list ',' { Expression exp = MkExpDummy(); exp.loc.start = @2.end; exp.loc.end = @2.end; $$ = $1; ListAdd($1, exp); }
;
common_unary_expression:
| SIZEOF '(' guess_type_name ')' { $$ = MkExpTypeSize($3); $$.loc = @$; }
| SIZEOF '(' CLASS type ')' { $$ = MkExpClassSize($4); $$.loc = @$; }
| SIZEOF '(' CLASS guess_type ')' { $$ = MkExpClassSize($4); $$.loc = @$; }
+
+ | ALIGNOF '(' unary_expression ')' { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+ | ALIGNOF simple_unary_expression { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
+ | ALIGNOF '(' guess_type_name ')' { $$ = MkExpTypeAlign($3); $$.loc = @$; }
;
unary_expression:
expression:
assignment_expression { $$ = MkList(); ListAdd($$, $1); }
- | expression ',' assignment_expression { ListAdd($1, $3); }
- | expression_error ',' assignment_expression { ListAdd($1, $3); }
+ | expression ',' assignment_expression { $$ = $1; ListAdd($1, $3); }
+ | expression_error ',' assignment_expression { $$ = $1; ListAdd($1, $3); }
| expression_error ')'
;
expression_anon_inst:
anon_instantiation_expression { $$ = MkList(); ListAdd($$, $1); }
- | expression ',' anon_instantiation_expression { ListAdd($1, $3); }
- | expression_error ',' anon_instantiation_expression { ListAdd($1, $3); }
+ | expression ',' anon_instantiation_expression { $$ = $1; ListAdd($1, $3); }
+ | expression_error ',' anon_instantiation_expression { $$ = $1; ListAdd($1, $3); }
;
postfix_expression_error:
| postfix_expression '(' argument_expression_list { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;}
| postfix_expression '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;}
+ /* Useless rules due to conflicts
| postfix_expression '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end;$$.loc = @$; $$.call.argLoc.end.charPos++;}
- | postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; /*@2.end; $$.call.argLoc.end.charPos++;*/ }
+ | postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; }
+ */
| postfix_expression '.' error { $$ = MkExpMember($1, null); $$.loc = @$; }
| postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;}
+ /* Useless rules due to conflicts
| postfix_expression_error '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end; $$.call.argLoc.end.charPos++;}
| postfix_expression_error '(' error { $$ = MkExpCall($1, MkList() ); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @2.end; $$.call.argLoc.end.charPos++;}
+ */
| postfix_expression_error '.' error { $$ = MkExpMember($1, null); $$.loc = @$; }
;
| simple_postfix_expression '(' argument_expression_list { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;}
| simple_postfix_expression '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.loc = @$; $$.call.argLoc.end.charPos++;}
+ /* Useless rules due to conflicts
| simple_postfix_expression '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end;$$.loc = @$; $$.call.argLoc.end.charPos++;}
- | simple_postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; /*@2.end; $$.call.argLoc.end.charPos++;*/ }
+ | simple_postfix_expression '(' error { $$ = MkExpCall($1, MkList() ); @$.end = yylloc.start; $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = yylloc.start; }
+ */
| simple_postfix_expression '.' error { $$ = MkExpMember($1, null); $$.loc = @$; }
- | simple_postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;}
+ | simple_postfix_expression_error '(' argument_expression_list_error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @3.end; $$.call.argLoc.end.charPos++;}
+ /* Useless rules due to conflicts
| simple_postfix_expression_error '(' argument_expression_list ',' error { $$ = MkExpCall($1, $3); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @4.end; $$.call.argLoc.end.charPos++;}
| simple_postfix_expression_error '(' error { $$ = MkExpCall($1, MkList() ); $$.loc = @$; $$.call.argLoc.start = @2.start; $$.call.argLoc.end = @2.end; $$.call.argLoc.end.charPos++;}
+ */
| simple_postfix_expression_error '.' error { $$ = MkExpMember($1, null); $$.loc = @$; }
;
| SIZEOF '(' guess_type_name ')' error { $$ = MkExpTypeSize($3); $$.loc = @$; }
| SIZEOF '(' CLASS type ')' error { $$ = MkExpClassSize($4); $$.loc = @$; }
| SIZEOF '(' CLASS guess_type ')' error { $$ = MkExpClassSize($4); $$.loc = @$; }
+ | ALIGNOF '(' unary_expression_error { $$ = MkExpOp(null, ALIGNOF, $3); $$.loc = @$; }
+ | ALIGNOF simple_unary_expression_error { $$ = MkExpOp(null, ALIGNOF, $2); $$.loc = @$; }
+ | ALIGNOF '(' guess_type_name ')' error { $$ = MkExpTypeAlign($3); $$.loc = @$; }
;
unary_expression_error:
additive_expression_error:
multiplicative_expression_error
| additive_expression '+' multiplicative_expression_error { $$ = MkExpOp($1, '+', $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| additive_expression '+' error { $$ = MkExpOp($1, '+', null); $$.loc = @$; }
+ */
| additive_expression '-' multiplicative_expression_error { $$ = MkExpOp($1, '-', $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| additive_expression '-' error { $$ = MkExpOp($1, '-', null); $$.loc = @$; }
+ */
| additive_expression_error '+' multiplicative_expression_error { $$ = MkExpOp($1, '+', $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| additive_expression_error '+' error { $$ = MkExpOp($1, '+', null); $$.loc = @$; }
+ */
| additive_expression_error '-' multiplicative_expression_error { $$ = MkExpOp($1, '-', $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| additive_expression_error '-' error { $$ = MkExpOp($1, '-', null); $$.loc = @$; }
+ */
;
shift_expression_error:
skipErrors = false;
FreeExpression($1);
+ FreeExpression($2);
fileInput.Seek(@1.start.pos, start);
resetScannerPos(&@1.start);
yyclearin;
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
/*
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
- YYPOPSTACK;
+ YYPOPSTACK(1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
*/
| equality_expression NE_OP relational_expression_error { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
| equality_expression_error EQ_OP relational_expression_error { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
| equality_expression_error NE_OP relational_expression_error { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
-
+ /* Useless rules due to conflicts
| equality_expression EQ_OP error { $$ = MkExpOp($1, EQ_OP, MkExpDummy()); $$.loc = @$; }
| equality_expression NE_OP error { $$ = MkExpOp($1, NE_OP, MkExpDummy()); $$.loc = @$; }
| equality_expression_error EQ_OP error { $$ = MkExpOp($1, EQ_OP, MkExpDummy()); $$.loc = @$; }
| equality_expression_error NE_OP error { $$ = MkExpOp($1, NE_OP, MkExpDummy()); $$.loc = @$; }
-
+ */
| equality_expression EQ_OP anon_instantiation_expression_error { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
| equality_expression NE_OP anon_instantiation_expression_error { $$ = MkExpOp($1, NE_OP, $3); $$.loc = @$; }
| equality_expression_error EQ_OP anon_instantiation_expression_error { $$ = MkExpOp($1, EQ_OP, $3); $$.loc = @$; }
assignment_expression_error:
conditional_expression_error
| unary_expression assignment_operator assignment_expression_error { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| unary_expression assignment_operator error { $$ = MkExpOp($1, $2, MkExpDummy()); $$.loc = @$; $$.op.exp2.loc = @2; }
+ */
| unary_expression_error assignment_operator assignment_expression_error { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
+ /* Useless rules due to conflicts
| unary_expression_error assignment_operator error { $$ = MkExpOp($1, $2, MkExpDummy()); $$.loc = @$; $$.op.exp2.loc = @2; }
+ */
| unary_expression assignment_operator anon_instantiation_expression_error { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
| unary_expression_error assignment_operator anon_instantiation_expression_error { $$ = MkExpOp($1, $2, $3); $$.loc = @$; }
expression_error:
assignment_expression_error { $$ = MkList(); ListAdd($$, $1); }
| assignment_expression error { $$ = MkList(); ListAdd($$, $1); }
- | expression ',' assignment_expression_error { ListAdd($1, $3); }
- | expression_error ',' assignment_expression_error { ListAdd($1, $3); }
+ | expression ',' assignment_expression_error { $$ = $1; ListAdd($1, $3); }
+ | expression_error ',' assignment_expression_error { $$ = $1; ListAdd($1, $3); }
+ /* Useless rules due to conflicts
| expression ',' error
| expression_error ',' error
| expression error
- | expression expression
- | expression_error expression
- | expression expression_error
+ */
+ | expression expression { $$ = $1; FreeList($2, FreeExpression); }
+ | expression_error expression { $$ = $1; FreeList($2, FreeExpression); }
+ | expression expression_error { $$ = $1; FreeList($2, FreeExpression); }
;
expression_anon_inst_error:
anon_instantiation_expression_error { $$ = MkList(); ListAdd($$, $1); }
| anon_instantiation_expression error { $$ = MkList(); ListAdd($$, $1); }
- | expression ',' anon_instantiation_expression_error { ListAdd($1, $3); }
- | expression_error ',' anon_instantiation_expression_error { ListAdd($1, $3); }
+ | expression ',' anon_instantiation_expression_error { $$ = $1; ListAdd($1, $3); }
+ | expression_error ',' anon_instantiation_expression_error { $$ = $1; ListAdd($1, $3); }
;
enumerator_list:
enumerator { $$ = MkList(); ListAdd($$, $1); }
- | enumerator_list ',' enumerator { ListAdd($1, $3); }
+ | enumerator_list ',' enumerator { $$ = $1; ListAdd($1, $3); }
| enumerator_list ','
;
;
enum_specifier_compound:
- enum_specifier_compound_error '}' { $$.loc = @$; POP_DEFAULT_ACCESS }
+ enum_specifier_compound_error '}' { $$.loc = @$; POP_DEFAULT_ACCESS $$ = $1; }
| enum_specifier identifier '{' '}' { $$ = MkEnum($2, null); $$.loc = @$; POP_DEFAULT_ACCESS }
| enum_specifier strict_type '{' '}' { $$ = MkEnum(MkIdentifier($2.name), null); FreeSpecifier($2); $$.loc = @$; POP_DEFAULT_ACCESS }
;
;
enum_class:
- enum_class_error '}' { $$.loc = @$; }
+ enum_class_error '}' { $$ = $1; $$.loc = @$; }
| enum_decl ':' inheritance_specifiers '{' '}' { $$ = MkEnum($1, null); $$.baseSpecs = $3; $$.loc = @$; POP_DEFAULT_ACCESS }
| enum_decl '{' '}' { $$ = MkEnum($1, null); POP_DEFAULT_ACCESS }
;
;
ext_storage:
- EXT_STORAGE { $$ = MkSpecifierExtended(yytext); }
- | ext_decl { $$ = MkSpecifierExtended($1); delete $1; }
+ EXT_STORAGE { $$ = MkSpecifierExtended(MkExtDeclString(CopyString(yytext))); }
+ | ext_decl { $$ = MkSpecifierExtended($1); }
;
type_qualifier:
type_qualifier_list:
type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | type_qualifier_list type_qualifier { ListAdd($1, $2); }
+ | type_qualifier_list type_qualifier { $$ = $1; ListAdd($1, $2); }
;
type_specifier:
// TESTING declarator_nofunction here... For function declarations
struct_declarator:
- declarator_nofunction
+ declarator_nofunction_type_ok
{ $$ = MkStructDeclarator($1, null); $$.loc = @$; }
- | declarator_nofunction ext_attrib
+ | declarator_nofunction_type_ok attrib
{ $$ = MkStructDeclarator($1, null); $$.structDecl.attrib = $2; $$.loc = @$; }
| ':' constant_expression
{ $$ = MkStructDeclarator(null, $2); $$.loc = @$; }
- | declarator_nofunction ':' constant_expression
+ | declarator_nofunction_type_ok ':' constant_expression
{ $$ = MkStructDeclarator($1, $3); $$.loc = @$; }
- | declarator_nofunction ':' constant_expression ':' constant_expression
+ | declarator_nofunction_type_ok ':' constant_expression ':' constant_expression
{ $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
| ':' constant_expression_error
{ $$ = MkStructDeclarator(null, $2); $$.loc = @$; }
- | declarator_nofunction ':' constant_expression_error
+ | declarator_nofunction_type_ok ':' constant_expression_error
{ $$ = MkStructDeclarator($1, $3); $$.loc = @$; }
- | declarator_nofunction ':' constant_expression ':' constant_expression_error
+ | declarator_nofunction_type_ok ':' constant_expression ':' constant_expression_error
{ $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
- | declarator_nofunction ':' constant_expression_error ':' constant_expression_error
+ | declarator_nofunction_type_ok ':' constant_expression_error ':' constant_expression_error
{ $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
- | declarator_nofunction ':' constant_expression_error ':' constant_expression
+ | declarator_nofunction_type_ok ':' constant_expression_error ':' constant_expression
{ $$ = MkStructDeclarator($1, $3); $$.structDecl.posExp = $5; $$.loc = @$; }
;
struct_declarator_list:
struct_declarator { $$ = MkList(); ListAdd($$, $1); }
- | struct_declarator_list ',' struct_declarator { ListAdd($1, $3); }
+ | struct_declarator_list ',' struct_declarator { $$ = $1; ListAdd($1, $3); }
;
struct_entry:
$$.ctx = PushContext();
FreeSpecifier($2);
}
+ | struct_or_union ext_decl identifier
+ {
+ $$ = MkStructOrUnion($1, $3, null);
+ $$.extDeclStruct = $2;
+ $$.addNameSpace = true;
+ $$.ctx = PushContext();
+ }
+ | struct_or_union ext_decl base_strict_type
+ {
+ $$ = MkStructOrUnion($1, MkIdentifier($3.name), null);
+ $$.extDeclStruct = $2;
+ $$.ctx = PushContext();
+ FreeSpecifier($3);
+ }
;
struct_or_union_specifier_compound:
- struct_or_union_specifier_compound_error '}' { $$.loc = @$; }
+ struct_or_union_specifier_compound_error '}' { $$ = $1; $$.loc = @$; }
| struct_entry '{' '}' { $$ = $1; $$.loc = @$; POP_DEFAULT_ACCESS PopContext(curContext); }
| struct_or_union '{' '}' { $$ = MkStructOrUnion($1, null, null); $$.loc = @$; POP_DEFAULT_ACCESS }
+ | struct_or_union ext_decl '{' '}' { $$ = MkStructOrUnion($1, null, null); $$.extDeclStruct = $2; $$.loc = @$; POP_DEFAULT_ACCESS }
;
struct_or_union_specifier_compound_error:
| struct_or_union '{' struct_declaration_list { $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS }
| struct_or_union '{' struct_declaration_list_error { $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS }
| struct_or_union '{' error { $$ = MkStructOrUnion($1, null, null); POP_DEFAULT_ACCESS }
+
+ | struct_or_union ext_decl '{' struct_declaration_list { $$ = MkStructOrUnion($1, null, $4); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
+ | struct_or_union ext_decl '{' struct_declaration_list_error { $$ = MkStructOrUnion($1, null, $4); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
+ | struct_or_union ext_decl '{' error { $$ = MkStructOrUnion($1, null, null); $$.extDeclStruct = $2; POP_DEFAULT_ACCESS }
;
struct_or_union_specifier_nocompound:
;
struct_class:
- struct_class_error '}' { $$.loc = @$; }
+ struct_class_error '}' { $$ = $1; $$.loc = @$; }
| struct_head '{' '}'
{ $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
- | struct_decl '{' '}' { POP_DEFAULT_ACCESS PopContext(curContext); }
+ | struct_decl '{' '}' { $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
| struct_or_union '{' '}' { $$ = MkStructOrUnion($1, null, null); POP_DEFAULT_ACCESS }
;
POP_DEFAULT_ACCESS
}
| struct_decl '{' error
- { POP_DEFAULT_ACCESS PopContext(curContext); }
+ { $$ = $1; POP_DEFAULT_ACCESS PopContext(curContext); }
| struct_or_union '{' struct_declaration_list
{ $$ = MkStructOrUnion($1, null, $3); POP_DEFAULT_ACCESS }
specifier_qualifier_list:
type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | specifier_qualifier_list type_qualifier { ListAdd($1, $2); }
+ | specifier_qualifier_list type_qualifier { $$ = $1; ListAdd($1, $2); }
| type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | specifier_qualifier_list type_specifier { ListAdd($1, $2); }
+ | specifier_qualifier_list type_specifier { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | specifier_qualifier_list enum_specifier_compound { ListAdd($1, $2); }
+ | specifier_qualifier_list enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | specifier_qualifier_list struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | specifier_qualifier_list struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
;
guess_specifier_qualifier_list:
type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | guess_specifier_qualifier_list type_qualifier { ListAdd($1, $2); }
+ | guess_specifier_qualifier_list type_qualifier { $$ = $1; ListAdd($1, $2); }
| type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | guess_specifier_qualifier_list type_specifier { ListAdd($1, $2); }
+ | guess_specifier_qualifier_list type_specifier { $$ = $1; ListAdd($1, $2); }
| guess_type { $$ = MkList(); ListAdd($$, $1); }
- | guess_specifier_qualifier_list guess_type { ListAdd($1, $2); }
+ | guess_specifier_qualifier_list guess_type { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | guess_specifier_qualifier_list enum_specifier_compound { ListAdd($1, $2); }
+ | guess_specifier_qualifier_list enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | guess_specifier_qualifier_list struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | guess_specifier_qualifier_list struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
;
declaration_specifiers:
storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | declaration_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | declaration_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | declaration_specifiers type_qualifier { ListAdd($1, $2); }
+ | declaration_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| strict_type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | declaration_specifiers strict_type_specifier { ListAdd($1, $2); }
+ | declaration_specifiers strict_type_specifier { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | declaration_specifiers enum_specifier_compound { ListAdd($1, $2); }
+ | declaration_specifiers enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | declaration_specifiers struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | declaration_specifiers struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
;
guess_declaration_specifiers:
storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | guess_declaration_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers type_qualifier { ListAdd($1, $2); }
+ | guess_declaration_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers type_specifier { ListAdd($1, $2); }
+ | guess_declaration_specifiers type_specifier { $$ = $1; ListAdd($1, $2); }
| guess_type { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers guess_type { ListAdd($1, $2); }
+ | guess_declaration_specifiers guess_type { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | guess_declaration_specifiers struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | guess_declaration_specifiers enum_specifier_compound { ListAdd($1, $2); }
+ | guess_declaration_specifiers enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
;
external_guess_declaration_specifiers:
external_storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers external_storage_class_specifier { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers external_storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers type_qualifier { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers type_specifier { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers type_specifier { $$ = $1; ListAdd($1, $2); }
| guess_type { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers guess_type { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers guess_type { $$ = $1; ListAdd($1, $2); }
| class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers class_specifier { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers class_specifier { $$ = $1; ListAdd($1, $2); }
;
external_guess_declaration_specifiers_error:
class_specifier_error { $$ = MkList(); ListAdd($$, $1); }
- | external_guess_declaration_specifiers class_specifier_error { ListAdd($1, $2); }
+ | external_guess_declaration_specifiers class_specifier_error { $$ = $1; ListAdd($1, $2); }
;
_inheritance_specifiers:
PRIVATE { $$ = MkList(); ListAdd($$, MkSpecifier(PRIVATE)); }
| PUBLIC { $$ = MkList(); ListAdd($$, MkSpecifier(PUBLIC)); }
| storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | _inheritance_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | _inheritance_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | _inheritance_specifiers type_qualifier { ListAdd($1, $2); }
+ | _inheritance_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| strict_type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | _inheritance_specifiers strict_type_specifier { ListAdd($1, $2); }
+ | _inheritance_specifiers strict_type_specifier { $$ = $1; ListAdd($1, $2); }
| identifier
{ _DeclClass(0, $1.string); $$ = MkListOne(MkSpecifierName($1.string)); FreeIdentifier($1); }
- | _inheritance_specifiers identifier { _DeclClass(0, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
+ | _inheritance_specifiers identifier { $$ = $1; _DeclClass(0, $2.string); ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2); }
| identifier '<' template_arguments_list '>'
{
}
| _inheritance_specifiers identifier '<' template_arguments_list '>'
{
+ $$ = $1;
if($2._class && !$2._class.name)
{
char name[1024];
property_specifiers:
storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | property_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | property_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | property_specifiers type_qualifier { ListAdd($1, $2); }
+ | property_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| strict_type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | property_specifiers strict_type_specifier { ListAdd($1, $2); }
+ | property_specifiers strict_type_specifier { $$ = $1; ListAdd($1, $2); }
| identifier { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
- | property_specifiers identifier { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+ | property_specifiers identifier { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
| identifier '<' template_arguments_list '>'
{
// if($1._class && !$1._class.name)
renew_specifiers:
storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | renew_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | renew_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | renew_specifiers type_qualifier { ListAdd($1, $2); }
+ | renew_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| strict_type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | renew_specifiers strict_type_specifier { ListAdd($1, $2); }
+ | renew_specifiers strict_type_specifier { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | renew_specifiers struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | renew_specifiers struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | renew_specifiers enum_specifier_compound { ListAdd($1, $2); }
+ | renew_specifiers enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
| identifier { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
- | renew_specifiers identifier { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+ | renew_specifiers identifier { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
| identifier '<' template_arguments_list '>'
{
// if($1._class && !$1._class.name)
new_specifiers:
storage_class_specifier { $$ = MkList(); ListAdd($$, $1); }
- | new_specifiers storage_class_specifier { ListAdd($1, $2); }
+ | new_specifiers storage_class_specifier { $$ = $1; ListAdd($1, $2); }
| type_qualifier { $$ = MkList(); ListAdd($$, $1); }
- | new_specifiers type_qualifier { ListAdd($1, $2); }
+ | new_specifiers type_qualifier { $$ = $1; ListAdd($1, $2); }
| strict_type_specifier { $$ = MkList(); ListAdd($$, $1); }
- | new_specifiers strict_type_specifier { ListAdd($1, $2); }
+ | new_specifiers strict_type_specifier { $$ = $1; ListAdd($1, $2); }
| struct_or_union_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | new_specifiers struct_or_union_specifier_compound { ListAdd($1, $2); }
+ | new_specifiers struct_or_union_specifier_compound { $$ = $1; ListAdd($1, $2); }
| enum_specifier_compound { $$ = MkList(); ListAdd($$, $1); }
- | new_specifiers enum_specifier_compound { ListAdd($1, $2); }
+ | new_specifiers enum_specifier_compound { $$ = $1; ListAdd($1, $2); }
| identifier { $$ = MkList(); ListAdd($$, MkSpecifierName($1.string)); FreeIdentifier($1)}
- | new_specifiers identifier { ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
+ | new_specifiers identifier { $$ = $1; ListAdd($1, MkSpecifierName($2.string)); FreeIdentifier($2)}
| identifier '<' template_arguments_list '>'
{
// if($1._class && !$1._class.name)
;
identifier_list_error:
- identifier_list ',' error { ListAdd($1, null); }
- | identifier_list_error ',' error { ListAdd($1, null); }
+ identifier_list ',' error { $$ = $1; ListAdd($1, null); }
+ | identifier_list_error ',' error { $$ = $1; ListAdd($1, null); }
;
identifier_list:
identifier { $$ = MkList(); ListAdd($$, MkTypeName(null, MkDeclaratorIdentifier($1))); }
- | identifier_list ',' identifier { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
- | identifier_list_error ',' identifier { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
- | parameter_list ',' identifier { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
- | parameter_list_error ',' identifier { ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+ | identifier_list ',' identifier { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+ | identifier_list_error ',' identifier { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+ | parameter_list ',' identifier { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
+ | parameter_list_error ',' identifier { $$ = $1; ListAdd($1, MkTypeName(null, MkDeclaratorIdentifier($3))); }
;
+/*
+tricky_declarator:
+ base_strict_type
+ {
+ $$ = MkDeclaratorIdentifier(MkIdentifier($1.name));
+ FreeSpecifier($1);
+ }
+ ;
+*/
+direct_declarator_nofunction_type_ok:
+ direct_declarator_nofunction
+ | base_strict_type
+ {
+ char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+ String s = colon ? colon + 2 : $1.name;
+ FreeSpecifier($1);
+ $$ = MkDeclaratorIdentifier(MkIdentifier(s));
+ }
+ | UINT { $$ = MkDeclaratorIdentifier(MkIdentifier("uint")); }
+ | base_strict_type '[' constant_expression ']'
+ {
+ Declarator decl;
+ char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+ String s = colon ? colon + 2 : $1.name;
+ decl = MkDeclaratorIdentifier(MkIdentifier(s));
+ FreeSpecifier($1);
+ $$ = MkDeclaratorArray(decl, $3);
+ }
+ | base_strict_type '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
+ | base_strict_type '[' type ']' { $$ = MkDeclaratorEnumArray($1, $3); }
+ | base_strict_type '[' ']' { $$ = MkDeclaratorArray($1, null); }
+
+ | direct_declarator_nofunction_type_ok '[' constant_expression ']' { $$ = MkDeclaratorArray($1, $3); }
+ | direct_declarator_nofunction_type_ok '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
+ | direct_declarator_nofunction_type_ok '[' type ']' { $$ = MkDeclaratorEnumArray($1, $3); }
+ | direct_declarator_nofunction_type_ok '[' ']' { $$ = MkDeclaratorArray($1, null); }
+ ;
+
direct_declarator_nofunction:
identifier { $$ = MkDeclaratorIdentifier($1); }
| '(' declarator ')' { $$ = MkDeclaratorBrackets($2); }
+ | '(' ext_decl declarator ')' { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+ | '(' declarator_type_ok ')' { $$ = MkDeclaratorBrackets($2); }
+ | '(' ext_decl declarator_type_ok ')' { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
| direct_declarator_nofunction '[' constant_expression ']' { $$ = MkDeclaratorArray($1, $3); }
| direct_declarator_nofunction '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
| direct_declarator_nofunction '[' type ']' { $$ = MkDeclaratorEnumArray($1, $3); }
// Tricky stuff here for overriding...
direct_declarator_function_error:
- direct_declarator_function_start identifier_list_error
- {
- $$ = MkDeclaratorFunction($1, null);
+ direct_declarator_function_start identifier_list_error
+ {
+ $$ = MkDeclaratorFunction($1, $2);
fileInput.Seek(@1.end.pos, start);
yyclearin;
resetScannerPos(&@1.end);
}
| direct_declarator_function_start parameter_list '('
{
- $$ = MkDeclaratorFunction($1, null);
+ $$ = MkDeclaratorFunction($1, $2);
fileInput.Seek(@1.end.pos, start);
yyclearin;
resetScannerPos(&@1.end);
resetScannerPos(&@1.end);
@$.start = @1.start;
@$.end = @1.end;
+ FreeList($2, FreeSpecifier);
FreeIdentifier($3);
}
;
direct_declarator:
direct_declarator_function
| direct_declarator_nofunction
+/*
| ext_decl direct_declarator_function
{ $$ = MkDeclaratorExtended($1, $2); }
| ext_decl direct_declarator_nofunction
{ $$ = MkDeclaratorExtended($1, $2); }
+*/
;
+
+direct_declarator_function_start_type_ok:
+ direct_declarator_nofunction_type_ok '('
+ ;
+
+direct_declarator_function_type_ok:
+ direct_declarator_function_start_type_ok parameter_type_list ')' { $$ = MkDeclaratorFunction($1, $2); }
+ | direct_declarator_function_start_type_ok parameter_type_list_error ')' { $$ = MkDeclaratorFunction($1, $2); }
+ | direct_declarator_function_start_type_ok identifier_list ')' { $$ = MkDeclaratorFunction($1, $2); }
+ | direct_declarator_function_start_type_ok identifier_list_error ')' { $$ = MkDeclaratorFunction($1, $2); }
+ | direct_declarator_function_start_type_ok ')' { $$ = MkDeclaratorFunction($1, null); }
+ ;
+
+// Tricky stuff here for overriding...
+direct_declarator_function_error_type_ok:
+ direct_declarator_function_start_type_ok identifier_list_error
+ {
+ $$ = MkDeclaratorFunction($1, $2);
+ fileInput.Seek(@1.end.pos, start);
+ yyclearin;
+ resetScannerPos(&@1.end);
+ @$.start = @1.start;
+ @$.end = @1.end;
+ }
+ | direct_declarator_function_start_type_ok error
+ {
+ $$ = MkDeclaratorFunction($1, null);
+ fileInput.Seek(@1.end.pos, start);
+ yyclearin;
+ resetScannerPos(&@1.end);
+ @$.start = @1.start;
+ @$.end = @1.end;
+ }
+ | direct_declarator_function_start_type_ok parameter_list '('
+ {
+ $$ = MkDeclaratorFunction($1, $2);
+ fileInput.Seek(@1.end.pos, start);
+ yyclearin;
+ resetScannerPos(&@1.end);
+ @$.start = @1.start;
+ @$.end = @1.end;
+ }
+ | direct_declarator_function_start_type_ok guess_declaration_specifiers identifier '('
+ {
+ $$ = MkDeclaratorFunction($1, null);
+ fileInput.Seek(@1.end.pos, start);
+ yyclearin;
+ resetScannerPos(&@1.end);
+ @$.start = @1.start;
+ @$.end = @1.end;
+ FreeList($2, FreeSpecifier);
+ FreeIdentifier($3);
+ }
+ ;
+
+direct_declarator_type_ok:
+ direct_declarator_function_type_ok
+ | direct_declarator_nofunction_type_ok
+/*
+ | ext_decl direct_declarator_function_type_ok
+ { $$ = MkDeclaratorExtended($1, $2); }
+ | ext_decl direct_declarator_nofunction_type_ok
+ { $$ = MkDeclaratorExtended($1, $2); }
+*/
+ ;
/*
asm_start:
ASM '(' STRING_LITERAL { $<string>$ = CopyString(yytext); } STRING_LITERAL { $<string>$ = CopyString(yytext); }
;
ext_decl:
- EXT_DECL { $$ = CopyString(yytext); }
- | ext_attrib
+ EXT_DECL { $$ = MkExtDeclString(CopyString(yytext)); }
+ | attrib { $$ = MkExtDeclAttrib($1);
| asm_start ')'
{
char temp[1024];
strcpy(temp, $<string>1);
strcat(temp, ")");
delete $<string>1;
- $$ = CopyString(temp);
+ $$ = MkExtDeclString(CopyString(temp));
}
| asm_start STRING_LITERAL { $$ = CopyString(yytext); } ')'
{
strcat(temp, ")");
delete $<string>1;
delete $<string>3;
- $$ = CopyString(temp);
+ $$ = MkExtDeclString(CopyString(temp));
}
;
*/
ext_decl:
- EXT_DECL { $$ = CopyString(yytext); }
- | ext_attrib
+ EXT_DECL { $$ = MkExtDeclString(CopyString(yytext)); }
+ | attrib { $$ = MkExtDeclAttrib($1); }
| ASM '(' string_literal ')'
{
char temp[1024];
strcpy(temp, "__asm__(");
strcat(temp, $3);
strcat(temp, ")");
- $$ = CopyString(temp);
+ $$ = MkExtDeclString(CopyString(temp));
delete $3;
}
;
-ext_attrib:
- EXT_ATTRIB { $$ = CopyString(yytext); }
+_attrib:
+ ATTRIB { $<i>$ = ATTRIB; }
+ | ATTRIB_DEP { $<i>$ = ATTRIB_DEP; }
+ | __ATTRIB { $<i>$ = __ATTRIB; }
+ ;
+
+
+attribute_word:
+ IDENTIFIER { $$ = CopyString(yytext); }
+ | TYPE_NAME { $$ = CopyString(yytext); }
+ | EXT_STORAGE { $$ = CopyString(yytext); }
+ | EXT_DECL { $$ = CopyString(yytext); }
+ | CONST { $$ = CopyString(yytext); }
+ ;
+
+attribute:
+ attribute_word { $$ = MkAttribute($1, null); $$.loc = @$; }
+ | attribute_word '(' expression ')' { $$ = MkAttribute($1, MkExpBrackets($3)); $$.loc = @$; }
+ ;
+
+attribs_list:
+ attribute { $$ = MkListOne($1); }
+ | attribs_list attribute { ListAdd($1, $2); $$ = $1; }
+ | attribs_list ',' attribute { ListAdd($1, $3); $$ = $1; }
+ ;
+
+attrib:
+ _attrib '(' '(' attribs_list ')' ')' { $$ = MkAttrib($<i>1, $4); $$.loc = @$; }
+ | _attrib '(' '(' ')' ')' { $$ = MkAttrib($<i>1, null); $$.loc = @$; }
;
-
direct_abstract_declarator:
- '(' abstract_declarator ')'
- { $$ = MkDeclaratorBrackets($2); }
- | '[' ']'
- { $$ = MkDeclaratorArray(null, null); }
- | '[' constant_expression ']'
- { $$ = MkDeclaratorArray(null, $2); }
- | '[' constant_expression_error ']'
- { $$ = MkDeclaratorArray(null, $2); }
- | '[' type ']'
- { $$ = MkDeclaratorEnumArray(null, $2); }
- | direct_abstract_declarator '[' ']'
- { $$ = MkDeclaratorArray($1, null); }
- | direct_abstract_declarator '[' constant_expression ']'
- { $$ = MkDeclaratorArray($1, $3); }
- | direct_abstract_declarator '[' type']'
- { $$ = MkDeclaratorEnumArray($1, $3); }
- | direct_abstract_declarator '[' constant_expression_error ']'
- { $$ = MkDeclaratorArray($1, $3); }
- | '(' ')'
- { $$ = MkDeclaratorFunction(null, null); }
- | '(' parameter_type_list ')'
- { $$ = MkDeclaratorFunction(null, $2); }
- | '(' parameter_type_list_error ')'
- { $$ = MkDeclaratorFunction(null, $2); }
- | direct_abstract_declarator '(' ')'
- { $$ = MkDeclaratorFunction($1, null); }
- | direct_abstract_declarator '(' parameter_type_list ')'
- { $$ = MkDeclaratorFunction($1, $3); }
- | direct_abstract_declarator '(' parameter_type_list_error ')'
- { $$ = MkDeclaratorFunction($1, $3); }
+ '(' abstract_declarator ')' { $$ = MkDeclaratorBrackets($2); }
+ | '(' ext_decl abstract_declarator ')' { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+ | '[' ']' { $$ = MkDeclaratorArray(null, null); }
+ | '[' constant_expression ']' { $$ = MkDeclaratorArray(null, $2); }
+ | '[' constant_expression_error ']' { $$ = MkDeclaratorArray(null, $2); }
+ | '[' type ']' { $$ = MkDeclaratorEnumArray(null, $2); }
+ | direct_abstract_declarator '[' ']' { $$ = MkDeclaratorArray($1, null); }
+ | direct_abstract_declarator '[' constant_expression ']' { $$ = MkDeclaratorArray($1, $3); }
+ | direct_abstract_declarator '[' type']' { $$ = MkDeclaratorEnumArray($1, $3); }
+ | direct_abstract_declarator '[' constant_expression_error ']' { $$ = MkDeclaratorArray($1, $3); }
+ | '(' ')' { $$ = MkDeclaratorFunction(null, null); }
+ | '(' parameter_type_list ')' { $$ = MkDeclaratorFunction(null, $2); }
+ | '(' parameter_type_list_error ')' { $$ = MkDeclaratorFunction(null, $2); }
+ | direct_abstract_declarator '(' ')' { $$ = MkDeclaratorFunction($1, null); }
+ | direct_abstract_declarator '(' parameter_type_list ')' { $$ = MkDeclaratorFunction($1, $3); }
+ | direct_abstract_declarator '(' parameter_type_list_error ')' { $$ = MkDeclaratorFunction($1, $3); }
;
direct_abstract_declarator_noarray:
- '(' abstract_declarator_noarray ')'
- { $$ = MkDeclaratorBrackets($2); }
- | '(' ')'
- { $$ = MkDeclaratorFunction(null, null); }
- | '(' parameter_type_list ')'
- { $$ = MkDeclaratorFunction(null, $2); }
- | '(' parameter_type_list_error ')'
- { $$ = MkDeclaratorFunction(null, $2); }
- | direct_abstract_declarator_noarray '(' ')'
- { $$ = MkDeclaratorFunction($1, null); }
- | direct_abstract_declarator_noarray '(' parameter_type_list ')'
- { $$ = MkDeclaratorFunction($1, $3); }
- | direct_abstract_declarator_noarray '(' parameter_type_list_error ')'
- { $$ = MkDeclaratorFunction($1, $3); }
+ '(' abstract_declarator_noarray ')' { $$ = MkDeclaratorBrackets($2); }
+ | '(' ext_decl abstract_declarator_noarray ')' { $$ = MkDeclaratorBrackets(MkDeclaratorExtended($2, $3)); }
+ | '(' ')' { $$ = MkDeclaratorFunction(null, null); }
+ | '(' parameter_type_list ')' { $$ = MkDeclaratorFunction(null, $2); }
+ | '(' parameter_type_list_error ')' { $$ = MkDeclaratorFunction(null, $2); }
+ | direct_abstract_declarator_noarray '(' ')' { $$ = MkDeclaratorFunction($1, null); }
+ | direct_abstract_declarator_noarray '(' parameter_type_list ')' { $$ = MkDeclaratorFunction($1, $3); }
+ | direct_abstract_declarator_noarray '(' parameter_type_list_error ')' { $$ = MkDeclaratorFunction($1, $3); }
;
pointer:
| direct_abstract_declarator
| pointer direct_abstract_declarator { $$ = MkDeclaratorPointer($1, $2); }
| ext_decl pointer { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, null)); }
- | ext_decl direct_abstract_declarator { $$ = MkDeclaratorExtended($1, $2); }
+// | ext_decl direct_abstract_declarator { $$ = MkDeclaratorExtended($1, $2); }
| ext_decl pointer direct_abstract_declarator { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
;
| direct_abstract_declarator_noarray
| pointer direct_abstract_declarator_noarray { $$ = MkDeclaratorPointer($1, $2); }
| ext_decl pointer { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, null)); }
- | ext_decl direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, $2); }
- | ext_decl pointer direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+// | ext_decl direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, $2); }
+ | ext_decl pointer direct_abstract_declarator_noarray { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
;
declarator:
{ $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
| declarator ext_decl
{ $$ = MkDeclaratorExtendedEnd($2, $1); }
+ | declarator_nofunction_type_ok ext_decl
+ { $$ = MkDeclaratorExtendedEnd($2, $1); }
+ ;
+
+declarator_type_ok:
+ direct_declarator_type_ok
+ | pointer direct_declarator_type_ok
+ { $$ = MkDeclaratorPointer($1, $2); }
+ | ext_decl pointer direct_declarator_type_ok
+ { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+ | declarator_type_ok ext_decl
+ { $$ = MkDeclaratorExtendedEnd($2, $1); }
;
declarator_function:
direct_declarator_function
| pointer direct_declarator_function { $$ = MkDeclaratorPointer($1, $2); }
- | ext_decl direct_declarator_function { $$ = MkDeclaratorExtended($1, $2); }
+// | ext_decl direct_declarator_function { $$ = MkDeclaratorExtended($1, $2); }
| ext_decl pointer direct_declarator_function { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
| pointer ext_decl direct_declarator_function { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
;
declarator_function_error:
direct_declarator_function_error
| pointer direct_declarator_function_error { $$ = MkDeclaratorPointer($1, $2); }
- | ext_decl direct_declarator_function_error { $$ = MkDeclaratorExtended($1, $2); }
+// | ext_decl direct_declarator_function_error { $$ = MkDeclaratorExtended($1, $2); }
| ext_decl pointer direct_declarator_function_error { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
| pointer ext_decl direct_declarator_function_error { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
;
+/*
declarator_nofunction:
direct_declarator_nofunction
| pointer direct_declarator_nofunction { $$ = MkDeclaratorPointer($1, $2); }
- | ext_decl direct_declarator_nofunction { $$ = MkDeclaratorExtended($1, $2); }
+// | ext_decl direct_declarator_nofunction { $$ = MkDeclaratorExtended($1, $2); }
| ext_decl pointer direct_declarator_nofunction { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
| pointer ext_decl direct_declarator_nofunction { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
;
+*/
+
+declarator_function_type_ok:
+ direct_declarator_function_type_ok
+ | pointer direct_declarator_function_type_ok { $$ = MkDeclaratorPointer($1, $2); }
+// | ext_decl direct_declarator_function_type_ok { $$ = MkDeclaratorExtended($1, $2); }
+ | ext_decl pointer direct_declarator_function_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+ | pointer ext_decl direct_declarator_function_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+ ;
+
+declarator_function_error_type_ok:
+ direct_declarator_function_error_type_ok
+ | pointer direct_declarator_function_error_type_ok { $$ = MkDeclaratorPointer($1, $2); }
+// | ext_decl direct_declarator_function_error_type_ok { $$ = MkDeclaratorExtended($1, $2); }
+ | ext_decl pointer direct_declarator_function_error_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+ | pointer ext_decl direct_declarator_function_error_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+ ;
+
+declarator_nofunction_type_ok:
+ direct_declarator_nofunction_type_ok
+ | pointer direct_declarator_nofunction_type_ok { $$ = MkDeclaratorPointer($1, $2); }
+// | ext_decl direct_declarator_nofunction_type_ok { $$ = MkDeclaratorExtended($1, $2); }
+ | ext_decl pointer direct_declarator_nofunction_type_ok { $$ = MkDeclaratorExtended($1, MkDeclaratorPointer($2, $3)); }
+ | pointer ext_decl direct_declarator_nofunction_type_ok { $$ = MkDeclaratorPointer($1, MkDeclaratorExtended($2, $3)); }
+ ;
initializer:
assignment_expression { $$ = MkInitializerAssignment($1); $$.loc = @$; }
initializer_list:
initializer { $$ = MkList(); ListAdd($$, $1); }
| initializer_error { $$ = MkList(); ListAdd($$, $1); }
- | initializer_list ',' initializer { ListAdd($1, $3); }
- | initializer_list ',' initializer_error { ListAdd($1, $3); }
+ | initializer_list ',' initializer { $$ = $1; ListAdd($1, $3); }
+ | initializer_list ',' initializer_error { $$ = $1; ListAdd($1, $3); }
// Errors
- | initializer_list initializer { ListAdd($1, $2); }
- | initializer_list initializer_error { ListAdd($1, $2); }
+ | initializer_list initializer { $$ = $1; ListAdd($1, $2); }
+ | initializer_list initializer_error { $$ = $1; ListAdd($1, $2); }
;
init_declarator:
declarator { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
+ | declarator_type_ok { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
| declarator '=' initializer { $$ = MkInitDeclarator($1, $3); $$.loc = @$; $$.initializer.loc.start = @2.end; }
;
init_declarator_error:
declarator error { $$ = MkInitDeclarator($1, null); $$.loc = @$; }
+ /* Useless rules due to conflicts
| declarator '=' error { $$ = MkInitDeclarator($1, MkInitializerAssignment(MkExpDummy())); $$.loc = @$; $$.initializer.loc = @2; $$.initializer.exp.loc = @2; }
+ */
| declarator '=' initializer_error { $$ = MkInitDeclarator($1, $3); $$.loc = @$; $$.initializer.loc.start = @2.end; }
;
init_declarator_list:
init_declarator { $$ = MkList(); ListAdd($$, $1); }
- | init_declarator_list ',' init_declarator { ListAdd($1, $3); }
- | init_declarator_list_error ',' init_declarator { ListAdd($1, $3); }
+ | init_declarator_list ',' init_declarator { $$ = $1; ListAdd($1, $3); }
+ | UINT ',' init_declarator { $$ = MkList(); ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("uint")), null)); ListAdd($$, $3); }
+ | INT64 ',' init_declarator { $$ = MkList(); ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier("int64")), null)); ListAdd($$, $3); }
+ | base_strict_type ',' init_declarator
+ {
+ char * colon = RSearchString($1.name, "::", strlen($1.name), true, false);
+ String s = colon ? colon + 2 : $1.name;
+ FreeSpecifier($1);
+ $$ = MkList();
+ ListAdd($$, MkInitDeclarator(MkDeclaratorIdentifier(MkIdentifier(s)), null));
+ ListAdd($$, $3);
+ }
+ | init_declarator_list_error ',' init_declarator { $$ = $1; ListAdd($1, $3); }
+ /*| base_strict_type ',' init_declarator
+ {
+ $$ = MkList();
+ ListAdd($1, $3);
+ }*/
;
init_declarator_list_error:
init_declarator_error { $$ = MkList(); ListAdd($$, $1); }
| init_declarator error { $$ = MkList(); ListAdd($$, $1); }
- | init_declarator_list ',' init_declarator_error { ListAdd($1, $3); }
- | init_declarator_list_error ',' init_declarator_error { ListAdd($1, $3); }
+ | init_declarator_list ',' init_declarator_error { $$ = $1; ListAdd($1, $3); }
+ | init_declarator_list_error ',' init_declarator_error { $$ = $1; ListAdd($1, $3); }
;
type_name:
/*** PARAMETERS **********************************************************************/
parameter_declaration:
- guess_declaration_specifiers declarator { $$ = MkTypeName($1, $2); }
+ guess_declaration_specifiers declarator_type_ok { $$ = MkTypeName($1, $2); }
| guess_declaration_specifiers abstract_declarator { $$ = MkTypeName($1, $2); }
| guess_declaration_specifiers '&' { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), null)); }
- | guess_declaration_specifiers '&' declarator { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), $3)); }
- | guess_declaration_specifiers { $$ = MkTypeName($1, null); }
+ | guess_declaration_specifiers '&' declarator_type_ok { $$ = MkTypeName($1, MkDeclaratorPointer(MkPointer(null,null), $3)); }
+ | guess_declaration_specifiers { $$ = MkTypeNameGuessDecl($1, null); }
| CLASS
{ $$ = MkTypeName(MkListOne(MkSpecifier(CLASS)), null); }
/*
;
parameter_declaration_error:
- guess_declaration_specifiers declarator error { $$ = MkTypeName($1, $2); }
+ guess_declaration_specifiers declarator_type_ok error { $$ = MkTypeName($1, $2); }
| guess_declaration_specifiers abstract_declarator error { $$ = MkTypeName($1, $2); }
;
parameter_list:
parameter_declaration { $$ = MkList(); ListAdd($$, $1); }
- | parameter_list ',' parameter_declaration { ListAdd($1, $3); }
- | parameter_list error ',' parameter_declaration { ListAdd($1, $4); }
- | parameter_list_error ',' parameter_declaration { ListAdd($1, $3); }
- | parameter_list_error error ',' parameter_declaration { ListAdd($1, $4); }
+ | parameter_list ',' parameter_declaration { $$ = $1; ListAdd($1, $3); }
+ | parameter_list error ',' parameter_declaration { $$ = $1; ListAdd($1, $4); }
+ | parameter_list_error ',' parameter_declaration { $$ = $1; ListAdd($1, $3); }
+ | parameter_list_error error ',' parameter_declaration { $$ = $1; ListAdd($1, $4); }
| error ',' parameter_declaration { $$ = MkList(); ListAdd($$, MkTypeName(MkList(), null)); ListAdd($$, $3); }
- | identifier_list ',' parameter_declaration { ListAdd($1, $3); }
- | identifier_list error ',' parameter_declaration { ListAdd($1, $4); }
- | identifier_list_error ',' parameter_declaration { ListAdd($1, $3); }
- | identifier_list_error error ',' parameter_declaration { ListAdd($1, $4); }
+ | identifier_list ',' parameter_declaration { $$ = $1; ListAdd($1, $3); }
+ | identifier_list error ',' parameter_declaration { $$ = $1; ListAdd($1, $4); }
+ | identifier_list_error ',' parameter_declaration { $$ = $1; ListAdd($1, $3); }
+ | identifier_list_error error ',' parameter_declaration { $$ = $1; ListAdd($1, $4); }
;
parameter_list_error:
parameter_declaration_error { $$ = MkList(); ListAdd($$, $1); }
- | parameter_list ',' parameter_declaration_error { ListAdd($1, $3); }
- | parameter_list_error ',' parameter_declaration_error { ListAdd($1, $3); }
- | parameter_list_error error ',' parameter_declaration_error { ListAdd($1, $4); }
+ | parameter_list ',' parameter_declaration_error { $$ = $1; ListAdd($1, $3); }
+ | parameter_list_error ',' parameter_declaration_error { $$ = $1; ListAdd($1, $3); }
+ | parameter_list_error error ',' parameter_declaration_error { $$ = $1; ListAdd($1, $4); }
| error ',' parameter_declaration_error { $$ = MkList(); ListAdd($$, MkTypeName(MkList(), null)); ListAdd($$, $3); }
- | identifier_list ',' parameter_declaration_error { ListAdd($1, $3); }
- | identifier_list_error ',' parameter_declaration_error { ListAdd($1, $3); }
- | identifier_list_error error ',' parameter_declaration_error { ListAdd($1, $4); }
+ | identifier_list ',' parameter_declaration_error { $$ = $1; ListAdd($1, $3); }
+ | identifier_list_error ',' parameter_declaration_error { $$ = $1; ListAdd($1, $3); }
+ | identifier_list_error error ',' parameter_declaration_error { $$ = $1; ListAdd($1, $4); }
;
parameter_type_list:
parameter_list
- | parameter_list ',' ELLIPSIS { ListAdd($1, MkTypeName(null, null)); }
- | parameter_list_error ',' ELLIPSIS { ListAdd($1, MkTypeName(null, null)); }
- | identifier_list ',' ELLIPSIS { ListAdd($1, MkTypeName(null, null)); }
- | identifier_list_error ',' ELLIPSIS { ListAdd($1, MkTypeName(null, null)); }
+ | parameter_list ',' ELLIPSIS { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+ | parameter_list_error ',' ELLIPSIS { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+ | identifier_list ',' ELLIPSIS { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
+ | identifier_list_error ',' ELLIPSIS { $$ = $1; ListAdd($1, MkTypeName(null, null)); }
| error ',' ELLIPSIS { $$ = MkList(); ListAdd($$, MkTypeName(null, null)); }
;
parameter_type_list_error:
parameter_list_error
- | parameter_list ',' error { ListAdd($1, null); }
+ | parameter_list ',' error { $$ = $1; ListAdd($1, null); }
| parameter_list_error error
;
/****** STATEMENTS *******************************************************************/
statement:
labeled_statement
- | EXT_ATTRIB { $$ = MkExpressionStmt(null); } // Ignoring this for now... ( For __attribute__ ((__unused__)) )
+ | attrib { $$ = MkExpressionStmt(null); FreeAttrib($1); } // Ignoring this for now... ( For __attribute__ ((__unused__)) )
| compound_statement
| ';' { $$ = MkExpressionStmt(null); }
| ':' { $$ = MkExpressionStmt(null); }
| selection_statement
| iteration_statement
| jump_statement
- | asm_statement {}
-
+ | asm_statement
| firewatchers ';'
| stopwatching ';'
| watch_definition ';'
;
statement_error:
- labeled_statement_error { $$ = $1; Compiler_Error("syntax error\n"); }
- | iteration_statement_error { $$ = $1; Compiler_Error("syntax error\n"); }
- | compound_statement_error { $$ = $1; Compiler_Error("syntax error\n"); }
- | selection_statement_error { $$ = $1; Compiler_Error("syntax error\n"); }
- | jump_statement_error { $$ = $1; Compiler_Error("syntax error\n"); }
- | jump_statement error { $$ = $1; Compiler_Error("syntax error\n"); }
- | expression_error { $$ = MkExpressionStmt($1); Compiler_Error("syntax error\n"); $$.loc = @1; }
+ labeled_statement_error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | iteration_statement_error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | compound_statement_error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | selection_statement_error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | jump_statement_error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | jump_statement error { $$ = $1; Compiler_Error($"syntax error\n"); }
+ | expression_error { $$ = MkExpressionStmt($1); Compiler_Error($"syntax error\n"); $$.loc = @1; }
;
asm_field:
declaration_specifiers ';' { $$ = MkDeclaration($1, null); $$.loc = @$; }
| declaration_specifiers init_declarator_list ';' { $$ = MkDeclaration($1, $2); $$.loc = @$; }
| instantiation_named ';' { $$ = MkDeclarationInst($1); $$.loc = @$; }
- | declaration_error ';' {}
+ | declaration_error ';' { $$ = $1; }
;
external_guess_declaration:
declaration_list:
declaration { $$ = MkList(); ListAdd($$, $1); /*declMode = defaultDeclMode;*/ }
- | declaration_list declaration { ListAdd($1, $2); /*declMode = defaultDeclMode; */}
- | declaration_list_error declaration { ListAdd($1, $2); /*declMode = defaultDeclMode; */}
- | declaration_list error ';' { }
+ | declaration_list declaration { $$ = $1; ListAdd($1, $2); /*declMode = defaultDeclMode; */}
+ | declaration_list_error declaration { $$ = $1; ListAdd($1, $2); /*declMode = defaultDeclMode; */}
+ | declaration_list error ';' { $$ = $1; }
;
declaration_list_error:
declaration_error { $$ = MkList(); ListAdd($$, $1); }
- | declaration_list declaration_error { ListAdd($1, $2); }
+ | declaration_list declaration_error { $$ = $1; ListAdd($1, $2); }
;
statement_list:
statement { $$ = MkList(); ListAdd($$, $1); }
- | statement_list statement { ListAdd($1, $2); }
- | statement_list_error statement { ListAdd($1, $2); }
+ | statement_list statement { $$ = $1; ListAdd($1, $2); }
+ | statement_list_error statement { $$ = $1; ListAdd($1, $2); }
;
statement_list_error:
statement_error { $$ = MkList(); ListAdd($$, $1); }
- | statement_list statement_error { ListAdd($1, $2); }
- | statement_list_error statement_error { ListAdd($1, $2); }
- | statement_list declaration { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
- | statement_list_error declaration { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
- | statement_list declaration_error { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
- | statement_list_error declaration_error { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+ | statement_list statement_error { $$ = $1; ListAdd($1, $2); }
+ | statement_list_error statement_error { $$ = $1; ListAdd($1, $2); }
+ | statement_list declaration { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+ | statement_list_error declaration { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+ | statement_list declaration_error { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
+ | statement_list_error declaration_error { Statement stmt = MkBadDeclStmt($2); stmt.loc = @2; yyerror(); $$ = $1; ListAdd($1, stmt); /*declMode = defaultDeclMode;*/ }
;
compound_inside:
;
compound_statement:
- compound_statement_error '}' { $$.loc = @$; }
+ compound_statement_error '}' { $$ = $1; $$.loc = @$; }
;
compound_statement_error:
FOR '(' expression_error error { $$ = MkForStmt(MkExpressionStmt($3), null, null, null); $$.forStmt.init.loc = @3; $$.loc = @$; } |
FOR '(' expression_statement error { $$ = MkForStmt($3, null, null, null); $$.loc = @$; } |
FOR '(' expression_statement expression_error error { $$ = MkForStmt($3, MkExpressionStmt($4), null, null); $$.loc = @$; $$.forStmt.check.loc = @4; } |
+ /* Useless rules due to conflicts
FOR '(' expression_statement expression_statement error { $$ = MkForStmt($3, $4, null, null); $$.loc = @$; } |
+ */
FOR '(' expression_statement expression_statement expression_error { $$ = MkForStmt($3, $4, $5, null); $$.loc = @$; } |
FOR '(' expression_statement expression_statement ')' statement_error { $$ = MkForStmt($3, $4, null, $6); $$.loc = @$; } |
FOR '(' expression_statement expression_statement expression ')' statement_error { $$ = MkForStmt($3, $4, $5, $7); $$.loc = @$; } |
WHILE error { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
+ /* Useless rules due to conflicts
WHILE '(' error { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
+ */
WHILE '(' ')' error { $$ = MkWhileStmt(null, null); $$.loc = @$; } |
WHILE '(' expression_error { $$ = MkWhileStmt($3, null); $$.loc = @$; } |
+ /* Useless rules due to conflicts
WHILE '(' expression_error error { $$ = MkWhileStmt($3, null); $$.loc = @$; } |
+ */
WHILE '(' expression ')' statement_error { $$ = MkWhileStmt($3, $5); $$.loc = @$; } |
WHILE '(' expression_error statement_error { $$ = MkWhileStmt($3, $4 ); $$.loc = @$; }
external_guess_declaration_specifiers declarator_function declaration_list compound_statement { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; }
| external_guess_declaration_specifiers declarator_function compound_statement
{ $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; }
+ | external_guess_declaration_specifiers declarator_function_type_ok declaration_list compound_statement { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; }
+ | external_guess_declaration_specifiers declarator_function_type_ok compound_statement
+ { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; }
| declarator_function declaration_list compound_statement { $$ = MkFunction(null, $1, $2); ProcessFunctionBody($$, $3); $$.loc = @$; }
| declarator_function compound_statement { $$ = MkFunction(null, $1, null); ProcessFunctionBody($$, $2); $$.loc = @$;}
function_definition_error:
external_guess_declaration_specifiers declarator_function declaration_list compound_statement_error { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; $$.loc.end = $4.loc.end; }
| external_guess_declaration_specifiers declarator_function compound_statement_error { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
+ | external_guess_declaration_specifiers declarator_function_type_ok declaration_list compound_statement_error { $$ = MkFunction($1, $2, $3); ProcessFunctionBody($$, $4); $$.loc = @$; $$.loc.end = $4.loc.end; }
+ | external_guess_declaration_specifiers declarator_function_type_ok compound_statement_error { $$ = MkFunction($1, $2, null); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
| declarator_function declaration_list compound_statement_error { $$ = MkFunction(null, $1, $2); ProcessFunctionBody($$, $3); $$.loc = @$; $$.loc.end = $3.loc.end; }
| declarator_function compound_statement_error { $$ = MkFunction(null, $1, null); ProcessFunctionBody($$, $2); $$.loc = @$; $$.loc.end = $2.loc.end; }
;
{
int len1 = strlen($1);
int len2 = strlen(yytext);
- $$ = eSystem_New(len1-1 + len2-1 + 1);
+ $$ = new byte[len1-1 + len2-1 + 1];
memcpy($$, $1, len1-1);
memcpy($$ + len1-1, yytext+1, len2);
delete $1;
{ $$ = MkExternalClass($1); $$.loc = @$; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
| external_guess_declaration_specifiers class
- { $$ = MkExternalClass($2); $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+ { $$ = MkExternalClass($2); $$.loc = @$; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; FreeList($1, FreeSpecifier); }
| external_guess_declaration
{ $$ = MkExternalDeclaration($1); $$.loc = @$; $1.declMode = declMode; declMode = defaultDeclMode; }
| IMPORT string_literal { $$ = MkExternalImport($2, normalImport, (declMode != defaultAccess) ? declMode : privateAccess); $$.loc = @$; }
| IMPORT STATIC string_literal { $$ = MkExternalImport($3, staticImport, (declMode != defaultAccess) ? declMode : privateAccess); $$.loc = @$; }
- | IMPORT identifier string_literal { if(!strcmp($2.string, "remote")) { $$ = MkExternalImport($3, remoteImport, (declMode != defaultAccess) ? declMode : privateAccess); $$.loc = @$; } else yyerror(); FreeIdentifier($2); }
+ | IMPORT identifier string_literal
+ {
+ bool isRemote = !strcmp($2.string, "remote");
+ $$ = MkExternalImport($3, isRemote ? remoteImport : normalImport, (declMode != defaultAccess) ? declMode : privateAccess);
+ $$.loc = @$;
+ FreeIdentifier($2);
+ if(!isRemote)
+ yyerror();
+ }
| ';' { $$ = null; }
| declaration_mode external_guess_declaration { $$ = MkExternalDeclaration($2); $$.loc = @$; $2.declMode = $1; declMode = defaultDeclMode; }
| declaration_mode IMPORT string_literal { $$ = MkExternalImport($3, normalImport, ($1 != defaultAccess) ? $1 : privateAccess); $$.loc = @$; declMode = defaultDeclMode; }
| declaration_mode IMPORT STATIC string_literal { $$ = MkExternalImport($4, staticImport, ($1 != defaultAccess) ? $1 : privateAccess); $$.loc = @$; declMode = defaultDeclMode; }
- | declaration_mode IMPORT identifier string_literal { if(!strcmp($3.string, "remote")) { $$ = MkExternalImport($4, remoteImport, ($1 != defaultAccess) ? $1 : privateAccess); $$.loc = @$; FreeIdentifier($3); } else yyerror(); declMode = defaultDeclMode; }
+ | declaration_mode IMPORT identifier string_literal
+ {
+ bool isRemote = !strcmp($3.string, "remote");
+ $$ = MkExternalImport($4, isRemote ? remoteImport : normalImport, ($1 != defaultAccess) ? $1 : privateAccess);
+ $$.loc = @$;
+ FreeIdentifier($3);
+ declMode = defaultDeclMode;
+ if(!isRemote)
+ yyerror();
+ }
| declaration_mode ':' { defaultDeclMode = $1; $$ = null; }
| STATIC ':' { defaultDeclMode = staticAccess; $$ = null; }
| NAMESPACE identifier { $$ = MkExternalNameSpace($2); $$.loc = @$; }
external_declaration_error:
class_error { $$ = MkExternalClass($1); $$.loc = $1.loc; $1.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
- | external_guess_declaration_specifiers class_error { $$ = MkExternalClass($2); $$.loc = $2.loc; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+ | external_guess_declaration_specifiers class_error
+ {
+ FreeList($1, FreeSpecifier);
+ $$ = MkExternalClass($2);
+ $$.loc = $2.loc;
+ $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess;
+ declMode = defaultDeclMode;
+ }
| function_definition_error { $$ = MkExternalFunction($1); $$.loc = $1.loc; $1.declMode = declMode; declMode = defaultDeclMode; }
| declaration_mode class_error { $$ = MkExternalClass($2); $$.loc = $2.loc; $2.declMode = ($1 != defaultAccess) ? $1 : privateAccess; declMode = defaultDeclMode; }
translation_unit_error:
external_declaration_error { $$ = MkList(); ListAdd($$, $1); ast = $$; }
- | translation_unit external_declaration_error { ListAdd($1, $2); }
- | translation_unit_error external_declaration_error { ListAdd($1, $2); }
+ | translation_unit external_declaration_error { $$ = $1; ListAdd($1, $2); }
+ | translation_unit_error external_declaration_error { $$ = $1; ListAdd($1, $2); }
| translation_unit error
| translation_unit_error error
;
translation_unit:
external_declaration { $$ = MkList(); ListAdd($$, $1); ast = $$; }
- | translation_unit external_declaration { ListAdd($1, $2); }
+ | translation_unit external_declaration { $$ = $1; ListAdd($1, $2); }
| translation_unit_error class
- { External _class = MkExternalClass($2); ListAdd($1, _class); _class.loc = @2; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
+ { External _class = MkExternalClass($2); $$ = $1; ListAdd($1, _class); _class.loc = @2; $2.declMode = (declMode != defaultAccess) ? declMode : privateAccess; declMode = defaultDeclMode; }
| translation_unit_error declaration_mode class
- { External _class = MkExternalClass($3); ListAdd($1, _class); _class.loc = @3; $3.declMode = ($2 != defaultAccess) ? $2 : privateAccess; declMode = defaultDeclMode; }
+ { External _class = MkExternalClass($3); $$ = $1; ListAdd($1, _class); _class.loc = @3; $3.declMode = ($2 != defaultAccess) ? $2 : privateAccess; declMode = defaultDeclMode; }
;
thefile: