📄 gnucemitter.g
字号:
| 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
)
;
/*
exception
catch [RecognitionException ex]
{
reportError(ex);
System.out.println("PROBLEM TREE:\n"
+ _t.toStringList());
if (_t!=null) {_t = _t.getNextSibling();}
}
*/
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -