INTER.RIG 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -- interpreter for Prof. Blikle small language (SL)
  2. -- written in Riga 13.10.1989
  3. -- takes input from file EX1.TXT
  4. --
  5. #main
  6. $token_list := #CALL_PAS(3 'ex1.txt' );
  7. -- reads token list
  8. OPEN report ' ';
  9. $abstract_syntax := #analyse_program( $token_list );
  10. IF $abstract_syntax -> report <<' no errors in program ... ';
  11. #interpret_program ( $abstract_syntax )
  12. ELSIF T -> report << 'an error is found ...' FI
  13. ##
  14. %INCLUDE ANALYSE.RIG
  15. #interpret_program
  16. -- has global variable $state
  17. / $state := <. W: 1, V: 1, X: 1, Y: 1, Z: 1 .>/
  18. -- assigns initial values to variables
  19. #interpret_stmt_list
  20. / report << 'end of interpretation, the state is:';
  21. PRINT $state /
  22. ##
  23. #interpret_stmt_list
  24. (. (* #interpret_stmt
  25. --/ PRINT LAST #interpret_program $state /
  26. *) .) ##
  27. #interpret_stmt
  28. ( #interpret_assignment ! #interpret_while ) ##
  29. #interpret_assignment
  30. 'assignment_op' ::
  31. <. left_part: $var,
  32. right_part: $rez := #eval_expr .>
  33. / LAST #interpret_program $state ++:=
  34. <. $var : $rez .> / ##
  35. #interpret_while
  36. 'while_op' ::
  37. <. condition: $rez := #eval_expr .>
  38. / IF $rez = tt -> #interpret_stmt_list( $. body);
  39. #interpret_while( $)
  40. ELSIF $rez = ff -> RETURN finished
  41. ELSIF $rez = err OR #NUMBER( $rez) ->
  42. LAST #interpret_program $state . X := err
  43. FI / ##
  44. #eval_expr
  45. $NUM / RETURN $NUM / ;;
  46. $Id / RETURN LAST #interpret_program $state . $Id /;;
  47. '+' :: <. arg1: $val1 := #eval_expr,
  48. arg2: $val2 := #eval_expr .>
  49. / IF $val1 = err OR $val2 = err -> RETURN err
  50. ELSIF NOT ( #NUMBER( $val1) AND #NUMBER( $val2) ) ->
  51. RETURN err
  52. ELSIF $val1 + $val2 > 100 -> RETURN err
  53. ELSIF T -> RETURN $val1 + $val2
  54. FI / ;;
  55. '<' :: <. arg1: $val1 := #eval_expr,
  56. arg2: $val2 := #eval_expr .>
  57. / IF $val1 = err OR $val2 = err -> RETURN err
  58. ELSIF NOT ( #NUMBER( $val1) AND #NUMBER( $val2) ) ->
  59. RETURN err
  60. ELSIF $val1 < $val2 -> RETURN tt
  61. ELSIF T -> RETURN ff FI /
  62. ##