#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"


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

  /* clang-format on */

  //    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"


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

  /* clang-format on */

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


  /* clang-format off */
_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);

  /* clang-format on */

  //    14    S = T."right"


  /* clang-format off */
_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);

  /* clang-format on */

  //    15    S = T.U


  /* clang-format off */
_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);

  /* clang-format on */

  //    16  %endofprogram

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