%k5000
ucase        [A-Z]
lcase        [a-z]
letter       ({ucase}|{lcase})
zero         0
nonzero      [1-9]
sign         [+-]
digit        ({zero}|{nonzero})
blanks       [ \t\f]
newline      \n
D                       [0-9]
O                       [0-7]
L                       [a-zA-Z_]
H                       [a-fA-F0-9]
E                       [Ee][+-]?{D}+
FS                      (f|F|l|L)
IS                      (u|U|l|L)*


%{
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <stdio.h>
#include "types.h"
#include "gram.h"
#include "listing.h"
#include "utils.h"
#include "build.h"
#include "protos.h"
#define MYRET(a)        \
	{             \
	echo(yytext); \
	return((a));  \
	}
#define RETKEY(a)                         \
	{                                 \
	echo(yytext);                     \
	yylval.rk.terminal = a;           \
	strcpy(yylval.rk.string,yytext);  \
	return((a));                      \
	}
   int linenumber;
   int col;
%}

%%
[Cc][Ll][Aa][Ss][Ss]    {RETKEY(CLASS)}
[Ee][Xx][Tt][Ee][Nn][Dd][Ss]    {RETKEY(EXTENDS)}
[Aa][Cc][Cc][Ee][Ss][Ss]    {RETKEY(ACCESS)}
[Ii][Mm][Pp][Ll][Ee][Mm][Ee][Nn][Tt][Ss]    {RETKEY(IMPLEMENTS)}
[Ff][Ii][Ee][Ll][Dd]    {RETKEY(FIELD)}
[Mm][Ee][Tt][Hh][Oo][Dd]    {RETKEY(METHOD)}
[Mm][Aa][Xx]"_"[Ss][Tt][Aa][Cc][Kk]    {RETKEY(MAX_STACK)}
[Mm][Aa][Xx]"_"[Ll][Oo][Cc][Aa][Ll][Ss]    {RETKEY(MAX_LOCALS)}
[Cc][Oo][Dd][Ee]    {RETKEY(CODE)}
[Pp][Uu][Bb][Ll][Ii][Cc]    {RETKEY(PUBLIC)}
[Pp][Rr][Ii][Vv][Aa][Tt][Ee]    {RETKEY(PRIVATE)}
[Pp][Rr][Oo][Tt][Ee][Cc][Tt][Ee][Dd]    {RETKEY(PROTECTED)}
[Aa][Bb][Ss][Tt][Rr][Aa][Cc][Tt]    {RETKEY(ABSTRACT)}
[Ff][Ii][Nn][Aa][Ll]    {RETKEY(FINAL)}
[Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee]    {RETKEY(INTERFACE)}
[Ss][Tt][Aa][Tt][Ii][Cc]    {RETKEY(STATIC)}
[Nn][Aa][Tt][Ii][Vv][Ee]    {RETKEY(NATIVE)}
[Ss][Yy][Nn][Cc][Hh][Rr][Oo][Nn][Ii][Zz][Ee][Dd]    {RETKEY(SYNCHRONIZED)}
[Tt][Rr][Aa][Nn][Ss][Ii][Ee][Nn][Tt]    {RETKEY(TRANSIENT)}
[Vv][Oo][Ll][Aa][Tt][Ii][Ll][Ee]    {RETKEY(VOLATILE)}
[Bb][Yy][Tt][Ee]    {RETKEY(BYTE)}
[Cc][Hh][Aa][Rr]    {RETKEY(CHAR)}
[Dd][Oo][Uu][Bb][Ll][Ee]    {RETKEY(DOUBLE)}
[Ff][Ll][Oo][Aa][Tt]    {RETKEY(FLOAT)}
[Ii][Nn][Tt]    {RETKEY(INT)}
[Ll][Oo][Nn][Gg]    {RETKEY(LONG)}
[Ss][Hh][Oo][Rr][Tt]    {RETKEY(SHORT)}
[Bb][Oo][Oo][Ll][Ee][Aa][Nn]    {RETKEY(BOOLEAN)}
[Vv][Oo][Ii][Dd]    {RETKEY(VOID)}
[Dd][Ee][Ff][Aa][Uu][Ll][Tt]    {RETKEY(DEFAULT)}
[Tt][Oo]    {RETKEY(TO)}
[Ee][Xx][Cc][Ee][Pp][Tt][Ii][Oo][Nn][Ss]    {RETKEY(EXCEPTIONS)}
[Ss][Oo][Uu][Rr][Cc][Ee][Ff][Ii][Ll][Ee]    {RETKEY(SOURCEFILE)}
[Tt][Hh][Rr][Oo][Ww][Ss]    {RETKEY(THROWS)}
[Ll][Ii][Nn][Ee][Nn][Uu][Mm][Bb][Ee][Rr][Tt][Aa][Bb][Ll][Ee]    {RETKEY(LINENUMBERTABLE)}
[Ll][Oo][Cc][Aa][Ll][Vv][Aa][Rr][Ii][Aa][Bb][Ll][Ee][Tt][Aa][Bb][Ll][Ee]    {RETKEY(LOCALVARIABLETABLE)}
[Aa][Cc][Cc]"_"[Pp][Uu][Bb][Ll][Ii][Cc]    {RETKEY(ACC_PUBLIC)}
[Aa][Cc][Cc]"_"[Pp][Rr][Ii][Vv][Aa][Tt][Ee]    {RETKEY(ACC_PRIVATE)}
[Aa][Cc][Cc]"_"[Pp][Rr][Oo][Tt][Ee][Cc][Tt][Ee][Dd]    {RETKEY(ACC_PROTECTED)}
[Aa][Cc][Cc]"_"[Ss][Tt][Aa][Tt][Ii][Cc]    {RETKEY(ACC_STATIC)}
[Aa][Cc][Cc]"_"[Ff][Ii][Nn][Aa][Ll]    {RETKEY(ACC_FINAL)}
[Aa][Cc][Cc]"_"[Ss][Yy][Nn][Cc][Hh][Rr][Oo][Nn][Ii][Zz][Ee][Dd]    {RETKEY(ACC_SYNCHRONIZED)}
[Aa][Cc][Cc]"_"[Vv][Oo][Ll][Aa][Tt][Ii][Ll][Ee]    {RETKEY(ACC_VOLATILE)}
[Aa][Cc][Cc]"_"[Tt][Rr][Aa][Nn][Ss][Ii][Ee][Nn][Tt]    {RETKEY(ACC_TRANSIENT)}
[Aa][Cc][Cc]"_"[Nn][Aa][Tt][Ii][Vv][Ee]    {RETKEY(ACC_NATIVE)}
[Aa][Cc][Cc]"_"[Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee]    {RETKEY(ACC_INTERFACE)}
[Aa][Cc][Cc]"_"[Aa][Bb][Ss][Tt][Rr][Aa][Cc][Tt]    {RETKEY(ACC_ABSTRACT)}
[Aa][Aa][Ll][Oo][Aa][Dd]    {RETKEY(AALOAD)}
[Aa][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(AASTORE)}
[Aa][Cc][Oo][Nn][Ss][Tt]"_"[Nn][Uu][Ll][Ll]    {RETKEY(ACONST_NULL)}
[Aa][Ll][Oo][Aa][Dd]"_""0"    {RETKEY(ALOAD_0)}
[Aa][Ll][Oo][Aa][Dd]"_""1"    {RETKEY(ALOAD_1)}
[Aa][Ll][Oo][Aa][Dd]"_""2"    {RETKEY(ALOAD_2)}
[Aa][Ll][Oo][Aa][Dd]"_""3"    {RETKEY(ALOAD_3)}
[Aa][Nn][Ee][Ww][Aa][Rr][Rr][Aa][Yy]    {RETKEY(ANEWARRAY)}
[Aa][Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(ARETURN)}
[Aa][Rr][Rr][Aa][Yy][Ll][Ee][Nn][Gg][Tt][Hh]    {RETKEY(ARRAYLENGTH)}
[Aa][Ss][Tt][Oo][Rr][Ee]"_""0"    {RETKEY(ASTORE_0)}
[Aa][Ss][Tt][Oo][Rr][Ee]"_""1"    {RETKEY(ASTORE_1)}
[Aa][Ss][Tt][Oo][Rr][Ee]"_""2"    {RETKEY(ASTORE_2)}
[Aa][Ss][Tt][Oo][Rr][Ee]"_""3"    {RETKEY(ASTORE_3)}
[Aa][Tt][Hh][Rr][Oo][Ww]    {RETKEY(ATHROW)}
[Bb][Aa][Ll][Oo][Aa][Dd]    {RETKEY(BALOAD)}
[Bb][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(BASTORE)}
[Bb][Ii][Pp][Uu][Ss][Hh]    {RETKEY(BIPUSH)}
[Cc][Aa][Ll][Oo][Aa][Dd]    {RETKEY(CALOAD)}
[Cc][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(CASTORE)}
[Cc][Hh][Ee][Cc][Kk][Cc][Aa][Ss][Tt]    {RETKEY(CHECKCAST)}
[Dd]"2"[Ff]    {RETKEY(D2F)}
[Dd]"2"[Ii]    {RETKEY(D2I)}
[Dd]"2"[Ll]    {RETKEY(D2L)}
[Dd][Aa][Dd][Dd]    {RETKEY(DADD)}
[Dd][Aa][Ll][Oo][Aa][Dd]    {RETKEY(DALOAD)}
[Dd][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(DASTORE)}
[Dd][Cc][Mm][Pp][Gg]    {RETKEY(DCMPG)}
[Dd][Cc][Mm][Pp][Ll]    {RETKEY(DCMPL)}
[Dd][Cc][Oo][Nn][Ss][Tt]"_""0"    {RETKEY(DCONST_0)}
[Dd][Cc][Oo][Nn][Ss][Tt]"_""1"    {RETKEY(DCONST_1)}
[Dd][Dd][Ii][Vv]    {RETKEY(DDIV)}
[Dd][Ll][Oo][Aa][Dd]"_""0"    {RETKEY(DLOAD_0)}
[Dd][Ll][Oo][Aa][Dd]"_""1"    {RETKEY(DLOAD_1)}
[Dd][Ll][Oo][Aa][Dd]"_""2"    {RETKEY(DLOAD_2)}
[Dd][Ll][Oo][Aa][Dd]"_""3"    {RETKEY(DLOAD_3)}
[Dd][Mm][Uu][Ll]    {RETKEY(DMUL)}
[Dd][Nn][Ee][Gg]    {RETKEY(DNEG)}
[Dd][Rr][Ee][Mm]    {RETKEY(DREM)}
[Dd][Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(DRETURN)}
[Dd][Ss][Tt][Oo][Rr][Ee]"_""0"    {RETKEY(DSTORE_0)}
[Dd][Ss][Tt][Oo][Rr][Ee]"_""1"    {RETKEY(DSTORE_1)}
[Dd][Ss][Tt][Oo][Rr][Ee]"_""2"    {RETKEY(DSTORE_2)}
[Dd][Ss][Tt][Oo][Rr][Ee]"_""3"    {RETKEY(DSTORE_3)}
[Dd][Ss][Uu][Bb]    {RETKEY(DSUB)}
[Dd][Uu][Pp]    {RETKEY(DUP)}
[Dd][Uu][Pp]"_"[Xx]"1"    {RETKEY(DUP_X1)}
[Dd][Uu][Pp]"_"[Xx]"2"    {RETKEY(DUP_X2)}
[Dd][Uu][Pp]"2"    {RETKEY(DUP2)}
[Dd][Uu][Pp]"2""_"[Xx]"1"    {RETKEY(DUP2_X1)}
[Dd][Uu][Pp]"2""_"[Xx]"2"    {RETKEY(DUP2_X2)}
[Ff]"2"[Dd]    {RETKEY(F2D)}
[Ff]"2"[Ii]    {RETKEY(F2I)}
[Ff]"2"[Ll]    {RETKEY(F2L)}
[Ff][Aa][Dd][Dd]    {RETKEY(FADD)}
[Ff][Aa][Ll][Oo][Aa][Dd]    {RETKEY(FALOAD)}
[Ff][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(FASTORE)}
[Ff][Cc][Mm][Pp][Gg]    {RETKEY(FCMPG)}
[Ff][Cc][Mm][Pp][Ll]    {RETKEY(FCMPL)}
[Ff][Cc][Oo][Nn][Ss][Tt]"_""0"    {RETKEY(FCONST_0)}
[Ff][Cc][Oo][Nn][Ss][Tt]"_""1"    {RETKEY(FCONST_1)}
[Ff][Cc][Oo][Nn][Ss][Tt]"_""2"    {RETKEY(FCONST_2)}
[Ff][Dd][Ii][Vv]    {RETKEY(FDIV)}
[Ff][Ll][Oo][Aa][Dd]"_""0"    {RETKEY(FLOAD_0)}
[Ff][Ll][Oo][Aa][Dd]"_""1"    {RETKEY(FLOAD_1)}
[Ff][Ll][Oo][Aa][Dd]"_""2"    {RETKEY(FLOAD_2)}
[Ff][Ll][Oo][Aa][Dd]"_""3"    {RETKEY(FLOAD_3)}
[Ff][Mm][Uu][Ll]    {RETKEY(FMUL)}
[Ff][Nn][Ee][Gg]    {RETKEY(FNEG)}
[Ff][Rr][Ee][Mm]    {RETKEY(FREM)}
[Ff][Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(FRETURN)}
[Ff][Ss][Tt][Oo][Rr][Ee]"_""0"    {RETKEY(FSTORE_0)}
[Ff][Ss][Tt][Oo][Rr][Ee]"_""1"    {RETKEY(FSTORE_1)}
[Ff][Ss][Tt][Oo][Rr][Ee]"_""2"    {RETKEY(FSTORE_2)}
[Ff][Ss][Tt][Oo][Rr][Ee]"_""3"    {RETKEY(FSTORE_3)}
[Ff][Ss][Uu][Bb]    {RETKEY(FSUB)}
[Gg][Ee][Tt][Ff][Ii][Ee][Ll][Dd]    {RETKEY(GETFIELD)}
[Gg][Ee][Tt][Ss][Tt][Aa][Tt][Ii][Cc]    {RETKEY(GETSTATIC)}
[Gg][Oo][Tt][Oo]    {RETKEY(GOTO)}
[Gg][Oo][Tt][Oo]"_"[Ww]    {RETKEY(GOTO_W)}
[Ii]"2"[Bb]    {RETKEY(I2B)}
[Ii]"2"[Cc]    {RETKEY(I2C)}
[Ii]"2"[Dd]    {RETKEY(I2D)}
[Ii]"2"[Ff]    {RETKEY(I2F)}
[Ii]"2"[Ll]    {RETKEY(I2L)}
[Ii]"2"[Ss]    {RETKEY(I2S)}
[Ii][Aa][Dd][Dd]    {RETKEY(IADD)}
[Ii][Aa][Ll][Oo][Aa][Dd]    {RETKEY(IALOAD)}
[Ii][Aa][Nn][Dd]    {RETKEY(IAND)}
[Ii][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(IASTORE)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""0"    {RETKEY(ICONST_0)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""1"    {RETKEY(ICONST_1)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""2"    {RETKEY(ICONST_2)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""3"    {RETKEY(ICONST_3)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""4"    {RETKEY(ICONST_4)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_""5"    {RETKEY(ICONST_5)}
[Ii][Cc][Oo][Nn][Ss][Tt]"_"[Mm]"1"    {RETKEY(ICONST_M1)}
[Ii][Dd][Ii][Vv]    {RETKEY(IDIV)}
[Ii][Ff]"_"[Aa][Cc][Mm][Pp][Ee][Qq]    {RETKEY(IF_ACMPEQ)}
[Ii][Ff]"_"[Aa][Cc][Mm][Pp][Nn][Ee]    {RETKEY(IF_ACMPNE)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Ee][Qq]    {RETKEY(IF_ICMPEQ)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Nn][Ee]    {RETKEY(IF_ICMPNE)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Ll][Tt]    {RETKEY(IF_ICMPLT)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Gg][Ee]    {RETKEY(IF_ICMPGE)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Gg][Tt]    {RETKEY(IF_ICMPGT)}
[Ii][Ff]"_"[Ii][Cc][Mm][Pp][Ll][Ee]    {RETKEY(IF_ICMPLE)}
[Ii][Ff][Ee][Qq]    {RETKEY(IFEQ)}
[Ii][Ff][Nn][Ee]    {RETKEY(IFNE)}
[Ii][Ff][Ll][Tt]    {RETKEY(IFLT)}
[Ii][Ff][Gg][Ee]    {RETKEY(IFGE)}
[Ii][Ff][Gg][Tt]    {RETKEY(IFGT)}
[Ii][Ff][Ll][Ee]    {RETKEY(IFLE)}
[Ii][Ff][Nn][Oo][Nn][Nn][Uu][Ll][Ll]    {RETKEY(IFNONNULL)}
[Ii][Ff][Nn][Uu][Ll][Ll]    {RETKEY(IFNULL)}
[Ii][Ll][Oo][Aa][Dd]"_""0"    {RETKEY(ILOAD_0)}
[Ii][Ll][Oo][Aa][Dd]"_""1"    {RETKEY(ILOAD_1)}
[Ii][Ll][Oo][Aa][Dd]"_""2"    {RETKEY(ILOAD_2)}
[Ii][Ll][Oo][Aa][Dd]"_""3"    {RETKEY(ILOAD_3)}
[Ii][Mm][Uu][Ll]    {RETKEY(IMUL)}
[Ii][Nn][Ee][Gg]    {RETKEY(INEG)}
[Ii][Oo][Rr]    {RETKEY(IOR)}
[Ii][Rr][Ee][Mm]    {RETKEY(IREM)}
[Ii][Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(IRETURN)}
[Ii][Ss][Hh][Ll]    {RETKEY(ISHL)}
[Ii][Ss][Hh][Rr]    {RETKEY(ISHR)}
[Ii][Ss][Tt][Oo][Rr][Ee]"_""0"    {RETKEY(ISTORE_0)}
[Ii][Ss][Tt][Oo][Rr][Ee]"_""1"    {RETKEY(ISTORE_1)}
[Ii][Ss][Tt][Oo][Rr][Ee]"_""2"    {RETKEY(ISTORE_2)}
[Ii][Ss][Tt][Oo][Rr][Ee]"_""3"    {RETKEY(ISTORE_3)}
[Ii][Ss][Uu][Bb]    {RETKEY(ISUB)}
[Ii][Uu][Ss][Hh][Rr]    {RETKEY(IUSHR)}
[Ii][Xx][Oo][Rr]    {RETKEY(IXOR)}
[Jj][Ss][Rr]    {RETKEY(JSR)}
[Jj][Ss][Rr]"_"[Ww]    {RETKEY(JSR_W)}
[Ll]"2"[Dd]    {RETKEY(L2D)}
[Ll]"2"[Ff]    {RETKEY(L2F)}
[Ll]"2"[Ii]    {RETKEY(L2I)}
[Ll][Aa][Dd][Dd]    {RETKEY(LADD)}
[Ll][Aa][Ll][Oo][Aa][Dd]    {RETKEY(LALOAD)}
[Ll][Aa][Nn][Dd]    {RETKEY(LAND)}
[Ll][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(LASTORE)}
[Ll][Cc][Mm][Pp]    {RETKEY(LCMP)}
[Ll][Cc][Oo][Nn][Ss][Tt]"_""0"    {RETKEY(LCONST_0)}
[Ll][Cc][Oo][Nn][Ss][Tt]"_""1"    {RETKEY(LCONST_1)}
[Ll][Dd][Ii][Vv]    {RETKEY(LDIV)}
[Ll][Ll][Oo][Aa][Dd]"_""0"    {RETKEY(LLOAD_0)}
[Ll][Ll][Oo][Aa][Dd]"_""1"    {RETKEY(LLOAD_1)}
[Ll][Ll][Oo][Aa][Dd]"_""2"    {RETKEY(LLOAD_2)}
[Ll][Ll][Oo][Aa][Dd]"_""3"    {RETKEY(LLOAD_3)}
[Ll][Mm][Uu][Ll]    {RETKEY(LMUL)}
[Ll][Nn][Ee][Gg]    {RETKEY(LNEG)}
[Ll][Oo][Rr]    {RETKEY(LOR)}
[Ll][Rr][Ee][Mm]    {RETKEY(LREM)}
[Ll][Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(LRETURN)}
[Ll][Ss][Hh][Ll]    {RETKEY(LSHL)}
[Ll][Ss][Hh][Rr]    {RETKEY(LSHR)}
[Ll][Ss][Tt][Oo][Rr][Ee]"_""0"    {RETKEY(LSTORE_0)}
[Ll][Ss][Tt][Oo][Rr][Ee]"_""1"    {RETKEY(LSTORE_1)}
[Ll][Ss][Tt][Oo][Rr][Ee]"_""2"    {RETKEY(LSTORE_2)}
[Ll][Ss][Tt][Oo][Rr][Ee]"_""3"    {RETKEY(LSTORE_3)}
[Ll][Ss][Uu][Bb]    {RETKEY(LSUB)}
[Ll][Uu][Ss][Hh][Rr]    {RETKEY(LUSHR)}
[Ll][Xx][Oo][Rr]    {RETKEY(LXOR)}
[Mm][Oo][Nn][Ii][Tt][Oo][Rr][Ee][Nn][Tt][Ee][Rr]    {RETKEY(MONITORENTER)}
[Mm][Oo][Nn][Ii][Tt][Oo][Rr][Ee][Xx][Ii][Tt]    {RETKEY(MONITOREXIT)}
[Nn][Oo][Pp]    {RETKEY(NOP)}
[Pp][Oo][Pp]    {RETKEY(POP)}
[Pp][Oo][Pp]"2"    {RETKEY(POP2)}
[Rr][Ee][Tt][Uu][Rr][Nn]    {RETKEY(RETURN)}
[Ss][Aa][Ll][Oo][Aa][Dd]    {RETKEY(SALOAD)}
[Ss][Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(SASTORE)}
[Ss][Ww][Aa][Pp]    {RETKEY(SWAP)}
[Ii][Ii][Nn][Cc]    {RETKEY(IINC)}
[Ii][Nn][Ss][Tt][Aa][Nn][Cc][Ee][Oo][Ff]    {RETKEY(INSTANCEOF)}
[Ii][Nn][Vv][Oo][Kk][Ee][Ii][Nn][Tt][Ee][Rr][Ff][Aa][Cc][Ee]    {RETKEY(INVOKEINTERFACE)}
[Ii][Nn][Vv][Oo][Kk][Ee][Nn][Oo][Nn][Vv][Ii][Rr][Tt][Uu][Aa][Ll]    {RETKEY(INVOKENONVIRTUAL)}
[Ii][Nn][Vv][Oo][Kk][Ee][Ss][Tt][Aa][Tt][Ii][Cc]    {RETKEY(INVOKESTATIC)}
[Ii][Nn][Vv][Oo][Kk][Ee][Vv][Ii][Rr][Tt][Uu][Aa][Ll]    {RETKEY(INVOKEVIRTUAL)}
[Ll][Dd][Cc]    {RETKEY(LDC)}
[Ll][Dd][Cc]"_"[Ww]    {RETKEY(LDC_W)}
[Ll][Dd][Cc]"2""_"[Ww]    {RETKEY(LDC2_W)}
[Mm][Uu][Ll][Tt][Ii][Aa][Nn][Ee][Ww][Aa][Rr][Rr][Aa][Yy]    {RETKEY(MULTIANEWARRAY)}
[Nn][Ee][Ww]    {RETKEY(NEW)}
[Nn][Ee][Ww][Aa][Rr][Rr][Aa][Yy]    {RETKEY(NEWARRAY)}
[Pp][Uu][Tt][Ff][Ii][Ee][Ll][Dd]    {RETKEY(PUTFIELD)}
[Pp][Uu][Tt][Ss][Tt][Aa][Tt][Ii][Cc]    {RETKEY(PUTSTATIC)}
[Ss][Ii][Pp][Uu][Ss][Hh]    {RETKEY(SIPUSH)}
[Ii][Ll][Oo][Aa][Dd]    {RETKEY(ILOAD)}
[Ff][Ll][Oo][Aa][Dd]    {RETKEY(FLOAD)}
[Aa][Ll][Oo][Aa][Dd]    {RETKEY(ALOAD)}
[Ll][Ll][Oo][Aa][Dd]    {RETKEY(LLOAD)}
[Dd][Ll][Oo][Aa][Dd]    {RETKEY(DLOAD)}
[Ii][Ss][Tt][Oo][Rr][Ee]    {RETKEY(ISTORE)}
[Ff][Ss][Tt][Oo][Rr][Ee]    {RETKEY(FSTORE)}
[Aa][Ss][Tt][Oo][Rr][Ee]    {RETKEY(ASTORE)}
[Ll][Ss][Tt][Oo][Rr][Ee]    {RETKEY(LSTORE)}
[Dd][Ss][Tt][Oo][Rr][Ee]    {RETKEY(DSTORE)}
[Rr][Ee][Tt]    {RETKEY(RET)}
[Ww][Ii][Dd][Ee]    {RETKEY(WIDE)}
[Ll][Oo][Aa][Dd]    {RETKEY(LOAD)}
[Ss][Tt][Oo][Rr][Ee]    {RETKEY(STORE)}
[Ll][Oo][Oo][Kk][Uu][Pp][Ss][Ww][Ii][Tt][Cc][Hh]    {RETKEY(LOOKUPSWITCH)}
[Tt][Aa][Bb][Ll][Ee][Ss][Ww][Ii][Tt][Cc][Hh]    {RETKEY(TABLESWITCH)}
{blanks}+				{echo(yytext);}
{newline}				{ NewLine(1); }
^#.*$					{echo(yytext);}
"/*"(\\.|[^\\*/]|"*"[^/])*"*/"		{echo(yytext);}
{L}({L}|{D})*":"	{ 
			  if (yyleng >= 99) oops("String too long");
			  else {
			     unsigned char c;
			     char *str;
			     str = (char *) malloc(yyleng+2);
			     c = strlen(yytext);
			     strcpy(&(str[1]),yytext);
			     str[0] = c;
			     str[c] = '\0';
			     yylval.string = &(str[1]);
			  }
			  MYRET(LABEL) 
			}
({L}({L}|{D})*\/)+{L}({L}|{D})* {
			  if (yyleng >= 99) oops("String too long");
			  else {
			     unsigned char c;
			     char *str;
			     str = (char *) malloc(yyleng+2);
			     c = strlen(yytext);
			     strcpy(&(str[1]),yytext);
			     str[0] = c;
			     yylval.string = &(str[1]);
			  }
			  MYRET(IDENTIFIER) 
			}
"<"{L}({L}|{D})*">"		{ 
			  if (yyleng >= 99) oops("String too long");
			  else {
			     unsigned char c;
			     char *str;
			     str = (char *) malloc(yyleng+2);
			     c = strlen(yytext);
			     strcpy(&(str[1]),yytext);
			     str[0] = c;
			     yylval.string = &(str[1]);
			  }
			  if (IsTypeSymbol(yytext))
			       MYRET(IDENTIFIER)  /* was TYPENAME */
			  else MYRET(IDENTIFIER) 
			}
{L}({L}|{D})*		{ 
			  if (yyleng >= 99) oops("String too long");
			  else {
			     unsigned char c;
			     char *str;
			     str = (char *) malloc(yyleng+2);
			     c = strlen(yytext);
			     strcpy(&(str[1]),yytext);
			     str[0] = c;
			     yylval.string = &(str[1]);
			  }
			  if (IsTypeSymbol(yytext))
			       MYRET(IDENTIFIER)  /* was TYPENAME */
			  else MYRET(IDENTIFIER) 
			}

0[xX]{H}+		{ yylval.intval = (int) strtol(yytext,(char**)NULL,0);
		           MYRET(INTCONSTANT) }
0[xX]{H}+[lL]		{ yylval.longval = strtoll(yytext,(char**)NULL,0);
		           MYRET(LONGCONSTANT) /*all longs need work*/}
0			{ yylval.intval = 0; MYRET(INTCONSTANT) }
0{O}*	   		{ yylval.intval = (int) strtol(yytext,(char**)NULL,0);
		           MYRET(INTCONSTANT) }
0{O}*[lL]		{ yylval.longval = strtoll(yytext,(char**)NULL,0);
		           MYRET(LONGCONSTANT) }
[+-]{D}*   		{ yylval.intval = (int) strtol(yytext,(char**)NULL,0);
		           MYRET(INTCONSTANT) }
{D}*	   		{ yylval.intval = (int) strtol(yytext,(char**)NULL,0);
		           MYRET(INTCONSTANT) }
{D}*[lL]		{ yylval.longval = strtoll(yytext,(char**)NULL,0);
		           MYRET(LONGCONSTANT) }
\'\\n\'			{ yylval.charval = '\n';   MYRET(CHARCONSTANT) }
\'\\.\'			{ yylval.charval = yytext[2];   MYRET(CHARCONSTANT) }
\'.\'			{ yylval.charval = yytext[1];   MYRET(CHARCONSTANT) }
'(\\.|[^\\'])+'		{ oops("What was that?");   MYRET(CHARCONSTANT) }

{D}+{E}[dD]?			{ yylval.doubleval = atof(yytext); 
				MYRET(DOUBLECONSTANT) }
{D}*"."{D}+({E})?[dD]?	{ yylval.doubleval = atof(yytext); 
				MYRET(DOUBLECONSTANT) }
{D}+"."({E})?[dD]?	{ yylval.doubleval = atof(yytext); 
				MYRET(DOUBLECONSTANT) }
{D}+{E}[fF]		{ yylval.floatval = (float) atof(yytext); 
				MYRET(FLOATCONSTANT) }
{D}*"."{D}+({E})?[fF]	 { yylval.floatval = (float) atof(yytext); 
				MYRET(FLOATCONSTANT) }
{D}+"."({E})?[fF]	{ yylval.floatval = (float) atof(yytext); 
				MYRET(FLOATCONSTANT) }

\"(\\.|[^\\"])*\"	{
			  if (yyleng >= 99) oops("String too long");
			  else {
			     unsigned char c;
			     int textlength;
			     char *str;
			     str = (char *) malloc(yyleng);
			     textlength = yyleng-2;
			     c = textlength;
			     strncpy(&(str[1]),&(yytext[1]),textlength);
			     str[0] = c;
			     yylval.string = &(str[1]);
			  }
			  MYRET(STRING_LITERAL) 
			}

"="			{ MYRET('=') }
"<"			{ MYRET('<') }
">"			{ MYRET('>') }
"["			{ MYRET('[') }
"]"			{ MYRET(']') }
"("			{ MYRET('(') }
")"			{ MYRET(')') }
","			{ MYRET(',') }
"."			{ MYRET('.') }
"{"			{ MYRET('{') }
"}"			{ MYRET('}') }
"?"			{ MYRET('?') }
":"			{ MYRET(':') }
.					{echo(yytext); 
                                         oops("Illegal character");
                                        }
%%
/* Listing routines */

void StartListing(void) {
   printf("%s","*     Java Assembler\n\n");
   linenumber = 0;
   col        = 1;
   NewLine(1);
}

void EndListing(void) {
   printf("%s","\n\n*     End of Assembly \n\n");
}

void NewLine(int bump) 
{
   linenumber += bump;
   if (bump) {
      col = 1;
      printf("\n%7d: ",linenumber);
      }
   else printf("\n%s%6d: ","*",linenumber);
}

void echo(char *text) 
{
   col += strlen(yytext);
   printf("%s",yytext);
}

void StartMessage(void) {
   int i;
   NewLine(0);
   printf("%*s",col,"^^^ ");
}

void EndMessage(void) {
   int i;
   NewLine(0);
   printf("%*s",col," ");
}

void message(char *text) 
{
   StartMessage();
   printf("%s",text);
   EndMessage();
}

void ABORT(int line, int col)
{
   fprintf(stderr,"Aborting due to error at line %d, column %d\n",
                  line, col);
   EndListing();
   exit(1);
}

void warning(char *text)
{
   message(text);
   fprintf(stderr,"%s\n",text);
}
void oops(char *text) 
{
   message(text);
   fprintf(stderr,"%s\n",text);
   ABORT(linenumber,col);
}

int LineNumber() {
  return(linenumber);
}
int ColNumber() {
  return(col);
}
