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

📄 my.cup

📁 非常好的编译源代码 将一个l语言转换为中间代码 java版本
💻 CUP
📖 第 1 页 / 共 2 页
字号:
		;//函数,数组 参数列表call_lists	::=	expression:e {:					//RESULT=new NonTerminal();					callList =new ArrayList();					callList.add(e.place);					:}		|	expression:e COMMA call_lists {:							callList.add(e.place);:}		|		;method_invocation	::=	IDENTIFIER:e LPAREN call_lists RPAREN {:									//RESULT=new NonTerminal();									for(int i=0; i< callList.size();i++)										codeTable.gen("param" ,callList.get(i).toString(),"_","_");																		codeTable.gen("call" ,e,"_","_");									:}			;		  array_access	::=	Elist:e1 RBRACK {:						RESULT=new NonTerminal();						RESULT.place=NonTerminal.generateName();						codeTable.gen("-",e1.array,C(e1.array)+"",RESULT.place);						RESULT.offset=NonTerminal.generateName();						codeTable.gen("*",e1.place,W(e1.array)+"",RESULT.offset);					:}		;Elist ::= IDENTIFIER:e1 LBRACK expression:e2 {:						RESULT=new NonTerminal();						RESULT.place = e2.place; 						RESULT.ndim=1;						RESULT.array=e1;												:}	;Elist ::= Elist:e1 COMMA expression:e2 {:						RESULT=new NonTerminal();						String t=NonTerminal.generateName();int m= e1.ndim+1;						codeTable.gen("*",e1.place,limit(e1.array,m)+"",t);						codeTable.gen("+",e2.place,t,t);						RESULT.array = e1.array;						RESULT.place=t;						RESULT.ndim=m;					:}	;postfix_expression	::=	literal:e {:						RESULT =new NonTerminal(); RESULT.place = e.toString();					:}			|	method_invocation			|	array_access :e {:							RESULT=new NonTerminal();							RESULT.place=NonTerminal.generateName();							codeTable.gen("=[]",e.place,e.offset+"",RESULT.place);						:}			|	IDENTIFIER {:						int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;						int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;						java_cup.runtime.Symbol e = ((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0));						RESULT =(NonTerminal)(symTable.retrieve((String)e.value));						if(RESULT == null) {							parser.report_fatal_error("未声明变量 !", e);							}						:}			|	postincrement_expression			|	postdecrement_expression			;postincrement_expression	::=	postfix_expression PLUSPLUS				;postdecrement_expression	::=	postfix_expression MINUSMINUS				;unary_expression	::=	preincrement_expression			|	predecrement_expression			|	PLUS unary_expression			|	MINUS unary_expression:e  {:								RESULT =new NonTerminal();								RESULT.place=NonTerminal.generateName();								codeTable.gen("-","0",e.place,RESULT.place) ;								:}			|	unary_expression_not_plus_minus:e {:									RESULT =new NonTerminal(); 									RESULT.place=e.place;									RESULT.truelist = e.truelist;									RESULT.falselist = e.falselist ;									:}			;preincrement_expression	::=	PLUSPLUS unary_expression			;predecrement_expression ::=	MINUSMINUS unary_expression			;unary_expression_not_plus_minus	::=	postfix_expression:e {:								RESULT =new NonTerminal();								RESULT.place = e.place;								RESULT.truelist = e.truelist;								RESULT.falselist = e.falselist ;								:}				|	NOT unary_expression:e {:									RESULT =new NonTerminal(); 									RESULT.truelist=e.falselist;									RESULT.falselist=e.truelist;								:}				;multiplicative_expression	::=	unary_expression:e {:								RESULT =new NonTerminal();								RESULT.place=e.place;								RESULT.truelist = e.truelist;								RESULT.falselist = e.falselist ;								:}				|	multiplicative_expression:e1 MULT unary_expression:e2 {:												RESULT =new NonTerminal(); 												RESULT.place=NonTerminal.generateName();												codeTable.gen("*",e1.place,e2.place,RESULT.place);												:}				|	multiplicative_expression:e1 DIV unary_expression:e2 {:												RESULT =new NonTerminal(); 												RESULT.place=NonTerminal.generateName();												codeTable.gen("/",e1.place,e2.place,RESULT.place);												:}				|	multiplicative_expression:e1 MOD unary_expression:e2 {:												RESULT =new NonTerminal(); 												RESULT.place=NonTerminal.generateName();												codeTable.gen("%",e1.place,e2.place,RESULT.place);												:}				;additive_expression	::=	multiplicative_expression:e {:								RESULT =new NonTerminal();								RESULT.place=e.place;								RESULT.truelist = e.truelist;								RESULT.falselist = e.falselist ;								:}			|	additive_expression:e1 PLUS multiplicative_expression:e2 {:												RESULT =new NonTerminal(); 												RESULT.place=NonTerminal.generateName();												codeTable.gen("+",e1.place,e2.place,RESULT.place);												:}			|	additive_expression:e1 MINUS multiplicative_expression:e2 {:												RESULT =new NonTerminal(); 												RESULT.place=NonTerminal.generateName();												codeTable.gen("-",e1.place,e2.place,RESULT.place);												:}			;shift_expression	::=	additive_expression:e {:							RESULT =new NonTerminal();							RESULT.place=e.place;							RESULT.truelist = e.truelist;							RESULT.falselist = e.falselist ;							:}			|	shift_expression LSHIFT additive_expression			|	shift_expression RSHIFT additive_expression			;relational_expression ::=		shift_expression:e {:					RESULT =new NonTerminal();					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	relational_expression:e1 LT shift_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j < ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}	|	relational_expression:e1 GT shift_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j > ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}	|	relational_expression:e1 LTEQ shift_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j <= ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}	|	relational_expression:e1 GTEQ shift_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j >= ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}		;equality_expression ::=		relational_expression:e {:						RESULT =new NonTerminal();						RESULT.place=e.place;						RESULT.truelist = e.truelist;						RESULT.falselist = e.falselist ;						:}	|	equality_expression:e1 EQEQ relational_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j == ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}	|	equality_expression:e1 NOTEQ relational_expression:e2 {:								RESULT =new NonTerminal();								RESULT.truelist=CodeTable.nextquad;								RESULT.falselist=CodeTable.nextquad+1;								codeTable.gen("j <> ",e1.place,e2.place,"0");								codeTable.gen("j","_","_","0");								:}	;and_expression ::=		equality_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	and_expression AND equality_expression	;exclusive_or_expression ::=		and_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	exclusive_or_expression XOR and_expression	;inclusive_or_expression ::=		exclusive_or_expression:e {:						RESULT =new NonTerminal();						RESULT.truelist = e.truelist;						RESULT.falselist = e.falselist;						RESULT.place=e.place;						:}	|	inclusive_or_expression OR exclusive_or_expression	;conditional_and_expression ::=		inclusive_or_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	conditional_and_expression:e1 ANDAND M:e3 inclusive_or_expression:e2 {:											codeTable.backpath(e1.truelist,e3.quad);											RESULT =new NonTerminal();											RESULT.falselist=codeTable.merge(e1.falselist,e2.falselist);											RESULT.truelist=e2.truelist;											:}	;conditional_or_expression ::=		conditional_and_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	conditional_or_expression:e1 OROR M:e3 conditional_and_expression:e2 {:											codeTable.backpath(e1.falselist,e3.quad);											RESULT =new NonTerminal();											RESULT.truelist=codeTable.merge(e1.truelist,e2.truelist);											RESULT.falselist=e2.falselist;										:}	;M	::=  {:		RESULT =new NonTerminal();		RESULT.quad=CodeTable.nextquad;		:}	;conditional_expression ::=		conditional_or_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	conditional_or_expression QUESTION expression 			COLON conditional_expression	;assignment_expression ::=		conditional_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	|	assignment:e {:RESULT =new NonTerminal(); RESULT.place=e.place;:}	;assignment ::=	left_hand_side:e1 assignment_operator:e2 assignment_expression:e3 {:											RESULT =new NonTerminal();											//RESULT.nextlist= CodeTable.nextquad;											if(e1.offset==null)												codeTable.gen(e2.place,e3.place,"_",e1.place);											else {												codeTable.gen(e2.place,e3.place,"_",e1.place+"["+e1.offset+"]");												}											:}	;left_hand_side ::=		IDENTIFIER {:				int eleft = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).left;				int eright = ((java_cup.runtime.Symbol)CUP$Parser$stack.elementAt(CUP$Parser$top-0)).right;				java_cup.runtime.Symbol e = ((java_cup.runtime.Symbol) CUP$Parser$stack.elementAt(CUP$Parser$top-0));				RESULT =(NonTerminal)(symTable.retrieve((String)e.value));					if(RESULT == null) {						parser.report_fatal_error("未声明变量 !", e);					}				:}	|	array_access:e {:					RESULT=new NonTerminal();					RESULT.place=e.place;					RESULT.offset=e.offset;				:}	;assignment_operator ::=		ASSIGN:e {: RESULT=new NonTerminal();RESULT.place=":=";:}	|	MULTEQ:e {: RESULT=new NonTerminal();RESULT.place="*=";:}	|	DIVEQ:e {: RESULT=new NonTerminal();RESULT.place="/=";:}	|	MODEQ:e {: RESULT=new NonTerminal();RESULT.place="%=";:}	|	PLUSEQ:e {: RESULT=new NonTerminal();RESULT.place="+=";:}	|	MINUSEQ:e {: RESULT=new NonTerminal();RESULT.place="-=";:}	|	LSHIFTEQ	|	RSHIFTEQ	|	ANDEQ	|	XOREQ	|	OREQ	;expression ::=	assignment_expression:e {:					RESULT =new NonTerminal(); 					RESULT.place=e.place;					RESULT.truelist = e.truelist;					RESULT.falselist = e.falselist ;					:}	;/***基本元素*/literal ::=	INTEGER_LITERAL:e {:RESULT=new Integer(e.intValue());:}	|	FLOATING_POINT_LITERAL	|	BOOLEAN_LITERAL	|	CHARACTER_LITERAL	|	STRING_LITERAL	;type ::=		numeric_type	|	BOOLEAN	;numeric_type::=	integral_type	|	floating_point_type	;integral_type ::= 		BYTE 	|	SHORT 	|	INTEGER 	|	LONG 	|	CHAR 	;floating_point_type ::= 		FLOAT 	|	REAL	;//****************************************************************END	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -