import Ġorg . object web . asm . Class Writer Ċ import Ġorg . object web . asm . Label Ċ import Ġorg . object web . asm . Method Visitor Ċ import Ġorg . object web . asm . Op codes .* Ċ import Ġjava . io . File Ċ import Ġjava . util .* Ċ import Ġjavax . lang . model . Source Version Ċ Ċ /** Ċ Ġ* ĠTrans lates Ġtoken ized ĠBr ain f uck / PET OO OH Ġcode Ġto ĠJVM Ġbytecode . Ċ Ġ* Ġ@ author ĠK ir ill ĠFed ose ev , ĠI van ĠRe zn ik Ċ Ġ*/ Ċ class ĠToken Compiler Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp iles Ġtokens Array ĊĠĠĠĠ Ġ* Ġ@ returns Ġbyte - code Ġof Ġthe Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġbegin Label Stack Ġ= ĠStack < Label >() ĊĠĠĠ Ġprivate Ġval Ġend Label Stack Ġ= ĠStack < Label >() ĊĠĠĠ Ġprivate Ġval ĠSIZE ARRAY Ġ= Ġ 3 0 0 0 0 ĊĊĠĠĠ Ġprivate Ġvar Ġtokens Ġ= ĠArray ( 0 , Ġ{ ĠToken . PLUS Ġ}) ĊĊĠĠĠ Ġfun Ġcompile ( tokens : ĠArray < Token >, Ġoutput : ĠString ): ĠByteArray ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif (! Source Version . is Identifier ( output ) Ġ|| ĠSource Version . is Keyword ( output )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Your Ġname Ġof Ġclass Ġis Ġinvalid .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . tokens Ġ= Ġtokens ĊĠĠĠĠĠĠĠ Ġval Ġwriter Ġ= ĠFile ( output Ġ+ Ġ". class ") ĊĠĠĠĠĠĠĠ Ġval Ġcw Ġ= ĠClass Writer ( 0 ) ĊĠĠĠĠĠĠĠ Ġcw . visit ( V 1 _ 7 , ĠACC _ PUBLIC , Ġoutput , Ġnull , Ġ" java / lang / Object ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġval Ġvm Ġ= Ġcw . visit Method ( ACC _ PUBLIC Ġ+ ĠACC _ STATIC , Ġ" main ", Ġ" ([ Ljava / lang / String ;) V ", Ġnull , Ġnull ) ĊĠĠĠĠĠĠĠ Ġwith ( vm ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Code () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġarray [ 3 0 0 0 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Int Insn ( S IP USH , ĠSIZE ARRAY ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Int Insn ( NE WAR R AY , ĠT _ CHAR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( AST ORE , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Make Ġcursor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Var Insn ( IST ORE , Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. tokens . size Ġ- Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( tokens [ i ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . PLUS Ġ-> Ġsum Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . MINUS Ġ-> Ġsub Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . LEFT Ġ-> Ġleft Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . RIGHT Ġ-> Ġright Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . WRITE Ġ-> Ġwrite Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . READ Ġ-> Ġread Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . BEGIN Ġ-> Ġbegin Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠToken . END Ġ-> Ġend Compile () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Insn ( RETURN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit Max s ( 4 , Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvisit End () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġcw . visit End () ĊĠĠĠĠĠĠĠ Ġwriter . write Bytes ( cw . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġcw . toByteArray () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġ 1 Ġto Ġcurrent Ġelement Ġof Ġarray ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . sum Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( DUP 2 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CAL O AD ) ĊĠĠĠĠĠĠĠ Ġ// visit Int Insn ( B IP USH , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I ADD ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CA STORE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSub s Ġ 1 Ġfrom Ġcurrent Ġelement Ġof Ġarray ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . sub Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( DUP 2 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CAL O AD ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ M 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I ADD ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CA STORE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġcursor Ġto Ġthe Ġleft ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . left Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ M 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I ADD ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( DUP ) ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġvisit Jump Insn ( IF GE , Ġlabel ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( POP ) ĊĠĠĠĠĠĠĠ Ġvisit Int Insn ( S IP USH , ĠSIZE ARRAY Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Label ( label ) ĊĠĠĠĠĠĠĠ Ġvisit Frame ( F _ FULL , Ġ 2 , ĠarrayOf ("[ C ", ĠINTEGER ), Ġ 1 , ĠarrayOf ( INTEGER )) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( IST ORE , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMov es Ġcursor Ġto Ġthe Ġright ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . right Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I ADD ) ĊĠĠĠĠĠĠĠ Ġval Ġlabel Ġ= ĠLabel () ĊĠĠĠĠĠĠĠ Ġvisit Insn ( DUP ) ĊĠĠĠĠĠĠĠ Ġvisit Int Insn ( S IP USH , ĠSIZE ARRAY Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Jump Insn ( IF _ IC MP LE , Ġlabel ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( POP ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( ICON ST _ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Label ( label ) ĊĠĠĠĠĠĠĠ Ġvisit Frame ( F _ FULL , Ġ 2 , ĠarrayOf ("[ C ", ĠINTEGER ), Ġ 1 , ĠarrayOf ( INTEGER )) ĊĠĠĠĠĠĠĠ Ġvisit Int Insn ( IST ORE , Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġbyte Ġfrom Ġinput ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . read Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Field Insn ( GET STATIC , Ġ" java / lang / System ", Ġ" in ", Ġ" Ljava / io / InputStream ; ") ĊĠĠĠĠĠĠĠ Ġvisit Method Insn ( IN VOKE VIRTUAL , Ġ" java / io / InputStream ", Ġ" read ", Ġ" () I ", Ġfalse ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I 2 B ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CA STORE ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWrites Ġchar Ġto Ġoutput ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . write Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Field Insn ( GET STATIC , Ġ" java / lang / System ", Ġ" out ", Ġ" Ljava / io / Print Stream ; ") ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CAL O AD ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( I 2 C ) ĊĠĠĠĠĠĠĠ Ġvisit Method Insn ( IN VOKE VIRTUAL , Ġ" java / io / Print Stream ", Ġ" println ", Ġ"( C ) V ", Ġfalse ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp iles Ġbeginning Ġof Ġloop ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . begin Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġbegin Label Stack . push ( Label ()) ĊĠĠĠĠĠĠĠ Ġend Label Stack . push ( Label ()) ĊĠĠĠĠĠĠĠ Ġvisit Label ( begin Label Stack . last Element ()) ĊĠĠĠĠĠĠĠ Ġvisit Frame ( F _ FULL , Ġ 2 , ĠarrayOf ("[ C ", ĠINTEGER ), Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( AL O AD , Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġvisit Var Insn ( I LOAD , Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġvisit Insn ( CAL O AD ) ĊĠĠĠĠĠĠĠ Ġvisit Jump Insn ( IF EQ , Ġend Label Stack . last Element ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComp iles Ġexit Ġfrom Ġloop Ġor Ġgoing Ġto Ġbeginning Ġof Ġloop ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠMethod Visitor . end Compile () Ġ{ ĊĠĠĠĠĠĠĠ Ġvisit Jump Insn ( GOTO , Ġbegin Label Stack . last Element ()) ĊĠĠĠĠĠĠĠ Ġvisit Label ( end Label Stack . last Element ()) ĊĠĠĠĠĠĠĠ Ġvisit Frame ( F _ FULL , Ġ 2 , ĠarrayOf ("[ C ", ĠINTEGER ), Ġ 0 , Ġnull ) ĊĠĠĠĠĠĠĠ Ġbegin Label Stack . pop () ĊĠĠĠĠĠĠĠ Ġend Label Stack . pop () ĊĠĠĠ Ġ} Ċ }