Enhanced expression parser for PC relative symbol and modulo handling and bitwise or.

This commit is contained in:
Chris Hodges 2021-07-16 09:47:56 +02:00
parent e33470ea1a
commit b7f655745b
15 changed files with 728 additions and 258 deletions

View File

@ -38,8 +38,9 @@ public class _M68kLexer implements FlexLexer {
public static final int ASMOPS = 8; public static final int ASMOPS = 8;
public static final int ASSIGNMENT = 10; public static final int ASSIGNMENT = 10;
public static final int EXPR = 12; public static final int EXPR = 12;
public static final int MACROCALL = 14; public static final int EXPR_OP = 14;
public static final int WAITEOL = 16; public static final int MACROCALL = 16;
public static final int WAITEOL = 18;
/** /**
* ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
@ -49,7 +50,7 @@ public class _M68kLexer implements FlexLexer {
*/ */
private static final int ZZ_LEXSTATE[] = { private static final int ZZ_LEXSTATE[] = {
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
8, 8 8, 8, 9, 9
}; };
/** /**
@ -131,12 +132,12 @@ public class _M68kLexer implements FlexLexer {
/* The ZZ_CMAP_A table has 3200 entries */ /* The ZZ_CMAP_A table has 3200 entries */
static final char ZZ_CMAP_A[] = zzUnpackCMap( static final char ZZ_CMAP_A[] = zzUnpackCMap(
"\11\0\1\4\1\2\2\1\1\3\22\0\1\4\1\54\1\44\1\51\1\24\1\31\1\52\1\43\1\56\1\57" + "\11\0\1\4\1\2\2\1\1\3\22\0\1\4\1\55\1\44\1\51\1\24\1\31\1\62\1\43\1\53\1\54" +
"\1\63\1\61\1\47\1\62\1\22\1\64\2\32\6\6\2\36\1\23\1\50\1\45\1\21\1\46\1\0" + "\1\61\1\57\1\47\1\60\1\22\1\64\2\32\6\6\2\36\1\23\1\50\1\45\1\21\1\46\1\0" +
"\1\40\1\5\1\71\1\65\1\11\1\15\6\12\1\30\3\12\1\10\1\16\1\67\1\7\1\20\1\17" + "\1\40\1\5\1\71\1\65\1\11\1\15\6\12\1\30\3\12\1\10\1\16\1\67\1\7\1\20\1\17" +
"\1\70\1\27\3\12\1\0\1\42\1\0\1\55\1\13\1\41\1\33\1\26\1\66\1\34\1\37\1\35" + "\1\70\1\27\3\12\1\0\1\42\1\0\1\52\1\13\1\41\1\33\1\26\1\66\1\34\1\37\1\35" +
"\5\12\1\30\3\12\1\10\1\16\1\67\1\25\1\20\1\17\1\70\1\27\3\12\1\0\1\53\1\0" + "\5\12\1\30\3\12\1\10\1\16\1\67\1\25\1\20\1\17\1\70\1\27\3\12\1\0\1\63\1\0" +
"\1\60\6\0\1\1\12\0\1\4\11\0\1\12\12\0\1\12\4\0\1\12\5\0\27\12\1\0\27\12\1" + "\1\56\6\0\1\1\12\0\1\4\11\0\1\12\12\0\1\12\4\0\1\12\5\0\27\12\1\0\27\12\1" +
"\7\2\12\4\0\14\12\16\0\5\12\7\0\1\12\1\0\1\12\1\0\5\12\1\0\2\12\2\0\4\12\1" + "\7\2\12\4\0\14\12\16\0\5\12\7\0\1\12\1\0\1\12\1\0\5\12\1\0\2\12\2\0\4\12\1" +
"\0\1\12\6\0\1\12\1\0\3\12\1\0\1\12\1\0\4\12\1\0\23\12\1\0\13\12\10\0\6\12" + "\0\1\12\6\0\1\12\1\0\3\12\1\0\1\12\1\0\4\12\1\0\23\12\1\0\13\12\10\0\6\12" +
"\1\0\26\12\2\0\1\12\6\0\10\12\10\0\13\12\5\0\3\12\15\0\12\14\4\0\6\12\1\0" + "\1\0\26\12\2\0\1\12\6\0\10\12\10\0\13\12\5\0\3\12\15\0\12\14\4\0\6\12\1\0" +
@ -188,21 +189,25 @@ public class _M68kLexer implements FlexLexer {
private static final int[] ZZ_ACTION = zzUnpackAction(); private static final int[] ZZ_ACTION = zzUnpackAction();
private static final String ZZ_ACTION_PACKED_0 = private static final String ZZ_ACTION_PACKED_0 =
"\11\0\1\1\2\2\1\3\1\4\1\1\1\5\2\6" + "\12\0\1\1\2\2\1\3\1\4\1\1\1\5\2\6" +
"\1\2\1\7\1\10\1\1\1\11\2\12\1\7\1\10" + "\1\2\1\7\1\10\1\1\1\11\2\12\1\7\1\10" +
"\1\13\1\14\1\1\1\15\1\16\5\15\1\17\1\15" + "\1\13\1\14\1\1\1\15\1\16\5\15\1\17\1\15" +
"\1\1\1\20\4\1\1\21\1\22\1\23\1\24\1\25" + "\1\1\1\20\4\1\1\21\1\22\1\23\1\24\1\25" +
"\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35" + "\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35" +
"\1\36\1\37\2\15\2\1\1\40\1\41\1\12\4\41" + "\1\36\1\37\2\15\2\1\1\40\1\41\1\42\6\1" +
"\1\0\1\42\1\4\2\43\3\0\1\44\1\45\1\46" + "\1\43\1\30\1\44\1\40\1\45\1\46\1\47\1\50" +
"\1\47\1\50\1\51\1\52\1\15\1\53\1\44\1\45" + "\1\51\1\52\1\53\1\54\1\55\1\56\1\57\1\60" +
"\1\46\1\54\1\55\1\56\1\0\1\41\5\0\1\57" + "\1\53\1\61\1\62\1\12\4\62\1\0\1\63\1\4" +
"\1\60\1\61\1\62\1\63\1\64\1\65\2\15\2\0" + "\2\64\3\0\1\65\1\66\1\67\1\70\1\71\1\72" +
"\3\41\1\0\1\41\2\0\1\4\1\43\1\7\1\66" + "\1\73\1\15\1\74\1\65\1\66\1\67\1\75\1\76" +
"\1\67\1\70\1\71\4\0"; "\1\77\1\0\1\62\5\0\1\100\1\101\1\102\1\103" +
"\1\104\1\105\1\106\1\20\2\15\2\0\1\107\1\110" +
"\1\111\1\0\1\112\5\0\1\113\1\114\1\115\1\116" +
"\1\117\1\120\1\121\1\122\3\62\1\0\1\62\2\0" +
"\1\4\1\64\1\7\1\123\1\124\1\125\1\126\4\0";
private static int[] zzUnpackAction() { private static int[] zzUnpackAction() {
int[] result = new int[130]; int[] result = new int[176];
int offset = 0; int offset = 0;
offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
return result; return result;
@ -228,25 +233,30 @@ public class _M68kLexer implements FlexLexer {
private static final String ZZ_ROWMAP_PACKED_0 = private static final String ZZ_ROWMAP_PACKED_0 =
"\0\0\0\72\0\164\0\256\0\350\0\u0122\0\u015c\0\u0196" + "\0\0\0\72\0\164\0\256\0\350\0\u0122\0\u015c\0\u0196" +
"\0\u01d0\0\u020a\0\u020a\0\u0244\0\u027e\0\u02b8\0\u02f2\0\u032c" + "\0\u01d0\0\u020a\0\u0244\0\u0244\0\u027e\0\u02b8\0\u02f2\0\u032c" +
"\0\u020a\0\u0366\0\u03a0\0\u03da\0\u0414\0\u044e\0\u0488\0\u020a" + "\0\u0366\0\u0244\0\u03a0\0\u03da\0\u0414\0\u044e\0\u0488\0\u04c2" +
"\0\u04c2\0\u04fc\0\u0536\0\u0570\0\u05aa\0\u05e4\0\u061e\0\u0658" + "\0\u0244\0\u04fc\0\u0536\0\u0570\0\u05aa\0\u05e4\0\u061e\0\u0658" +
"\0\u0692\0\u06cc\0\u0706\0\u0740\0\u077a\0\u07b4\0\u07ee\0\u0828" + "\0\u0692\0\u06cc\0\u0706\0\u0740\0\u077a\0\u07b4\0\u07ee\0\u0828" +
"\0\u0862\0\u089c\0\u08d6\0\u0910\0\u094a\0\u0984\0\u09be\0\u020a" + "\0\u0862\0\u089c\0\u08d6\0\u0910\0\u094a\0\u0984\0\u09be\0\u09f8" +
"\0\u020a\0\u09f8\0\u0a32\0\u0a6c\0\u020a\0\u020a\0\u020a\0\u020a" + "\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u0a32\0\u0244\0\u0244" +
"\0\u020a\0\u020a\0\u020a\0\u020a\0\u0aa6\0\u0ae0\0\u0b1a\0\u0b54" + "\0\u0244\0\u0244\0\u0a6c\0\u0aa6\0\u0ae0\0\u0b1a\0\u0b54\0\u0b8e" +
"\0\u020a\0\u0b8e\0\u0b8e\0\u0bc8\0\u0c02\0\u0c3c\0\u0c76\0\u0cb0" + "\0\u0bc8\0\u0244\0\u0c02\0\u0c3c\0\u0c76\0\u0cb0\0\u0cea\0\u0d24" +
"\0\u0cea\0\u0d24\0\u0d5e\0\u0d98\0\u0dd2\0\u0d5e\0\u0e0c\0\u020a" + "\0\u0d5e\0\u0d98\0\u0244\0\u0244\0\u0244\0\u0dd2\0\u0244\0\u0e0c" +
"\0\u020a\0\u020a\0\u0740\0\u0740\0\u0740\0\u0740\0\u0e46\0\u020a" + "\0\u0e46\0\u0244\0\u0244\0\u0244\0\u0e80\0\u0244\0\u0244\0\u0244" +
"\0\u0740\0\u0740\0\u0740\0\u0828\0\u0862\0\u089c\0\u08d6\0\u020a" + "\0\u0244\0\u0eba\0\u0ef4\0\u0f2e\0\u0f68\0\u0f68\0\u0fa2\0\u0fdc" +
"\0\u0e80\0\u0910\0\u0eba\0\u094a\0\u0ef4\0\u020a\0\u020a\0\u020a" + "\0\u1016\0\u1050\0\u108a\0\u10c4\0\u10fe\0\u1138\0\u1172\0\u11ac" +
"\0\u020a\0\u020a\0\u020a\0\u020a\0\u0f2e\0\u0f68\0\u0fa2\0\u0fdc" + "\0\u1138\0\u11e6\0\u0244\0\u0244\0\u0244\0\u077a\0\u077a\0\u077a" +
"\0\u1016\0\u1050\0\u108a\0\u10c4\0\u10fe\0\u1138\0\u1172\0\u020a" + "\0\u077a\0\u1220\0\u0244\0\u077a\0\u077a\0\u077a\0\u0862\0\u089c" +
"\0\u020a\0\u020a\0\u0740\0\u0740\0\u0740\0\u020a\0\u11ac\0\u11e6" + "\0\u08d6\0\u0910\0\u0244\0\u125a\0\u094a\0\u1294\0\u0984\0\u12ce" +
"\0\u1220\0\u0cea"; "\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244" +
"\0\u1308\0\u1342\0\u137c\0\u13b6\0\u0c76\0\u0cb0\0\u0cea\0\u0d24" +
"\0\u0244\0\u13f0\0\u0d5e\0\u142a\0\u0d98\0\u1464\0\u0244\0\u0244" +
"\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u0244\0\u149e\0\u14d8" +
"\0\u1512\0\u154c\0\u1586\0\u15c0\0\u15fa\0\u0244\0\u0244\0\u0244" +
"\0\u077a\0\u077a\0\u077a\0\u0244\0\u1634\0\u166e\0\u16a8\0\u10c4";
private static int[] zzUnpackRowMap() { private static int[] zzUnpackRowMap() {
int[] result = new int[130]; int[] result = new int[176];
int offset = 0; int offset = 0;
offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
return result; return result;
@ -269,90 +279,102 @@ public class _M68kLexer implements FlexLexer {
private static final int[] ZZ_TRANS = zzUnpackTrans(); private static final int[] ZZ_TRANS = zzUnpackTrans();
private static final String ZZ_TRANS_PACKED_0 = private static final String ZZ_TRANS_PACKED_0 =
"\1\12\2\13\1\14\1\15\1\16\1\12\5\16\1\12" + "\1\13\2\14\1\15\1\16\1\17\1\13\5\17\1\13" +
"\4\16\1\12\1\17\2\12\4\16\2\12\3\16\1\12" + "\4\17\1\13\1\20\2\13\4\17\2\13\3\17\1\13" +
"\1\16\10\12\2\20\11\12\1\20\1\12\5\16\1\12" + "\1\17\10\13\2\21\7\13\1\21\3\13\5\17\1\13" +
"\2\21\1\22\1\23\1\24\1\12\4\24\1\25\1\12" + "\2\22\1\23\1\24\1\25\1\13\4\25\1\26\1\13" +
"\4\24\1\12\1\26\2\12\4\24\2\12\3\24\1\12" + "\4\25\1\13\1\27\2\13\4\25\2\13\3\25\1\13" +
"\1\24\10\12\2\27\11\12\1\27\1\12\5\24\1\12" + "\1\25\10\13\2\30\7\13\1\30\3\13\5\25\1\13" +
"\2\30\1\31\1\23\1\32\1\12\4\32\1\33\1\12" + "\2\31\1\32\1\24\1\33\1\13\4\33\1\34\1\13" +
"\4\32\4\12\4\32\2\12\3\32\1\12\1\32\10\12" + "\4\33\4\13\4\33\2\13\3\33\1\13\1\33\10\13" +
"\1\34\14\12\5\32\1\12\2\30\1\31\1\35\15\12" + "\1\35\14\13\5\33\1\13\2\31\1\32\1\36\15\13" +
"\1\36\25\12\1\34\22\12\2\30\1\31\1\23\1\37" + "\1\37\25\13\1\35\22\13\2\31\1\32\1\24\1\40" +
"\1\40\1\41\1\42\1\43\2\44\1\12\2\44\1\45" + "\1\41\1\42\1\43\1\44\2\45\1\13\2\45\1\46" +
"\1\44\1\46\1\47\1\12\1\50\1\41\3\44\1\51" + "\1\45\1\47\1\50\1\13\1\51\1\42\3\45\1\52" +
"\1\40\1\37\1\43\1\44\1\40\1\44\1\52\1\53" + "\1\41\1\40\1\44\1\45\1\41\1\45\1\53\1\54" +
"\1\12\1\54\1\55\1\56\1\57\1\60\1\34\1\61" + "\1\13\1\55\1\56\1\57\1\60\1\61\1\35\1\62" +
"\1\62\1\63\1\64\1\65\1\66\1\67\1\70\1\71" + "\1\63\1\64\1\65\1\66\1\67\1\70\1\71\1\72" +
"\1\72\1\73\1\74\2\75\1\44\1\76\1\44\1\12" + "\1\73\1\74\1\75\2\76\1\45\1\77\1\45\1\13" +
"\2\30\1\31\1\23\2\12\1\77\5\12\1\100\3\12" + "\2\31\1\32\1\24\2\13\1\100\5\13\1\101\3\13" +
"\1\101\3\12\1\77\11\12\1\100\10\12\1\34\22\12" + "\1\102\3\13\1\100\11\13\1\101\10\13\1\35\22\13" +
"\2\30\1\31\1\23\1\44\1\40\5\44\1\12\4\44" + "\2\31\1\32\1\24\1\103\1\104\5\103\1\13\4\103" +
"\1\46\1\44\1\12\1\50\4\44\1\51\1\40\3\44" + "\1\13\1\103\1\13\1\105\4\103\1\106\1\104\3\103" +
"\1\40\1\44\1\52\1\53\1\12\1\54\1\55\1\56" + "\1\104\1\103\1\107\1\110\1\13\1\111\1\112\2\13" +
"\1\57\1\60\1\34\1\12\1\62\1\63\1\64\1\65" + "\1\61\1\35\1\13\1\63\1\64\1\113\1\114\1\67" +
"\1\66\1\67\1\70\1\71\1\72\1\73\1\74\5\44" + "\1\70\1\71\1\115\3\13\5\103\1\13\2\31\1\32" +
"\1\102\1\103\1\30\1\31\1\23\34\102\1\104\1\102" + "\1\24\14\13\1\116\7\13\1\117\13\13\1\120\1\121" +
"\1\105\1\106\1\107\1\102\1\60\1\34\21\102\1\12" + "\1\122\1\35\1\13\1\123\1\124\1\65\1\125\1\126" +
"\2\30\1\31\66\12\74\0\1\13\73\0\1\15\71\0" + "\1\127\1\130\1\131\1\132\1\133\1\134\5\13\1\135" +
"\1\110\14\16\1\111\1\0\1\112\1\113\4\16\1\0" + "\1\136\1\31\1\32\1\24\34\135\1\137\1\135\1\140" +
"\6\16\25\0\5\16\5\0\1\114\1\0\5\114\1\0" + "\1\141\1\142\1\135\1\61\1\35\21\135\1\13\2\31" +
"\4\114\4\0\4\114\2\0\3\114\1\0\1\114\25\0" + "\1\32\66\13\74\0\1\14\73\0\1\16\71\0\1\143" +
"\5\114\1\20\3\0\66\20\2\0\1\21\73\0\1\23" + "\14\17\1\144\1\0\1\145\1\146\4\17\1\0\6\17" +
"\72\0\1\24\1\25\4\24\2\25\4\24\1\0\1\115" + "\25\0\5\17\5\0\1\147\1\0\5\147\1\0\4\147" +
"\1\112\1\116\4\24\1\0\1\25\3\24\1\25\1\24" + "\4\0\4\147\2\0\3\147\1\0\1\147\25\0\5\147" +
"\25\0\5\24\5\0\14\25\2\0\1\112\1\116\4\25" + "\1\21\3\0\66\21\2\0\1\22\73\0\1\24\72\0" +
"\1\0\6\25\25\0\5\25\5\0\1\117\1\0\5\117" + "\1\25\1\26\4\25\2\26\4\25\1\0\1\150\1\145" +
"\1\0\4\117\4\0\4\117\2\0\3\117\1\0\1\117" + "\1\151\4\25\1\0\1\26\3\25\1\26\1\25\25\0" +
"\25\0\5\117\1\27\3\0\66\27\2\0\1\30\74\0" + "\5\25\5\0\14\26\2\0\1\145\1\151\4\26\1\0" +
"\1\32\1\33\4\32\2\33\4\32\1\0\1\115\2\0" + "\6\26\25\0\5\26\5\0\1\152\1\0\5\152\1\0" +
"\4\32\1\0\1\33\3\32\1\33\1\32\25\0\5\32" + "\4\152\4\0\4\152\2\0\3\152\1\0\1\152\25\0" +
"\5\0\14\33\4\0\4\33\1\0\6\33\25\0\5\33" + "\5\152\1\30\3\0\66\30\2\0\1\31\74\0\1\33" +
"\1\34\3\0\66\34\4\0\1\35\112\0\2\120\1\121" + "\1\34\4\33\2\34\4\33\1\0\1\150\2\0\4\33" +
"\1\122\46\0\1\44\1\123\12\44\3\0\5\44\1\0" + "\1\0\1\34\3\33\1\34\1\33\25\0\5\33\5\0" +
"\1\123\5\44\25\0\5\44\6\0\1\40\23\0\1\40" + "\14\34\4\0\4\34\1\0\6\34\25\0\5\34\1\35" +
"\3\0\1\40\40\0\3\44\1\123\10\44\3\0\5\44" + "\3\0\66\35\4\0\1\36\112\0\2\153\1\154\1\155" +
"\1\0\6\44\25\0\2\44\1\124\2\44\5\0\14\44" + "\46\0\1\45\1\156\12\45\3\0\5\45\1\0\1\156" +
"\3\0\5\44\1\0\6\44\25\0\2\125\3\44\5\0" + "\5\45\25\0\5\45\6\0\1\41\23\0\1\41\3\0" +
"\1\44\1\126\12\44\3\0\5\44\1\0\1\126\5\44" + "\1\41\40\0\3\45\1\156\10\45\3\0\5\45\1\0" +
"\25\0\5\44\5\0\14\44\3\0\5\44\1\0\6\44" + "\6\45\25\0\2\45\1\157\2\45\5\0\14\45\3\0" +
"\25\0\5\44\5\0\2\44\1\127\11\44\3\0\1\44" + "\5\45\1\0\6\45\25\0\2\160\3\45\5\0\1\45" +
"\1\127\3\44\1\0\6\44\25\0\5\44\21\0\1\130" + "\1\161\12\45\3\0\5\45\1\0\1\161\5\45\25\0" +
"\55\0\14\44\3\0\1\44\2\131\1\132\1\133\1\0" + "\5\45\5\0\14\45\3\0\5\45\1\0\6\45\25\0" +
"\6\44\25\0\5\44\6\0\1\134\17\0\1\134\3\0" + "\5\45\5\0\2\45\1\162\11\45\3\0\1\45\1\162" +
"\6\134\26\0\1\134\35\0\1\135\45\0\1\136\23\0" + "\3\45\1\0\6\45\25\0\5\45\21\0\1\163\55\0" +
"\1\136\37\0\41\137\1\140\1\141\27\137\42\142\1\143" + "\14\45\3\0\1\45\2\164\1\165\1\166\1\0\6\45" +
"\1\140\26\142\42\144\1\145\1\144\1\140\25\144\21\0" + "\25\0\5\45\6\0\1\167\17\0\1\167\3\0\6\167" +
"\1\146\23\0\1\147\1\150\44\0\1\151\24\0\1\152" + "\26\0\1\167\35\0\1\170\45\0\1\171\23\0\1\171" +
"\75\0\1\153\72\0\1\154\37\0\1\150\55\0\14\44" + "\37\0\41\172\1\173\1\174\27\172\42\175\1\176\1\173" +
"\3\0\5\44\1\0\6\44\25\0\2\155\3\44\5\0" + "\26\175\42\177\1\200\1\177\1\173\25\177\21\0\1\201" +
"\14\44\3\0\2\44\1\156\2\44\1\0\6\44\25\0" + "\23\0\1\202\1\203\44\0\1\204\24\0\1\205\44\0" +
"\4\44\1\156\15\0\1\157\21\0\1\157\50\0\1\160" + "\1\203\132\0\1\206\72\0\1\207\72\0\1\210\12\0" +
"\53\0\2\102\3\0\42\102\2\0\21\102\2\104\3\137" + "\14\45\3\0\5\45\1\0\6\45\25\0\2\211\3\45" +
"\34\104\1\102\1\161\4\104\2\137\21\104\2\105\3\142" + "\5\0\14\45\3\0\2\45\1\212\2\45\1\0\6\45" +
"\35\105\1\162\1\102\3\105\2\142\21\105\2\106\3\144" + "\25\0\4\45\1\212\15\0\1\213\21\0\1\213\50\0" +
"\35\106\1\163\1\106\1\102\2\106\2\144\21\106\2\107" + "\1\214\60\0\14\103\3\0\5\103\1\0\6\103\25\0" +
"\3\164\35\107\1\165\3\107\1\102\2\164\21\107\4\0" + "\5\103\6\0\1\104\23\0\1\104\3\0\1\104\41\0" +
"\1\110\2\0\1\166\5\0\1\167\3\0\1\111\3\0" + "\1\215\17\0\1\215\3\0\6\215\26\0\1\215\35\0" +
"\1\166\11\0\1\167\36\0\1\111\110\0\1\170\71\0" + "\1\216\45\0\1\217\23\0\1\217\37\0\41\220\1\221" +
"\1\171\53\0\14\114\2\0\1\171\1\0\4\114\1\0" + "\1\222\27\220\42\223\1\224\1\221\26\223\42\225\1\226" +
"\6\114\25\0\5\114\1\172\3\0\66\172\5\0\14\117" + "\1\225\1\221\25\225\21\0\1\227\71\0\1\230\23\0" +
"\2\0\1\171\1\0\4\117\1\0\6\117\25\0\5\117" + "\1\231\1\232\44\0\1\233\24\0\1\234\44\0\1\232" +
"\5\0\3\44\1\173\10\44\3\0\5\44\1\0\6\44" + "\132\0\1\235\72\0\1\236\72\0\1\117\5\0\2\135" +
"\25\0\5\44\1\137\3\0\66\137\1\142\3\0\66\142" + "\3\0\42\135\2\0\21\135\2\137\3\172\34\137\1\135" +
"\1\144\3\0\66\144\5\0\14\44\3\0\5\44\1\0" + "\1\237\4\137\2\172\21\137\2\140\3\175\35\140\1\240" +
"\6\44\25\0\2\44\1\174\2\44\5\0\14\44\3\0" + "\1\135\3\140\2\175\21\140\2\141\3\177\35\141\1\241" +
"\5\44\1\0\6\44\25\0\2\44\1\175\2\44\20\0" + "\1\141\1\135\2\141\2\177\21\141\2\142\3\242\35\142" +
"\1\176\70\0\1\176\52\0\1\104\1\102\2\0\1\137" + "\1\243\3\142\1\135\2\242\21\142\4\0\1\143\2\0" +
"\42\104\2\137\21\104\1\105\1\102\2\0\1\142\42\105" + "\1\244\5\0\1\245\3\0\1\144\3\0\1\244\11\0" +
"\2\142\21\105\1\106\1\102\2\0\1\144\42\106\2\144" + "\1\245\36\0\1\144\110\0\1\246\71\0\1\247\53\0" +
"\21\106\42\164\1\177\3\164\1\140\23\164\1\107\1\102" + "\14\147\2\0\1\247\1\0\4\147\1\0\6\147\25\0" +
"\2\0\1\164\42\107\2\164\21\107\15\0\1\200\21\0" + "\5\147\1\250\3\0\66\250\5\0\14\152\2\0\1\247" +
"\1\200\50\0\1\201\53\0\1\164\3\0\66\164\20\0" + "\1\0\4\152\1\0\6\152\25\0\5\152\5\0\3\45" +
"\1\202\70\0\1\202\52\0"; "\1\251\10\45\3\0\5\45\1\0\6\45\25\0\5\45" +
"\1\172\3\0\66\172\1\175\3\0\66\175\1\177\3\0" +
"\66\177\5\0\14\45\3\0\5\45\1\0\6\45\25\0" +
"\2\45\1\252\2\45\5\0\14\45\3\0\5\45\1\0" +
"\6\45\25\0\2\45\1\253\2\45\20\0\1\254\70\0" +
"\1\254\52\0\1\220\3\0\66\220\1\223\3\0\66\223" +
"\1\225\3\0\66\225\1\137\1\135\2\0\1\172\42\137" +
"\2\172\21\137\1\140\1\135\2\0\1\175\42\140\2\175" +
"\21\140\1\141\1\135\2\0\1\177\42\141\2\177\21\141" +
"\42\242\1\255\3\242\1\173\23\242\1\142\1\135\2\0" +
"\1\242\42\142\2\242\21\142\15\0\1\256\21\0\1\256" +
"\50\0\1\257\53\0\1\242\3\0\66\242\20\0\1\260" +
"\70\0\1\260\52\0";
private static int[] zzUnpackTrans() { private static int[] zzUnpackTrans() {
int[] result = new int[4698]; int[] result = new int[5858];
int offset = 0; int offset = 0;
offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
return result; return result;
@ -390,14 +412,15 @@ public class _M68kLexer implements FlexLexer {
private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final int[] ZZ_ATTRIBUTE = zzUnpackAttribute();
private static final String ZZ_ATTRIBUTE_PACKED_0 = private static final String ZZ_ATTRIBUTE_PACKED_0 =
"\11\0\2\11\5\1\1\11\6\1\1\11\27\1\2\11" + "\12\0\2\11\5\1\1\11\6\1\1\11\27\1\5\11" +
"\3\1\10\11\4\1\1\11\6\1\1\0\4\1\3\0" + "\1\1\4\11\7\1\1\11\10\1\3\11\1\1\1\11" +
"\3\11\5\1\1\11\6\1\1\0\1\11\5\0\7\11" + "\2\1\3\11\1\1\4\11\11\1\1\0\4\1\3\0" +
"\2\1\2\0\3\1\1\0\1\1\2\0\3\11\3\1" + "\3\11\5\1\1\11\6\1\1\0\1\11\5\0\10\11" +
"\1\11\4\0"; "\2\1\2\0\3\1\1\0\1\11\5\0\10\11\3\1" +
"\1\0\1\1\2\0\3\11\3\1\1\11\4\0";
private static int[] zzUnpackAttribute() { private static int[] zzUnpackAttribute() {
int[] result = new int[130]; int[] result = new int[176];
int offset = 0; int offset = 0;
offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
return result; return result;
@ -720,40 +743,40 @@ public class _M68kLexer implements FlexLexer {
return BAD_CHARACTER; return BAD_CHARACTER;
} }
// fall through // fall through
case 58: case 87:
break; break;
case 2: { case 2: {
return WHITE_SPACE; return WHITE_SPACE;
} }
// fall through // fall through
case 59: case 88:
break; break;
case 3: { case 3: {
yybegin(NOSOL); yybegin(NOSOL);
return WHITE_SPACE; return WHITE_SPACE;
} }
// fall through // fall through
case 60: case 89:
break; break;
case 4: { case 4: {
yybegin(INSTRPART); yybegin(INSTRPART);
return GLOBAL_LABEL_DEF; return GLOBAL_LABEL_DEF;
} }
// fall through // fall through
case 61: case 90:
break; break;
case 5: { case 5: {
return COMMENT; return COMMENT;
} }
// fall through // fall through
case 62: case 91:
break; break;
case 6: { case 6: {
yybegin(YYINITIAL); yybegin(YYINITIAL);
return WHITE_SPACE; return WHITE_SPACE;
} }
// fall through // fall through
case 63: case 92:
break; break;
case 7: { case 7: {
if (isAsmMnemonicWithSize(yytext())) { if (isAsmMnemonicWithSize(yytext())) {
@ -777,317 +800,520 @@ public class _M68kLexer implements FlexLexer {
return MACRO_INVOKATION; return MACRO_INVOKATION;
} }
// fall through // fall through
case 64: case 93:
break; break;
case 8: { case 8: {
yybegin(MACROCALL); yybegin(MACROCALL);
return MACRO_INVOKATION; return MACRO_INVOKATION;
} }
// fall through // fall through
case 65: case 94:
break; break;
case 9: { case 9: {
yybegin(YYINITIAL); yybegin(YYINITIAL);
return COMMENT; return COMMENT;
} }
// fall through // fall through
case 66: case 95:
break; break;
case 10: { case 10: {
yybegin(YYINITIAL); yybegin(YYINITIAL);
return EOL; return EOL;
} }
// fall through // fall through
case 67: case 96:
break; break;
case 11: { case 11: {
yybegin(WAITEOL); yybegin(WAITEOL);
return COMMENT; return COMMENT;
} }
// fall through // fall through
case 68: case 97:
break; break;
case 12: { case 12: {
yybegin(ASMOPS); yybegin(ASMOPS);
return WHITE_SPACE; return WHITE_SPACE;
} }
// fall through // fall through
case 69: case 98:
break; break;
case 13: { case 13: {
return SYMBOL; return SYMBOL;
} }
// fall through // fall through
case 70: case 99:
break; break;
case 14: { case 14: {
return DECIMAL; return DECIMAL;
} }
// fall through // fall through
case 71: case 100:
break; break;
case 15: { case 15: {
return OP_ASSIGN; return OP_ASSIGN;
} }
// fall through // fall through
case 72: case 101:
break; break;
case 16: { case 16: {
return OP_AR_MOD; return OP_AR_MOD;
} }
// fall through // fall through
case 73: case 102:
break; break;
case 17: { case 17: {
return OP_CMP_LT; return OP_CMP_LT;
} }
// fall through // fall through
case 74: case 103:
break; break;
case 18: { case 18: {
return OP_CMP_GT; return OP_CMP_GT;
} }
// fall through // fall through
case 75: case 104:
break; break;
case 19: { case 19: {
return SEPARATOR; return SEPARATOR;
} }
// fall through // fall through
case 76: case 105:
break; break;
case 20: { case 20: {
return HASH; return HASH;
} }
// fall through // fall through
case 77: case 106:
break; break;
case 21: { case 21: {
return OP_BITWISE_AND;
}
// fall through
case 78:
break;
case 22: {
return OP_BITWISE_OR;
}
// fall through
case 79:
break;
case 23: {
return OP_UNARY_NOT;
}
// fall through
case 80:
break;
case 24: {
return OP_BITWISE_XOR; return OP_BITWISE_XOR;
} }
// fall through // fall through
case 81: case 107:
break; break;
case 25: { case 22: {
return ROUND_L; return ROUND_L;
} }
// fall through // fall through
case 82: case 108:
break; break;
case 26: { case 23: {
return ROUND_R; return ROUND_R;
} }
// fall through // fall through
case 83: case 109:
break; break;
case 27: { case 24: {
return OP_UNARY_NOT;
}
// fall through
case 110:
break;
case 25: {
return OP_UNARY_COMPL; return OP_UNARY_COMPL;
} }
// fall through // fall through
case 84: case 111:
break; break;
case 28: { case 26: {
return OP_PLUS; return OP_PLUS;
} }
// fall through // fall through
case 85: case 112:
break; break;
case 29: { case 27: {
return OP_MINUS; return OP_MINUS;
} }
// fall through // fall through
case 86: case 113:
break; break;
case 30: { case 28: {
return OP_AR_MUL; return OP_AR_MUL;
} }
// fall through // fall through
case 87: case 114:
break;
case 29: {
return OP_BITWISE_AND;
}
// fall through
case 115:
break;
case 30: {
return OP_BITWISE_OR;
}
// fall through
case 116:
break; break;
case 31: { case 31: {
return OP_AR_DIV; return OP_AR_DIV;
} }
// fall through // fall through
case 88: case 117:
break; break;
case 32: { case 32: {
yybegin(EXPR); yybegin(EXPR);
return OP_ASSIGN; return OP_ASSIGN;
} }
// fall through // fall through
case 89: case 118:
break; break;
case 33: { case 33: {
yybegin(EXPR_OP);
return SYMBOL;
}
// fall through
case 119:
break;
case 34: {
yybegin(EXPR_OP);
return DECIMAL;
}
// fall through
case 120:
break;
case 35: {
yybegin(EXPR_OP);
return ROUND_R;
}
// fall through
case 121:
break;
case 36: {
yybegin(EXPR_OP);
return CURRENT_PC_SYMBOL;
}
// fall through
case 122:
break;
case 37: {
yybegin(EXPR);
return OP_AR_MOD;
}
// fall through
case 123:
break;
case 38: {
yybegin(EXPR);
return OP_CMP_LT;
}
// fall through
case 124:
break;
case 39: {
yybegin(EXPR);
return OP_CMP_GT;
}
// fall through
case 125:
break;
case 40: {
yybegin(EXPR);
return SEPARATOR;
}
// fall through
case 126:
break;
case 41: {
yybegin(EXPR);
return OP_BITWISE_XOR;
}
// fall through
case 127:
break;
case 42: {
yybegin(EXPR);
return ROUND_L;
}
// fall through
case 128:
break;
case 43: {
yybegin(EXPR);
return OP_BITWISE_OR;
}
// fall through
case 129:
break;
case 44: {
yybegin(EXPR);
return OP_UNARY_COMPL;
}
// fall through
case 130:
break;
case 45: {
yybegin(EXPR);
return OP_PLUS;
}
// fall through
case 131:
break;
case 46: {
yybegin(EXPR);
return OP_MINUS;
}
// fall through
case 132:
break;
case 47: {
yybegin(EXPR);
return OP_AR_MUL;
}
// fall through
case 133:
break;
case 48: {
yybegin(EXPR);
return OP_BITWISE_AND;
}
// fall through
case 134:
break;
case 49: {
yybegin(EXPR);
return OP_AR_DIV;
}
// fall through
case 135:
break;
case 50: {
return STRINGLIT; return STRINGLIT;
} }
// fall through // fall through
case 90: case 136:
break; break;
case 34: { case 51: {
yybegin(ASSIGNMENT); yybegin(ASSIGNMENT);
yypushback(pushbackAssignment(yytext())); yypushback(pushbackAssignment(yytext()));
return SYMBOLDEF; return SYMBOLDEF;
} }
// fall through // fall through
case 91: case 137:
break; break;
case 35: { case 52: {
yybegin(INSTRPART); yybegin(INSTRPART);
return LOCAL_LABEL_DEF; return LOCAL_LABEL_DEF;
} }
// fall through // fall through
case 92: case 138:
break; break;
case 36: { case 53: {
return OPSIZE_BS; return OPSIZE_BS;
} }
// fall through // fall through
case 93: case 139:
break; break;
case 37: { case 54: {
return OPSIZE_W; return OPSIZE_W;
} }
// fall through // fall through
case 94: case 140:
break; break;
case 38: { case 55: {
return OPSIZE_L; return OPSIZE_L;
} }
// fall through // fall through
case 95: case 141:
break; break;
case 39: { case 56: {
return AREG; return AREG;
} }
// fall through // fall through
case 96: case 142:
break; break;
case 40: { case 57: {
return REG_SR; return REG_SR;
} }
// fall through // fall through
case 97: case 143:
break; break;
case 41: { case 58: {
return PC; return PC;
} }
// fall through // fall through
case 98: case 144:
break; break;
case 42: { case 59: {
return DREG; return DREG;
} }
// fall through // fall through
case 99: case 145:
break; break;
case 43: { case 60: {
return OP_CMP_EQ; return OP_CMP_EQ;
} }
// fall through // fall through
case 100: case 146:
break; break;
case 44: { case 61: {
return HEXADECIMAL; return HEXADECIMAL;
} }
// fall through // fall through
case 101: case 147:
break; break;
case 45: { case 62: {
return BINARY; return BINARY;
} }
// fall through // fall through
case 102: case 148:
break; break;
case 46: { case 63: {
return OCTAL; return OCTAL;
} }
// fall through // fall through
case 103: case 149:
break; break;
case 47: { case 64: {
return OP_CMP_LT_EQ; return OP_CMP_LT_EQ;
} }
// fall through // fall through
case 104: case 150:
break; break;
case 48: { case 65: {
return OP_AR_SHIFT_L; return OP_AR_SHIFT_L;
} }
// fall through // fall through
case 105: case 151:
break; break;
case 49: { case 66: {
return OP_CMP_NOT_EQ; return OP_CMP_NOT_EQ;
} }
// fall through // fall through
case 106: case 152:
break; break;
case 50: { case 67: {
return OP_CMP_GT_EQ; return OP_CMP_GT_EQ;
} }
// fall through // fall through
case 107: case 153:
break; break;
case 51: { case 68: {
return OP_AR_SHIFT_R; return OP_AR_SHIFT_R;
} }
// fall through // fall through
case 108: case 154:
break; break;
case 52: { case 69: {
return OP_LOGICAL_AND; return OP_LOGICAL_AND;
} }
// fall through // fall through
case 109: case 155:
break; break;
case 53: { case 70: {
return OP_LOGICAL_OR; return OP_LOGICAL_OR;
} }
// fall through // fall through
case 110: case 156:
break; break;
case 54: { case 71: {
yybegin(EXPR_OP);
return HEXADECIMAL;
}
// fall through
case 157:
break;
case 72: {
yybegin(EXPR_OP);
return BINARY;
}
// fall through
case 158:
break;
case 73: {
yybegin(EXPR_OP);
return OCTAL;
}
// fall through
case 159:
break;
case 74: {
yybegin(EXPR_OP);
return STRINGLIT;
}
// fall through
case 160:
break;
case 75: {
yybegin(EXPR);
return OP_CMP_EQ;
}
// fall through
case 161:
break;
case 76: {
yybegin(EXPR);
return OP_CMP_LT_EQ;
}
// fall through
case 162:
break;
case 77: {
yybegin(EXPR);
return OP_AR_SHIFT_L;
}
// fall through
case 163:
break;
case 78: {
yybegin(EXPR);
return OP_CMP_NOT_EQ;
}
// fall through
case 164:
break;
case 79: {
yybegin(EXPR);
return OP_CMP_GT_EQ;
}
// fall through
case 165:
break;
case 80: {
yybegin(EXPR);
return OP_AR_SHIFT_R;
}
// fall through
case 166:
break;
case 81: {
yybegin(EXPR);
return OP_LOGICAL_AND;
}
// fall through
case 167:
break;
case 82: {
yybegin(EXPR);
return OP_LOGICAL_OR;
}
// fall through
case 168:
break;
case 83: {
return REG_USP; return REG_USP;
} }
// fall through // fall through
case 111: case 169:
break; break;
case 55: { case 84: {
return REG_CCR; return REG_CCR;
} }
// fall through // fall through
case 112: case 170:
break; break;
case 56: { case 85: {
return REG_VBR; return REG_VBR;
} }
// fall through // fall through
case 113: case 171:
break; break;
case 57: { case 86: {
yybegin(EXPR); yybegin(EXPR);
return EQU; return EQU;
} }
// fall through // fall through
case 114: case 172:
break; break;
default: default:
zzScanError(ZZ_NO_MATCH); zzScanError(ZZ_NO_MATCH);

View File

@ -1194,13 +1194,14 @@ public class M68kParser implements PsiParser, LightPsiParser {
return r || p; return r || p;
} }
// SYMBOL // SYMBOL|CURRENT_PC_SYMBOL
public static boolean ref_expr(PsiBuilder b, int l) { public static boolean ref_expr(PsiBuilder b, int l) {
if (!recursion_guard_(b, l, "ref_expr")) return false; if (!recursion_guard_(b, l, "ref_expr")) return false;
if (!nextTokenIsSmart(b, SYMBOL)) return false; if (!nextTokenIsSmart(b, CURRENT_PC_SYMBOL, SYMBOL)) return false;
boolean r; boolean r;
Marker m = enter_section_(b, l, _NONE_, REF_EXPR, "<expression>"); Marker m = enter_section_(b, l, _NONE_, REF_EXPR, "<expression>");
r = consumeTokenSmart(b, SYMBOL); r = consumeTokenSmart(b, SYMBOL);
if (!r) r = consumeTokenSmart(b, CURRENT_PC_SYMBOL);
exit_section_(b, l, m, r, false, null); exit_section_(b, l, m, r, false, null);
return r; return r;
} }

View File

@ -72,6 +72,7 @@ public interface M68kTypes {
IElementType AREG = new M68kTokenType("AREG"); IElementType AREG = new M68kTokenType("AREG");
IElementType BINARY = new M68kTokenType("BINARY"); IElementType BINARY = new M68kTokenType("BINARY");
IElementType COMMENT = new M68kTokenType("COMMENT"); IElementType COMMENT = new M68kTokenType("COMMENT");
IElementType CURRENT_PC_SYMBOL = new M68kTokenType("CURRENT_PC_SYMBOL");
IElementType DATA_DIRECTIVE = new M68kTokenType("DATA_DIRECTIVE"); IElementType DATA_DIRECTIVE = new M68kTokenType("DATA_DIRECTIVE");
IElementType DECIMAL = new M68kTokenType("DECIMAL"); IElementType DECIMAL = new M68kTokenType("DECIMAL");
IElementType DREG = new M68kTokenType("DREG"); IElementType DREG = new M68kTokenType("DREG");

View File

@ -49,7 +49,7 @@ PLAINPARAM=(`([^`\\]|\\.)*`|'([^'\\]|\\.)*'|\"([^\"\\]|\\.)*\")|<([^>\\]|\\.)*>|
COMMENT=([;].*+) COMMENT=([;].*+)
HASH_COMMENT=([#;*].*+) HASH_COMMENT=([#;*].*+)
%state NOSOL,INSTRPART,ASMINSTR,ASMOPS,ASSIGNMENT,EXPR,MACROCALL,WAITEOL %state NOSOL,INSTRPART,ASMINSTR,ASMOPS,ASSIGNMENT,EXPR,EXPR_OP,MACROCALL,WAITEOL
%% %%
<YYINITIAL> { <YYINITIAL> {
@ -133,45 +133,69 @@ HASH_COMMENT=([#;*].*+)
{WHITE_SPACE} { return WHITE_SPACE; } // FIXME space optionally introduces comment {WHITE_SPACE} { return WHITE_SPACE; } // FIXME space optionally introduces comment
{EOL} { yybegin(YYINITIAL); return EOL; } {EOL} { yybegin(YYINITIAL); return EOL; }
{BINARY} { return BINARY; } {BINARY} { yybegin(EXPR_OP); return BINARY; }
{HEXADECIMAL} { return HEXADECIMAL; } {HEXADECIMAL} { yybegin(EXPR_OP); return HEXADECIMAL; }
{OCTAL} { return OCTAL; } {OCTAL} { yybegin(EXPR_OP); return OCTAL; }
{DECIMAL} { return DECIMAL; } {DECIMAL} { yybegin(EXPR_OP); return DECIMAL; }
{STRINGLIT} { return STRINGLIT; } {STRINGLIT} { yybegin(EXPR_OP); return STRINGLIT; }
"<<" { return OP_AR_SHIFT_L; }
">>" { return OP_AR_SHIFT_R; }
"&&" { return OP_LOGICAL_AND; }
"||" { return OP_LOGICAL_OR; }
"==" { return OP_CMP_EQ; }
"<>" { return OP_CMP_NOT_EQ; }
">=" { return OP_CMP_GT_EQ; }
"<=" { return OP_CMP_LT_EQ; }
"!=" { return OP_CMP_NOT_EQ; }
"<" { return OP_CMP_LT; }
">" { return OP_CMP_GT; }
"&" { return OP_BITWISE_AND; }
"|" { return OP_BITWISE_OR; }
"^" { return OP_BITWISE_XOR; } "^" { return OP_BITWISE_XOR; }
// ":" { return COLON; }
// ";" { return SEMICOLON; }
// "[" { return SQUARE_L; }
// "]" { return SQUARE_R; }
"," { return SEPARATOR; } "," { return SEPARATOR; }
"(" { return ROUND_L; } "(" { return ROUND_L; }
")" { return ROUND_R; } ")" { yybegin(EXPR_OP); return ROUND_R; }
// "." { return DOT; }
// "$" { return DOLLAR; }
"=" { return OP_ASSIGN; }
"!" { return OP_UNARY_NOT; } "!" { return OP_UNARY_NOT; }
"~" { return OP_UNARY_COMPL; } "~" { return OP_UNARY_COMPL; }
"+" { return OP_PLUS; } "+" { return OP_PLUS; }
"-" { return OP_MINUS; } "-" { return OP_MINUS; }
"*" { return OP_AR_MUL; } "*" { yybegin(EXPR_OP); return CURRENT_PC_SYMBOL; }
"/" { return OP_AR_DIV; }
"%" { return OP_AR_MOD; }
{SYMBOL} { return SYMBOL; } {SYMBOL} { yybegin(EXPR_OP); return SYMBOL; }
{COMMENT} { yybegin(WAITEOL); return COMMENT; }
}
<EXPR_OP> {
{WHITE_SPACE} { return WHITE_SPACE; } // FIXME space optionally introduces comment
{EOL} { yybegin(YYINITIAL); return EOL; }
// {BINARY} { return BINARY; }
// {HEXADECIMAL} { return HEXADECIMAL; }
// {OCTAL} { return OCTAL; }
// {DECIMAL} { return DECIMAL; }
// {STRINGLIT} { return STRINGLIT; }
"<<" { yybegin(EXPR); return OP_AR_SHIFT_L; }
">>" { yybegin(EXPR); return OP_AR_SHIFT_R; }
"&&" { yybegin(EXPR); return OP_LOGICAL_AND; }
"||" { yybegin(EXPR); return OP_LOGICAL_OR; }
"==" { yybegin(EXPR); return OP_CMP_EQ; }
"<>" { yybegin(EXPR); return OP_CMP_NOT_EQ; }
">=" { yybegin(EXPR); return OP_CMP_GT_EQ; }
"<=" { yybegin(EXPR); return OP_CMP_LT_EQ; }
"!=" { yybegin(EXPR); return OP_CMP_NOT_EQ; }
"<" { yybegin(EXPR); return OP_CMP_LT; }
">" { yybegin(EXPR); return OP_CMP_GT; }
"&" { yybegin(EXPR); return OP_BITWISE_AND; }
"|"|"!" { yybegin(EXPR); return OP_BITWISE_OR; }
"^" { yybegin(EXPR); return OP_BITWISE_XOR; }
// ":" { return COLON; }
// ";" { return SEMICOLON; }
// "[" { return SQUARE_L; }
// "]" { return SQUARE_R; }
"," { yybegin(EXPR); return SEPARATOR; }
"(" { yybegin(EXPR); return ROUND_L; }
")" { return ROUND_R; }
// "." { return DOT; }
// "$" { return DOLLAR; }
"=" { yybegin(EXPR); return OP_ASSIGN; }
"~" { yybegin(EXPR); return OP_UNARY_COMPL; }
"+" { yybegin(EXPR); return OP_PLUS; }
"-" { yybegin(EXPR); return OP_MINUS; }
"*" { yybegin(EXPR); return OP_AR_MUL; }
"%"|"//" { yybegin(EXPR); return OP_AR_MOD; }
"/" { yybegin(EXPR); return OP_AR_DIV; }
// {SYMBOL} { return SYMBOL; }
{COMMENT} { yybegin(WAITEOL); return COMMENT; } {COMMENT} { yybegin(WAITEOL); return COMMENT; }
} }
@ -228,8 +252,8 @@ HASH_COMMENT=([#;*].*+)
"+" { return OP_PLUS; } "+" { return OP_PLUS; }
"-" { return OP_MINUS; } "-" { return OP_MINUS; }
"*" { return OP_AR_MUL; } "*" { return OP_AR_MUL; }
"%"|"//" { return OP_AR_MOD; }
"/" { return OP_AR_DIV; } "/" { return OP_AR_DIV; }
"%" { return OP_AR_MOD; }
{SYMBOL} { return SYMBOL; } {SYMBOL} { return SYMBOL; }

View File

@ -253,5 +253,5 @@ binary_logical_or_expr ::= expr OP_LOGICAL_OR expr
//macrobrace_expr ::= OP_CMP_LT expr OP_CMP_GT //macrobrace_expr ::= OP_CMP_LT expr OP_CMP_GT
paren_expr ::= ROUND_L expr ROUND_R //{pin=1 recoverWhile=statement_recover} paren_expr ::= ROUND_L expr ROUND_R //{pin=1 recoverWhile=statement_recover}
ref_expr ::= SYMBOL ref_expr ::= SYMBOL|CURRENT_PC_SYMBOL
literal_expr ::= BINARY|DECIMAL|HEXADECIMAL|OCTAL|STRINGLIT literal_expr ::= BINARY|DECIMAL|HEXADECIMAL|OCTAL|STRINGLIT

View File

@ -18,6 +18,11 @@ internal class AssignmentTest : AbstractParsingTest() {
testGoodSyntax(testCase, "FOO=123+10\n") testGoodSyntax(testCase, "FOO=123+10\n")
} }
@Test
internal fun assignment_with_local_label(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO=.local-.bar\n")
}
@Test @Test
internal fun assignment_via_equ(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) { internal fun assignment_via_equ(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO equ BAR\n") testGoodSyntax(testCase, "FOO equ BAR\n")

View File

@ -0,0 +1,46 @@
package de.platon42.intellij.plugins.m68k.parser
import de.platon42.intellij.jupiter.MyTestCase
import de.platon42.intellij.jupiter.ParsingTestExtension
import de.platon42.intellij.jupiter.TestDataSubPath
import org.junit.jupiter.api.Test
@TestDataSubPath("expressions")
internal class ExpressionsTest : AbstractParsingTest() {
@Test
internal fun pure_decimal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = 10\n")
}
@Test
internal fun pure_hexadecimal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = $1234\n")
}
@Test
internal fun pure_octal_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = @777\n")
}
@Test
internal fun pure_binary_number_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = %11001100\n")
}
@Test
internal fun pure_string_literal(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = 'string'\n"
+ "FOO=\"bar\"\n")
}
@Test
internal fun math_expression(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, "FOO = -(~(!!(+(1//~WIDTH^@123+3*4/2+(NARF%10|32!21))<<2)>>1)&$1f)\n")
}
@Test
internal fun current_pc_symbol_relative_expression(@MyTestCase testCase: ParsingTestExtension.IParsingTestCase) {
testGoodSyntax(testCase, " dc.w *-.label\n")
}
}

View File

@ -0,0 +1,12 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
M68kBinarySubExprImpl(BINARY_SUB_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.local')
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.bar')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,13 @@
Assembly File: a.asm
PsiWhiteSpace(' ')
M68kStatementImpl(STATEMENT)
M68kPreprocessorDirectiveImpl(PREPROCESSOR_DIRECTIVE)
PsiElement(M68kTokenType.DATA_DIRECTIVE)('dc.w')
PsiWhiteSpace(' ')
M68kBinarySubExprImpl(BINARY_SUB_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.CURRENT_PC_SYMBOL)('*')
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('.label')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,85 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kUnaryMinusExprImpl(UNARY_MINUS_EXPR)
PsiElement(M68kTokenType.OP_MINUS)('-')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryBitwiseAndExprImpl(BINARY_BITWISE_AND_EXPR)
M68kUnaryComplExprImpl(UNARY_COMPL_EXPR)
PsiElement(M68kTokenType.OP_UNARY_COMPL)('~')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryShiftRExprImpl(BINARY_SHIFT_R_EXPR)
M68kUnaryNotExprImpl(UNARY_NOT_EXPR)
PsiElement(M68kTokenType.OP_UNARY_NOT)('!')
M68kUnaryNotExprImpl(UNARY_NOT_EXPR)
PsiElement(M68kTokenType.OP_UNARY_NOT)('!')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryShiftLExprImpl(BINARY_SHIFT_L_EXPR)
M68kUnaryPlusExprImpl(UNARY_PLUS_EXPR)
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryAddExprImpl(BINARY_ADD_EXPR)
M68kBinaryAddExprImpl(BINARY_ADD_EXPR)
M68kBinaryModExprImpl(BINARY_MOD_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('1')
PsiElement(M68kTokenType.OP_AR_MOD)('//')
M68kBinaryBitwiseXorExprImpl(BINARY_BITWISE_XOR_EXPR)
M68kUnaryComplExprImpl(UNARY_COMPL_EXPR)
PsiElement(M68kTokenType.OP_UNARY_COMPL)('~')
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('WIDTH')
PsiElement(M68kTokenType.OP_BITWISE_XOR)('^')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.OCTAL)('@123')
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kBinaryDivExprImpl(BINARY_DIV_EXPR)
M68kBinaryMulExprImpl(BINARY_MUL_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('3')
PsiElement(M68kTokenType.OP_AR_MUL)('*')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('4')
PsiElement(M68kTokenType.OP_AR_DIV)('/')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('2')
PsiElement(M68kTokenType.OP_PLUS)('+')
M68kParenExprImpl(PAREN_EXPR)
PsiElement(M68kTokenType.ROUND_L)('(')
M68kBinaryModExprImpl(BINARY_MOD_EXPR)
M68kRefExprImpl(REF_EXPR)
PsiElement(M68kTokenType.SYMBOL)('NARF')
PsiElement(M68kTokenType.OP_AR_MOD)('%')
M68kBinaryBitwiseOrExprImpl(BINARY_BITWISE_OR_EXPR)
M68kBinaryBitwiseOrExprImpl(BINARY_BITWISE_OR_EXPR)
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('10')
PsiElement(M68kTokenType.OP_BITWISE_OR)('|')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('32')
PsiElement(M68kTokenType.OP_BITWISE_OR)('!')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('21')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_AR_SHIFT_L)('<<')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('2')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_AR_SHIFT_R)('>>')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('1')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.OP_BITWISE_AND)('&')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.HEXADECIMAL)('$1f')
PsiElement(M68kTokenType.ROUND_R)(')')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.BINARY)('%11001100')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.DECIMAL)('10')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.HEXADECIMAL)('$1234')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,10 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.OCTAL)('@777')
PsiElement(M68kTokenType.EOL)('\n')

View File

@ -0,0 +1,17 @@
Assembly File: a.asm
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiWhiteSpace(' ')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
PsiWhiteSpace(' ')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.STRINGLIT)(''string'')
PsiElement(M68kTokenType.EOL)('\n')
M68kStatementImpl(STATEMENT)
M68kAssignmentImpl(ASSIGNMENT)
PsiElement(M68kTokenType.SYMBOLDEF)('FOO')
PsiElement(M68kTokenType.OP_ASSIGN)('=')
M68kLiteralExprImpl(LITERAL_EXPR)
PsiElement(M68kTokenType.STRINGLIT)('"bar"')
PsiElement(M68kTokenType.EOL)('\n')