📄 nescemitter.g
字号:
localLabelDecl
| declaration
)+
;
localLabelDecl
: #(a:"__label__" { print( a ); }
( i:ID { commaSep( i ); }
)+
{ print( ";" ); }
)
;
compoundStatement
: #( cs:NCompoundStatement { print( cs ); newline(); tabs++;
}
( declarationList
| functionDef
)*
( statementList )?
rc:RCURLY {
tabs--; print( rc ); newline();
}
)
;
statementList
: ( statement )+
;
statement
: ( ("atomic") => a:"atomic" { print( a ); }
statementBody
| statementBody )
;
statementBody
: s:SEMI { print( s ); newline(); }
| compoundStatement // Group of statements
| #(NStatementExpr
expr { print( ";" ); newline(); }
) // Expressions
// Iteration statements:
| #( w:"while" { print( w ); print( "(" ); }
expr { print( ")" ); newline(); }
statement )
| #( d:"do" { print( d ); newline(); }
statement
{ print( " while ( " ); }
expr
{ print( " );" ); newline(); }
)
| #( f:"for" { print( f ); print( "(" ); }
expr { print( ";" ); }
expr { print( ";" ); }
expr { print( ")" ); newline(); }
statement
)
// Jump statements:
| #( g:"goto" { print( g );}
expr { print( ";" ); newline();}
)
| c:"continue" { print( c ); print( ";" ); newline();}
| b:"break" { print( b ); print( ";" ); newline();}
| #( r:"return" { print( r ); }
( expr )?
{ print( ";" ); newline(); }
)
// Labeled statements:
| #( NLabel
ni:ID { print( ni ); print( ":" ); newline(); }
( statement )?
)
| #(
ca:"case" { print( ca ); }
expr { print( ":" ); }
(statement)?
)
| #(
de:"default" { print( de ); print( ":" ); }
(statement)?
)
// Selection statements:
| #( i:"if" { print( i ); print( "(" ); }
expr { print( ")" ); newline(); }
statement
( e:"else" { print( e ); newline(); }
statement
)?
)
| #( sw:"switch" { print( sw ); print( "(" ); }
expr { print( ")" ); newline(); }
statement
)
;
/*
exception
catch [RecognitionException ex]
{
reportError(ex);
System.out.println("PROBLEM TREE:\n"
+ _t.toStringList());
if (_t!=null) {_t = _t.getNextSibling();}
}
*/
expr
:
binaryExpr
| conditionalExpr
| castExpr
| unaryExpr
| postfixExpr
| primaryExpr
| emptyExpr
| compoundStatementExpr
| initializer
| rangeExpr
| gnuAsmExpr
;
emptyExpr
: NEmptyExpression
;
compoundStatementExpr
: #(l:LPAREN { print( l ); }
compoundStatement
r:RPAREN { print( r ); }
)
;
rangeExpr
: #(NRangeExpr expr v:VARARGS{ print( v ); } expr)
;
gnuAsmExpr
: #(n:NGnuAsmExpr { print( n ); }
(v:"volatile" { print( v ); } )?
lp:LPAREN { print( lp ); }
stringConst
( options { warnWhenFollowAmbig = false; }:
c1:COLON { print( c1 );}
(strOptExprPair
( c2:COMMA { print( c2 ); } strOptExprPair)*
)?
( options { warnWhenFollowAmbig = false; }:
c3:COLON { print( c3 ); }
(strOptExprPair
( c4:COMMA { print( c4 ); } strOptExprPair)*
)?
)?
)?
( c5:COLON { print( c5 ); }
stringConst
( c6:COMMA { print( c6 ); }
stringConst
)*
)?
rp:RPAREN { print( rp ); }
)
;
strOptExprPair
: stringConst
(
l:LPAREN { print( l ); }
expr
r:RPAREN { print( r ); }
)?
;
binaryOperator
: ASSIGN
| DIV_ASSIGN
| PLUS_ASSIGN
| MINUS_ASSIGN
| STAR_ASSIGN
| MOD_ASSIGN
| RSHIFT_ASSIGN
| LSHIFT_ASSIGN
| BAND_ASSIGN
| BOR_ASSIGN
| BXOR_ASSIGN
| LOR
| LAND
| BOR
| BXOR
| BAND
| EQUAL
| NOT_EQUAL
| LT
| LTE
| GT
| GTE
| LSHIFT
| RSHIFT
| PLUS
| MINUS
| STAR
| DIV
| MOD
| NCommaExpr
;
binaryExpr
: b:binaryOperator
// no rules allowed as roots, so here I manually get
// the first and second children of the binary operator
// and then print them out in the right order
{ TNode e1, e2;
e1 = (TNode) b.getFirstChild();
e2 = (TNode) e1.getNextSibling();
expr( e1 );
print( b );
expr( e2 );
}
;
conditionalExpr
: #( q:QUESTION
expr { print( q ); }
( expr )?
c:COLON { print( c ); }
expr
)
;
castExpr
: #(
c:NCast { print( c ); }
typeName
rp:RPAREN { print( rp ); }
expr
)
;
typeName
: specifierQualifierList (nonemptyAbstractDeclarator)?
;
nonemptyAbstractDeclarator
: #( NNonemptyAbstractDeclarator
( pointerGroup
( (lp1:LPAREN { print( lp1 ); }
( nonemptyAbstractDeclarator
| parameterTypeList
)?
rp1:RPAREN { print( rp1 ); }
)
| (
lb1:LBRACKET { print( lb1 ); }
(expr)?
rb1:RBRACKET { print( rb1 ); }
)
)*
| ( (lp2:LPAREN { print( lp2 ); }
( nonemptyAbstractDeclarator
| parameterTypeList
)?
rp2:RPAREN { print( rp2 ); }
)
| (
lb2:LBRACKET { print( lb2 ); }
(expr)?
rb2:RBRACKET { print( rb2 ); }
)
)+
)
)
;
unaryExpr
: #( i:INC { print( i ); } expr )
| #( d:DEC { print( d ); } expr )
| #( NUnaryExpr u:unaryOperator { print( u ); } expr)
| #( s:"sizeof" { print( s ); }
( ( LPAREN typeName )=>
lps:LPAREN { print( lps ); }
typeName
rps:RPAREN { print( rps ); }
| expr
)
)
| #( a:"__alignof" { print( a ); }
( ( LPAREN typeName )=>
lpa:LPAREN { print( lpa ); }
typeName
rpa:RPAREN { print( rpa ); }
| expr
)
)
;
/*
exception
catch [RecognitionException ex]
{
reportError(ex);
System.out.println("PROBLEM TREE:\n"
+ _t.toStringList());
if (_t!=null) {_t = _t.getNextSibling();}
}
*/
unaryOperator
: BAND
| STAR
| PLUS
| MINUS
| BNOT
| LNOT
| LAND
| "__real"
| "__imag"
;
postfixExpr
: #( NPostfixExpr
(
(
primaryExpr
( a:PTR b:ID { print( a ); print( b ); }
| c:DOT d:ID { print( c ); print( d ); }
| #( n:NFunctionCallArgs { print( n ); }
(argExprList)?
rp:RPAREN { print( rp ); }
)
| lb:LBRACKET { print( lb ); }
expr
rb:RBRACKET { print( rb ); }
| f:INC { print( f ); }
| g:DEC { print( g ); }
)+
)
|
( c2:"call" {print (c2);} | s2:"signal" {print (s2);} )
fn2:ID { printns( fn2 ); }
(
d2:DOT { printns (d2);}
fn22:ID { printns( fn22 ); }
)?
(interfaceParamArgs)?
#( n2:NFunctionCallArgs { print( n2 ); }
(argExprList)?
rp2:RPAREN { print( rp2 ); }
)
|
p3:"post" {print (p3);}
primaryExpr
#( n3:NFunctionCallArgs { print( n3 ); }
(argExprList)?
rp3:RPAREN { print( rp3 ); }
)
)
)
;
interfaceParamArgs
: #(lb:NInterfaceParamArgs { print( lb ); }
argExprList
rb:RBRACKET { print( rb ); }
)
;
primaryExpr
: i:ID { print( i ); }
| n:Number { print( n ); }
| charConst
| stringConst
// JTC:
// ID should catch the enumerator
// leaving it in gives ambiguous err
// | enumerator
| #( eg:NExpressionGroup { print( eg ); }
expr { print( ")" ); }
)
;
argExprList
: expr ( {print( "," );} expr )*
;
protected
charConst
: c:CharLiteral { print( c ); }
;
protected
stringConst
: #( NStringSeq
(
s:StringLiteral { print( s ); }
)+
)
;
protected
intConst
: IntOctalConst
| LongOctalConst
| UnsignedOctalConst
| IntIntConst
| LongIntConst
| UnsignedIntConst
| IntHexConst
| LongHexConst
| UnsignedHexConst
;
protected
floatConst
: FloatDoubleConst
| DoubleDoubleConst
| LongDoubleConst
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -