📄 expandednescemitter.g
字号:
| 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
)
;
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
)
)
;
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
;
// inherited from grammar GnuCTreeParser
commaExpr :#(NCommaExpr expr expr)
;
// inherited from grammar GnuCTreeParser
assignExpr :#( ASSIGN expr expr)
| #( DIV_ASSIGN expr expr)
| #( PLUS_ASSIGN expr expr)
| #( MINUS_ASSIGN expr expr)
| #( STAR_ASSIGN expr expr)
| #( MOD_ASSIGN expr expr)
| #( RSHIFT_ASSIGN expr expr)
| #( LSHIFT_ASSIGN expr expr)
| #( BAND_ASSIGN expr expr)
| #( BOR_ASSIGN expr expr)
| #( BXOR_ASSIGN expr expr)
;
// inherited from grammar GnuCTreeParser
logicalOrExpr :#( LOR expr expr)
;
// inherited from grammar GnuCTreeParser
logicalAndExpr :#( LAND expr expr )
;
// inherited from grammar GnuCTreeParser
inclusiveOrExpr :#( BOR expr expr )
;
// inherited from grammar GnuCTreeParser
exclusiveOrExpr :#( BXOR expr expr )
;
// inherited from grammar GnuCTreeParser
bitAndExpr :#( BAND expr expr )
;
// inherited from grammar GnuCTreeParser
equalityExpr :#( EQUAL expr expr)
| #( NOT_EQUAL expr expr)
;
// inherited from grammar GnuCTreeParser
relationalExpr :#( LT expr expr)
| #( LTE expr expr)
| #( GT expr expr)
| #( GTE expr expr)
;
// inherited from grammar GnuCTreeParser
shiftExpr :#( LSHIFT expr expr)
| #( RSHIFT expr expr)
;
// inherited from grammar GnuCTreeParser
additiveExpr :#( PLUS expr expr)
| #( MINUS expr expr)
;
// inherited from grammar GnuCTreeParser
multExpr :#( STAR expr expr)
| #( DIV expr expr)
| #( MOD expr expr)
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -