package Ġcom . al mas b . lang Ċ Ċ import Ġorg . hamcrest . Matcher Assert Ċ import Ġorg . hamcrest . Matcher Assert .* Ċ import Ġorg . hamcrest . Matchers Ċ import Ġorg . hamcrest . Matchers .* Ċ import Ġorg . junit . jupiter . api . Test Ċ Ċ class ĠExp Test Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġbasic `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ+ Ġ 5 Ġ+ Ġ 7 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ+ Ġ 5 Ġ+ Ġ 7 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġcomplex Ġadd `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ+ Ġ 5 Ġ+ Ġ 7 Ġ+ Ġ 1 5 Ġ+ Ġ 3 Ġ+ Ġ 7 5 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ+ Ġ 5 Ġ+ Ġ 7 Ġ+ Ġ 1 5 Ġ+ Ġ 3 Ġ+ Ġ 7 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġ+ Ġ- `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ+ Ġ 5 Ġ- Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 3 Ġ- Ġ 1 5 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ+ Ġ 5 Ġ- Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 3 Ġ- Ġ 1 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġ+ Ġ- Ġmul Ġand Ġdiv `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ+ Ġ 5 Ġ* Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 1 5 Ġ/ Ġ 5 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ+ Ġ 5 Ġ* Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 1 5 Ġ/ Ġ 5 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġcomplex Ġ+ Ġ- Ġmul Ġand Ġdiv `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ* Ġ 5 Ġ+ Ġ 2 Ġ* Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 1 5 Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ 6 Ġ/ Ġ 2 Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ* Ġ 5 Ġ+ Ġ 2 Ġ* Ġ 7 Ġ+ Ġ 1 5 Ġ- Ġ 1 5 Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ 6 Ġ/ Ġ 2 Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġcomplex Ġ+ Ġ- Ġmul Ġand Ġdiv Ġwith Ġp aren `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ* Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ* Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġcomplex Ġ+ Ġ- Ġmul Ġand Ġdiv Ġwith Ġp aren Ġrecursive `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ* Ġ( Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ* Ġ( Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġcomplex Ġ+ Ġ- Ġmul Ġand Ġdiv Ġwith Ġp aren Ġinside `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ" 3 Ġ* Ġ( Ġ 1 5 5 Ġ- Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser (). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is `( 3 Ġ* Ġ( Ġ 1 5 5 Ġ- Ġ( Ġ 5 Ġ+ Ġ 2 Ġ) Ġ) Ġ* Ġ 7 Ġ+ Ġ( Ġ 1 5 Ġ- Ġ 1 5 Ġ) Ġ/ Ġ 5 Ġ/ Ġ 3 Ġ+ Ġ( Ġ 6 Ġ/ Ġ 2 Ġ) Ġ- Ġ 2 Ġ+ Ġ 1 Ġ* Ġ 4 Ġ* Ġ 6 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` Test Ġvars `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġline Ġ= Ġ"- 5 Ġ+ Ġx Ġ+ Ġ- 1 3 Ġ* Ġy Ġ/ Ġz Ġ+ Ġ 3 " ĊĊĠĠĠĠĠĠĠ Ġval Ġenv Ġ= ĠEnv ({ Ġ}) ĊĠĠĠĠĠĠĠ Ġenv . memory [" x "] Ġ= Ġ" 3 " ĊĠĠĠĠĠĠĠ Ġenv . memory [" y "] Ġ= Ġ" 2 " ĊĠĠĠĠĠĠĠ Ġenv . memory [" z "] Ġ= Ġ"- 1 3 " ĊĊĠĠĠĠĠĠĠ Ġval Ġexp : ĠExp Ġ= ĠParser ( env ). parse ( Lexer (). tokenize ( line )) ĊĊĠĠĠĠĠĠĠ ĠassertThat ( exp . eval (). toInt (), Ġ` is ` (- 5 Ġ+ Ġ 3 Ġ+ Ġ- 1 3 Ġ* Ġ 2 Ġ/ Ġ- 1 3 Ġ+ Ġ 3 )) ĊĠĠĠ Ġ} Ċ }