1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-09 08:54:40 +00:00

Added support for #error. Closes #440

This commit is contained in:
jespergravgaard 2020-05-29 22:21:20 +02:00
parent 1786d85ea5
commit 0041a4d07c
15 changed files with 1177 additions and 854 deletions

View File

@ -133,6 +133,7 @@ IFIF: '#if' ;
ELIF: '#elif' ;
IFELSE: '#else' ;
ENDIF: '#endif' ;
ERROR: '#error' ;
// Numbers
NUMBER : NUMFLOAT | NUMINT ;

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -106,62 +106,63 @@ IFIF=105
ELIF=106
IFELSE=107
ENDIF=108
NUMBER=109
NUMFLOAT=110
BINFLOAT=111
DECFLOAT=112
HEXFLOAT=113
NUMINT=114
BININTEGER=115
DECINTEGER=116
HEXINTEGER=117
NAME=118
STRING=119
CHAR=120
WS=121
COMMENT_LINE=122
COMMENT_BLOCK=123
ASM_BYTE=124
ASM_MNEMONIC=125
ASM_IMM=126
ASM_COLON=127
ASM_COMMA=128
ASM_PAR_BEGIN=129
ASM_PAR_END=130
ASM_BRACKET_BEGIN=131
ASM_BRACKET_END=132
ASM_DOT=133
ASM_SHIFT_LEFT=134
ASM_SHIFT_RIGHT=135
ASM_PLUS=136
ASM_MINUS=137
ASM_LESS_THAN=138
ASM_GREATER_THAN=139
ASM_MULTIPLY=140
ASM_DIVIDE=141
ASM_CURLY_BEGIN=142
ASM_CURLY_END=143
ASM_NUMBER=144
ASM_NUMFLOAT=145
ASM_BINFLOAT=146
ASM_DECFLOAT=147
ASM_HEXFLOAT=148
ASM_NUMINT=149
ASM_BININTEGER=150
ASM_DECINTEGER=151
ASM_HEXINTEGER=152
ASM_CHAR=153
ASM_MULTI_REL=154
ASM_MULTI_NAME=155
ASM_NAME=156
ASM_WS=157
ASM_COMMENT_LINE=158
ASM_COMMENT_BLOCK=159
IMPORT_SYSTEMFILE=160
IMPORT_LOCALFILE=161
IMPORT_WS=162
IMPORT_COMMENT_LINE=163
IMPORT_COMMENT_BLOCK=164
ERROR=109
NUMBER=110
NUMFLOAT=111
BINFLOAT=112
DECFLOAT=113
HEXFLOAT=114
NUMINT=115
BININTEGER=116
DECINTEGER=117
HEXINTEGER=118
NAME=119
STRING=120
CHAR=121
WS=122
COMMENT_LINE=123
COMMENT_BLOCK=124
ASM_BYTE=125
ASM_MNEMONIC=126
ASM_IMM=127
ASM_COLON=128
ASM_COMMA=129
ASM_PAR_BEGIN=130
ASM_PAR_END=131
ASM_BRACKET_BEGIN=132
ASM_BRACKET_END=133
ASM_DOT=134
ASM_SHIFT_LEFT=135
ASM_SHIFT_RIGHT=136
ASM_PLUS=137
ASM_MINUS=138
ASM_LESS_THAN=139
ASM_GREATER_THAN=140
ASM_MULTIPLY=141
ASM_DIVIDE=142
ASM_CURLY_BEGIN=143
ASM_CURLY_END=144
ASM_NUMBER=145
ASM_NUMFLOAT=146
ASM_BINFLOAT=147
ASM_DECFLOAT=148
ASM_HEXFLOAT=149
ASM_NUMINT=150
ASM_BININTEGER=151
ASM_DECINTEGER=152
ASM_HEXINTEGER=153
ASM_CHAR=154
ASM_MULTI_REL=155
ASM_MULTI_NAME=156
ASM_NAME=157
ASM_WS=158
ASM_COMMENT_LINE=159
ASM_COMMENT_BLOCK=160
IMPORT_SYSTEMFILE=161
IMPORT_LOCALFILE=162
IMPORT_WS=163
IMPORT_COMMENT_LINE=164
IMPORT_COMMENT_BLOCK=165
';'=8
'..'=11
'...'=12
@ -245,5 +246,6 @@ IMPORT_COMMENT_BLOCK=164
'#elif'=106
'#else'=107
'#endif'=108
'.byte'=124
'#'=126
'#error'=109
'.byte'=125
'#'=127

File diff suppressed because one or more lines are too long

View File

