📄 plusplus.y
字号:
start-linkage-block
: Y_LEFT_BRACE
{ LinkageBlock(); }
;
linkage-id
: strings
{
LinkagePush( $1->u.string->string );
StringTrash( $1->u.string );
PTreeFree( $1 );
if( ! ScopeType( GetCurrScope(), SCOPE_FILE ) ) {
CErr1( ERR_ONLY_GLOBAL_LINKAGES );
}
}
;
declarator-list
: init-declarator
{
tryCtorStyleInit( state, $1 );
}
| declarator-list Y_COMMA comma-init-declarator
{
tryCtorStyleInit( state, $3 );
}
;
init-declarator
: declarator
{
$$ = InsertDeclInfo( GetCurrScope(), $1 );
GStackPush( &(state->gstack), GS_INIT_DATA );
$$ = DataInitNoInit( &(state->gstack->u.initdata), $$ );
GStackPop( &(state->gstack) );
}
| declaring-declarator initializer
{ $$ = $1; }
| ptr-mod-init-declarator
{
$1 = FinishDeclarator( state->gstack->u.dspec, $1 );
$$ = InsertDeclInfo( GetCurrScope(), $1 );
}
| actual-declarator Y_LEFT_PAREN expression-list Y_RIGHT_PAREN
{
$1 = FinishDeclarator( state->gstack->u.dspec, $1 );
$$ = InsertDeclInfo( GetCurrScope(), $1 );
setInitWithLocn( $$, $3, &yylp[2] );
}
;
comma-init-declarator
: comma-declarator
{
$$ = InsertDeclInfo( GetCurrScope(), $1 );
GStackPush( &(state->gstack), GS_INIT_DATA );
$$ = DataInitNoInit( &(state->gstack->u.initdata), $$ );
GStackPop( &(state->gstack) );
}
| comma-declaring-declarator initializer
{ $$ = $1; }
| cv-qualifiers-opt ptr-mod-init-declarator
{
$2 = AddMSCVQualifierKludge( $1, $2 );
$2 = FinishDeclarator( state->gstack->u.dspec, $2 );
$$ = InsertDeclInfo( GetCurrScope(), $2 );
}
| cv-qualifiers-opt actual-declarator Y_LEFT_PAREN expression-list Y_RIGHT_PAREN
{
$2 = AddMSCVQualifierKludge( $1, $2 );
$2 = FinishDeclarator( state->gstack->u.dspec, $2 );
$$ = InsertDeclInfo( GetCurrScope(), $2 );
setInitWithLocn( $$, $4, &yylp[3] );
}
;
declaring-declarator
: declarator
{
$$ = InsertDeclInfo( GetCurrScope(), $1 );
GStackPush( &(state->gstack), GS_DECL_INFO );
state->gstack->u.dinfo = $$;
}
;
comma-declaring-declarator
: comma-declarator
{
$$ = InsertDeclInfo( GetCurrScope(), $1 );
GStackPush( &(state->gstack), GS_DECL_INFO );
state->gstack->u.dinfo = $$;
}
;
declarator
: ptr-mod-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
| actual-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
;
comma-declarator
: cv-qualifiers-opt ptr-mod-declarator
{
$2 = AddMSCVQualifierKludge( $1, $2 );
$$ = FinishDeclarator( state->gstack->u.dspec, $2 );
}
| cv-qualifiers-opt actual-declarator
{
$2 = AddMSCVQualifierKludge( $1, $2 );
$$ = FinishDeclarator( state->gstack->u.dspec, $2 );
}
;
ptr-mod
: modifier
{ $$ = MakeFlagModifier( $1 ); }
| Y___BASED Y_LEFT_PAREN based-expression Y_RIGHT_PAREN
{ $$ = $3; }
| pragma-modifier
| ptr-operator
;
ptr-mod-init-declarator
: ptr-mod ptr-mod-init-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod actual-declarator Y_LEFT_PAREN expression-list Y_RIGHT_PAREN
{
$$ = AddDeclarator( $2, $1 );
setInitWithLocn( $$, $4, &yylp[3] );
}
;
ptr-mod-declarator
: ptr-mod ptr-mod-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod actual-declarator
{ $$ = AddDeclarator( $2, $1 ); }
;
actual-declarator
: declarator-id
{
$$ = MakeDeclarator( state->gstack->u.dspec, $1 );
if( $$ == NULL ) {
what = P_SYNTAX;
} else {
if( $$->template_member ) {
what = P_CLASS_TEMPLATE;
}
}
}
| actual-declarator Y_LEFT_PAREN abstract-args Y_RIGHT_PAREN cv-qualifiers-opt except-spec-opt
{
$$ = AddDeclarator( $1, MakeFnType( &($3), $5, $6 ) );
$$ = AddExplicitParms( $$, $3 );
}
| actual-declarator Y_LEFT_BRACKET constant-expression Y_RIGHT_BRACKET
{ $$ = AddArrayDeclarator( $1, $3 ); }
| actual-declarator Y_LEFT_BRACKET Y_RIGHT_BRACKET
{ $$ = AddArrayDeclarator( $1, NULL ); }
| Y_LEFT_PAREN ptr-mod-declarator Y_RIGHT_PAREN
{ $$ = $2; }
| Y_LEFT_PAREN actual-declarator Y_RIGHT_PAREN
{ $$ = $2; }
;
modifier
: Y___NEAR
{ $$ = TF1_NEAR; }
| Y___FAR
{ $$ = TF1_FAR; }
| Y__FAR16
{ $$ = TF1_SET_FAR16; /* equals TF1_FAR on the 8086 */ }
| Y___FAR16
{ $$ = TF1_SET_FAR16; /* equals TF1_FAR on the 8086 */ }
| Y___HUGE
{ $$ = TF1_SET_HUGE; /* equals TF1_FAR on the 386 */ }
| Y__EXPORT
{ $$ = TF1_DLLEXPORT | TF1_HUG_FUNCTION; }
| Y___EXPORT
{ $$ = TF1_DLLEXPORT | TF1_HUG_FUNCTION; }
| Y___LOADDS
{ $$ = TF1_LOADDS | TF1_TYP_FUNCTION; }
| Y___SAVEREGS
{ $$ = TF1_SAVEREGS | TF1_TYP_FUNCTION; }
| Y___INTERRUPT
{ $$ = TF1_INTERRUPT | TF1_TYP_FUNCTION; }
;
based-expression
: segment-cast-opt Y___SEGNAME Y_LEFT_PAREN strings Y_RIGHT_PAREN
{ $$ = MakeBasedModifier( TF1_BASED_STRING, $1, $4 ); }
| segment-cast-opt Y_ID
{ $$ = MakeBasedModifier( TF1_NULL, $1, $2 ); }
| segment-cast-opt Y_VOID
{ $$ = MakeBasedModifier( TF1_BASED_VOID, $1, NULL ); }
| segment-cast-opt Y___SELF
{ $$ = MakeBasedModifier( TF1_BASED_SELF, $1, NULL ); }
;
segment-cast-opt
: /* nothing */
{ $$ = FALSE; }
| Y_LEFT_PAREN Y___SEGMENT Y_RIGHT_PAREN
{ $$ = TRUE; }
;
pragma-modifier
: Y___PRAGMA Y_LEFT_PAREN pragma-id Y_RIGHT_PAREN
{
$$ = MakePragma( $3->u.string->string );
StringTrash( $3->u.string );
PTreeFree( $3 );
}
| Y__CDECL
{ $$ = MakeIndexPragma( M_CDECL ); }
| Y___CDECL
{ $$ = MakeIndexPragma( M_CDECL ); }
| Y__FASTCALL
{ $$ = MakeIndexPragma( M_FASTCALL ); }
| Y___FASTCALL
{ $$ = MakeIndexPragma( M_FASTCALL ); }
| Y___FORTRAN
{ $$ = MakeIndexPragma( M_FORTRAN ); }
| Y__OPTLINK
{ $$ = MakeIndexPragma( M_OPTLINK ); }
| Y__PASCAL
{ $$ = MakeIndexPragma( M_PASCAL ); }
| Y___PASCAL
{ $$ = MakeIndexPragma( M_PASCAL ); }
| Y___STDCALL
{ $$ = MakeIndexPragma( M_STDCALL ); }
| Y__SYSCALL
{ $$ = MakeIndexPragma( M_SYSCALL ); }
| Y___SYSCALL
{ $$ = MakeIndexPragma( M_SYSCALL ); }
| Y__SYSTEM
{ $$ = MakeIndexPragma( M_SYSTEM ); }
| Y___WATCALL
{ $$ = MakeIndexPragma( M_WATCALL ); }
;
pragma-id
: strings
;
ptr-operator
: Y_TIMES cv-qualifiers-opt
{ $$ = MakePointerType( TF1_NULL, $2 ); }
| Y_AND cv-qualifiers-opt
{ $$ = MakePointerType( TF1_REFERENCE, $2 ); }
| Y_SCOPED_TIMES cv-qualifiers-opt
{ $$ = MakeMemberPointer( $1, $2 ); }
| template-class-id Y_TEMPLATE_SCOPED_TIMES cv-qualifiers-opt
{ $$ = MakeMemberPointer( $2, $3 ); PTypeRelease( $1 ); }
| Y_TEMPLATE_SCOPED_TIMES cv-qualifiers-opt
{ $$ = MakeMemberPointer( $1, $2 ); zapTemplateClassDeclSpec( state ); }
| Y_TIMES Y__SEG16 cv-qualifiers-opt
{ $$ = MakeSeg16Pointer( $3 ); }
;
cv-qualifiers-opt
: /* nothing */
{ $$ = STY_NULL; }
| Y_CONST
{ $$ = STY_CONST; }
| Y_VOLATILE
{ $$ = STY_VOLATILE; }
| Y___UNALIGNED
{ $$ = STY_UNALIGNED; }
| Y_CONST Y_VOLATILE
{ $$ = STY_CONST | STY_VOLATILE; }
| Y_VOLATILE Y_CONST
{ $$ = STY_CONST | STY_VOLATILE; }
| Y_CONST Y___UNALIGNED
{ $$ = STY_CONST | STY_UNALIGNED; }
| Y___UNALIGNED Y_CONST
{ $$ = STY_CONST | STY_UNALIGNED; }
| Y_VOLATILE Y___UNALIGNED
{ $$ = STY_VOLATILE | STY_UNALIGNED; }
| Y___UNALIGNED Y_VOLATILE
{ $$ = STY_VOLATILE | STY_UNALIGNED; }
| Y___UNALIGNED Y_CONST Y_VOLATILE
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
| Y___UNALIGNED Y_VOLATILE Y_CONST
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
| Y_VOLATILE Y_CONST Y___UNALIGNED
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
| Y_VOLATILE Y___UNALIGNED Y_CONST
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
| Y_CONST Y_VOLATILE Y___UNALIGNED
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
| Y_CONST Y___UNALIGNED Y_VOLATILE
{ $$ = STY_CONST | STY_VOLATILE | STY_UNALIGNED; }
;
declarator-id
: Y_ID
| Y_GLOBAL_ID
| Y_TEMPLATE_NAME
| Y_NAMESPACE_NAME
| qualified-type-specifier
{ $$ = MakeIdFromType( $1 ); }
| destructor-name
| operator-name
| qualified-id-expression
;
special-new-type-id
: type-specifiers special-new-abstract-declarator
{
$$ = $2;
GStackPop( &(state->gstack) );
}
| type-specifiers
{
$$ = MakeNewTypeId( DoDeclSpec( state->gstack->u.dspec ) );
GStackPop( &(state->gstack) );
}
;
type-id
: type-specifiers abstract-declarator
{
$$ = TypeDeclarator( $2 );
GStackPop( &(state->gstack) );
}
| type-specifiers
{
$$ = DoDeclSpec( state->gstack->u.dspec );
GStackPop( &(state->gstack) );
}
;
type-id-list
: type-id
| type-id-list Y_COMMA type-id
{ $$ = PTreeTListAppend( $1, $3 ); }
;
special-new-abstract-declarator
: special-new-abstract-ptr-mod-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
| special-new-actual-abstract-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
;
abstract-declarator
: abstract-ptr-mod-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
| actual-abstract-declarator
{
$$ = FinishDeclarator( state->gstack->u.dspec, $1 );
}
;
special-new-abstract-ptr-mod-declarator
: ptr-mod special-new-abstract-ptr-mod-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod special-new-actual-abstract-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod
{ $$ = MakeAbstractDeclarator( $1 ); }
;
abstract-ptr-mod-declarator
: ptr-mod abstract-ptr-mod-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod actual-abstract-declarator
{ $$ = AddDeclarator( $2, $1 ); }
| ptr-mod
{ $$ = MakeAbstractDeclarator( $1 ); }
;
special-new-actual-abstract-declarator
: special-new-actual-abstract-declarator Y_LEFT_PAREN abstract-args Y_RIGHT_PAREN cv-qualifiers-opt except-spec-opt
{
$$ = AddDeclarator( $1, MakeFnType( &($3), $5, $6 ) );
FreeArgs( $3 );
}
| Y_LEFT_PAREN abstract-args Y_RIGHT_PAREN cv-qualifiers-opt except-spec-opt
{
$$ = MakeAbstractDeclarator( MakeFnType( &($2), $4, $5 ) );
FreeArgs( $2 );
}
| special-new-actual-abstract-declarator Y_LEFT_BRACKET constant-expression Y_RIGHT_BRACKET
{ $$ = AddArrayDeclarator( $1, $3 ); }
| Y_LEFT_BRACKET expression Y_RIGHT_BRACKET
{ $$ = MakeNewDynamicArray( $2 ); }
| special-new-actual-abstract-declarator Y_LEFT_BRACKET Y_RIGHT_BRACKET
{ $$ = AddArrayDeclarator( $1, NULL ); }
| Y_LEFT_BRACKET Y_RIGHT_BRACKET
{
$$ = MakeAbstractDeclarator( NULL );
$$ = AddArrayDeclarator( $$, NULL );
}
| Y_LEFT_PAREN special-new-actual-abstract-declarator Y_RIGHT_PAREN
{ $$ = $2; }
| Y_LEFT_PAREN special-new-abstract-ptr-mod-declarator Y_RIGHT_PAREN
{ $$ = $2; }
;
actual-abstract-declarator
: actual-abstract-declarator Y_LEFT_PAREN abstract-args Y_RIGHT_PAREN cv-qualifiers-opt except-spec-opt
{
$$ = AddDeclarator( $1, MakeFnType( &($3), $5, $6 ) );
FreeArgs( $3 );
}
| Y_LEFT_PAREN abstract-args Y_RIGHT_PARE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -