#include "perms.h"

                                                                //      1  %begin
#line 1 "prec.imp"
int main(int argc, char **argv) {
  __label__ _imp_endofblock;
  _imp_initialise(argc, argv);
                                                                //      2  
                                                                //      3  !
                                                                //      4  ! Precedence of operators
                                                                //      5  !
                                                                //      6  ! Highest: 1. \ (complement, unary not)
                                                                //      7  !          2. \, \\, <<, >>
                                                                //      8  !          3. *, /, //, &
                                                                //      9  ! Lowest:  4. +, - (unary and binary), !, !!
                                                                //     10  !
                                                                //     11  ! In general, sub-expressions with operators of equal precedence are evaluated from left to right.
                                                                //     12  !
                                                                //     13  ! The one exception to the left-hand precedence rule is that consecutive
                                                                //     14  ! exponentiations are evaluated from right to left; thus A**B**C is
                                                                //     15  ! evaluated as A**(B**C), not as (A**B)**C.  (Imp80 documentation)
                                                                //     16  
                                                                //     17  ! Arithmetic operators:
                                                                //     18  
                                                                //     19  ! |...| modulus              also: !...!  (deprecated some time ago)
                                                                //     20  
                                                                //     21  ! !  inclusive or
                                                                //     22  ! !! exclusive or
                                                                //     23  ! &  and
                                                                //     24  
                                                                //     25  ! \  real exponentiation     also:  ^  (Imp77)  or  **    (ERCC compilers)
                                                                //     26  ! \\ integer exponentiation  also:  ^^ (Imp77)  or  ****
                                                                //     27  
                                                                //     28  ! *  multiply
                                                                //     29  ! /  real division
                                                                //     30  ! // integer division
                                                                //     31  
                                                                //     32  ! << left shift
                                                                //     33  ! >> right shift
                                                                //     34  
                                                                //     35  ! +  plus
                                                                //     36  ! -  minus
                                                                //     37  
                                                                //     38  ! +  unary +                 
                                                                //     39  ! -  unary -
                                                                //     40  ! \  unary not               also ~ (can be *displayed* as: ¬ (&not;))
                                                                //     41  
                                                                //     42  ! .  string concatenation
                                                                //     43  
                                                                //     44  ! Comparison operators:
                                                                //     45  ! =  eq
                                                                //     46  ! #  not equals              also \= and <> (Imp80 documentation)
                                                                //     47  ! == address equals
                                                                //     48  ! ## address not equals      also \==
                                                                //     49  ! -> string resolution       (a difficult to classify hybrid of a comparison and an assignment operator)
                                                                //     50  ! <= less than or equals
                                                                //     51  ! <  less than
                                                                //     52  ! >= greater than or equals
                                                                //     53  ! >
                                                                //     54  
                                                                //     55  ! Assignment operators:
                                                                //     56  ! =  assignment
                                                                //     57  ! == pointer assignment
                                                                //     58  ! <- jam transfer
                                                                //     59  ! -> string resolution
                                                                //     60  
                                                                //     61  ! Data structure operators:
                                                                //     62  ! _  record field
                                                                //     63  ! () array indexing
                                                                //     64  ! [] pointer increment       (a Hamish extension in 68000 Imp only)
                                                                //     65  
                                                                //     66  ! Other:
                                                                //     67  ! @  may be considered an operator in %real literals, usually handled by a BIP.
                                                                //     68  
                                                                //     69  
                                                                //     70    %const %integer a = 19, b = 17, c = 5, d = 3
_imp_current_line = 70; _imp_current_file = "prec.imp";
                                                                //     71    %integer x = a * b // c * d
_imp_current_line = 71; _imp_current_file = "prec.imp";
#line 71 "prec.imp"
int X;
#line 71 "prec.imp"
X = (((((((((int)(19)) * (17)))) / ((int)(5))))) * (3));
                                                                //     72    print string("Imp77 precedence and associativity test."); newlines(2)
_imp_current_line = 72; _imp_current_file = "prec.imp";
#line 72 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("Imp77 precedence and associativity test."));
_imp_current_line = 72; _imp_current_file = "prec.imp";
#line 72 "prec.imp"
_imp_NEWLINES(2);
                                                                //     73    %if x = 21 %start
_imp_current_line = 73; _imp_current_file = "prec.imp";
#line 73 "prec.imp"
if (((X) != (21))) goto L_0002;
                                                                //     74      print string("In a * b // c * d, '*' has higher priority than '/'."); newline
_imp_current_line = 74; _imp_current_file = "prec.imp";
#line 74 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("In a * b // c * d, '*' has higher priority than '/'."));
_imp_current_line = 74; _imp_current_file = "prec.imp";
#line 74 "prec.imp"
_imp_NEWLINE();
                                                                //     75      print string("A second test with '/' will be needed to determine associativity:"); newline
_imp_current_line = 75; _imp_current_file = "prec.imp";
#line 75 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("A second test with '/' will be needed to determine associativity:"));
_imp_current_line = 75; _imp_current_file = "prec.imp";
#line 75 "prec.imp"
_imp_NEWLINE();
                                                                //     76      x = a // c // d
_imp_current_line = 76; _imp_current_file = "prec.imp";
#line 76 "prec.imp"
X = (((((((int)(19)) / ((int)(5)))))) / ((int)(3)));
                                                                //     77      %if x = 1 %start
_imp_current_line = 77; _imp_current_file = "prec.imp";
#line 77 "prec.imp"
if (((X) != (1))) goto L_0003;
                                                                //     78        print string("a // c // d is right associative, i.e. a // (b // c)"); newline
_imp_current_line = 78; _imp_current_file = "prec.imp";
#line 78 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a // c // d is right associative, i.e. a // (b // c)"));
_imp_current_line = 78; _imp_current_file = "prec.imp";
#line 78 "prec.imp"
_imp_NEWLINE();
                                                                //     79      %else %if x = 19
_imp_current_line = 79; _imp_current_file = "prec.imp";
#line 79 "prec.imp"
goto L_0004;
#line 79 "prec.imp"
L_0003:;
#line 79 "prec.imp"
if (((X) != (19))) goto L_0005;
                                                                //     80        print string("a // c // d is left associative, i.e. (a // b) // c"); newline
_imp_current_line = 80; _imp_current_file = "prec.imp";
#line 80 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a // c // d is left associative, i.e. (a // b) // c"));
_imp_current_line = 80; _imp_current_file = "prec.imp";
#line 80 "prec.imp"
_imp_NEWLINE();
                                                                //     81      %else
_imp_current_line = 81; _imp_current_file = "prec.imp";
#line 81 "prec.imp"
goto L_0004;
#line 81 "prec.imp"
L_0005:;
                                                                //     82        print string("a // c // d is something weird!  I give up."); newline
_imp_current_line = 82; _imp_current_file = "prec.imp";
#line 82 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a // c // d is something weird!  I give up."));
_imp_current_line = 82; _imp_current_file = "prec.imp";
#line 82 "prec.imp"
_imp_NEWLINE();
                                                                //     83      %finish
_imp_current_line = 83; _imp_current_file = "prec.imp";
#line 83 "prec.imp"
L_0004:;
                                                                //     84    %else %if x = 19
_imp_current_line = 84; _imp_current_file = "prec.imp";
#line 84 "prec.imp"
goto L_0006;
#line 84 "prec.imp"
L_0002:;
#line 84 "prec.imp"
if (((X) != (19))) goto L_0007;
                                                                //     85      print string("a * b // c * d is right associative and with equal precedence, i.e. a * (b // (c * d))"); newline
_imp_current_line = 85; _imp_current_file = "prec.imp";
#line 85 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a * b // c * d is right associative and with equal precedence, i.e. a * (b // (c * d))"));
_imp_current_line = 85; _imp_current_file = "prec.imp";
#line 85 "prec.imp"
_imp_NEWLINE();
                                                                //     86      newline
_imp_current_line = 86; _imp_current_file = "prec.imp";
#line 86 "prec.imp"
_imp_NEWLINE();
                                                                //     87      print string("This grammar would support the above:"); newline
_imp_current_line = 87; _imp_current_file = "prec.imp";
#line 87 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("This grammar would support the above:"));
_imp_current_line = 87; _imp_current_file = "prec.imp";
#line 87 "prec.imp"
_imp_NEWLINE();
                                                                //     88      newline
_imp_current_line = 88; _imp_current_file = "prec.imp";
#line 88 "prec.imp"
_imp_NEWLINE();
                                                                //     89      print string("P<expr> = <term> <op-term-list> ;"); newline
_imp_current_line = 89; _imp_current_file = "prec.imp";
#line 89 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<expr> = <term> <op-term-list> ;"));
_imp_current_line = 89; _imp_current_file = "prec.imp";
#line 89 "prec.imp"
_imp_NEWLINE();
                                                                //     90      print string("P<op-term-list> = <op-term> <op-term-list> | ;"); newline
_imp_current_line = 90; _imp_current_file = "prec.imp";
#line 90 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<op-term-list> = <op-term> <op-term-list> | ;"));
_imp_current_line = 90; _imp_current_file = "prec.imp";
#line 90 "prec.imp"
_imp_NEWLINE();
                                                                //     91      print string("P<op-term> = <op> <term> ;"); newline
_imp_current_line = 91; _imp_current_file = "prec.imp";
#line 91 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<op-term> = <op> <term> ;"));
_imp_current_line = 91; _imp_current_file = "prec.imp";
#line 91 "prec.imp"
_imp_NEWLINE();
                                                                //     92    %else %if x = 192
_imp_current_line = 92; _imp_current_file = "prec.imp";
#line 92 "prec.imp"
goto L_0006;
#line 92 "prec.imp"
L_0007:;
#line 92 "prec.imp"
if (((X) != (192))) goto L_0008;
                                                                //     93      print string("a * b // c * d is left associative and with equal precedence, i.e. ((a * b) // c) * d"); newline
_imp_current_line = 93; _imp_current_file = "prec.imp";
#line 93 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a * b // c * d is left associative and with equal precedence, i.e. ((a * b) // c) * d"));
_imp_current_line = 93; _imp_current_file = "prec.imp";
#line 93 "prec.imp"
_imp_NEWLINE();
                                                                //     94      newline
_imp_current_line = 94; _imp_current_file = "prec.imp";
#line 94 "prec.imp"
_imp_NEWLINE();
                                                                //     95      print string("This grammar would support the above:"); newline
_imp_current_line = 95; _imp_current_file = "prec.imp";
#line 95 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("This grammar would support the above:"));
_imp_current_line = 95; _imp_current_file = "prec.imp";
#line 95 "prec.imp"
_imp_NEWLINE();
                                                                //     96      newline
_imp_current_line = 96; _imp_current_file = "prec.imp";
#line 96 "prec.imp"
_imp_NEWLINE();
                                                                //     97      print string("P<expr> = <term-op-list> <term> ;"); newline
_imp_current_line = 97; _imp_current_file = "prec.imp";
#line 97 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<expr> = <term-op-list> <term> ;"));
_imp_current_line = 97; _imp_current_file = "prec.imp";
#line 97 "prec.imp"
_imp_NEWLINE();
                                                                //     98      print string("P<term-op-list> = <term-op> <term-op-list> | ;"); newline
_imp_current_line = 98; _imp_current_file = "prec.imp";
#line 98 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<term-op-list> = <term-op> <term-op-list> | ;"));
_imp_current_line = 98; _imp_current_file = "prec.imp";
#line 98 "prec.imp"
_imp_NEWLINE();
                                                                //     99      print string("P<term-op> = <term> <op> ;"); newline
_imp_current_line = 99; _imp_current_file = "prec.imp";
#line 99 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<term-op> = <term> <op> ;"));
_imp_current_line = 99; _imp_current_file = "prec.imp";
#line 99 "prec.imp"
_imp_NEWLINE();
                                                                //    100    %else
_imp_current_line = 100; _imp_current_file = "prec.imp";
#line 100 "prec.imp"
goto L_0006;
#line 100 "prec.imp"
L_0008:;
                                                                //    101      print string("a * b // c * d uses some weird non-standard combination of precedence and associativity!"); newline
_imp_current_line = 101; _imp_current_file = "prec.imp";
#line 101 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("a * b // c * d uses some weird non-standard combination of precedence and associativity!"));
_imp_current_line = 101; _imp_current_file = "prec.imp";
#line 101 "prec.imp"
_imp_NEWLINE();
                                                                //    102    %finish
_imp_current_line = 102; _imp_current_file = "prec.imp";
#line 102 "prec.imp"
L_0006:;
                                                                //    103    newline
_imp_current_line = 103; _imp_current_file = "prec.imp";
#line 103 "prec.imp"
_imp_NEWLINE();
                                                                //    104  
                                                                //    105  
                                                                //    106    %const %integer p = 4, q = 3, r = 2
_imp_current_line = 106; _imp_current_file = "prec.imp";
                                                                //    107    %integer y
_imp_current_line = 107; _imp_current_file = "prec.imp";
#line 107 "prec.imp"
int Y;
                                                                //    108  
                                                                //    109    y = p ^^ q ^^ r
_imp_current_line = 109; _imp_current_file = "prec.imp";
#line 109 "prec.imp"
Y = _imp_IEXP(_imp_IEXP(4, 3), 2);
                                                                //    110  
                                                                //    111    %if y = 262144 %start
_imp_current_line = 111; _imp_current_file = "prec.imp";
#line 111 "prec.imp"
if (((Y) != (262144))) goto L_0009;
                                                                //    112      print string("p ^^ q ^^ r is right associative, i.e. p ^^ (q ^^ r)"); newline
_imp_current_line = 112; _imp_current_file = "prec.imp";
#line 112 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("p ^^ q ^^ r is right associative, i.e. p ^^ (q ^^ r)"));
_imp_current_line = 112; _imp_current_file = "prec.imp";
#line 112 "prec.imp"
_imp_NEWLINE();
                                                                //    113      newline
_imp_current_line = 113; _imp_current_file = "prec.imp";
#line 113 "prec.imp"
_imp_NEWLINE();
                                                                //    114      print string("This grammar would support the above:"); newline
_imp_current_line = 114; _imp_current_file = "prec.imp";
#line 114 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("This grammar would support the above:"));
_imp_current_line = 114; _imp_current_file = "prec.imp";
#line 114 "prec.imp"
_imp_NEWLINE();
                                                                //    115      newline
_imp_current_line = 115; _imp_current_file = "prec.imp";
#line 115 "prec.imp"
_imp_NEWLINE();
                                                                //    116      print string("P<expr> = <term> <exp-term-list> ;"); newline
_imp_current_line = 116; _imp_current_file = "prec.imp";
#line 116 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<expr> = <term> <exp-term-list> ;"));
_imp_current_line = 116; _imp_current_file = "prec.imp";
#line 116 "prec.imp"
_imp_NEWLINE();
                                                                //    117      print string("P<exp-term-list> = <exp-term> <exp-term-list> | ;"); newline
_imp_current_line = 117; _imp_current_file = "prec.imp";
#line 117 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<exp-term-list> = <exp-term> <exp-term-list> | ;"));
_imp_current_line = 117; _imp_current_file = "prec.imp";
#line 117 "prec.imp"
_imp_NEWLINE();
                                                                //    118      print string("P<exp-term> = ""^^"" <term> ;"); newline
_imp_current_line = 118; _imp_current_file = "prec.imp";
#line 118 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<exp-term> = \"^^\" <term> ;"));
_imp_current_line = 118; _imp_current_file = "prec.imp";
#line 118 "prec.imp"
_imp_NEWLINE();
                                                                //    119    %else %if y = 4096
_imp_current_line = 119; _imp_current_file = "prec.imp";
#line 119 "prec.imp"
goto L_000a;
#line 119 "prec.imp"
L_0009:;
#line 119 "prec.imp"
if (((Y) != (4096))) goto L_000b;
                                                                //    120      print string("p ^^ q ^^ r is left associative, i.e. (p ^^ q) ^^ r"); newline
_imp_current_line = 120; _imp_current_file = "prec.imp";
#line 120 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("p ^^ q ^^ r is left associative, i.e. (p ^^ q) ^^ r"));
_imp_current_line = 120; _imp_current_file = "prec.imp";
#line 120 "prec.imp"
_imp_NEWLINE();
                                                                //    121      newline
_imp_current_line = 121; _imp_current_file = "prec.imp";
#line 121 "prec.imp"
_imp_NEWLINE();
                                                                //    122      print string("This grammar would support the above:"); newline
_imp_current_line = 122; _imp_current_file = "prec.imp";
#line 122 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("This grammar would support the above:"));
_imp_current_line = 122; _imp_current_file = "prec.imp";
#line 122 "prec.imp"
_imp_NEWLINE();
                                                                //    123      newline
_imp_current_line = 123; _imp_current_file = "prec.imp";
#line 123 "prec.imp"
_imp_NEWLINE();
                                                                //    124      print string("P<expr> = <term-exp-list> <term> ;"); newline
_imp_current_line = 124; _imp_current_file = "prec.imp";
#line 124 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<expr> = <term-exp-list> <term> ;"));
_imp_current_line = 124; _imp_current_file = "prec.imp";
#line 124 "prec.imp"
_imp_NEWLINE();
                                                                //    125      print string("P<term-exp-list> = <term-exp> <term-exp-list> | ;"); newline
_imp_current_line = 125; _imp_current_file = "prec.imp";
#line 125 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<term-exp-list> = <term-exp> <term-exp-list> | ;"));
_imp_current_line = 125; _imp_current_file = "prec.imp";
#line 125 "prec.imp"
_imp_NEWLINE();
                                                                //    126      print string("P<term-exp> = <term> ""^^"" ;"); newline
_imp_current_line = 126; _imp_current_file = "prec.imp";
#line 126 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("P<term-exp> = <term> \"^^\" ;"));
_imp_current_line = 126; _imp_current_file = "prec.imp";
#line 126 "prec.imp"
_imp_NEWLINE();
                                                                //    127    %else
_imp_current_line = 127; _imp_current_file = "prec.imp";
#line 127 "prec.imp"
goto L_000a;
#line 127 "prec.imp"
L_000b:;
                                                                //    128      print string("p ^^ q ^^ r is something weird! ("); write(y, 0); print string(") - I give up."); newline
_imp_current_line = 128; _imp_current_file = "prec.imp";
#line 128 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal("p ^^ q ^^ r is something weird! ("));
_imp_current_line = 128; _imp_current_file = "prec.imp";
#line 128 "prec.imp"
_imp_WRITE(Y, 0);
_imp_current_line = 128; _imp_current_file = "prec.imp";
#line 128 "prec.imp"
_imp_PRINTSTRING(_imp_str_literal(") - I give up."));
_imp_current_line = 128; _imp_current_file = "prec.imp";
#line 128 "prec.imp"
_imp_NEWLINE();
                                                                //    129    %finish
_imp_current_line = 129; _imp_current_file = "prec.imp";
#line 129 "prec.imp"
L_000a:;
                                                                //    130    newline
_imp_current_line = 130; _imp_current_file = "prec.imp";
#line 130 "prec.imp"
_imp_NEWLINE();
                                                                //    131  
                                                                //    132  ! The remaining issue to be checked is how left/right associativity interact when the precedence is the same,
                                                                //    133  ! which is only the case for exponentiation and shifts together, eg
                                                                //    134  !
                                                                //    135  ! a << b << c ^^ d ^^ e   or   a ^^ b ^^ c >> d >> e
                                                                //    136  !
                                                                //    137  
                                                                //    138  %endofprogram
_imp_current_line = 138; _imp_current_file = "prec.imp";
#line 138 "prec.imp"
return 0;
_imp_endofblock: ;
} // End of block _imp_main at level 1
#line 138 "prec.imp"
// End of file
// COMPILE WITH: gcc12 -DVALGRIND_AVAILABLE -UPARM_OPT -DPARM_UNASS -DPARM_CHECK -O -g -ftrivial-auto-var-init=pattern -fmerge-constants -fno-strict-aliasing -Wall -Wno-unused-but-set-variable -Wno-unused-variable -Wno-unused-label -Wno-unused-function -Wno-maybe-uninitialized -Wno-uninitialized -frecord-gcc-switches -fsanitize=undefined -fsanitize=float-divide-by-zero -fsanitize-undefined-trap-on-error -fsanitize=float-cast-overflow -fno-sanitize-recover=all -fstack-protector -Wno-frame-address -fno-omit-frame-pointer -Wno-return-type -Wno-comment -ftrapv -ggdb3 -gdwarf-4 -I. -I.. -c -o prec.o prec.c -lm
