📄 expandedgnucemitter.g
字号:
externalDef :declaration
| functionDef
| asm_expr
| typelessDeclaration
| s:SEMI { print( s ); }
;
typelessDeclaration :#(NTypeMissing initDeclList s: SEMI) { print( s ); }
;
asm_expr :#( a:"asm" { print( a ); }
( v:"volatile" { print( v ); }
)?
lc:LCURLY { print( lc ); tabs++; }
expr
rc:RCURLY { tabs--; print( rc ); }
s:SEMI { print( s ); }
)
;
declaration :#( NDeclaration
declSpecifiers
(
initDeclList
)?
( s:SEMI { print( s ); } )+
)
;
declSpecifiers :( storageClassSpecifier
| typeQualifier
| typeSpecifier
)+
;
storageClassSpecifier :a:"auto" { print( a ); }
| b:"register" { print( b ); }
| c:"typedef" { print( c ); }
| functionStorageClassSpecifier
;
functionStorageClassSpecifier :a:"extern" { print( a ); }
| b:"static" { print( b ); }
| c:"inline" { print( c ); }
;
typeQualifier :a:"const" { print( a ); }
| b:"volatile" { print( b ); }
;
typeSpecifier :a:"void" { print( a ); }
| b:"char" { print( b ); }
| c:"short" { print( c ); }
| d:"int" { print( d ); }
| e:"long" { print( e ); }
| f:"float" { print( f ); }
| g:"double" { print( g ); }
| h:"signed" { print( h ); }
| i:"unsigned" { print( i ); }
| structSpecifier ( attributeDecl )*
| unionSpecifier ( attributeDecl )*
| enumSpecifier
| typedefName
| #(n:"typeof" lp:LPAREN { print( n ); print( lp ); }
( (typeName )=> typeName
| expr
)
rp:RPAREN { print( rp ); }
)
| p:"__complex" { print( p ); }
;
typedefName :#(NTypedefName i:ID { print( i ); } )
;
structSpecifier :#( a:"struct" { print( a ); }
structOrUnionBody
)
;
unionSpecifier :#( a:"union" { print( a ); }
structOrUnionBody
)
;
structOrUnionBody :( (ID LCURLY) => i1:ID lc1:LCURLY { print( i1 ); print ( "{" ); tabs++; }
( structDeclarationList )?
rc1:RCURLY { tabs--; print( rc1 ); }
| lc2:LCURLY { print( "{" ); tabs++; }
( structDeclarationList )?
rc2:RCURLY { tabs--; print( rc2 ); }
| i2:ID { print( i2 ); }
)
;
structDeclarationList :( structDeclaration { print( ";" ); }
)+
;
structDeclaration :specifierQualifierList structDeclaratorList
;
specifierQualifierList :(
typeSpecifier
| typeQualifier
)+
;
structDeclaratorList :structDeclarator
( { print(","); } structDeclarator )*
;
structDeclarator :#( NStructDeclarator
( declarator )?
( c:COLON { print( c ); } expr )?
( attributeDecl )*
)
;
enumSpecifier :#( a:"enum" { print( a ); }
( i:ID { print( i ); } )?
( lc:LCURLY { print( lc ); tabs++; }
enumList
rc:RCURLY { tabs--; print( rc ); }
)?
)
;
enumList :enumerator ( {print(",");} enumerator)*
;
enumerator :i:ID { print( i ); }
( b:ASSIGN { print( b ); }
expr
)?
;
attributeDecl :#( a:"__attribute" { print( a ); }
(b:. { print( b ); } )*
)
| #( n:NAsmAttribute { print( n ); }
lp:LPAREN { print( lp ); }
expr { print( ")" ); }
rp:RPAREN { print( rp ); }
)
;
initDeclList :initDecl
( { print( "," ); } initDecl )*
;
initDecl { String declName = ""; }
:#(NInitDecl
declarator
( attributeDecl )*
( a:ASSIGN { print( a ); }
initializer
| b:COLON { print( b ); }
expr
)?
)
;
pointerGroup :#( NPointerGroup
( a:STAR { print( a ); }
( typeQualifier )*
)+
)
;
idList :i:ID { print( i ); }
( c:COMMA { print( c ); }
id:ID { print( id ); }
)*
;
initializer :#( NInitializer (initializerElementLabel)? expr )
| lcurlyInitializer
;
initializerElementLabel :#( NInitializerElementLabel
(
( l:LBRACKET { print( l ); }
expr
r:RBRACKET { print( r ); }
(a1:ASSIGN { print( a1 ); } )?
)
| i1:ID c:COLON { print( i1 ); print( c ); }
| d:DOT i2:ID a2:ASSIGN { print( d ); print( i2 ); print( a2 ); }
)
)
;
lcurlyInitializer :#(n:NLcurlyInitializer { print( n ); tabs++; }
initializerList
rc:RCURLY { tabs--; print( rc ); }
)
;
initializerList :( i:initializer { commaSep( i ); }
)*
;
declarator :#( NDeclarator
( pointerGroup )?
( id:ID { print( id ); }
| lp:LPAREN { print( lp ); } declarator rp:RPAREN { print( rp ); }
)
( #( n:NParameterTypeList { print( n ); }
(
parameterTypeList
| (idList)?
)
r:RPAREN { print( r ); }
)
| lb:LBRACKET { print( lb );} ( expr )? rb:RBRACKET { print( rb ); }
)*
)
;
parameterTypeList :( parameterDeclaration
( c:COMMA { print( c ); }
| s:SEMI { print( s ); }
)?
)+
( v:VARARGS { print( v ); } )?
;
parameterDeclaration :#( NParameterDeclaration
declSpecifiers
(declarator | nonemptyAbstractDeclarator)?
)
;
functionDef :#( NFunctionDef
( functionDeclSpecifiers)?
declarator
(declaration
| v:VARARGS { print( v ); }
)*
compoundStatement
)
;
functionDeclSpecifiers :( functionStorageClassSpecifier
| typeQualifier
| typeSpecifier
)+
;
declarationList :( //ANTLR doesn't know that declarationList properly eats all the declarations
//so it warns about the ambiguity
options {
warnWhenFollowAmbig = false;
} :
localLabelDecl
| declaration
)+
;
localLabelDecl :#(a:"__label__" { print( a ); }
( i:ID { commaSep( i ); }
)+
{ print( ";" ); }
)
;
compoundStatement :#( cs:NCompoundStatement { print( cs ); tabs++; }
( declarationList
| functionDef
)*
( statementList )?
rc:RCURLY { tabs--; print( rc ); }
)
;
statementList :( statement )+
;
statement :statementBody
;
statementBody :s:SEMI { print( s ); }
| compoundStatement // Group of statements
| #(NStatementExpr
expr { print( ";" ); }
) // Expressions
// Iteration statements:
| #( w:"while" { print( w ); print( "(" ); }
expr { print( ")" ); }
statement )
| #( d:"do" { print( d ); }
statement
{ print( " while ( " ); }
expr
{ print( " );" ); }
)
| #( f:"for" { print( f ); print( "(" ); }
expr { print( ";" ); }
expr { print( ";" ); }
expr { print( ")" ); }
statement
)
// Jump statements:
| #( g:"goto" { print( g );}
expr { print( ";" ); }
)
| c:"continue" { print( c ); print( ";" );}
| b:"break" { print( b ); print( ";" );}
| #( r:"return" { print( r ); }
( expr )?
{ print( ";" ); }
)
// Labeled statements:
| #( NLabel
ni:ID { print( ni ); print( ":" ); }
( statement )?
)
| #(
ca:"case" { print( ca ); }
expr { print( ":" ); }
(statement)?
)
| #(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -