#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  %begin

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     2    %integer I

  int I;

  //     3    %real R

  float R;

  //     4    %string(255) S, T, U

  _imp_string255 S;
  _imp_string255 T;
  _imp_string255 U;

  //     5    I = 123

  I = 123;

  //     6    I = 123 ^^ 2

  I = _imp_IEXP(123, 2);

  //     7    R = 3.141592653589793

  R = 3.141592653589793;

  //     8    R = 2 / 3.141592653589793

  R = (double)(2 / 3.141592653589793);

  //     9    S = "hello world"

  _imp_strncpy(/*?*/ &S, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = _imp_str_literal("hello world");
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    10    S -> T.(" ").U

  if (!_imp_resolve(*({
        _imp_string255 tmp = S;
        (_imp_string255 *)&tmp;
      }),
                    (_imp_string255 *)/*?*/ &T, *({
                      _imp_string tmp = _imp_str_literal(" ");
                      (_imp_string255 *)&tmp;
                    }),
                    (_imp_string255 *)/*?*/ &U))
    _imp_signal(7, 1, 0, "string resolution fails");
    //    11  ! S." OK" -> T.(" ").U
    //    12    S = "left"." "."right"

  _imp_strncpy(/*?*/ &S, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = _imp_str_literal("left");
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    13    S <- "left"." "."right".T

  _imp_strncpy(/*?*/ &S, ({
                 __typeof__(_imp_string255) tmp; /*C*/
                 tmp = *({
                   _imp_string255 tmp =
                       _imp_join((_imp_string *)/*?*/ _imp_str_literal_ptr("left"), (_imp_string *)/*?*/ &T);
                   (_imp_string255 *)&tmp;
                 });
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    14    S = T."right"

  _imp_strncpy(/*?*/ &S, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *({
                   _imp_string255 tmp =
                       _imp_join((_imp_string *)/*?*/ &T, (_imp_string *)/*?*/ _imp_str_literal_ptr("right"));
                   (_imp_string255 *)&tmp;
                 });
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    15    S = T.U

  _imp_strncpy(/*?*/ &S, ({
                 __typeof__(_imp_string255) tmp; /*B*/
                 tmp = *({
                   _imp_string255 tmp = _imp_join((_imp_string *)/*?*/ &T, (_imp_string *)/*?*/ &U);
                   (_imp_string255 *)&tmp;
                 });
                 (void *)&tmp;
               }),
               /*max:*/ 255);

  //    16  %endofprogram

  _imp_stop(0);
  return 0;
end_0:;
}