FOUND! The C #define of maxint was faulty - it needed an "unsigned" qualifier to ensure that -1 >> 1 was not also -1 ! Fixing that made the program work - completely as far as I can tell so far. The only outstanding issue is that imp %signals are not handled (in the pass1 source I mean) and therefore things like %include don't issue sensible error messages if the include file cannot be read. I'll work on simulating a signal mechanism next... IGNORE EVERYTHGING BELOW, NOW. =========== Until the bug is found, stdperm.imp consists of only the line %endofperm The test file, test.imp, is a minimal test to show the bug. Most things that it is possible to test without numeric literals appear to work. Anything with a literal integer or real errors out as a type error. console output (stderr): * 2 type %integer i = ^123456 Program contains 1 fault debugging trace (CONSOLE): > main > on_event_block_2 < on_event_block_2 > op < op > compileblock > analyse > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < codeatom > codeatom < codeatom < analyse > compile > getnext < getnext < compile > flushbuffer < flushbuffer > analyse > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < codeatom > op < op > codeatom < codeatom < analyse > compile > getnext < getnext > addchar < addchar < compile > flushbuffer < flushbuffer > compileblock > analyse > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < codeatom > op < op > codeatom < codeatom > codeatom < codeatom > codeatom < codeatom > codeatom < codeatom > compile > getnext < getnext < compile > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > lookup < lookup < codeatom > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < codeatom > codeatom > get > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < get < codeatom > fault > printss < printss > printss < printss < fault < analyse > analyse > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > codeatom > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ > readsym_ > debug_readsym_return < debug_readsym_return < readsym_ < codeatom > op < op < analyse > compile > getnext < getnext > compileend > addchar < addchar > addchar < addchar < compileend < compile > flushbuffer < flushbuffer > deletenames > fault > printident > putit < putit < printident < fault < deletenames < compileblock > deletenames < deletenames < compileblock > addchar < addchar > flushbuffer < flushbuffer Line reconstruction/classification. Type of integers looks OK. (-1): readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = N keyword readsym: symtype = 2 sym = D keyword readsym: symtype = 2 sym = O keyword readsym: symtype = 2 sym = F keyword readsym: symtype = 2 sym = P keyword readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = R keyword readsym: symtype = 2 sym = M keyword readsym: symtype = 0 sym = Newline 10 readsym: symtype = 2 sym = B keyword readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = G keyword readsym: symtype = 2 sym = I keyword readsym: symtype = 2 sym = N keyword readsym: symtype = 0 sym = Newline 10 readsym: symtype = 2 sym = I keyword readsym: symtype = 2 sym = N keyword readsym: symtype = 2 sym = T keyword readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = G keyword readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = R keyword readsym: symtype = -2 sym = I id readsym: symtype = 1 sym = '=' readsym: symtype = -1 sym = 1 num readsym: symtype = -1 sym = 2 num readsym: symtype = -1 sym = 3 num readsym: symtype = -1 sym = 4 num readsym: symtype = -1 sym = 5 num readsym: symtype = -1 sym = 6 num readsym: symtype = 0 sym = Newline 10 readsym: symtype = 2 sym = E keyword readsym: symtype = 2 sym = N keyword readsym: symtype = 2 sym = D keyword readsym: symtype = 2 sym = O keyword readsym: symtype = 2 sym = F keyword readsym: symtype = 2 sym = P keyword readsym: symtype = 2 sym = R keyword readsym: symtype = 2 sym = O keyword readsym: symtype = 2 sym = G keyword readsym: symtype = 2 sym = R keyword readsym: symtype = 2 sym = A keyword readsym: symtype = 2 sym = M keyword readsym: symtype = 0 sym = Newline 10 Listing file: Edinburgh IMP77 Compiler - Version 8.4 1 %begin 2 %integer i = 123456 * ! type 3 %endofprogram ?I unused Program contains 1 fault