         Edinburgh IMP77 Compiler - Version 8.4
    1 %begin
		.Ltext0:
		_imp_IEXP:
		.LFB60:
				pushl	%ebp
				movl	%esp, %ebp
				subl	$16, %esp
				call	__x86.get_pc_thunk.ax
				addl	$_GLOBAL_OFFSET_TABLE_, %eax
				movl	$1, -8(%ebp)
				movl	12(%ebp), %eax
				movl	%eax, -4(%ebp)
				jmp	.L2
		.L3:
				movl	-8(%ebp), %eax
				imull	8(%ebp), %eax
				movl	%eax, -8(%ebp)
		.L2:
				movl	-4(%ebp), %eax
				leal	-1(%eax), %edx
				movl	%edx, -4(%ebp)
				testl	%eax, %eax
				jg	.L3
				movl	-8(%ebp), %eax
				cltd
				leave
				ret
		.LFE60:
				.section	.rodata
				.align 32
		.LC0:
				.byte	40
				.string	"Imp77 precedence and associativity test."
				.zero	214
				.align 32
		.LC1:
				.byte	52
				.string	"In a * b // c * d, '*' has higher priority than '/'."
				.zero	202
				.align 32
		.LC2:
				.byte	65
				.string	"A second test with '/' will be needed to determine associativity:"
				.zero	189
				.align 32
		.LC3:
				.byte	52
				.string	"a // c // d is right associative, i.e. a // (b // c)"
				.zero	202
				.align 32
		.LC4:
				.byte	51
				.string	"a // c // d is left associative, i.e. (a // b) // c"
				.zero	203
				.align 32
		.LC5:
				.byte	43
				.string	"a // c // d is something weird!  I give up."
				.zero	211
				.align 32
		.LC6:
				.byte	86
				.string	"a * b // c * d is right associative and with equal precedence, i.e. a * (b // (c * d))"
				.zero	168
				.align 32
		.LC7:
				.byte	37
				.string	"This grammar would support the above:"
				.zero	217
				.align 32
		.LC8:
				.byte	33
				.string	"P<expr> = <term> <op-term-list> ;"
				.zero	221
				.align 32
		.LC9:
				.byte	46
				.string	"P<op-term-list> = <op-term> <op-term-list> | ;"
				.zero	208
				.align 32
		.LC10:
				.byte	26
				.string	"P<op-term> = <op> <term> ;"
				.zero	228
				.align 32
		.LC11:
				.byte	85
				.string	"a * b // c * d is left associative and with equal precedence, i.e. ((a * b) // c) * d"
				.zero	169
				.align 32
		.LC12:
				.byte	33
				.string	"P<expr> = <term-op-list> <term> ;"
				.zero	221
				.align 32
		.LC13:
				.byte	46
				.string	"P<term-op-list> = <term-op> <term-op-list> | ;"
				.zero	208
				.align 32
		.LC14:
				.byte	26
				.string	"P<term-op> = <term> <op> ;"
				.zero	228
				.align 32
		.LC15:
				.byte	88
				.string	"a * b // c * d uses some weird non-standard combination of precedence and associativity!"
				.zero	166
				.align 32
		.LC16:
				.byte	52
				.string	"p ^^ q ^^ r is right associative, i.e. p ^^ (q ^^ r)"
				.zero	202
				.align 32
		.LC17:
				.byte	34
				.string	"P<expr> = <term> <exp-term-list> ;"
				.zero	220
				.align 32
		.LC18:
				.byte	49
				.string	"P<exp-term-list> = <exp-term> <exp-term-list> | ;"
				.zero	205
				.align 32
		.LC19:
				.byte	27
				.string	"P<exp-term> = \"^^\" <term> ;"
				.zero	227
				.align 32
		.LC20:
				.byte	51
				.string	"p ^^ q ^^ r is left associative, i.e. (p ^^ q) ^^ r"
				.zero	203
				.align 32
		.LC21:
				.byte	34
				.string	"P<expr> = <term-exp-list> <term> ;"
				.zero	220
				.align 32
		.LC22:
				.byte	49
				.string	"P<term-exp-list> = <term-exp> <term-exp-list> | ;"
				.zero	205
				.align 32
		.LC23:
				.byte	27
				.string	"P<term-exp> = <term> \"^^\" ;"
				.zero	227
				.align 32
		.LC24:
				.byte	33
				.string	"p ^^ q ^^ r is something weird! ("
				.zero	221
				.align 32
		.LC25:
				.byte	14
				.string	") - I give up."
				.zero	240
				.globl	main
		main:
		.LFB189:
				leal	4(%esp), %ecx
				andl	$-16, %esp
				pushl	-4(%ecx)
				pushl	%ebp
				movl	%esp, %ebp
				pushl	%edi
				pushl	%esi
				pushl	%ebx
				pushl	%ecx
				subl	$14904, %esp
				call	__x86.get_pc_thunk.bx
				addl	$_GLOBAL_OFFSET_TABLE_, %ebx
				movl	%ecx, %eax
				movl	4(%eax), %edx
				movl	%edx, -14908(%ebp)
				movl	%gs:20, %esi
				movl	%esi, -28(%ebp)
				xorl	%esi, %esi
				subl	$8, %esp
				pushl	-14908(%ebp)
				pushl	(%eax)
				call	_imp_initialise@PLT
				addl	$16, %esp
    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
   71   %integer x = a * b // c * d
				movl	$192, -14892(%ebp)
		.LBB167:
   72   print string("Imp77 precedence and associativity test."); newlines(2)
				leal	-284(%ebp), %eax
				leal	.LC0@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-14876(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-7452(%ebp), %eax
				leal	-14876(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE167:
		.LBB168:
		.LBB169:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-7452(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
				movl	$2, -14884(%ebp)
		.LBE169:
		.LBE168:
		.LBB170:
		.LBB171:
				subl	$12, %esp
				pushl	-14884(%ebp)
				call	_imp_newlines@PLT
				addl	$16, %esp
		.LBE171:
		.LBE170:
   73   %if x = 21 %start
				cmpl	$21, -14892(%ebp)
				jne	.L31
		.LBB172:
				nop
		.L7:
				cmpl	$19, -14892(%ebp)
				jne	.L34
		.LBB197:
   74     print string("In a * b // c * d, '*' has higher priority than '/'."); newline
				leal	-284(%ebp), %eax
				leal	.LC1@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-14620(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-6940(%ebp), %eax
				leal	-14620(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE172:
		.LBB173:
		.LBB174:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-6940(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE174:
		.LBE173:
		.LBB175:
		.LBB176:
				call	_imp_newline@PLT
		.LBE176:
		.LBE175:
		.LBB177:
   75     print string("A second test with '/' will be needed to determine associativity:"); newline
				leal	-284(%ebp), %eax
				leal	.LC2@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-14364(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-7196(%ebp), %eax
				leal	-14364(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE177:
		.LBB178:
		.LBB179:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-7196(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE179:
		.LBE178:
		.LBB180:
		.LBB181:
				call	_imp_newline@PLT
		.LBE181:
		.LBE180:
   76     x = a // c // d
				movl	$1, -14892(%ebp)
   77     %if x = 1 %start
				cmpl	$1, -14892(%ebp)
				jne	.L32
		.LBB182:
				nop
		.L9:
				cmpl	$19, -14892(%ebp)
				jne	.L33
		.LBB187:
   78       print string("a // c // d is right associative, i.e. a // (b // c)"); newline
				leal	-284(%ebp), %eax
				leal	.LC3@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-14108(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-6684(%ebp), %eax
				leal	-14108(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE182:
		.LBB183:
		.LBB184:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-6684(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE184:
		.LBE183:
		.LBB185:
		.LBB186:
				call	_imp_newline@PLT
		.LBE186:
		.LBE185:
   79     %else %if x = 19
				jmp	.L10
		.L32:
				nop
		.L12:
		.LBB192:
   80       print string("a // c // d is left associative, i.e. (a // b) // c"); newline
				leal	-284(%ebp), %eax
				leal	.LC4@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-13852(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-6428(%ebp), %eax
				leal	-13852(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE187:
		.LBB188:
		.LBB189:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-6428(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE189:
		.LBE188:
		.LBB190:
		.LBB191:
				call	_imp_newline@PLT
		.LBE191:
		.LBE190:
   81     %else
				jmp	.L10
		.L33:
   82       print string("a // c // d is something weird!  I give up."); newline
				leal	-284(%ebp), %eax
				leal	.LC5@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-13596(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-6172(%ebp), %eax
				leal	-13596(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE192:
		.LBB193:
		.LBB194:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-6172(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE194:
		.LBE193:
		.LBB195:
		.LBB196:
				call	_imp_newline@PLT
		.LBE196:
		.LBE195:
   83     %finish
   84   %else %if x = 19
				jmp	.L13
		.L10:
				jmp	.L13
		.L31:
				nop
		.L15:
				cmpl	$192, -14892(%ebp)
				jne	.L35
		.LBB226:
   85     print string("a * b // c * d is right associative and with equal precedence, i.e. a * (b // (c * d))"); newline
				leal	-284(%ebp), %eax
				leal	.LC6@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-13340(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-4892(%ebp), %eax
				leal	-13340(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE197:
		.LBB198:
		.LBB199:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-4892(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE199:
		.LBE198:
		.LBB200:
		.LBB201:
				call	_imp_newline@PLT
		.LBE201:
		.LBE200:
		.LBB202:
		.LBB203:
				call	_imp_newline@PLT
		.LBE203:
		.LBE202:
		.LBB204:
   86     newline
   87     print string("This grammar would support the above:"); newline
				leal	-284(%ebp), %eax
				leal	.LC7@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-13084(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-5148(%ebp), %eax
				leal	-13084(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE204:
		.LBB205:
		.LBB206:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-5148(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE206:
		.LBE205:
		.LBB207:
		.LBB208:
				call	_imp_newline@PLT
		.LBE208:
		.LBE207:
		.LBB209:
		.LBB210:
				call	_imp_newline@PLT
		.LBE210:
		.LBE209:
		.LBB211:
   88     newline
   89     print string("P<expr> = <term> <op-term-list> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC8@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-12828(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-5404(%ebp), %eax
				leal	-12828(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE211:
		.LBB212:
		.LBB213:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-5404(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE213:
		.LBE212:
		.LBB214:
		.LBB215:
				call	_imp_newline@PLT
		.LBE215:
		.LBE214:
		.LBB216:
   90     print string("P<op-term-list> = <op-term> <op-term-list> | ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC9@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-12572(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-5660(%ebp), %eax
				leal	-12572(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE216:
		.LBB217:
		.LBB218:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-5660(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE218:
		.LBE217:
		.LBB219:
		.LBB220:
				call	_imp_newline@PLT
		.LBE220:
		.LBE219:
		.LBB221:
   91     print string("P<op-term> = <op> <term> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC10@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-12316(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-5916(%ebp), %eax
				leal	-12316(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE221:
		.LBB222:
		.LBB223:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-5916(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE223:
		.LBE222:
		.LBB224:
		.LBB225:
				call	_imp_newline@PLT
		.LBE225:
		.LBE224:
   92   %else %if x = 192
				jmp	.L13
		.L34:
				nop
		.L17:
		.LBB255:
   93     print string("a * b // c * d is left associative and with equal precedence, i.e. ((a * b) // c) * d"); newline
				leal	-284(%ebp), %eax
				leal	.LC11@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-12060(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-3612(%ebp), %eax
				leal	-12060(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE226:
		.LBB227:
		.LBB228:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-3612(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE228:
		.LBE227:
		.LBB229:
		.LBB230:
				call	_imp_newline@PLT
		.LBE230:
		.LBE229:
		.LBB231:
		.LBB232:
				call	_imp_newline@PLT
		.LBE232:
		.LBE231:
		.LBB233:
   94     newline
   95     print string("This grammar would support the above:"); newline
				leal	-284(%ebp), %eax
				leal	.LC7@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-11804(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-3868(%ebp), %eax
				leal	-11804(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE233:
		.LBB234:
		.LBB235:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-3868(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE235:
		.LBE234:
		.LBB236:
		.LBB237:
				call	_imp_newline@PLT
		.LBE237:
		.LBE236:
		.LBB238:
		.LBB239:
				call	_imp_newline@PLT
		.LBE239:
		.LBE238:
		.LBB240:
   96     newline
   97     print string("P<expr> = <term-op-list> <term> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC12@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-11548(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-4124(%ebp), %eax
				leal	-11548(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE240:
		.LBB241:
		.LBB242:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-4124(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE242:
		.LBE241:
		.LBB243:
		.LBB244:
				call	_imp_newline@PLT
		.LBE244:
		.LBE243:
		.LBB245:
   98     print string("P<term-op-list> = <term-op> <term-op-list> | ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC13@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-11292(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-4380(%ebp), %eax
				leal	-11292(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE245:
		.LBB246:
		.LBB247:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-4380(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE247:
		.LBE246:
		.LBB248:
		.LBB249:
				call	_imp_newline@PLT
		.LBE249:
		.LBE248:
		.LBB250:
   99     print string("P<term-op> = <term> <op> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC14@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-11036(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-4636(%ebp), %eax
				leal	-11036(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE250:
		.LBB251:
		.LBB252:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-4636(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE252:
		.LBE251:
		.LBB253:
		.LBB254:
				call	_imp_newline@PLT
		.LBE254:
		.LBE253:
  100   %else
				jmp	.L13
		.L35:
  101     print string("a * b // c * d uses some weird non-standard combination of precedence and associativity!"); newline
				leal	-284(%ebp), %eax
				leal	.LC15@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-10780(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-3356(%ebp), %eax
				leal	-10780(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE255:
		.LBB256:
		.LBB257:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-3356(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE257:
		.LBE256:
		.LBB258:
		.LBB259:
				call	_imp_newline@PLT
		.L13:
		.LBE259:
		.LBE258:
		.LBB260:
		.LBB261:
				call	_imp_newline@PLT
		.LBE261:
		.LBE260:
  102   %finish
  103   newline
  104
  105
  106   %const %integer p = 4, q = 3, r = 2
  107   %integer y
  108
  109   y = p ^^ q ^^ r
				subl	$8, %esp
				pushl	$3
				pushl	$4
				call	_imp_IEXP
				addl	$16, %esp
				subl	$8, %esp
				pushl	$2
				pushl	%eax
				call	_imp_IEXP
				addl	$16, %esp
				movl	%eax, -14888(%ebp)
  110
  111   %if y = 262144 %start
				cmpl	$262144, -14888(%ebp)
				jne	.L36
		.LBB262:
				nop
		.L19:
				cmpl	$4096, -14888(%ebp)
				jne	.L37
		.LBB291:
  112     print string("p ^^ q ^^ r is right associative, i.e. p ^^ (q ^^ r)"); newline
				leal	-284(%ebp), %eax
				leal	.LC16@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-10524(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-2076(%ebp), %eax
				leal	-10524(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE262:
		.LBB263:
		.LBB264:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-2076(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE264:
		.LBE263:
		.LBB265:
		.LBB266:
				call	_imp_newline@PLT
		.LBE266:
		.LBE265:
		.LBB267:
		.LBB268:
				call	_imp_newline@PLT
		.LBE268:
		.LBE267:
		.LBB269:
  113     newline
  114     print string("This grammar would support the above:"); newline
				leal	-284(%ebp), %eax
				leal	.LC7@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-10268(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-2332(%ebp), %eax
				leal	-10268(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE269:
		.LBB270:
		.LBB271:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-2332(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE271:
		.LBE270:
		.LBB272:
		.LBB273:
				call	_imp_newline@PLT
		.LBE273:
		.LBE272:
		.LBB274:
		.LBB275:
				call	_imp_newline@PLT
		.LBE275:
		.LBE274:
		.LBB276:
  115     newline
  116     print string("P<expr> = <term> <exp-term-list> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC17@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-10012(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-2588(%ebp), %eax
				leal	-10012(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE276:
		.LBB277:
		.LBB278:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-2588(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE278:
		.LBE277:
		.LBB279:
		.LBB280:
				call	_imp_newline@PLT
		.LBE280:
		.LBE279:
		.LBB281:
  117     print string("P<exp-term-list> = <exp-term> <exp-term-list> | ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC18@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-9756(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-2844(%ebp), %eax
				leal	-9756(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE281:
		.LBB282:
		.LBB283:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-2844(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE283:
		.LBE282:
		.LBB284:
		.LBB285:
				call	_imp_newline@PLT
		.LBE285:
		.LBE284:
		.LBB286:
  118     print string("P<exp-term> = ""^^"" <term> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC19@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-9500(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-3100(%ebp), %eax
				leal	-9500(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE286:
		.LBB287:
		.LBB288:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-3100(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE288:
		.LBE287:
		.LBB289:
		.LBB290:
				call	_imp_newline@PLT
		.LBE290:
		.LBE289:
  119   %else %if y = 4096
				jmp	.L20
		.L36:
				nop
		.L22:
		.LBB320:
  120     print string("p ^^ q ^^ r is left associative, i.e. (p ^^ q) ^^ r"); newline
				leal	-284(%ebp), %eax
				leal	.LC20@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-9244(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-796(%ebp), %eax
				leal	-9244(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE291:
		.LBB292:
		.LBB293:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-796(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE293:
		.LBE292:
		.LBB294:
		.LBB295:
				call	_imp_newline@PLT
		.LBE295:
		.LBE294:
		.LBB296:
		.LBB297:
				call	_imp_newline@PLT
		.LBE297:
		.LBE296:
		.LBB298:
  121     newline
  122     print string("This grammar would support the above:"); newline
				leal	-284(%ebp), %eax
				leal	.LC7@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-8988(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-1052(%ebp), %eax
				leal	-8988(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE298:
		.LBB299:
		.LBB300:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-1052(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE300:
		.LBE299:
		.LBB301:
		.LBB302:
				call	_imp_newline@PLT
		.LBE302:
		.LBE301:
		.LBB303:
		.LBB304:
				call	_imp_newline@PLT
		.LBE304:
		.LBE303:
		.LBB305:
  123     newline
  124     print string("P<expr> = <term-exp-list> <term> ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC21@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-8732(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-1308(%ebp), %eax
				leal	-8732(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE305:
		.LBB306:
		.LBB307:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-1308(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE307:
		.LBE306:
		.LBB308:
		.LBB309:
				call	_imp_newline@PLT
		.LBE309:
		.LBE308:
		.LBB310:
  125     print string("P<term-exp-list> = <term-exp> <term-exp-list> | ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC22@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-8476(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-1564(%ebp), %eax
				leal	-8476(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE310:
		.LBB311:
		.LBB312:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-1564(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE312:
		.LBE311:
		.LBB313:
		.LBB314:
				call	_imp_newline@PLT
		.LBE314:
		.LBE313:
		.LBB315:
  126     print string("P<term-exp> = <term> ""^^"" ;"); newline
				leal	-284(%ebp), %eax
				leal	.LC23@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-8220(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-1820(%ebp), %eax
				leal	-8220(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE315:
		.LBB316:
		.LBB317:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-1820(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE317:
		.LBE316:
		.LBB318:
		.LBB319:
				call	_imp_newline@PLT
		.LBE319:
		.LBE318:
  127   %else
				jmp	.L20
		.L37:
  128     print string("p ^^ q ^^ r is something weird! ("); write(y, 0); print string(") - I give up."); newline
				leal	-284(%ebp), %eax
				leal	.LC24@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-7964(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-540(%ebp), %eax
				leal	-7964(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE320:
		.LBB321:
		.LBB322:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-540(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE322:
		.LBE321:
				subl	$8, %esp
				pushl	$0
				pushl	-14888(%ebp)
				call	_imp_writeint@PLT
				addl	$16, %esp
		.LBB323:
				leal	-284(%ebp), %eax
				leal	.LC25@GOTOFF(%ebx), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-7708(%ebp), %eax
				leal	-284(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
				leal	-284(%ebp), %eax
				leal	-7708(%ebp), %edx
				movl	$64, %ecx
				movl	%eax, %edi
				movl	%edx, %esi
				rep movsl
		.LBE323:
		.LBB324:
		.LBB325:
				subl	$256, %esp
				movl	%esp, %eax
				movl	%eax, %edi
				leal	-284(%ebp), %eax
				movl	$64, %edx
				movl	%eax, %esi
				movl	%edx, %ecx
				rep movsl
				call	_imp_printstring@PLT
				addl	$256, %esp
		.LBE325:
		.LBE324:
		.LBB326:
		.LBB327:
				call	_imp_newline@PLT
		.L20:
		.LBE327:
		.LBE326:
		.LBB328:
		.LBB329:
				call	_imp_newline@PLT
				movl	$0, -14880(%ebp)
		.LBE329:
		.LBE328:
		.LBB330:
		.LBB331:
				subl	$12, %esp
				pushl	-14880(%ebp)
				call	exit@PLT
		.LBE331:
		.LBE330:
		.LFE189:
				.section	.text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
				.globl	__x86.get_pc_thunk.ax
				.hidden	__x86.get_pc_thunk.ax
		__x86.get_pc_thunk.ax:
		.LFB190:
				movl	(%esp), %eax
				ret
		.LFE190:
				.section	.text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
				.globl	__x86.get_pc_thunk.bx
				.hidden	__x86.get_pc_thunk.bx
		__x86.get_pc_thunk.bx:
		.LFB191:
				movl	(%esp), %ebx
				ret
		.LFE191:
		.Letext0:
  129   %finish
  130   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
   89 Statements compiled