@ -36,20 +36,20 @@ public class KickCParser extends Parser {
USES=88, CLOBBERS=89, BYTES=90, CYCLES=91, LOGIC_NOT=92, SIGNEDNESS=93,
SIMPLETYPE=94, BOOLEAN=95, KICKASM_BODY=96, IMPORT=97, INCLUDE=98, PRAGMA=99,
DEFINE=100, DEFINE_CONTINUE=101, UNDEF=102, IFDEF=103, IFNDEF=104, IFIF=105,
ELIF=106, IFELSE=107, ENDIF=108, NUMBER=109, NUMFLOAT=110, BINFLOAT=111,
DECFLOAT=112, HEXFLOAT=113, NUMINT=114, BININTEGER=115, DECINTEGER=116,
HEXINTEGER=117, NAME=118, STRING=119, CHAR=120, WS=121, COMMENT_LINE=122,
COMMENT_BLOCK=123, ASM_BYTE=124, ASM_MNEMONIC=125, ASM_IMM=126, ASM_COLON=127,
ASM_COMMA=128, ASM_PAR_BEGIN=129, ASM_PAR_END=130, ASM_BRACKET_BEGIN=131,
ASM_BRACKET_END=132, ASM_DOT=133, ASM_SHIFT_LEFT=134, ASM_SHIFT_RIGHT=135,
ASM_PLUS=136, ASM_MINUS=137, ASM_LESS_THAN=138, ASM_GREATER_THAN=139,
ASM_MULTIPLY=140, ASM_DIVIDE=141, ASM_CURLY_BEGIN=142, ASM_CURLY_END=143,
ASM_NUMBER=144, ASM_NUMFLOAT=145, ASM_BINFLOAT=146, ASM_DECFLOAT=147,
ASM_HEXFLOAT=148, ASM_NUMINT=149, ASM_BININTEGER=150, ASM_DECINTEGER=151,
ASM_HEXINTEGER=152, ASM_CHAR=153, ASM_MULTI_REL=154, ASM_MULTI_NAME=155,
ASM_NAME=156, ASM_WS=157, ASM_COMMENT_LINE=158, ASM_COMMENT_BLOCK=159,
IMPORT_SYSTEMFILE=160, IMPORT_LOCALFILE=161, IMPORT_WS=162, IMPORT_COMMENT_LINE=163,
IMPORT_COMMENT_BLOCK=164;
ELIF=106, IFELSE=107, ENDIF=108, ERROR=109, NUMBER=110, NUMFLOAT=111,
BINFLOAT=112, DECFLOAT=113, HEXFLOAT=114, NUMINT=115, BININTEGER=116,
DECINTEGER=117, HEXINTEGER=118, NAME=119, STRING=120, CHAR=121, WS=122,
COMMENT_LINE=123, COMMENT_BLOCK=124, ASM_BYTE=125, ASM_MNEMONIC=126, ASM_IMM=127,
ASM_COLON=128, ASM_COMMA=129, ASM_PAR_BEGIN=130, ASM_PAR_END=131, ASM_BRACKET_BEGIN=132,
ASM_BRACKET_END=133, ASM_DOT=134, ASM_SHIFT_LEFT=135, ASM_SHIFT_RIGHT=136,
ASM_PLUS=137, ASM_MINUS=138, ASM_LESS_THAN=139, ASM_GREATER_THAN=140,
ASM_MULTIPLY=141, ASM_DIVIDE=142, ASM_CURLY_BEGIN=143, ASM_CURLY_END=144,
ASM_NUMBER=145, ASM_NUMFLOAT=146, ASM_BINFLOAT=147, ASM_DECFLOAT=148,
ASM_HEXFLOAT=149, ASM_NUMINT=150, ASM_BININTEGER=151, ASM_DECINTEGER=152,
ASM_HEXINTEGER=153, ASM_CHAR=154, ASM_MULTI_REL=155, ASM_MULTI_NAME=156,
ASM_NAME=157, ASM_WS=158, ASM_COMMENT_LINE=159, ASM_COMMENT_BLOCK=160,
IMPORT_SYSTEMFILE=161, IMPORT_LOCALFILE=162, IMPORT_WS=163, IMPORT_COMMENT_LINE=164,
IMPORT_COMMENT_BLOCK=165;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3,
RULE_importDecl = 4, RULE_decl = 5, RULE_declVariables = 6, RULE_declVariableList = 7,
@ -96,8 +96,9 @@ public class KickCParser extends Parser {
"'kickasm'", "'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'",
"'!'", null, null, null, null, "'#import'", "'#include'", "'#pragma'",
"'#define'", null, "'#undef'", "'#ifdef'", "'#ifndef'", "'#if'", "'#elif'",
"'#else'", "'#endif'", null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, "'.byte'", null, "'#'"
"'#else'", "'#endif'", "'#error'", null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, "'.byte'", null,
"'#'"
};
}
private static final String[] _LITERAL_NAMES = makeLiteralNames();
@ -119,11 +120,11 @@ public class KickCParser extends Parser {
"RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", "LOGIC_NOT", "SIGNEDNESS",
"SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "IMPORT", "INCLUDE", "PRAGMA",
"DEFINE", "DEFINE_CONTINUE", "UNDEF", "IFDEF", "IFNDEF", "IFIF", "ELIF",
"IFELSE", "ENDIF", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT",
"NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "STRING",
"CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE", "ASM_MNEMONIC",
"ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN", "ASM_PAR_END",
"ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT",
"IFELSE", "ENDIF", "ERROR", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT",
"HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME",
"STRING", "CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE",
"ASM_MNEMONIC", "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN",
"ASM_PAR_END", "ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT",
"ASM_SHIFT_RIGHT", "ASM_PLUS", "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN",
"ASM_MULTIPLY", "ASM_DIVIDE", "ASM_CURLY_BEGIN", "ASM_CURLY_END", "ASM_NUMBER",
"ASM_NUMFLOAT", "ASM_BINFLOAT", "ASM_DECFLOAT", "ASM_HEXFLOAT", "ASM_NUMINT",
@ -6566,7 +6567,7 @@ public class KickCParser extends Parser {
setState(826);
_errHandler.sync(this);
_la = _input.LA(1);
while (((((_la - 124)) & ~0x3f) == 0 && ((1L << (_la - 124)) & ((1L << (ASM_BYTE - 124)) | (1L << (ASM_MNEMONIC - 124)) | (1L << (ASM_MULTI_NAME - 124)) | (1L << (ASM_NAME - 124)))) != 0)) {
while (((((_la - 125)) & ~0x3f) == 0 && ((1L << (_la - 125)) & ((1L << (ASM_BYTE - 125)) | (1L << (ASM_MNEMONIC - 125)) | (1L << (ASM_MULTI_NAME - 125)) | (1L << (ASM_NAME - 125)))) != 0)) {
{
{
setState(823);
@ -7327,7 +7328,7 @@ public class KickCParser extends Parser {
_prevctx = _localctx;
setState(883);
_la = _input.LA(1);
if ( !(((((_la - 136)) & ~0x3f) == 0 && ((1L << (_la - 136)) & ((1L << (ASM_PLUS - 136)) | (1L << (ASM_MINUS - 136)) | (1L << (ASM_LESS_THAN - 136)) | (1L << (ASM_GREATER_THAN - 136)))) != 0)) ) {
if ( !(((((_la - 137)) & ~0x3f) == 0 && ((1L << (_la - 137)) & ((1L << (ASM_PLUS - 137)) | (1L << (ASM_MINUS - 137)) | (1L << (ASM_LESS_THAN - 137)) | (1L << (ASM_GREATER_THAN - 137)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -7609,7 +7610,7 @@ public class KickCParser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a6\u0392\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u00a7\u0392\4\2\t"+
"\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+
"\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -7676,8 +7677,8 @@ public class KickCParser extends Parser {
"\3\61\3\61\3\61\7\61\u038d\n\61\f\61\16\61\u0390\13\61\3\61\2\t\20\34"+
"\36*HJ`\62\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+
"8:<>@BDFHJLNPRTVXZ\\^`\2\r\3\2\27\30\5\2\22\23\31\32^^\4\2!!$$\3\2\35"+
"\36\3\2\24\26\3\2\22\23\3\2\37$\3\2\u008a\u008d\3\2\u0088\u0089\3\2\u008e"+
"\u008f\3\2\u008a\u008b\2\u0417\2b\3\2\2\2\4e\3\2\2\2\6k\3\2\2\2\bp\3\2"+
"\36\3\2\24\26\3\2\22\23\3\2\37$\3\2\u008b\u008e\3\2\u0089\u008a\3\2\u008f"+
"\u0090\3\2\u008b\u008c\2\u0417\2b\3\2\2\2\4e\3\2\2\2\6k\3\2\2\2\bp\3\2"+
"\2\2\nx\3\2\2\2\f\u0089\3\2\2\2\16\u008b\3\2\2\2\20\u008e\3\2\2\2\22\u00a5"+
"\3\2\2\2\24\u00ca\3\2\2\2\26\u00cf\3\2\2\2\30\u00d9\3\2\2\2\32\u00e0\3"+
"\2\2\2\34\u00e6\3\2\2\2\36\u0105\3\2\2\2 \u0115\3\2\2\2\"\u0118\3\2\2"+
@ -7690,8 +7691,8 @@ public class KickCParser extends Parser {
"\3\2\2\2\\\u034e\3\2\2\2^\u036e\3\2\2\2`\u037e\3\2\2\2bc\5\6\4\2cd\7\2"+
"\2\3d\3\3\2\2\2ef\5T+\2fg\7\2\2\3g\5\3\2\2\2hj\5\b\5\2ih\3\2\2\2jm\3\2"+
"\2\2ki\3\2\2\2kl\3\2\2\2l\7\3\2\2\2mk\3\2\2\2nq\5\f\7\2oq\5\n\6\2pn\3"+
"\2\2\2po\3\2\2\2q\t\3\2\2\2rs\7c\2\2sy\7\u00a3\2\2tu\7d\2\2uy\7\u00a3"+
"\2\2vw\7d\2\2wy\7\u00a2\2\2xr\3\2\2\2xt\3\2\2\2xv\3\2\2\2y\13\3\2\2\2"+
"\2\2\2po\3\2\2\2q\t\3\2\2\2rs\7c\2\2sy\7\u00a4\2\2tu\7d\2\2uy\7\u00a4"+
"\2\2vw\7d\2\2wy\7\u00a3\2\2xr\3\2\2\2xt\3\2\2\2xv\3\2\2\2y\13\3\2\2\2"+
"z{\5\16\b\2{|\7\n\2\2|\u008a\3\2\2\2}~\5\"\22\2~\177\7\n\2\2\177\u008a"+
"\3\2\2\2\u0080\u0081\5(\25\2\u0081\u0082\7\n\2\2\u0082\u008a\3\2\2\2\u0083"+
"\u008a\5.\30\2\u0084\u008a\5N(\2\u0085\u008a\5\66\34\2\u0086\u0087\5\22"+
@ -7708,14 +7709,14 @@ public class KickCParser extends Parser {
"\2\2\2\u00a2\u00a3\3\2\2\2\u00a3\21\3\2\2\2\u00a4\u00a2\3\2\2\2\u00a5"+
"\u00a6\7)\2\2\u00a6\u00aa\5\26\f\2\u00a7\u00a9\5\30\r\2\u00a8\u00a7\3"+
"\2\2\2\u00a9\u00ac\3\2\2\2\u00aa\u00a8\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab"+
"\u00ad\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ad\u00b1\7x\2\2\u00ae\u00b0\5\32"+
"\u00ad\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ad\u00b1\7y\2\2\u00ae\u00b0\5\32"+
"\16\2\u00af\u00ae\3\2\2\2\u00b0\u00b3\3\2\2\2\u00b1\u00af\3\2\2\2\u00b1"+
"\u00b2\3\2\2\2\u00b2\u00b4\3\2\2\2\u00b3\u00b1\3\2\2\2\u00b4\u00b5\b\n"+
"\1\2\u00b5\23\3\2\2\2\u00b6\u00ba\7x\2\2\u00b7\u00b9\5\32\16\2\u00b8\u00b7"+
"\1\2\u00b5\23\3\2\2\2\u00b6\u00ba\7y\2\2\u00b7\u00b9\5\32\16\2\u00b8\u00b7"+
"\3\2\2\2\u00b9\u00bc\3\2\2\2\u00ba\u00b8\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb"+
"\u00bf\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bd\u00be\7\'\2\2\u00be\u00c0\5J"+
"&\2\u00bf\u00bd\3\2\2\2\u00bf\u00c0\3\2\2\2\u00c0\u00cb\3\2\2\2\u00c1"+
"\u00c5\7x\2\2\u00c2\u00c4\5\32\16\2\u00c3\u00c2\3\2\2\2\u00c4\u00c7\3"+
"\u00c5\7y\2\2\u00c2\u00c4\5\32\16\2\u00c3\u00c2\3\2\2\2\u00c4\u00c7\3"+
"\2\2\2\u00c5\u00c3\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6\u00c8\3\2\2\2\u00c7"+
"\u00c5\3\2\2\2\u00c8\u00c9\7\'\2\2\u00c9\u00cb\5N(\2\u00ca\u00b6\3\2\2"+
"\2\u00ca\u00c1\3\2\2\2\u00cb\25\3\2\2\2\u00cc\u00ce\5:\36\2\u00cd\u00cc"+
@ -7744,23 +7745,23 @@ public class KickCParser extends Parser {
"\2\u010c\u0111\7\7\2\2\u010d\u010e\f\b\2\2\u010e\u010f\7\b\2\2\u010f\u0111"+
"\7\t\2\2\u0110\u0107\3\2\2\2\u0110\u010d\3\2\2\2\u0111\u0114\3\2\2\2\u0112"+
"\u0110\3\2\2\2\u0112\u0113\3\2\2\2\u0113\37\3\2\2\2\u0114\u0112\3\2\2"+
"\2\u0115\u0116\7S\2\2\u0116\u0117\7x\2\2\u0117!\3\2\2\2\u0118\u011a\7"+
"S\2\2\u0119\u011b\7x\2\2\u011a\u0119\3\2\2\2\u011a\u011b\3\2\2\2\u011b"+
"\2\u0115\u0116\7S\2\2\u0116\u0117\7y\2\2\u0117!\3\2\2\2\u0118\u011a\7"+
"S\2\2\u0119\u011b\7y\2\2\u011a\u0119\3\2\2\2\u011a\u011b\3\2\2\2\u011b"+
"\u011c\3\2\2\2\u011c\u011e\7\4\2\2\u011d\u011f\5$\23\2\u011e\u011d\3\2"+
"\2\2\u011f\u0120\3\2\2\2\u0120\u011e\3\2\2\2\u0120\u0121\3\2\2\2\u0121"+
"\u0122\3\2\2\2\u0122\u0123\7\5\2\2\u0123#\3\2\2\2\u0124\u0125\5\16\b\2"+
"\u0125\u0126\7\n\2\2\u0126%\3\2\2\2\u0127\u0128\7T\2\2\u0128\u0129\7x"+
"\2\2\u0129\'\3\2\2\2\u012a\u012c\7T\2\2\u012b\u012d\7x\2\2\u012c\u012b"+
"\u0125\u0126\7\n\2\2\u0126%\3\2\2\2\u0127\u0128\7T\2\2\u0128\u0129\7y"+
"\2\2\u0129\'\3\2\2\2\u012a\u012c\7T\2\2\u012b\u012d\7y\2\2\u012c\u012b"+
"\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\7\4\2\2\u012f"+
"\u0130\5*\26\2\u0130\u0131\7\5\2\2\u0131)\3\2\2\2\u0132\u0133\b\26\1\2"+
"\u0133\u0134\5,\27\2\u0134\u013a\3\2\2\2\u0135\u0136\f\3\2\2\u0136\u0137"+
"\7\f\2\2\u0137\u0139\5,\27\2\u0138\u0135\3\2\2\2\u0139\u013c\3\2\2\2\u013a"+
"\u0138\3\2\2\2\u013a\u013b\3\2\2\2\u013b+\3\2\2\2\u013c\u013a\3\2\2\2"+
"\u013d\u0140\7x\2\2\u013e\u013f\7\'\2\2\u013f\u0141\5J&\2\u0140\u013e"+
"\u013d\u0140\7y\2\2\u013e\u013f\7\'\2\2\u013f\u0141\5J&\2\u0140\u013e"+
"\3\2\2\2\u0140\u0141\3\2\2\2\u0141-\3\2\2\2\u0142\u0146\5\26\f\2\u0143"+
"\u0145\5\30\r\2\u0144\u0143\3\2\2\2\u0145\u0148\3\2\2\2\u0146\u0144\3"+
"\2\2\2\u0146\u0147\3\2\2\2\u0147\u0149\3\2\2\2\u0148\u0146\3\2\2\2\u0149"+
"\u014a\7x\2\2\u014a\u014c\7\b\2\2\u014b\u014d\5\62\32\2\u014c\u014b\3"+
"\u014a\7y\2\2\u014a\u014c\7\b\2\2\u014b\u014d\5\62\32\2\u014c\u014b\3"+
"\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e\u0151\7\t\2\2\u014f"+
"\u0152\5\60\31\2\u0150\u0152\7\n\2\2\u0151\u014f\3\2\2\2\u0151\u0150\3"+
"\2\2\2\u0152/\3\2\2\2\u0153\u0155\7\4\2\2\u0154\u0156\5<\37\2\u0155\u0154"+
@ -7770,46 +7771,46 @@ public class KickCParser extends Parser {
"\u015f\3\2\2\2\u015f\63\3\2\2\2\u0160\u015e\3\2\2\2\u0161\u0165\5\26\f"+
"\2\u0162\u0164\5\30\r\2\u0163\u0162\3\2\2\2\u0164\u0167\3\2\2\2\u0165"+
"\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0168\3\2\2\2\u0167\u0165\3\2"+
"\2\2\u0168\u0169\7x\2\2\u0169\u016d\3\2\2\2\u016a\u016d\7`\2\2\u016b\u016d"+
"\2\2\u0168\u0169\7y\2\2\u0169\u016d\3\2\2\2\u016a\u016d\7`\2\2\u016b\u016d"+
"\7\16\2\2\u016c\u0161\3\2\2\2\u016c\u016a\3\2\2\2\u016c\u016b\3\2\2\2"+
"\u016d\65\3\2\2\2\u016e\u016f\7e\2\2\u016f\u0170\7,\2\2\u0170\u0171\3"+
"\2\2\2\u0171\u0172\7\b\2\2\u0172\u0173\7x\2\2\u0173\u01c6\7\t\2\2\u0174"+
"\2\2\2\u0171\u0172\7\b\2\2\u0172\u0173\7y\2\2\u0173\u01c6\7\t\2\2\u0174"+
"\u0175\7e\2\2\u0175\u0176\7\60\2\2\u0176\u0177\3\2\2\2\u0177\u0178\7\b"+
"\2\2\u0178\u0179\7x\2\2\u0179\u01c6\7\t\2\2\u017a\u017b\7e\2\2\u017b\u017c"+
"\7-\2\2\u017c\u017d\3\2\2\2\u017d\u017e\7\b\2\2\u017e\u017f\7y\2\2\u017f"+
"\2\2\u0178\u0179\7y\2\2\u0179\u01c6\7\t\2\2\u017a\u017b\7e\2\2\u017b\u017c"+
"\7-\2\2\u017c\u017d\3\2\2\2\u017d\u017e\7\b\2\2\u017e\u017f\7z\2\2\u017f"+
"\u01c6\7\t\2\2\u0180\u0181\7e\2\2\u0181\u0182\7.\2\2\u0182\u0183\3\2\2"+
"\2\u0183\u0184\7\b\2\2\u0184\u0185\7y\2\2\u0185\u01c6\7\t\2\2\u0186\u0187"+
"\2\u0183\u0184\7\b\2\2\u0184\u0185\7z\2\2\u0185\u01c6\7\t\2\2\u0186\u0187"+
"\7e\2\2\u0187\u0188\7/\2\2\u0188\u0189\3\2\2\2\u0189\u018a\7\b\2\2\u018a"+
"\u018b\7y\2\2\u018b\u01c6\7\t\2\2\u018c\u018d\7e\2\2\u018d\u018e\7*\2"+
"\u018b\7z\2\2\u018b\u01c6\7\t\2\2\u018c\u018d\7e\2\2\u018d\u018e\7*\2"+
"\2\u018e\u018f\3\2\2\2\u018f\u0190\7\b\2\2\u0190\u0195\58\35\2\u0191\u0192"+
"\7\f\2\2\u0192\u0194\58\35\2\u0193\u0191\3\2\2\2\u0194\u0197\3\2\2\2\u0195"+
"\u0193\3\2\2\2\u0195\u0196\3\2\2\2\u0196\u0198\3\2\2\2\u0197\u0195\3\2"+
"\2\2\u0198\u0199\7\t\2\2\u0199\u01c6\3\2\2\2\u019a\u019b\7e\2\2\u019b"+
"\u019c\7+\2\2\u019c\u019d\3\2\2\2\u019d\u019e\7\b\2\2\u019e\u019f\7o\2"+
"\u019c\7+\2\2\u019c\u019d\3\2\2\2\u019d\u019e\7\b\2\2\u019e\u019f\7p\2"+
"\2\u019f\u01c6\7\t\2\2\u01a0\u01a1\7e\2\2\u01a1\u01a2\7\61\2\2\u01a2\u01a3"+
"\3\2\2\2\u01a3\u01a4\7\b\2\2\u01a4\u01a5\7x\2\2\u01a5\u01c6\7\t\2\2\u01a6"+
"\3\2\2\2\u01a3\u01a4\7\b\2\2\u01a4\u01a5\7y\2\2\u01a5\u01c6\7\t\2\2\u01a6"+
"\u01a7\7e\2\2\u01a7\u01a8\7\62\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\7\b"+
"\2\2\u01aa\u01ab\7x\2\2\u01ab\u01c6\7\t\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae"+
"\7\63\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0\7\b\2\2\u01b0\u01b1\7x\2\2\u01b1"+
"\2\2\u01aa\u01ab\7y\2\2\u01ab\u01c6\7\t\2\2\u01ac\u01ad\7e\2\2\u01ad\u01ae"+
"\7\63\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0\7\b\2\2\u01b0\u01b1\7y\2\2\u01b1"+
"\u01c6\7\t\2\2\u01b2\u01b3\7e\2\2\u01b3\u01b4\7D\2\2\u01b4\u01b5\3\2\2"+
"\2\u01b5\u01b6\7\b\2\2\u01b6\u01b7\7E\2\2\u01b7\u01c6\7\t\2\2\u01b8\u01b9"+
"\7e\2\2\u01b9\u01ba\7F\2\2\u01ba\u01bb\3\2\2\2\u01bb\u01bc\7\b\2\2\u01bc"+
"\u01c1\7x\2\2\u01bd\u01be\7\f\2\2\u01be\u01c0\7x\2\2\u01bf\u01bd\3\2\2"+
"\u01c1\7y\2\2\u01bd\u01be\7\f\2\2\u01be\u01c0\7y\2\2\u01bf\u01bd\3\2\2"+
"\2\u01c0\u01c3\3\2\2\2\u01c1\u01bf\3\2\2\2\u01c1\u01c2\3\2\2\2\u01c2\u01c4"+
"\3\2\2\2\u01c3\u01c1\3\2\2\2\u01c4\u01c6\7\t\2\2\u01c5\u016e\3\2\2\2\u01c5"+
"\u0174\3\2\2\2\u01c5\u017a\3\2\2\2\u01c5\u0180\3\2\2\2\u01c5\u0186\3\2"+
"\2\2\u01c5\u018c\3\2\2\2\u01c5\u019a\3\2\2\2\u01c5\u01a0\3\2\2\2\u01c5"+
"\u01a6\3\2\2\2\u01c5\u01ac\3\2\2\2\u01c5\u01b2\3\2\2\2\u01c5\u01b8\3\2"+
"\2\2\u01c6\67\3\2\2\2\u01c7\u01ca\7o\2\2\u01c8\u01c9\7\r\2\2\u01c9\u01cb"+
"\7o\2\2\u01ca\u01c8\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb9\3\2\2\2\u01cc\u01f9"+
"\7\64\2\2\u01cd\u01ce\7\67\2\2\u01ce\u01cf\7\b\2\2\u01cf\u01d0\7o\2\2"+
"\2\2\u01c6\67\3\2\2\2\u01c7\u01ca\7p\2\2\u01c8\u01c9\7\r\2\2\u01c9\u01cb"+
"\7p\2\2\u01ca\u01c8\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb9\3\2\2\2\u01cc\u01f9"+
"\7\64\2\2\u01cd\u01ce\7\67\2\2\u01ce\u01cf\7\b\2\2\u01cf\u01d0\7p\2\2"+
"\u01d0\u01f9\7\t\2\2\u01d1\u01d5\7<\2\2\u01d2\u01d3\7\b\2\2\u01d3\u01d4"+
"\7x\2\2\u01d4\u01d6\7\t\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6"+
"\7y\2\2\u01d4\u01d6\7\t\2\2\u01d5\u01d2\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6"+
"\u01f9\3\2\2\2\u01d7\u01f9\7?\2\2\u01d8\u01f9\7@\2\2\u01d9\u01da\7>\2"+
"\2\u01da\u01db\7\b\2\2\u01db\u01dc\7o\2\2\u01dc\u01f9\7\t\2\2\u01dd\u01f9"+
"\2\u01da\u01db\7\b\2\2\u01db\u01dc\7p\2\2\u01dc\u01f9\7\t\2\2\u01dd\u01f9"+
"\79\2\2\u01de\u01f9\7:\2\2\u01df\u01f9\7A\2\2\u01e0\u01f9\7B\2\2\u01e1"+
"\u01f9\7\65\2\2\u01e2\u01f9\7\66\2\2\u01e3\u01f9\78\2\2\u01e4\u01f9\7"+
"C\2\2\u01e5\u01e9\7;\2\2\u01e6\u01e7\7\b\2\2\u01e7\u01e8\7x\2\2\u01e8"+
"C\2\2\u01e5\u01e9\7;\2\2\u01e6\u01e7\7\b\2\2\u01e7\u01e8\7y\2\2\u01e8"+
"\u01ea\7\t\2\2\u01e9\u01e6\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea\u01f9\3\2"+
"\2\2\u01eb\u01ec\7=\2\2\u01ec\u01ed\7\b\2\2\u01ed\u01f2\58\35\2\u01ee"+
"\u01ef\7\f\2\2\u01ef\u01f1\58\35\2\u01f0\u01ee\3\2\2\2\u01f1\u01f4\3\2"+
@ -7846,7 +7847,7 @@ public class KickCParser extends Parser {
"\u0247\7N\2\2\u0247\u0254\7\n\2\2\u0248\u0249\7O\2\2\u0249\u0254\7\n\2"+
"\2\u024a\u024c\7P\2\2\u024b\u024d\5P)\2\u024c\u024b\3\2\2\2\u024c\u024d"+
"\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u024f\7\4\2\2\u024f\u0250\5T+\2\u0250"+
"\u0251\7\u0091\2\2\u0251\u0254\3\2\2\2\u0252\u0254\5N(\2\u0253\u01ff\3"+
"\u0251\7\u0092\2\2\u0251\u0254\3\2\2\2\u0252\u0254\5N(\2\u0253\u01ff\3"+
"\2\2\2\u0253\u0202\3\2\2\2\u0253\u0207\3\2\2\2\u0253\u020a\3\2\2\2\u0253"+
"\u0216\3\2\2\2\u0253\u0222\3\2\2\2\u0253\u0230\3\2\2\2\u0253\u0239\3\2"+
"\2\2\u0253\u0241\3\2\2\2\u0253\u0246\3\2\2\2\u0253\u0248\3\2\2\2\u0253"+
@ -7862,7 +7863,7 @@ public class KickCParser extends Parser {
"\5\26\f\2\u026f\u0271\5\30\r\2\u0270\u026f\3\2\2\2\u0271\u0274\3\2\2\2"+
"\u0272\u0270\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u0276\3\2\2\2\u0274\u0272"+
"\3\2\2\2\u0275\u026e\3\2\2\2\u0275\u0276\3\2\2\2\u0276\u0277\3\2\2\2\u0277"+
"\u0278\7x\2\2\u0278\u0279\7\13\2\2\u0279\u027a\5J&\2\u027a\u027b\7\r\2"+
"\u0278\7y\2\2\u0278\u0279\7\13\2\2\u0279\u027a\5J&\2\u027a\u027b\7\r\2"+
"\2\u027b\u027c\5J&\2\u027c\u027e\3\2\2\2\u027d\u0267\3\2\2\2\u027d\u0275"+
"\3\2\2\2\u027eE\3\2\2\2\u027f\u0281\5\16\b\2\u0280\u027f\3\2\2\2\u0280"+
"\u0281\3\2\2\2\u0281\u0284\3\2\2\2\u0282\u0284\5H%\2\u0283\u0280\3\2\2"+
@ -7877,7 +7878,7 @@ public class KickCParser extends Parser {
"\2\2\u029e\u02a1\7\b\2\2\u029f\u02a2\5J&\2\u02a0\u02a2\5\34\17\2\u02a1"+
"\u029f\3\2\2\2\u02a1\u02a0\3\2\2\2\u02a2\u02a3\3\2\2\2\u02a3\u02a4\7\t"+
"\2\2\u02a4\u02cf\3\2\2\2\u02a5\u02a7\7W\2\2\u02a6\u02a8\7\b\2\2\u02a7"+
"\u02a6\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9\u02ab\7x"+
"\u02a6\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9\u02ab\7y"+
"\2\2\u02aa\u02ac\7\t\2\2\u02ab\u02aa\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac"+
"\u02cf\3\2\2\2\u02ad\u02ae\7\b\2\2\u02ae\u02af\5\34\17\2\u02af\u02b0\7"+
"\t\2\2\u02b0\u02b1\5J&\32\u02b1\u02cf\3\2\2\2\u02b2\u02b3\t\2\2\2\u02b3"+
@ -7886,9 +7887,9 @@ public class KickCParser extends Parser {
"\7\4\2\2\u02bb\u02c0\5J&\2\u02bc\u02bd\7\f\2\2\u02bd\u02bf\5J&\2\u02be"+
"\u02bc\3\2\2\2\u02bf\u02c2\3\2\2\2\u02c0\u02be\3\2\2\2\u02c0\u02c1\3\2"+
"\2\2\u02c1\u02c3\3\2\2\2\u02c2\u02c0\3\2\2\2\u02c3\u02c4\7\5\2\2\u02c4"+
"\u02cf\3\2\2\2\u02c5\u02cf\7x\2\2\u02c6\u02cf\7o\2\2\u02c7\u02c9\7y\2"+
"\u02cf\3\2\2\2\u02c5\u02cf\7y\2\2\u02c6\u02cf\7p\2\2\u02c7\u02c9\7z\2"+
"\2\u02c8\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u02c8\3\2\2\2\u02ca\u02cb"+
"\3\2\2\2\u02cb\u02cf\3\2\2\2\u02cc\u02cf\7z\2\2\u02cd\u02cf\7a\2\2\u02ce"+
"\3\2\2\2\u02cb\u02cf\3\2\2\2\u02cc\u02cf\7{\2\2\u02cd\u02cf\7a\2\2\u02ce"+
"\u0290\3\2\2\2\u02ce\u0295\3\2\2\2\u02ce\u029d\3\2\2\2\u02ce\u02a5\3\2"+
"\2\2\u02ce\u02ad\3\2\2\2\u02ce\u02b2\3\2\2\2\u02ce\u02b4\3\2\2\2\u02ce"+
"\u02b6\3\2\2\2\u02ce\u02b8\3\2\2\2\u02ce\u02ba\3\2\2\2\u02ce\u02c5\3\2"+
@ -7905,7 +7906,7 @@ public class KickCParser extends Parser {
"\u02ef\7\13\2\2\u02ef\u02f0\5J&\f\u02f0\u030b\3\2\2\2\u02f1\u02f2\f\n"+
"\2\2\u02f2\u02f3\7\'\2\2\u02f3\u030b\5J&\n\u02f4\u02f5\f\t\2\2\u02f5\u02f6"+
"\7(\2\2\u02f6\u030b\5J&\t\u02f7\u02f8\f!\2\2\u02f8\u02f9\7\20\2\2\u02f9"+
"\u030b\7x\2\2\u02fa\u02fb\f \2\2\u02fb\u02fc\7\21\2\2\u02fc\u030b\7x\2"+
"\u030b\7y\2\2\u02fa\u02fb\f \2\2\u02fb\u02fc\7\21\2\2\u02fc\u030b\7y\2"+
"\2\u02fd\u02fe\f\37\2\2\u02fe\u0300\7\b\2\2\u02ff\u0301\5L\'\2\u0300\u02ff"+
"\3\2\2\2\u0300\u0301\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u030b\7\t\2\2\u0303"+
"\u0304\f\33\2\2\u0304\u0305\7\6\2\2\u0305\u0306\5H%\2\u0306\u0307\7\7"+
@ -7924,8 +7925,8 @@ public class KickCParser extends Parser {
"\u0320\7\f\2\2\u0320\u0322\5R*\2\u0321\u031f\3\2\2\2\u0322\u0325\3\2\2"+
"\2\u0323\u0321\3\2\2\2\u0323\u0324\3\2\2\2\u0324\u0326\3\2\2\2\u0325\u0323"+
"\3\2\2\2\u0326\u0327\7\t\2\2\u0327Q\3\2\2\2\u0328\u0329\7Y\2\2\u0329\u0338"+
"\7y\2\2\u032a\u032b\7Z\2\2\u032b\u0338\7x\2\2\u032c\u032d\7[\2\2\u032d"+
"\u0338\7y\2\2\u032e\u032f\7\\\2\2\u032f\u0338\5J&\2\u0330\u0331\7]\2\2"+
"\7z\2\2\u032a\u032b\7Z\2\2\u032b\u0338\7y\2\2\u032c\u032d\7[\2\2\u032d"+
"\u0338\7z\2\2\u032e\u032f\7\\\2\2\u032f\u0338\5J&\2\u0330\u0331\7]\2\2"+
"\u0331\u0338\5J&\2\u0332\u0335\7+\2\2\u0333\u0336\78\2\2\u0334\u0336\5"+
"J&\2\u0335\u0333\3\2\2\2\u0335\u0334\3\2\2\2\u0336\u0338\3\2\2\2\u0337"+
"\u0328\3\2\2\2\u0337\u032a\3\2\2\2\u0337\u032c\3\2\2\2\u0337\u032e\3\2"+
@ -7933,29 +7934,29 @@ public class KickCParser extends Parser {
"\5V,\2\u033a\u0339\3\2\2\2\u033b\u033e\3\2\2\2\u033c\u033a\3\2\2\2\u033c"+
"\u033d\3\2\2\2\u033dU\3\2\2\2\u033e\u033c\3\2\2\2\u033f\u0343\5X-\2\u0340"+
"\u0343\5Z.\2\u0341\u0343\5\\/\2\u0342\u033f\3\2\2\2\u0342\u0340\3\2\2"+
"\2\u0342\u0341\3\2\2\2\u0343W\3\2\2\2\u0344\u0345\7\u009e\2\2\u0345\u0349"+
"\7\u0081\2\2\u0346\u0347\7\u009d\2\2\u0347\u0349\7\u0081\2\2\u0348\u0344"+
"\3\2\2\2\u0348\u0346\3\2\2\2\u0349Y\3\2\2\2\u034a\u034c\7\177\2\2\u034b"+
"\2\u0342\u0341\3\2\2\2\u0343W\3\2\2\2\u0344\u0345\7\u009f\2\2\u0345\u0349"+
"\7\u0082\2\2\u0346\u0347\7\u009e\2\2\u0347\u0349\7\u0082\2\2\u0348\u0344"+
"\3\2\2\2\u0348\u0346\3\2\2\2\u0349Y\3\2\2\2\u034a\u034c\7\u0080\2\2\u034b"+
"\u034d\5^\60\2\u034c\u034b\3\2\2\2\u034c\u034d\3\2\2\2\u034d[\3\2\2\2"+
"\u034e\u034f\7~\2\2\u034f\u0354\5`\61\2\u0350\u0351\7\u0082\2\2\u0351"+
"\u034e\u034f\7\177\2\2\u034f\u0354\5`\61\2\u0350\u0351\7\u0083\2\2\u0351"+
"\u0353\5`\61\2\u0352\u0350\3\2\2\2\u0353\u0356\3\2\2\2\u0354\u0352\3\2"+
"\2\2\u0354\u0355\3\2\2\2\u0355]\3\2\2\2\u0356\u0354\3\2\2\2\u0357\u036f"+
"\5`\61\2\u0358\u0359\7\u0080\2\2\u0359\u036f\5`\61\2\u035a\u035b\5`\61"+
"\2\u035b\u035c\7\u0082\2\2\u035c\u035d\7\u009e\2\2\u035d\u036f\3\2\2\2"+
"\u035e\u035f\7\u0083\2\2\u035f\u0360\5`\61\2\u0360\u0361\7\u0084\2\2\u0361"+
"\u0362\7\u0082\2\2\u0362\u0363\7\u009e\2\2\u0363\u036f\3\2\2\2\u0364\u0365"+
"\7\u0083\2\2\u0365\u0366\5`\61\2\u0366\u0367\7\u0082\2\2\u0367\u0368\7"+
"\u009e\2\2\u0368\u0369\7\u0084\2\2\u0369\u036f\3\2\2\2\u036a\u036b\7\u0083"+
"\2\2\u036b\u036c\5`\61\2\u036c\u036d\7\u0084\2\2\u036d\u036f\3\2\2\2\u036e"+
"\5`\61\2\u0358\u0359\7\u0081\2\2\u0359\u036f\5`\61\2\u035a\u035b\5`\61"+
"\2\u035b\u035c\7\u0083\2\2\u035c\u035d\7\u009f\2\2\u035d\u036f\3\2\2\2"+
"\u035e\u035f\7\u0084\2\2\u035f\u0360\5`\61\2\u0360\u0361\7\u0085\2\2\u0361"+
"\u0362\7\u0083\2\2\u0362\u0363\7\u009f\2\2\u0363\u036f\3\2\2\2\u0364\u0365"+
"\7\u0084\2\2\u0365\u0366\5`\61\2\u0366\u0367\7\u0083\2\2\u0367\u0368\7"+
"\u009f\2\2\u0368\u0369\7\u0085\2\2\u0369\u036f\3\2\2\2\u036a\u036b\7\u0084"+
"\2\2\u036b\u036c\5`\61\2\u036c\u036d\7\u0085\2\2\u036d\u036f\3\2\2\2\u036e"+
"\u0357\3\2\2\2\u036e\u0358\3\2\2\2\u036e\u035a\3\2\2\2\u036e\u035e\3\2"+
"\2\2\u036e\u0364\3\2\2\2\u036e\u036a\3\2\2\2\u036f_\3\2\2\2\u0370\u0371"+
"\b\61\1\2\u0371\u0372\7\u0085\2\2\u0372\u0373\5`\61\2\u0373\u0374\7\u0086"+
"\b\61\1\2\u0371\u0372\7\u0086\2\2\u0372\u0373\5`\61\2\u0373\u0374\7\u0087"+
"\2\2\u0374\u037f\3\2\2\2\u0375\u0376\t\t\2\2\u0376\u037f\5`\61\n\u0377"+
"\u037f\7\u009e\2\2\u0378\u037f\7\u009c\2\2\u0379\u037a\7\u0090\2\2\u037a"+
"\u037b\7\u009e\2\2\u037b\u037f\7\u0091\2\2\u037c\u037f\7\u0092\2\2\u037d"+
"\u037f\7\u009b\2\2\u037e\u0370\3\2\2\2\u037e\u0375\3\2\2\2\u037e\u0377"+
"\u037f\7\u009f\2\2\u0378\u037f\7\u009d\2\2\u0379\u037a\7\u0091\2\2\u037a"+
"\u037b\7\u009f\2\2\u037b\u037f\7\u0092\2\2\u037c\u037f\7\u0093\2\2\u037d"+
"\u037f\7\u009c\2\2\u037e\u0370\3\2\2\2\u037e\u0375\3\2\2\2\u037e\u0377"+
"\3\2\2\2\u037e\u0378\3\2\2\2\u037e\u0379\3\2\2\2\u037e\u037c\3\2\2\2\u037e"+
"\u037d\3\2\2\2\u037f\u038e\3\2\2\2\u0380\u0381\f\f\2\2\u0381\u0382\7\u0087"+
"\u037d\3\2\2\2\u037f\u038e\3\2\2\2\u0380\u0381\f\f\2\2\u0381\u0382\7\u0088"+
"\2\2\u0382\u038d\5`\61\r\u0383\u0384\f\13\2\2\u0384\u0385\t\n\2\2\u0385"+
"\u038d\5`\61\f\u0386\u0387\f\t\2\2\u0387\u0388\t\13\2\2\u0388\u038d\5"+
"`\61\n\u0389\u038a\f\b\2\2\u038a\u038b\t\f\2\2\u038b\u038d\5`\61\t\u038c"+

View File

@ -106,62 +106,63 @@ IFIF=105
ELIF=106
IFELSE=107
ENDIF=108
NUMBER=109
NUMFLOAT=110
BINFLOAT=111
DECFLOAT=112
HEXFLOAT=113
NUMINT=114
BININTEGER=115
DECINTEGER=116
HEXINTEGER=117
NAME=118
STRING=119
CHAR=120
WS=121
COMMENT_LINE=122
COMMENT_BLOCK=123
ASM_BYTE=124
ASM_MNEMONIC=125
ASM_IMM=126
ASM_COLON=127
ASM_COMMA=128
ASM_PAR_BEGIN=129
ASM_PAR_END=130
ASM_BRACKET_BEGIN=131
ASM_BRACKET_END=132
ASM_DOT=133
ASM_SHIFT_LEFT=134
ASM_SHIFT_RIGHT=135
ASM_PLUS=136
ASM_MINUS=137
ASM_LESS_THAN=138
ASM_GREATER_THAN=139
ASM_MULTIPLY=140
ASM_DIVIDE=141
ASM_CURLY_BEGIN=142
ASM_CURLY_END=143
ASM_NUMBER=144
ASM_NUMFLOAT=145
ASM_BINFLOAT=146
ASM_DECFLOAT=147
ASM_HEXFLOAT=148
ASM_NUMINT=149
ASM_BININTEGER=150
ASM_DECINTEGER=151
ASM_HEXINTEGER=152
ASM_CHAR=153
ASM_MULTI_REL=154
ASM_MULTI_NAME=155
ASM_NAME=156
ASM_WS=157
ASM_COMMENT_LINE=158
ASM_COMMENT_BLOCK=159
IMPORT_SYSTEMFILE=160
IMPORT_LOCALFILE=161
IMPORT_WS=162
IMPORT_COMMENT_LINE=163
IMPORT_COMMENT_BLOCK=164
ERROR=109
NUMBER=110
NUMFLOAT=111
BINFLOAT=112
DECFLOAT=113
HEXFLOAT=114
NUMINT=115
BININTEGER=116
DECINTEGER=117
HEXINTEGER=118
NAME=119
STRING=120
CHAR=121
WS=122
COMMENT_LINE=123
COMMENT_BLOCK=124
ASM_BYTE=125
ASM_MNEMONIC=126
ASM_IMM=127
ASM_COLON=128
ASM_COMMA=129
ASM_PAR_BEGIN=130
ASM_PAR_END=131
ASM_BRACKET_BEGIN=132
ASM_BRACKET_END=133
ASM_DOT=134
ASM_SHIFT_LEFT=135
ASM_SHIFT_RIGHT=136
ASM_PLUS=137
ASM_MINUS=138
ASM_LESS_THAN=139
ASM_GREATER_THAN=140
ASM_MULTIPLY=141
ASM_DIVIDE=142
ASM_CURLY_BEGIN=143
ASM_CURLY_END=144
ASM_NUMBER=145
ASM_NUMFLOAT=146
ASM_BINFLOAT=147
ASM_DECFLOAT=148
ASM_HEXFLOAT=149
ASM_NUMINT=150
ASM_BININTEGER=151
ASM_DECINTEGER=152
ASM_HEXINTEGER=153
ASM_CHAR=154
ASM_MULTI_REL=155
ASM_MULTI_NAME=156
ASM_NAME=157
ASM_WS=158
ASM_COMMENT_LINE=159
ASM_COMMENT_BLOCK=160
IMPORT_SYSTEMFILE=161
IMPORT_LOCALFILE=162
IMPORT_WS=163
IMPORT_COMMENT_LINE=164
IMPORT_COMMENT_BLOCK=165
';'=8
'..'=11
'...'=12
@ -245,5 +246,6 @@ IMPORT_COMMENT_BLOCK=164
'#elif'=106
'#else'=107
'#endif'=108
'.byte'=124
'#'=126
'#error'=109
'.byte'=125
'#'=127

View File

@ -141,6 +141,9 @@ public class CPreprocessor implements TokenSource {
return expand(inputToken, cTokenSource);
} else if(inputToken.getType() == KickCLexer.PRAGMA) {
return pragma(inputToken, cTokenSource);
} else if(inputToken.getType() == KickCLexer.ERROR) {
error(inputToken, cTokenSource);
return true;
}
return false;
}
@ -182,6 +185,25 @@ public class CPreprocessor implements TokenSource {
return true;
}
/**
* Report an error and halt compilation
*
* @param inputToken The #error token
* @param cTokenSource The token source used to get the error message
*/
private void error(Token inputToken, CTokenSource cTokenSource) {
skipWhitespace(cTokenSource);
final ArrayList<Token> errorBody = readBody(cTokenSource);
StringBuilder errorMsg = new StringBuilder();
Token lastToken = inputToken;
for(Token token : errorBody) {
errorMsg.append(token.getText());
lastToken = token;
}
throw new CompileError(errorMsg.toString(), new StatementSource(inputToken, lastToken));
}
/**
* Define a macro.
*

View File

@ -398,6 +398,16 @@ public class TestPrograms {
compileAndCompare("cstyle-decl-function.c");
}
@Test
public void testPreprocessor11() throws IOException, URISyntaxException {
compileAndCompare("preprocessor-11.c");
}
@Test
public void testPreprocessor10() throws IOException, URISyntaxException {
assertError("preprocessor-10.c", "Preprocessor causing an error!");
}
@Test
public void testPreprocessor9() throws IOException, URISyntaxException {
compileAndCompare("preprocessor-9.c");

View File

@ -0,0 +1,7 @@
// Test the preprocessor
// #error
#error Preprocessor causing an error!
void main() {
}

View File

@ -0,0 +1,12 @@
// Test the preprocessor
// #error that is not used
#ifdef ERR
#error Preprocessor causing an error!
#endif
char * const SCREEN = 0x0400;
void main() {
SCREEN[0] = 'a';
}

View File

@ -0,0 +1,13 @@
// Test the preprocessor
// #error that is not used
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.label SCREEN = $400
main: {
// SCREEN[0] = 'a'
lda #'a'
sta SCREEN
// }
rts
}

View File

@ -0,0 +1,17 @@
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
(void()) main()
main: scope:[main] from @1
[4] *((const nomodify byte*) SCREEN) ← (byte) 'a'
to:main::@return
main::@return: scope:[main] from main
[5] return
to:@return

View File

@ -0,0 +1,219 @@
CONTROL FLOW GRAPH SSA
@begin: scope:[] from
to:@1
(void()) main()
main: scope:[main] from @1
*((const nomodify byte*) SCREEN + (number) 0) ← (byte) 'a'
to:main::@return
main::@return: scope:[main] from main
return
to:@return
@1: scope:[] from @begin
call main
to:@2
@2: scope:[] from @1
to:@end
@end: scope:[] from @2
SYMBOL TABLE SSA
(label) @1
(label) @2
(label) @begin
(label) @end
(const nomodify byte*) SCREEN = (byte*)(number) $400
(void()) main()
(label) main::@return
Adding number conversion cast (unumber) 0 in *((const nomodify byte*) SCREEN + (number) 0) ← (byte) 'a'
Successful SSA optimization PassNAddNumberTypeConversions
Simplifying constant pointer cast (byte*) 1024
Simplifying constant integer cast 0
Successful SSA optimization PassNCastSimplification
Finalized unsigned number type (byte) 0
Successful SSA optimization PassNFinalizeNumberTypeConversions
Simplifying expression containing zero SCREEN in [0] *((const nomodify byte*) SCREEN + (byte) 0) ← (byte) 'a'
Successful SSA optimization PassNSimplifyExpressionWithZero
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @2
Adding NOP phi() at start of @end
CALL GRAPH
Calls in [] to main:2
Created 0 initial phi equivalence classes
Coalesced down to 0 phi equivalence classes
Culled Empty Block (label) @2
Adding NOP phi() at start of @begin
Adding NOP phi() at start of @1
Adding NOP phi() at start of @end
FINAL CONTROL FLOW GRAPH
@begin: scope:[] from
[0] phi()
to:@1
@1: scope:[] from @begin
[1] phi()
[2] call main
to:@end
@end: scope:[] from @1
[3] phi()
(void()) main()
main: scope:[main] from @1
[4] *((const nomodify byte*) SCREEN) ← (byte) 'a'
to:main::@return
main::@return: scope:[main] from main
[5] return
to:@return
VARIABLE REGISTER WEIGHTS
(void()) main()
Initial phi equivalence classes
Complete equivalence classes
INITIAL ASM
Target platform is c64basic / MOS6502X
// File Comments
// Test the preprocessor
// #error that is not used
// Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
// main
main: {
// [4] *((const nomodify byte*) SCREEN) ← (byte) 'a' -- _deref_pbuc1=vbuc2
lda #'a'
sta SCREEN
jmp __breturn
// main::@return
__breturn:
// [5] return
rts
}
// File Data
REGISTER UPLIFT POTENTIAL REGISTERS
Statement [4] *((const nomodify byte*) SCREEN) ← (byte) 'a' [ ] ( main:2 [ ] { } ) always clobbers reg byte a
REGISTER UPLIFT SCOPES
Uplift Scope [main]
Uplift Scope []
Uplifting [main] best 27 combination
Uplifting [] best 27 combination
ASSEMBLER BEFORE OPTIMIZATION
// File Comments
// Test the preprocessor
// #error that is not used
// Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
__bbegin:
// [1] phi from @begin to @1 [phi:@begin->@1]
__b1_from___bbegin:
jmp __b1
// @1
__b1:
// [2] call main
jsr main
// [3] phi from @1 to @end [phi:@1->@end]
__bend_from___b1:
jmp __bend
// @end
__bend:
// main
main: {
// [4] *((const nomodify byte*) SCREEN) ← (byte) 'a' -- _deref_pbuc1=vbuc2
lda #'a'
sta SCREEN
jmp __breturn
// main::@return
__breturn:
// [5] return
rts
}
// File Data
ASSEMBLER OPTIMIZATIONS
Removing instruction jmp __b1
Removing instruction jmp __bend
Removing instruction jmp __breturn
Succesful ASM optimization Pass5NextJumpElimination
Removing instruction __b1_from___bbegin:
Removing instruction __b1:
Removing instruction __bend_from___b1:
Succesful ASM optimization Pass5RedundantLabelElimination
Removing instruction __bbegin:
Removing instruction __bend:
Removing instruction __breturn:
Succesful ASM optimization Pass5UnusedLabelElimination
Removing instruction jsr main
Succesful ASM optimization Pass5SkipBegin
FINAL SYMBOL TABLE
(label) @1
(label) @begin
(label) @end
(const nomodify byte*) SCREEN = (byte*) 1024
(void()) main()
(label) main::@return
FINAL ASSEMBLER
Score: 12
// File Comments
// Test the preprocessor
// #error that is not used
// Upstart
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
// Global Constants & labels
.label SCREEN = $400
// @begin
// [1] phi from @begin to @1 [phi:@begin->@1]
// @1
// [2] call main
// [3] phi from @1 to @end [phi:@1->@end]
// @end
// main
main: {
// SCREEN[0] = 'a'
// [4] *((const nomodify byte*) SCREEN) ← (byte) 'a' -- _deref_pbuc1=vbuc2
lda #'a'
sta SCREEN
// main::@return
// }
// [5] return
rts
}
// File Data

View File

@ -0,0 +1,7 @@
(label) @1
(label) @begin
(label) @end
(const nomodify byte*) SCREEN = (byte*) 1024
(void()) main()
(label) main::@return