package Ġmin ic . frontend . ast čĊč Ċ import Ġmin ic . frontend . antlr . Mini CL ex er č Ċ import Ġmin ic . frontend . antlr . Mini C Parser .* č Ċ import Ġorg . antlr . v 4 . runtime . ParserRuleContext č Ċ import Ġorg . antlr . v 4 . runtime . Token čĊč Ċ internal Ġfun ĠToken . start Point () Ġ= ĠPoint ( line , Ġchar Position In Line ) č Ċ internal Ġfun ĠToken . end Point () Ġ= ĠPoint ( line , Ġchar Position In Line Ġ+ Ġ( if Ġ( type Ġ!= ĠMini CL ex er . EOF ) Ġtext . length Ġelse Ġ 0 )) čĊč Ċ /** čĊ Ġ* Ġ@ param Ġwith Positions Ġif Ġfalse , Ġsets Ġall Ġnodes Ġpositions Ġto Ġnull Ġ( used Ġto Ġsimplify Ġtests ) čĊ Ġ*/ č Ċ internal Ġclass ĠAnt lr To Ast Mapper ( val Ġwith Positions : ĠBoolean Ġ= Ġtrue ) Ġ{ čĊčĊĠĠĠ Ġ/** čĊĠĠĠĠ Ġ* ĠMaps ĠAN TLR Ġparse Ġto ĠAST čĊĠĠĠĠ Ġ*/ čĊĠĠĠ Ġfun Ġmap ( antlr Program Context : ĠProgram Context ) Ġ: ĠProgram Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġantlr Program Context . to Ast () čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠParser RuleContext . position () Ġ: ĠPosition ? Ġ{ čĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( with Positions ) ĠPosition ( start . start Point (), Ġstop . end Point ()) Ġelse Ġnull čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠProgram Context . to Ast () Ġ: ĠProgram Ġ= ĠProgram ( this . statement (). map Ġ{ Ġit . to Ast () Ġ}, Ġposition ()) čĊčĊĠĠĠ Ġprivate Ġfun ĠStatement Context . to Ast (): ĠStatement Ġ= Ġwhen Ġ( this ) Ġ{ čĊĠĠĠĠĠĠĠ Ġis ĠBlock Statement Context Ġ-> ĠState ments Block ( block (). statement (). map Ġ{ Ġit . to Ast () Ġ}, Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠIf Statement Context Ġ-> ĠIf Statement ( par Expression (). expression (). to Ast (), Ġif Body . to Ast (), Ġelse Body ?. to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠWhile Statement Context Ġ-> ĠWhile Statement ( par Expression (). expression (). to Ast (), Ġstatement (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠBreak Statement Context Ġ-> ĠBreak Statement ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠExit Statement Context Ġ-> ĠExit Statement ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠVariable Declaration Statement Context Ġ-> ĠVariable Declaration ( declaration (). type (). to Ast (), Ġdeclaration (). Identifier (). text , Ġdeclaration (). expression (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠAssignment Statement Context Ġ-> ĠAssignment ( assignment (). Identifier (). text , Ġassignment (). expression (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠPrint Statement Context Ġ-> ĠPrint Statement ( par Expression (). expression (). to Ast (), Ġnewline Ġ= Ġfalse , Ġposition Ġ= Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠPrint ln Statement Context Ġ-> ĠPrint Statement ( par Expression (). expression (). to Ast (), Ġnewline Ġ= Ġtrue , Ġposition Ġ= Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠEmpty Statement Context Ġ-> ĠEmpty Statement ( position ()) čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠExpression Context . to Ast (): ĠExpression Ġ= Ġwhen Ġ( this ) Ġ{ čĊĠĠĠĠĠĠĠ Ġis ĠLiteral Expression Context Ġ-> Ġliteral (). to Ast () čĊĠĠĠĠĠĠĠ Ġis ĠBinary Operation Context Ġ-> Ġto Ast () čĊĠĠĠĠĠĠĠ Ġis ĠUnary Operation Context Ġ-> Ġto Ast () čĊĠĠĠĠĠĠĠ Ġis ĠParent heses Expression Context Ġ-> Ġpar Expression (). expression (). to Ast () čĊĠĠĠĠĠĠĠ Ġis ĠVariable Reference Context Ġ-> ĠVariable Reference ( text , Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠRead Int Context Ġ-> ĠRead Int ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠRead Double Context Ġ-> ĠRead Double ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠRead Line Context Ġ-> ĠRead Line ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠToString Context Ġ-> ĠToString ( par Expression (). expression (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠLiteral Context . to Ast (): ĠExpression Ġ= Ġwhen Ġ( this ) Ġ{ čĊĠĠĠĠĠĠĠ Ġis ĠInt Context Ġ-> ĠInt Literal ( text . toInt (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠFloat Context Ġ-> ĠFloat Literal ( text . toDouble (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠBoolean Context Ġ-> ĠBoolean Literal ( text . to Boolean (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġis ĠString Context Ġ-> ĠString Literal ( text . substring ( 1 , Ġtext . last Index ), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠUnary Operation Context . to Ast (): ĠExpression Ġ= Ġwhen Ġ( op . type ) Ġ{ čĊĠĠĠĠĠĠĠ ĠMini CL ex er . NOT Ġ-> ĠNot Expression ( expression (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . MINUS Ġ-> ĠUnary Minus Expression ( expression (). to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠBinary Operation Context . to Ast (): ĠBinary Expression Ġ= Ġwhen Ġ( op . type ) Ġ{ čĊĠĠĠĠĠĠĠ ĠMini CL ex er . PLUS Ġ-> ĠAdd ition Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . MINUS Ġ-> ĠSub traction Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . MUL Ġ-> ĠMultip lication Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . DIV Ġ-> ĠDiv ision Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . MOD Ġ-> ĠMod Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊčĊĠĠĠĠĠĠĠ ĠMini CL ex er . AND Ġ-> ĠAnd Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . OR Ġ-> ĠOr Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊčĊĠĠĠĠĠĠĠ ĠMini CL ex er . EQ Ġ-> ĠEqual Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . NOT EQ Ġ-> ĠNot Equal Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . LT Ġ-> ĠLess Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . GT Ġ-> ĠG reater Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . LTE Q Ġ-> ĠLess OrEqual Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊĠĠĠĠĠĠĠ ĠMini CL ex er . G TE Q Ġ-> ĠG reater OrEqual Expression ( left . to Ast (), Ġright . to Ast (), Ġposition ()) čĊčĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} čĊčĊĠĠĠ Ġprivate Ġfun ĠType Context . to Ast (): ĠType Node Ġ= Ġwhen Ġ( this ) Ġ{ čĊĠĠĠĠĠĠĠ Ġis ĠInt Type Context Ġ-> ĠInt Type Node ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠDouble Type Context Ġ-> ĠDouble Type Node ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠBoolean Type Context Ġ-> ĠBool Type Node ( position ()) čĊĠĠĠĠĠĠĠ Ġis ĠString Type Context Ġ-> ĠString Type Node ( position ()) čĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠUnsupportedOperationException ( this . java Class . canonical Name ) čĊĠĠĠ Ġ} č Ċ } čĊ