📄 my.cup
字号:
;//函数,数组 参数列表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 + -