📄 cpptree.g
字号:
{ r = expMacro.getExpansion(); } Macrox_stack.pop(); } else if(expObject instanceof ObjectMacro) { r = ((ObjectMacro)expObject).getExpansion() + "()"; } } else { r = id.toString() + "()"; } } else { r = id.toString() + "()"; } } | ^(EXPAND id=IDENTIFIER lst=macArgs[expand]) { if(expand) { if(isMacroDefined(id.toString())) { Object expObject = getMacroObject(id.toString()); if(expObject instanceof FunctionMacro) { Macrox_stack.push(new Macros_scope()); ((Macros_scope)Macrox_stack.peek()).defines = new HashMap(); FunctionMacro expMacro = (FunctionMacro)expObject; if(expMacro.haveArgs()) { MacroParameter parm; List formalArgs = expMacro.getArgList(); int argSize = formalArgs.size(); int lstSize = lst.size(); parm=(MacroParameter)formalArgs.get(argSize-1); if(parm.type == ELLIPSIS || parm.type == EXP_ARGS) { ExpressionReturn variadics = new ExpressionReturn(); variadics.text = ""; if(argSize == 1) { for(int i = 0; i<lstSize; i++) { variadics.text += ((ExpressionReturn)lst.get(i)).text; if( i != lstSize-1) variadics.text += ","; } putMacroParameter(((parm.type == ELLIPSIS)? "__VA_ARGS__":parm.text), variadics); r = expMacro.getExpansion(); } else { if(lstSize < argSize -1) { System.err.println("Function Macro Call Not Defined:"+id.toString()); r = id.toString()+"("; for (int i=0; i<lstSize; i++) { ExpressionReturn exp = (ExpressionReturn)lst.get(i); r += exp.text; if( i != lstSize-1) r += ","; } r += ")"; } else { if(lstSize == argSize -1) { for (int i=0; i<lstSize; i++) { putMacroObject(((MacroParameter)formalArgs.get(i)).text, lst.get(i)); } variadics.text = "__VA_ARGS__"; } else { for (int i=0; i<argSize-1; i++) { putMacroParameter(((MacroParameter)formalArgs.get(i)).text, lst.get(i)); } for(int i = argSize-1; i<lstSize; i++) { variadics.text += ((ExpressionReturn)lst.get(i)).text; if( i != lstSize-1) variadics.text += ","; } } putMacroParameter(((parm.type == ELLIPSIS)? "__VA_ARGS__":parm.text), variadics); r = expMacro.getExpansion(); } } } else { if(formalArgs.size() != lst.size()) { System.err.println("// error: macro \"" + id.toString() +"\" passed " + lst.size()+ " arguments, but takes just " +formalArgs.size()); r = id.toString(); } else { for (int i=0; i<formalArgs.size(); i++) { putMacroParameter(((MacroParameter)formalArgs.get(i)).text, lst.get(i)); } r = expMacro.getExpansion(); } } } else { System.err.println("// error: macro \"" + id.toString() + "\" passed " + lst.size()+ " arguments, but takes just 0 " ); r = id.toString(); } Macrox_stack.pop(); } else { System.err.println("Function Macro Call Not Defined:"+id.toString()); r = id.toString()+"("; for (int i=0; i<lst.size(); i++) { ExpressionReturn exp = (ExpressionReturn)lst.get(i); r += exp.text; if( i != lst.size()-1) r += ","; } r += ")"; } } else { int argSize = lst.size(); r = id.toString()+"("; for (int i=0; i<argSize; i++) { ExpressionReturn exp = (ExpressionReturn)lst.get(i); if(!exp.text.equals("__VA_ARGS__")) r += exp.text; if(i==argSize-2) { ExpressionReturn lastExp = (ExpressionReturn)lst.get(lst.size()-1); if(lastExp.text.equals("__VA_ARGS_EMPTY__")) break; } if( i != argSize-1) r += ","; } r += ")"; } } else { r = id.toString()+"("; for (int i=0; i<lst.size(); i++) { ExpressionReturn exp = (ExpressionReturn)lst.get(i); r += exp.text; if( i != lst.size()-1) r += ","; } r += ")"; } } ;macArgs[boolean expand] returns [List r]@init { r = new ArrayList();} : ^(EXP_ARGS (a=mArg[expand] { ExpressionReturn arg = new ExpressionReturn(); arg.text = a; r.add(arg); } )+) ;mArg[boolean expand] returns [String r]@init { r = new String(""); } : ^(EXP_ARG (a=source_text[expand] { r += a; } )+) | EXP_ARG { r = " "; } ;macroExecution returns [int r] : ^(EXEC_MACRO a=expression) { r = a; } ;expression returns [int r]@init {r = 0;} : ^(EXPR a=expr) { r = a; } | ^(EXPR_DEF id=IDENTIFIER) { r = isMacroDefined(id.toString()) ? 1: 0 ; } | ^(EXPR_NDEF id= IDENTIFIER) { r = isMacroDefined(id.toString()) ? 0: 1 ; } ;expr returns [int r]@init { r = 0; } : ( a=assignmentExpression | a=conditionalExpression | a=logicalOrExpression | a=logicalAndExpression | a=inclusiveOrExpression | a=exclusiveOrExpression | a=andExpression | a=equalityExpression | a=relationalExpression | a=shiftExpression | a=additiveExpression | a=multiplicativeExpression | a=unaryExpression | a=postfixExpression | a=primaryExpression ) { r = a; } ;assignmentExpression returns [int r]@init {r = 0;} : ^(o=ASSIGNEQUAL a=expr b=expr) { r = a; } | ^(o=TIMESEQUAL a=expr b=expr) { a *= b; r = a;} | ^(o=DIVIDEEQUAL a=expr b=expr) { a /= b; r = a;} | ^(o=PLUSEQUAL a=expr b=expr) { a += b; r = a;} | ^(o=MINUSEQUAL a=expr b=expr) { a -= b; r = a;} | ^(o=SHIFTLEFTEQUAL a=expr b=expr) { a <<= b; r = a;} | ^(o=SHIFTRIGHTEQUAL a=expr b=expr) { a >>= b; r = a;} | ^(o=BITWISEANDEQUAL a=expr b=expr) { a &= b; r = a;} | ^(o=BITWISEXOREQUAL a=expr b=expr) { a ^= b; r = a;} | ^(o=BITWISEOREQUAL a=expr b=expr) { a |= b; r = a;} | ^(o=MODEQUAL a=expr b=expr) { a =Mod(a,b); r = a;} ;conditionalExpression returns [int r]@init {r = 0;} : ^( QUESTIONMARK a=expr b=expr COLON c=expr ) { r = ((a!=0) ? b:c); } ;logicalOrExpression returns [int r]@init {r = 0;} : ^( o=OR a=expr b=expr ) { r = ((a!=0||b!=0) ? 1:0); } ; logicalAndExpression returns [int r]@init {r = 0;} : ^( o=AND a=expr b=expr ) { r = (((a!=0)&&(b!=0)) ? 1:0); } ;inclusiveOrExpression returns [int r]@init {r = 0;} : ^( o=BITWISEOR a=expr b=expr ) { r = a|b; } ;exclusiveOrExpression returns [int r]@init {r = 0;} : ^( o=BITWISERXOR a=expr b=expr ) { r = a^b; } ;andExpression returns [int r]@init {r = 0;} : ^( o=AMPERSAND a=expr b=expr ) { r = a&b; } ;equalityExpression returns [int r]@init {r = 0;} : ^(o=NOTEQUAL a=expr b=expr ) { r = ((a != b) ? 1:0); } | ^(o=EQUAL a=expr b=expr ) { r = ((a == b) ? 1:0); } ;relationalExpression returns [int r]@init {r = 0;} : ^(o=LESSTHAN a=expr b=expr ) { r = ((a < b) ? 1:0); } | ^(o=GREATERTHAN a=expr b=expr ) { r = ((a > b) ? 1:0); } | ^(o=LESSTHANOREQUALTO a=expr b=expr ) { r = ((a <= b) ? 1:0); } | ^(o=GREATERTHANOREQUALTO a=expr b=expr ) { r = ((a >= b) ? 1:0); } ;shiftExpression returns [int r]@init {r = 0;} : ^(o=SHIFTLEFT a=expr b=expr ) { r = a<<b; } | ^(o=SHIFTRIGHT a=expr b=expr ) { r = a>>b; } ;additiveExpression returns [int r]@init {r = 0;} : ^(o=PLUS a=expr b=expr ) { r = a+b; } | ^(o=MINUS a=expr b=expr ) { r = a-b; } ;multiplicativeExpression returns [int r]@init {r = 0;} : ^(o=STAR a=expr b=expr) { r = a*b; } | ^(o=DIVIDE a=expr b=expr) { r = a/b; } | ^(o=MOD a=expr b=expr) { r = Mod(a,b); } ;unaryExpression returns[int r]@init {r = 0; } : ^(o=PLUSPLUS a=expr) { r = ++a; } | ^(o=MINUSMINUS a=expr) { r = --a; } | ^(o=REFERANCE a=expr) { r =1; } | ^(o=POINTER_AT a=expr) { r =1; } | ^(o=UNARY_MINUS a=expr) { r = +a; } | ^(o=UNARY_PLUS a=expr) { r = -a; } | ^(SIZEOF a=expr) { r = 1; } | ^(SIZEOF_TYPE b=IDENTIFIER) { r = 1; } | ^(o=NOT a=expr) { r = ((a!=0) ? 0:1); } | ^(o=TILDE a=expr) { r = ((a!=0) ? 0:1); } | ^(o=TYPECAST b=IDENTIFIER a=expr ) { r = 1; } | ^(DEFINED b=IDENTIFIER) { r = isMacroDefined(b.toString()) ? 1: 0 ; } ;postfixExpression returns [int r]@init {r = 0;} : ^(POST_INC a=expr ) { r = a++; } | ^(POST_DEC a=expr ) { r = a--; } | ^(POINTERTO a=expr i=IDENTIFIER ) { r = 1; } | ^(POINTER a=expr i=IDENTIFIER ) { r = 1; } | ^(DOT a=expr i=IDENTIFIER ) { r = 1; } | ^(INDEX_OP a=expr b=expr ) { r = 1; } ;primaryExpression returns [int r]@init {r = 0;} : c=constant[true] { r = c.value; } | ^(EXPR_GROUP b=expr) { r = b; } | id=IDENTIFIER { if(isMacroDefined(id.toString())) { Object expObject = getMacroObject(id.toString()); if(expObject instanceof ObjectMacro) { r = ((ObjectMacro)expObject).getExpandedValue(); } else if( expObject instanceof ExpressionReturn) { r = ((ExpressionReturn)expObject).value; } else if( expObject instanceof FunctionMacro) { r = 0; } } else { r = 0; } } | ^(METHOD_CALL id=IDENTIFIER ) { if(isMacroDefined(id.toString())) { Object expObject = getMacroObject(id.toString()); if(expObject instanceof FunctionMacro) { FunctionMacro expMacro = (FunctionMacro)expObject; if(expMacro.haveArgs()) { r = 0; System.out.println("Not Exist Parameter List"); } else { r = expMacro.getExpandedValue(); } } else if(expObject instanceof ObjectMacro) { r = ((ObjectMacro)expObject).getExpandedValue(); } } else { r = 0; } } | ^(METHOD_CALL id=IDENTIFIER lst=argList) { if(isMacroDefined(id.toString())) { Object expObject = getMacroObject(id.toString()); if(expObject instanceof FunctionMacro) { Macrox_stack.push(new Macros_scope()); ((Macros_scope)Macrox_stack.peek()).defines = new HashMap(); FunctionMacro expMacro = (FunctionMacro)expObject; if(expMacro.haveArgs()) { List formalArgs = expMacro.getArgList(); if(formalArgs.size() != lst.size()) { r = 0; System.err.println(" error: macro \"" + id.toString() + "\" passed " + lst.size()+ " arguments, but takes just " + formalArgs.size()); } else { for (int i=0; i<formalArgs.size(); i++) { putMacroParameter(((MacroParameter)formalArgs.get(i)).text, lst.get(i)); } r = expMacro.getExpandedValue(); } } else { r = 0; System.err.println(" error: macro \"" + id.toString() + "\" passed " + lst.size()+ " arguments, but takes just 0" ); } Macrox_stack.pop(); } else { System.err.println("Function Macro Call Not Defined:"+id.toString()); } } else { r = 0; } } ;argList returns [List r]@init { r = new ArrayList(); } : ^(ARGS (a=expr { ExpressionReturn arg = new ExpressionReturn(); arg.value = a; r.add(arg); } )+) ;constant[boolean eval] returns [ExpressionReturn r]@init {r = new ExpressionReturn();} : c=HEX_LITERAL { if(eval) { String decString = c.toString(); if(c.toString().endsWith("ul") || c.toString().endsWith("UL")) { decString = c.toString().substring(0,c.toString().length()-2); } else if( c.toString().endsWith("u") || c.toString().endsWith("U") || c.toString().endsWith("l") || c.toString().endsWith("L") ) { decString = c.toString().substring(0,c.toString().length()-1); } r.value = Long.decode(decString).intValue(); } else { r.text = c.toString(); } } | c=OCTAL_LITERAL { if(eval) { String decString = c.toString(); if(c.toString().endsWith("ul") || c.toString().endsWith("UL")) { decString = c.toString().substring(0,c.toString().length()-2); } else if( c.toString().endsWith("u") || c.toString().endsWith("U") || c.toString().endsWith("l") || c.toString().endsWith("L") ) { decString = c.toString().substring(0,c.toString().length()-1); } r.value = Long.decode(decString).intValue(); } else { r.text = c.toString(); } } | c=DECIMAL_LITERAL { if(eval) { String decString = c.toString(); if(c.toString().endsWith("ul") || c.toString().endsWith("UL")) { decString = c.toString().substring(0,c.toString().length()-2); } else if( c.toString().endsWith("u") || c.toString().endsWith("U") || c.toString().endsWith("l") || c.toString().endsWith("L") ) { decString = c.toString().substring(0,c.toString().length()-1); } r.value = (new Integer(decString.toString())).intValue(); } else { r.text = c.toString(); } } | c=FLOATING_POINT_LITERAL { if(eval) { r.value = (new Float(c.toString())).intValue(); } else { r.text = c.toString(); } } | c=CHARACTER_LITERAL { if(eval) { String cs = c.toString(); char d = cs.charAt(1); Character Ch = new Character(d); r.value = Ch.charValue(); } else { r.text = c.toString(); } } | c=STRING_LITERAL { if(eval) r.value = (new Integer(c.toString())).intValue(); else r.text = c.toString(); } ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -