import Ġx iao Language . ast .* Ċ import Ġx iao Language . ast . Function Ċ import Ġx iao Language . lexer . Lexer Ċ import Ġx iao Language . parser . Parser Ċ import Ġx iao Language . tokens . TokenType Ċ import Ġx iao Language . util . Report Ċ import Ġx iao Language . util . String Stream Ċ import Ġjava . io . File Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNot Equals Ċ Ċ class ĠParser Test Ġ{ ĊĠĠĠ Ġdata Ġclass ĠExpected Class Data ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġfunctions : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġfunction Parameters : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġfunction ParameterType : ĠList < String >? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠExpected Function Data ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġparameter : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval Ġparameter Type : ĠList < String >? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġval ĠreturnType : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠExpected Variable Data ( ĊĠĠĠĠĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġvalue : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠString ? Ġ= Ġnull ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠExpected Operator Data ( ĊĠĠĠĠĠĠĠ Ġval Ġexpressions : ĠList < String >, ĊĠĠĠĠĠĠĠ Ġval Ġoperator : ĠList < String > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠExpected Path Data ( ĊĠĠĠĠĠĠĠ Ġval Ġnames : ĠList < String > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġdata Ġclass ĠExpected Token Data ( ĊĠĠĠĠĠĠĠ Ġval Ġliteral : ĠString , ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠTokenType ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġparse Ġto ĠAbstract ĠSyntax ĠTree ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġparser Test ( filePath : ĠString ): ĠMutable List < AST Node > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( this :: class . java . getResource ( filePath ) !!. path ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Stream Ġ= ĠString Stream ( file ) ĊĠĠĠĠĠĠĠ Ġval Ġlex Ġ= ĠLex er ( string Stream ) ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠParser ( lex , Ġfile ) ĊĠĠĠĠĠĠĠ Ġval Ġ( ast , Ġreports ) Ġ= Ġparser . parser () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( report Ġin Ġreports ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report Ġis ĠReport . Error ) Ġast . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport . print Report ( file . read Lines (), ĠfilePath ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġast ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġimport ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Import Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf (" xiao / Math ", Ġ" test 2 ", Ġ" xiao / Math / plus ") ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / import / import . xiao ") ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠImport ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġnode . path . join ToString ("/") Ġ{ Ġit . literal Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ], Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġfunction ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Function Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Function Data (" main "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Function Data (" test 2 3 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Function Data (" test 3 3 ", ĠlistOf (" name "), ĠlistOf (" Str ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Function Data (" test 3 4 ", ĠlistOf (" name ", Ġ" info "), ĠlistOf (" Str ", Ġ" Int ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Function Data (" test 6 6 ", Ġnull , Ġnull , Ġ" Str ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / functions / function . xiao ") ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠFunction ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġnode . function Name . literal ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. name , Ġname ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnode . parameters . map Indexed Ġ{ Ġindex 2 , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. parameter ?. get ( index 2 ), Ġparameter . name . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. parameter Type ?. get ( index 2 ), Ġparameter . type . type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. returnType , Ġnode . returnType ?. type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Class Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / classes / class . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Class Data (" A "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Class Data (" B 1 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Class Data (" ABC ", ĠlistOf (" test ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Class Data (" AAC ", ĠlistOf (" test ", Ġ" test 2 ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Class Data (" AAA ", ĠlistOf (" test "), ĠlistOf (" name "), ĠlistOf (" Str ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ast Node Ġis ĠClass ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. name , Ġast Node . className . literal ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast Node . functions . map Indexed Ġ{ Ġindex 2 , Ġfunction Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. functions ?. get ( index 2 ), Ġfunction . function Name . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfunction . parameters . map Indexed Ġ{ Ġindex 3 , Ġparameter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. function Parameters ?. get ( index 3 ), Ġparameter . name . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Data [ index ]. function ParameterType ?. get ( index 3 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparameter . type . type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġvariable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Var Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / var / var . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Variable Data (" a ", Ġ" 1 2 "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Variable Data (" b ", Ġ" ABC ", Ġ" Str "), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Variable Data (" d ", Ġ" a ", Ġ" Int ") ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ast Node Ġis ĠStatement . Variable Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpression Ġ= Ġast Node . expression ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. name , Ġast Node . variable Name . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. type , Ġast Node . type ?. type ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Call Expression Ġ-> ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Data [ index ]. value , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . name . literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . String Expression Ġ-> ĠassertEquals ( expected Data [ index ]. value , Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Float Expression Ġ-> ĠassertEquals ( expected Data [ index ]. value , Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Int Expression Ġ-> ĠassertEquals ( expected Data [ index ]. value , Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġif Ġstatement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser If Statement Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / if Statement / if . xiao ") ĊĊĠĠĠĠĠĠĠ Ġassert Not Equals ( 0 , Ġast . size ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġoperator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Operator Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠgetString ( expressions : ĠList < Expression >, Ġoperator List : ĠList < String >, Ġindex : ĠInt ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrings Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġexpressions . map Ġ{ Ġexpression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Int Expression Ġ-> Ġstrings Ġ+= Ġexpression . value . literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Float Expression Ġ-> Ġstrings Ġ+= Ġexpression . value . literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . String Expression Ġ-> Ġstrings Ġ+= Ġexpression . value . literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Operator Expression Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( operator List [ index Ġ+ Ġ 1 ], Ġexpression . operator . operator . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( expression . operator . expressions , Ġoperator List , Ġindex Ġ+ Ġ 1 ). map Ġ{ Ġstrings Ġ+= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġstrings ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / operators / operator . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Operator Data ( listOf (" 1 0 ", Ġ" 2 0 ", Ġ" 3 0 ", Ġ" 5 0 "), ĠlistOf ("+ ", Ġ"+", Ġ"+ ")), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Operator Data ( listOf (" 1 0 ", Ġ" 5 0 ", Ġ" 2 0 ", Ġ" 5 0 "), ĠlistOf ("/", Ġ"> ", Ġ"< ")) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Node Ġas ĠStatement . Expression Statement ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoperator Ġ= Ġ( ast Node . expression [ 0 ] Ġas ĠExpression . Operator Expression ). operator ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( operator Ġis ĠOperator . Plus ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. operator [ 0 ], Ġoperator . operator . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetString ( operator . expressions , Ġexpected Data [ index ]. operator , Ġ 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġpath ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Path Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / path / path . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Path Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" test ", Ġ" test 2 ", Ġ" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Path Data ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" test ", Ġ" test 5 ", Ġ" test ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Node Ġas ĠStatement . Expression Statement ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Node . expression . map Indexed Ġ{ Ġindex 2 , Ġexpression Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expression Ġis ĠExpression . Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. names [ index 2 ], Ġexpression . name . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( expression Ġis ĠExpression . Variable Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ]. names [ index 2 ], Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġreturn Ġstatement ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Return Statement Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / return Statement / return . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf (" 1 0 0 ", Ġ" abc ", Ġ" A ", Ġ" a ", Ġ" a ") ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġast Node Ġas ĠStatement . Return Statement ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġexpression Ġ= Ġast Node . expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Call Expression Ġ-> ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Data [ index ], ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpression . name . literal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Variable Expression Ġ-> ĠassertEquals ( expected Data [ index ], Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Int Expression Ġ-> ĠassertEquals ( expected Data [ index ], Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . Float Expression Ġ-> ĠassertEquals ( expected Data [ index ], Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠExpression . String Expression Ġ-> ĠassertEquals ( expected Data [ index ], Ġexpression . value . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcorrect ness Ġof Ġparse Ġgenerator ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġparser Generator Test () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġast Ġ= Ġparser Test ("/ parser TestData / generator / generator . xiao ") ĊĠĠĠĠĠĠĠ Ġval Ġexpected Data Ġ= ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 1 0 ", ĠTokenType . INTEGER _ LITERAL _ TOKEN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 2 0 ", ĠTokenType . INTEGER _ LITERAL _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 2 ", ĠTokenType . STRING _ LITERAL _ TOKEN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 9 ", ĠTokenType . STRING _ LITERAL _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 0 . 3 ", ĠTokenType . FLOAT _ LITERAL _ TOKEN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" 0 . 7 ", ĠTokenType . FLOAT _ LITERAL _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (". 5 ", ĠTokenType . FLOAT _ LITERAL _ TOKEN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (". 3 ", ĠTokenType . FLOAT _ LITERAL _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" a ", ĠTokenType . IDENTIFIER _ TOKEN ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠExpected Token Data (" b ", ĠTokenType . IDENTIFIER _ TOKEN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġast . map Indexed Ġ{ Ġindex , Ġast Node Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ast Node Ġis ĠExpression . Generator Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġast Node . value . map Indexed Ġ{ Ġindex 2 , Ġtoken Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ][ index 2 ]. literal , Ġtoken . literal ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( expected Data [ index ][ index 2 ]. type , Ġtoken . token Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }