⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpptree.g

📁 C Preprocessor,antlr的grammar语言描述,用于学习词法分析,语法分析
💻 G
📖 第 1 页 / 共 2 页
字号:
							{								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 + -