diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmDataNumeric.java b/src/main/java/dk/camelot64/kickc/asm/AsmDataNumeric.java
index 225be8586..3fc5d0555 100644
--- a/src/main/java/dk/camelot64/kickc/asm/AsmDataNumeric.java
+++ b/src/main/java/dk/camelot64/kickc/asm/AsmDataNumeric.java
@@ -2,7 +2,9 @@ package dk.camelot64.kickc.asm;
import java.util.List;
-/** A labelled numeric data directive. */
+/**
+ * A labelled numeric data directive.
+ */
public class AsmDataNumeric implements AsmLine {
private String label;
@@ -37,7 +39,7 @@ public class AsmDataNumeric implements AsmLine {
@Override
public int getLineBytes() {
- return values.size()*getElementBytes();
+ return values.size() * getElementBytes();
}
@Override
@@ -48,10 +50,12 @@ public class AsmDataNumeric implements AsmLine {
@Override
public String getAsm() {
StringBuilder asm = new StringBuilder();
- asm.append(label+": ");
- asm.append("."+type.asm+" ");
+ if(label != null) {
+ asm.append(label + ": ");
+ }
+ asm.append("." + type.asm + " ");
boolean first = true;
- for (String value : values) {
+ for(String value : values) {
if(!first)
asm.append(", ");
first = false;
diff --git a/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java b/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
index 5f7245c86..13c66f38a 100644
--- a/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
+++ b/src/main/java/dk/camelot64/kickc/fragment/AsmFragment.java
@@ -6,6 +6,7 @@ import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.parser.KickCBaseVisitor;
import dk.camelot64.kickc.parser.KickCParser;
+import java.util.ArrayList;
import java.util.Map;
/**
@@ -303,6 +304,16 @@ public class AsmFragment {
return null;
}
+ @Override
+ public Object visitAsmBytes(KickCParser.AsmBytesContext ctx) {
+ ArrayList values = new ArrayList<>();
+ for(int i = 1; i < ctx.getChildCount(); i=i+2) {
+ values.add(ctx.getChild(i).getText());
+ }
+ program.addLine(new AsmDataNumeric(null, AsmDataNumeric.Type.BYTE, values));
+ return null;
+ }
+
@Override
public Object visitAsmInstruction(KickCParser.AsmInstructionContext ctx) {
KickCParser.AsmParamModeContext paramModeCtx = ctx.asmParamMode();
diff --git a/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa_eq_pbuc1_derefidx_vbuxx_then_la1.asm b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa_eq_pbuc1_derefidx_vbuxx_then_la1.asm
new file mode 100644
index 000000000..0b3b979f3
--- /dev/null
+++ b/src/main/java/dk/camelot64/kickc/fragment/asm/vbuaa_eq_pbuc1_derefidx_vbuxx_then_la1.asm
@@ -0,0 +1,2 @@
+cmp {c1},x
+beq {la1}
\ No newline at end of file
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4
index c5b097a1f..b28f89362 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4
+++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4
@@ -107,6 +107,7 @@ asmLines
asmLine
: asmLabel
| asmInstruction
+ | asmBytes
;
asmLabel
@@ -118,6 +119,10 @@ asmInstruction
: MNEMONIC (asmParamMode)?
;
+asmBytes
+ : '.byte' asmExpr ( ',' asmExpr)*
+ ;
+
asmParamMode
: asmExpr #asmModeAbs
| '#' asmExpr #asmModeImm
@@ -142,7 +147,7 @@ MNEMONIC:
'brk' | 'ora' | 'kil' | 'slo' | 'nop' | 'asl' | 'php' | 'anc' | 'bpl' | 'clc' | 'jsr' | 'and' | 'rla' | 'bit' | 'rol' | 'pla' | 'plp' | 'bmi' | 'sec' |
'rti' | 'eor' | 'sre' | 'lsr' | 'pha' | 'alr' | 'jmp' | 'bvc' | 'cli' | 'rts' | 'adc' | 'rra' | 'bvs' | 'sei' | 'sax' | 'sty' | 'sta' | 'stx' | 'dey' |
'txa' | 'xaa' | 'bcc' | 'ahx' | 'tya' | 'txs' | 'tas' | 'shy' | 'shx' | 'ldy' | 'lda' | 'ldx' | 'lax' | 'tay' | 'tax' | 'bcs' | 'clv' | 'tsx' | 'las' |
- 'cpy' | 'cmp' | 'cpx' | 'dcp' | 'dec' | 'inc' | 'axs' | 'bne' | 'cld' | 'sbc' | 'isc' | 'inx' | 'beq' | 'sed' | 'dex' | 'iny'
+ 'cpy' | 'cmp' | 'cpx' | 'dcp' | 'dec' | 'inc' | 'axs' | 'bne' | 'cld' | 'sbc' | 'isc' | 'inx' | 'beq' | 'sed' | 'dex' | 'iny' | 'ror'
;
SIMPLETYPE: 'byte' | 'word' | 'boolean' | 'void' ;
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
index d142d4efa..64c972114 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
+++ b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
@@ -45,25 +45,26 @@ T__43=44
T__44=45
T__45=46
T__46=47
-MNEMONIC=48
-SIMPLETYPE=49
-STRING=50
-CHAR=51
-BOOLEAN=52
-NUMBER=53
-NUMFLOAT=54
-BINFLOAT=55
-DECFLOAT=56
-HEXFLOAT=57
-NUMINT=58
-BININTEGER=59
-DECINTEGER=60
-HEXINTEGER=61
-NAME=62
-ASMREL=63
-WS=64
-COMMENT_LINE=65
-COMMENT_BLOCK=66
+T__47=48
+MNEMONIC=49
+SIMPLETYPE=50
+STRING=51
+CHAR=52
+BOOLEAN=53
+NUMBER=54
+NUMFLOAT=55
+BINFLOAT=56
+DECFLOAT=57
+HEXFLOAT=58
+NUMINT=59
+BININTEGER=60
+DECINTEGER=61
+HEXINTEGER=62
+NAME=63
+ASMREL=64
+WS=65
+COMMENT_LINE=66
+COMMENT_BLOCK=67
'import'=1
'('=2
')'=3
@@ -110,4 +111,5 @@ COMMENT_BLOCK=66
'|'=44
'&&'=45
'||'=46
-'#'=47
+'.byte'=47
+'#'=48
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
index c7add4b5f..5c8823130 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
@@ -587,6 +587,18 @@ public class KickCBaseListener implements KickCListener {
* The default implementation does nothing.
*/
@Override public void exitAsmInstruction(KickCParser.AsmInstructionContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterAsmBytes(KickCParser.AsmBytesContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitAsmBytes(KickCParser.AsmBytesContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
index 93ee98f12..2d1e971e0 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
@@ -347,6 +347,13 @@ public class KickCBaseVisitor extends AbstractParseTreeVisitor implements
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitAsmInstruction(KickCParser.AsmInstructionContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitAsmBytes(KickCParser.AsmBytesContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
index 824404d54..ebb64f500 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
@@ -23,10 +23,10 @@ public class KickCLexer extends Lexer {
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
- T__45=46, T__46=47, MNEMONIC=48, SIMPLETYPE=49, STRING=50, CHAR=51, BOOLEAN=52,
- NUMBER=53, NUMFLOAT=54, BINFLOAT=55, DECFLOAT=56, HEXFLOAT=57, NUMINT=58,
- BININTEGER=59, DECINTEGER=60, HEXINTEGER=61, NAME=62, ASMREL=63, WS=64,
- COMMENT_LINE=65, COMMENT_BLOCK=66;
+ T__45=46, T__46=47, T__47=48, MNEMONIC=49, SIMPLETYPE=50, STRING=51, CHAR=52,
+ BOOLEAN=53, NUMBER=54, NUMFLOAT=55, BINFLOAT=56, DECFLOAT=57, HEXFLOAT=58,
+ NUMINT=59, BININTEGER=60, DECINTEGER=61, HEXINTEGER=62, NAME=63, ASMREL=64,
+ WS=65, COMMENT_LINE=66, COMMENT_BLOCK=67;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -41,11 +41,11 @@ public class KickCLexer extends Lexer {
"T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24",
"T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32",
"T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40",
- "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "MNEMONIC", "SIMPLETYPE",
- "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT",
- "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT",
- "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR", "ASMREL", "WS",
- "COMMENT_LINE", "COMMENT_BLOCK"
+ "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "MNEMONIC",
+ "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT",
+ "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER",
+ "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR",
+ "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
private static final String[] _LITERAL_NAMES = {
@@ -54,16 +54,16 @@ public class KickCLexer extends Lexer {
"':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'",
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<>'", "'<='", "'=<'", "'>='", "'=>'", "'^'", "'|'",
- "'&&'", "'||'", "'#'"
+ "'&&'", "'||'", "'.byte'", "'#'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
- "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
- "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
+ null, "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER",
+ "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
+ "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@@ -123,7 +123,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2D\u02c5\b\1\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2E\u02d0\b\1\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"+
@@ -131,264 +131,268 @@ public class KickCLexer extends Lexer {
"\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
- "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\3\2"+
- "\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3"+
- "\b\3\b\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f"+
- "\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\20\3\20"+
- "\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3\23\3\23"+
- "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3\27\3\30"+
- "\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\36"+
- "\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3&\3"+
- "&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3.\3"+
- ".\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3"+
- "\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\3\61\5"+
- "\61\u01f9\n\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
- "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u020e\n\62\3\63\3\63\3\63"+
- "\3\63\7\63\u0214\n\63\f\63\16\63\u0217\13\63\3\63\3\63\3\64\3\64\3\64"+
- "\3\64\5\64\u021f\n\64\3\64\3\64\3\65\3\65\3\65\3\65\3\65\3\65\3\65\3\65"+
- "\3\65\5\65\u022c\n\65\3\66\3\66\5\66\u0230\n\66\3\67\3\67\3\67\5\67\u0235"+
- "\n\67\38\38\38\38\38\58\u023c\n8\38\78\u023f\n8\f8\168\u0242\138\38\3"+
- "8\68\u0246\n8\r8\168\u0247\39\79\u024b\n9\f9\169\u024e\139\39\39\69\u0252"+
- "\n9\r9\169\u0253\3:\3:\3:\3:\3:\5:\u025b\n:\3:\7:\u025e\n:\f:\16:\u0261"+
- "\13:\3:\3:\6:\u0265\n:\r:\16:\u0266\3;\3;\3;\5;\u026c\n;\3<\3<\3<\6<\u0271"+
- "\n<\r<\16<\u0272\3<\3<\6<\u0277\n<\r<\16<\u0278\5<\u027b\n<\3=\6=\u027e"+
- "\n=\r=\16=\u027f\3>\3>\3>\3>\3>\5>\u0287\n>\3>\6>\u028a\n>\r>\16>\u028b"+
- "\3?\3?\3@\3@\3A\3A\3B\3B\7B\u0296\nB\fB\16B\u0299\13B\3C\3C\3D\3D\3E\3"+
- "E\7E\u02a1\nE\fE\16E\u02a4\13E\3F\6F\u02a7\nF\rF\16F\u02a8\3F\3F\3G\3"+
- "G\3G\3G\7G\u02b1\nG\fG\16G\u02b4\13G\3G\3G\3H\3H\3H\3H\7H\u02bc\nH\fH"+
- "\16H\u02bf\13H\3H\3H\3H\3H\3H\3\u02bd\2I\3\3\5\4\7\5\t\6\13\7\r\b\17\t"+
- "\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27"+
- "-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W"+
- "-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}\2\177\2\u0081\2"+
- "\u0083@\u0085\2\u0087\2\u0089A\u008bB\u008dC\u008fD\3\2\r\3\2$$\3\2))"+
- "\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2-"+
- "-//\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2\u0329\2\3\3\2\2\2\2\5\3\2\2\2\2"+
- "\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+
- "\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+
- "\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+
- "\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+
- "\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+
- "\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+
- "M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+
- "\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+
- "\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+
- "s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2\u0083\3\2\2\2"+
- "\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\3\u0091"+
- "\3\2\2\2\5\u0098\3\2\2\2\7\u009a\3\2\2\2\t\u009c\3\2\2\2\13\u009e\3\2"+
- "\2\2\r\u00a0\3\2\2\2\17\u00a2\3\2\2\2\21\u00a8\3\2\2\2\23\u00aa\3\2\2"+
- "\2\25\u00ac\3\2\2\2\27\u00af\3\2\2\2\31\u00b4\3\2\2\2\33\u00ba\3\2\2\2"+
- "\35\u00bd\3\2\2\2\37\u00c1\3\2\2\2!\u00c8\3\2\2\2#\u00cc\3\2\2\2%\u00ce"+
- "\3\2\2\2\'\u00d1\3\2\2\2)\u00d8\3\2\2\2+\u00da\3\2\2\2-\u00dc\3\2\2\2"+
- "/\u00de\3\2\2\2\61\u00e1\3\2\2\2\63\u00e4\3\2\2\2\65\u00e6\3\2\2\2\67"+
- "\u00e8\3\2\2\29\u00ea\3\2\2\2;\u00ec\3\2\2\2=\u00ee\3\2\2\2?\u00f1\3\2"+
- "\2\2A\u00f4\3\2\2\2C\u00f6\3\2\2\2E\u00f8\3\2\2\2G\u00fa\3\2\2\2I\u00fc"+
- "\3\2\2\2K\u00ff\3\2\2\2M\u0102\3\2\2\2O\u0105\3\2\2\2Q\u0108\3\2\2\2S"+
- "\u010b\3\2\2\2U\u010e\3\2\2\2W\u0111\3\2\2\2Y\u0113\3\2\2\2[\u0115\3\2"+
- "\2\2]\u0118\3\2\2\2_\u011b\3\2\2\2a\u01f8\3\2\2\2c\u020d\3\2\2\2e\u020f"+
- "\3\2\2\2g\u021a\3\2\2\2i\u022b\3\2\2\2k\u022f\3\2\2\2m\u0234\3\2\2\2o"+
- "\u023b\3\2\2\2q\u024c\3\2\2\2s\u025a\3\2\2\2u\u026b\3\2\2\2w\u027a\3\2"+
- "\2\2y\u027d\3\2\2\2{\u0286\3\2\2\2}\u028d\3\2\2\2\177\u028f\3\2\2\2\u0081"+
- "\u0291\3\2\2\2\u0083\u0293\3\2\2\2\u0085\u029a\3\2\2\2\u0087\u029c\3\2"+
- "\2\2\u0089\u029e\3\2\2\2\u008b\u02a6\3\2\2\2\u008d\u02ac\3\2\2\2\u008f"+
- "\u02b7\3\2\2\2\u0091\u0092\7k\2\2\u0092\u0093\7o\2\2\u0093\u0094\7r\2"+
- "\2\u0094\u0095\7q\2\2\u0095\u0096\7t\2\2\u0096\u0097\7v\2\2\u0097\4\3"+
- "\2\2\2\u0098\u0099\7*\2\2\u0099\6\3\2\2\2\u009a\u009b\7+\2\2\u009b\b\3"+
- "\2\2\2\u009c\u009d\7}\2\2\u009d\n\3\2\2\2\u009e\u009f\7\177\2\2\u009f"+
- "\f\3\2\2\2\u00a0\u00a1\7.\2\2\u00a1\16\3\2\2\2\u00a2\u00a3\7e\2\2\u00a3"+
- "\u00a4\7q\2\2\u00a4\u00a5\7p\2\2\u00a5\u00a6\7u\2\2\u00a6\u00a7\7v\2\2"+
- "\u00a7\20\3\2\2\2\u00a8\u00a9\7?\2\2\u00a9\22\3\2\2\2\u00aa\u00ab\7=\2"+
- "\2\u00ab\24\3\2\2\2\u00ac\u00ad\7k\2\2\u00ad\u00ae\7h\2\2\u00ae\26\3\2"+
- "\2\2\u00af\u00b0\7g\2\2\u00b0\u00b1\7n\2\2\u00b1\u00b2\7u\2\2\u00b2\u00b3"+
- "\7g\2\2\u00b3\30\3\2\2\2\u00b4\u00b5\7y\2\2\u00b5\u00b6\7j\2\2\u00b6\u00b7"+
- "\7k\2\2\u00b7\u00b8\7n\2\2\u00b8\u00b9\7g\2\2\u00b9\32\3\2\2\2\u00ba\u00bb"+
- "\7f\2\2\u00bb\u00bc\7q\2\2\u00bc\34\3\2\2\2\u00bd\u00be\7h\2\2\u00be\u00bf"+
- "\7q\2\2\u00bf\u00c0\7t\2\2\u00c0\36\3\2\2\2\u00c1\u00c2\7t\2\2\u00c2\u00c3"+
- "\7g\2\2\u00c3\u00c4\7v\2\2\u00c4\u00c5\7w\2\2\u00c5\u00c6\7t\2\2\u00c6"+
- "\u00c7\7p\2\2\u00c7 \3\2\2\2\u00c8\u00c9\7c\2\2\u00c9\u00ca\7u\2\2\u00ca"+
- "\u00cb\7o\2\2\u00cb\"\3\2\2\2\u00cc\u00cd\7<\2\2\u00cd$\3\2\2\2\u00ce"+
- "\u00cf\7\60\2\2\u00cf\u00d0\7\60\2\2\u00d0&\3\2\2\2\u00d1\u00d2\7u\2\2"+
- "\u00d2\u00d3\7k\2\2\u00d3\u00d4\7i\2\2\u00d4\u00d5\7p\2\2\u00d5\u00d6"+
- "\7g\2\2\u00d6\u00d7\7f\2\2\u00d7(\3\2\2\2\u00d8\u00d9\7,\2\2\u00d9*\3"+
- "\2\2\2\u00da\u00db\7]\2\2\u00db,\3\2\2\2\u00dc\u00dd\7_\2\2\u00dd.\3\2"+
- "\2\2\u00de\u00df\7/\2\2\u00df\u00e0\7/\2\2\u00e0\60\3\2\2\2\u00e1\u00e2"+
- "\7-\2\2\u00e2\u00e3\7-\2\2\u00e3\62\3\2\2\2\u00e4\u00e5\7-\2\2\u00e5\64"+
- "\3\2\2\2\u00e6\u00e7\7/\2\2\u00e7\66\3\2\2\2\u00e8\u00e9\7#\2\2\u00e9"+
- "8\3\2\2\2\u00ea\u00eb\7(\2\2\u00eb:\3\2\2\2\u00ec\u00ed\7\u0080\2\2\u00ed"+
- "<\3\2\2\2\u00ee\u00ef\7@\2\2\u00ef\u00f0\7@\2\2\u00f0>\3\2\2\2\u00f1\u00f2"+
- "\7>\2\2\u00f2\u00f3\7>\2\2\u00f3@\3\2\2\2\u00f4\u00f5\7\61\2\2\u00f5B"+
- "\3\2\2\2\u00f6\u00f7\7\'\2\2\u00f7D\3\2\2\2\u00f8\u00f9\7>\2\2\u00f9F"+
- "\3\2\2\2\u00fa\u00fb\7@\2\2\u00fbH\3\2\2\2\u00fc\u00fd\7?\2\2\u00fd\u00fe"+
- "\7?\2\2\u00feJ\3\2\2\2\u00ff\u0100\7#\2\2\u0100\u0101\7?\2\2\u0101L\3"+
- "\2\2\2\u0102\u0103\7>\2\2\u0103\u0104\7@\2\2\u0104N\3\2\2\2\u0105\u0106"+
- "\7>\2\2\u0106\u0107\7?\2\2\u0107P\3\2\2\2\u0108\u0109\7?\2\2\u0109\u010a"+
- "\7>\2\2\u010aR\3\2\2\2\u010b\u010c\7@\2\2\u010c\u010d\7?\2\2\u010dT\3"+
- "\2\2\2\u010e\u010f\7?\2\2\u010f\u0110\7@\2\2\u0110V\3\2\2\2\u0111\u0112"+
- "\7`\2\2\u0112X\3\2\2\2\u0113\u0114\7~\2\2\u0114Z\3\2\2\2\u0115\u0116\7"+
- "(\2\2\u0116\u0117\7(\2\2\u0117\\\3\2\2\2\u0118\u0119\7~\2\2\u0119\u011a"+
- "\7~\2\2\u011a^\3\2\2\2\u011b\u011c\7%\2\2\u011c`\3\2\2\2\u011d\u011e\7"+
- "d\2\2\u011e\u011f\7t\2\2\u011f\u01f9\7m\2\2\u0120\u0121\7q\2\2\u0121\u0122"+
- "\7t\2\2\u0122\u01f9\7c\2\2\u0123\u0124\7m\2\2\u0124\u0125\7k\2\2\u0125"+
- "\u01f9\7n\2\2\u0126\u0127\7u\2\2\u0127\u0128\7n\2\2\u0128\u01f9\7q\2\2"+
- "\u0129\u012a\7p\2\2\u012a\u012b\7q\2\2\u012b\u01f9\7r\2\2\u012c\u012d"+
- "\7c\2\2\u012d\u012e\7u\2\2\u012e\u01f9\7n\2\2\u012f\u0130\7r\2\2\u0130"+
- "\u0131\7j\2\2\u0131\u01f9\7r\2\2\u0132\u0133\7c\2\2\u0133\u0134\7p\2\2"+
- "\u0134\u01f9\7e\2\2\u0135\u0136\7d\2\2\u0136\u0137\7r\2\2\u0137\u01f9"+
- "\7n\2\2\u0138\u0139\7e\2\2\u0139\u013a\7n\2\2\u013a\u01f9\7e\2\2\u013b"+
- "\u013c\7l\2\2\u013c\u013d\7u\2\2\u013d\u01f9\7t\2\2\u013e\u013f\7c\2\2"+
- "\u013f\u0140\7p\2\2\u0140\u01f9\7f\2\2\u0141\u0142\7t\2\2\u0142\u0143"+
- "\7n\2\2\u0143\u01f9\7c\2\2\u0144\u0145\7d\2\2\u0145\u0146\7k\2\2\u0146"+
- "\u01f9\7v\2\2\u0147\u0148\7t\2\2\u0148\u0149\7q\2\2\u0149\u01f9\7n\2\2"+
- "\u014a\u014b\7r\2\2\u014b\u014c\7n\2\2\u014c\u01f9\7c\2\2\u014d\u014e"+
- "\7r\2\2\u014e\u014f\7n\2\2\u014f\u01f9\7r\2\2\u0150\u0151\7d\2\2\u0151"+
- "\u0152\7o\2\2\u0152\u01f9\7k\2\2\u0153\u0154\7u\2\2\u0154\u0155\7g\2\2"+
- "\u0155\u01f9\7e\2\2\u0156\u0157\7t\2\2\u0157\u0158\7v\2\2\u0158\u01f9"+
- "\7k\2\2\u0159\u015a\7g\2\2\u015a\u015b\7q\2\2\u015b\u01f9\7t\2\2\u015c"+
- "\u015d\7u\2\2\u015d\u015e\7t\2\2\u015e\u01f9\7g\2\2\u015f\u0160\7n\2\2"+
- "\u0160\u0161\7u\2\2\u0161\u01f9\7t\2\2\u0162\u0163\7r\2\2\u0163\u0164"+
- "\7j\2\2\u0164\u01f9\7c\2\2\u0165\u0166\7c\2\2\u0166\u0167\7n\2\2\u0167"+
- "\u01f9\7t\2\2\u0168\u0169\7l\2\2\u0169\u016a\7o\2\2\u016a\u01f9\7r\2\2"+
- "\u016b\u016c\7d\2\2\u016c\u016d\7x\2\2\u016d\u01f9\7e\2\2\u016e\u016f"+
- "\7e\2\2\u016f\u0170\7n\2\2\u0170\u01f9\7k\2\2\u0171\u0172\7t\2\2\u0172"+
- "\u0173\7v\2\2\u0173\u01f9\7u\2\2\u0174\u0175\7c\2\2\u0175\u0176\7f\2\2"+
- "\u0176\u01f9\7e\2\2\u0177\u0178\7t\2\2\u0178\u0179\7t\2\2\u0179\u01f9"+
- "\7c\2\2\u017a\u017b\7d\2\2\u017b\u017c\7x\2\2\u017c\u01f9\7u\2\2\u017d"+
- "\u017e\7u\2\2\u017e\u017f\7g\2\2\u017f\u01f9\7k\2\2\u0180\u0181\7u\2\2"+
- "\u0181\u0182\7c\2\2\u0182\u01f9\7z\2\2\u0183\u0184\7u\2\2\u0184\u0185"+
- "\7v\2\2\u0185\u01f9\7{\2\2\u0186\u0187\7u\2\2\u0187\u0188\7v\2\2\u0188"+
- "\u01f9\7c\2\2\u0189\u018a\7u\2\2\u018a\u018b\7v\2\2\u018b\u01f9\7z\2\2"+
- "\u018c\u018d\7f\2\2\u018d\u018e\7g\2\2\u018e\u01f9\7{\2\2\u018f\u0190"+
- "\7v\2\2\u0190\u0191\7z\2\2\u0191\u01f9\7c\2\2\u0192\u0193\7z\2\2\u0193"+
- "\u0194\7c\2\2\u0194\u01f9\7c\2\2\u0195\u0196\7d\2\2\u0196\u0197\7e\2\2"+
- "\u0197\u01f9\7e\2\2\u0198\u0199\7c\2\2\u0199\u019a\7j\2\2\u019a\u01f9"+
- "\7z\2\2\u019b\u019c\7v\2\2\u019c\u019d\7{\2\2\u019d\u01f9\7c\2\2\u019e"+
- "\u019f\7v\2\2\u019f\u01a0\7z\2\2\u01a0\u01f9\7u\2\2\u01a1\u01a2\7v\2\2"+
- "\u01a2\u01a3\7c\2\2\u01a3\u01f9\7u\2\2\u01a4\u01a5\7u\2\2\u01a5\u01a6"+
- "\7j\2\2\u01a6\u01f9\7{\2\2\u01a7\u01a8\7u\2\2\u01a8\u01a9\7j\2\2\u01a9"+
- "\u01f9\7z\2\2\u01aa\u01ab\7n\2\2\u01ab\u01ac\7f\2\2\u01ac\u01f9\7{\2\2"+
- "\u01ad\u01ae\7n\2\2\u01ae\u01af\7f\2\2\u01af\u01f9\7c\2\2\u01b0\u01b1"+
- "\7n\2\2\u01b1\u01b2\7f\2\2\u01b2\u01f9\7z\2\2\u01b3\u01b4\7n\2\2\u01b4"+
- "\u01b5\7c\2\2\u01b5\u01f9\7z\2\2\u01b6\u01b7\7v\2\2\u01b7\u01b8\7c\2\2"+
- "\u01b8\u01f9\7{\2\2\u01b9\u01ba\7v\2\2\u01ba\u01bb\7c\2\2\u01bb\u01f9"+
- "\7z\2\2\u01bc\u01bd\7d\2\2\u01bd\u01be\7e\2\2\u01be\u01f9\7u\2\2\u01bf"+
- "\u01c0\7e\2\2\u01c0\u01c1\7n\2\2\u01c1\u01f9\7x\2\2\u01c2\u01c3\7v\2\2"+
- "\u01c3\u01c4\7u\2\2\u01c4\u01f9\7z\2\2\u01c5\u01c6\7n\2\2\u01c6\u01c7"+
- "\7c\2\2\u01c7\u01f9\7u\2\2\u01c8\u01c9\7e\2\2\u01c9\u01ca\7r\2\2\u01ca"+
- "\u01f9\7{\2\2\u01cb\u01cc\7e\2\2\u01cc\u01cd\7o\2\2\u01cd\u01f9\7r\2\2"+
- "\u01ce\u01cf\7e\2\2\u01cf\u01d0\7r\2\2\u01d0\u01f9\7z\2\2\u01d1\u01d2"+
- "\7f\2\2\u01d2\u01d3\7e\2\2\u01d3\u01f9\7r\2\2\u01d4\u01d5\7f\2\2\u01d5"+
- "\u01d6\7g\2\2\u01d6\u01f9\7e\2\2\u01d7\u01d8\7k\2\2\u01d8\u01d9\7p\2\2"+
- "\u01d9\u01f9\7e\2\2\u01da\u01db\7c\2\2\u01db\u01dc\7z\2\2\u01dc\u01f9"+
- "\7u\2\2\u01dd\u01de\7d\2\2\u01de\u01df\7p\2\2\u01df\u01f9\7g\2\2\u01e0"+
- "\u01e1\7e\2\2\u01e1\u01e2\7n\2\2\u01e2\u01f9\7f\2\2\u01e3\u01e4\7u\2\2"+
- "\u01e4\u01e5\7d\2\2\u01e5\u01f9\7e\2\2\u01e6\u01e7\7k\2\2\u01e7\u01e8"+
- "\7u\2\2\u01e8\u01f9\7e\2\2\u01e9\u01ea\7k\2\2\u01ea\u01eb\7p\2\2\u01eb"+
- "\u01f9\7z\2\2\u01ec\u01ed\7d\2\2\u01ed\u01ee\7g\2\2\u01ee\u01f9\7s\2\2"+
- "\u01ef\u01f0\7u\2\2\u01f0\u01f1\7g\2\2\u01f1\u01f9\7f\2\2\u01f2\u01f3"+
- "\7f\2\2\u01f3\u01f4\7g\2\2\u01f4\u01f9\7z\2\2\u01f5\u01f6\7k\2\2\u01f6"+
- "\u01f7\7p\2\2\u01f7\u01f9\7{\2\2\u01f8\u011d\3\2\2\2\u01f8\u0120\3\2\2"+
- "\2\u01f8\u0123\3\2\2\2\u01f8\u0126\3\2\2\2\u01f8\u0129\3\2\2\2\u01f8\u012c"+
- "\3\2\2\2\u01f8\u012f\3\2\2\2\u01f8\u0132\3\2\2\2\u01f8\u0135\3\2\2\2\u01f8"+
- "\u0138\3\2\2\2\u01f8\u013b\3\2\2\2\u01f8\u013e\3\2\2\2\u01f8\u0141\3\2"+
- "\2\2\u01f8\u0144\3\2\2\2\u01f8\u0147\3\2\2\2\u01f8\u014a\3\2\2\2\u01f8"+
- "\u014d\3\2\2\2\u01f8\u0150\3\2\2\2\u01f8\u0153\3\2\2\2\u01f8\u0156\3\2"+
- "\2\2\u01f8\u0159\3\2\2\2\u01f8\u015c\3\2\2\2\u01f8\u015f\3\2\2\2\u01f8"+
- "\u0162\3\2\2\2\u01f8\u0165\3\2\2\2\u01f8\u0168\3\2\2\2\u01f8\u016b\3\2"+
- "\2\2\u01f8\u016e\3\2\2\2\u01f8\u0171\3\2\2\2\u01f8\u0174\3\2\2\2\u01f8"+
- "\u0177\3\2\2\2\u01f8\u017a\3\2\2\2\u01f8\u017d\3\2\2\2\u01f8\u0180\3\2"+
- "\2\2\u01f8\u0183\3\2\2\2\u01f8\u0186\3\2\2\2\u01f8\u0189\3\2\2\2\u01f8"+
- "\u018c\3\2\2\2\u01f8\u018f\3\2\2\2\u01f8\u0192\3\2\2\2\u01f8\u0195\3\2"+
- "\2\2\u01f8\u0198\3\2\2\2\u01f8\u019b\3\2\2\2\u01f8\u019e\3\2\2\2\u01f8"+
- "\u01a1\3\2\2\2\u01f8\u01a4\3\2\2\2\u01f8\u01a7\3\2\2\2\u01f8\u01aa\3\2"+
- "\2\2\u01f8\u01ad\3\2\2\2\u01f8\u01b0\3\2\2\2\u01f8\u01b3\3\2\2\2\u01f8"+
- "\u01b6\3\2\2\2\u01f8\u01b9\3\2\2\2\u01f8\u01bc\3\2\2\2\u01f8\u01bf\3\2"+
- "\2\2\u01f8\u01c2\3\2\2\2\u01f8\u01c5\3\2\2\2\u01f8\u01c8\3\2\2\2\u01f8"+
- "\u01cb\3\2\2\2\u01f8\u01ce\3\2\2\2\u01f8\u01d1\3\2\2\2\u01f8\u01d4\3\2"+
- "\2\2\u01f8\u01d7\3\2\2\2\u01f8\u01da\3\2\2\2\u01f8\u01dd\3\2\2\2\u01f8"+
- "\u01e0\3\2\2\2\u01f8\u01e3\3\2\2\2\u01f8\u01e6\3\2\2\2\u01f8\u01e9\3\2"+
- "\2\2\u01f8\u01ec\3\2\2\2\u01f8\u01ef\3\2\2\2\u01f8\u01f2\3\2\2\2\u01f8"+
- "\u01f5\3\2\2\2\u01f9b\3\2\2\2\u01fa\u01fb\7d\2\2\u01fb\u01fc\7{\2\2\u01fc"+
- "\u01fd\7v\2\2\u01fd\u020e\7g\2\2\u01fe\u01ff\7y\2\2\u01ff\u0200\7q\2\2"+
- "\u0200\u0201\7t\2\2\u0201\u020e\7f\2\2\u0202\u0203\7d\2\2\u0203\u0204"+
- "\7q\2\2\u0204\u0205\7q\2\2\u0205\u0206\7n\2\2\u0206\u0207\7g\2\2\u0207"+
- "\u0208\7c\2\2\u0208\u020e\7p\2\2\u0209\u020a\7x\2\2\u020a\u020b\7q\2\2"+
- "\u020b\u020c\7k\2\2\u020c\u020e\7f\2\2\u020d\u01fa\3\2\2\2\u020d\u01fe"+
- "\3\2\2\2\u020d\u0202\3\2\2\2\u020d\u0209\3\2\2\2\u020ed\3\2\2\2\u020f"+
- "\u0215\7$\2\2\u0210\u0211\7^\2\2\u0211\u0214\7$\2\2\u0212\u0214\n\2\2"+
- "\2\u0213\u0210\3\2\2\2\u0213\u0212\3\2\2\2\u0214\u0217\3\2\2\2\u0215\u0213"+
- "\3\2\2\2\u0215\u0216\3\2\2\2\u0216\u0218\3\2\2\2\u0217\u0215\3\2\2\2\u0218"+
- "\u0219\7$\2\2\u0219f\3\2\2\2\u021a\u021e\7)\2\2\u021b\u021c\7^\2\2\u021c"+
- "\u021f\7)\2\2\u021d\u021f\n\3\2\2\u021e\u021b\3\2\2\2\u021e\u021d\3\2"+
- "\2\2\u021f\u0220\3\2\2\2\u0220\u0221\7)\2\2\u0221h\3\2\2\2\u0222\u0223"+
- "\7v\2\2\u0223\u0224\7t\2\2\u0224\u0225\7w\2\2\u0225\u022c\7g\2\2\u0226"+
- "\u0227\7h\2\2\u0227\u0228\7c\2\2\u0228\u0229\7n\2\2\u0229\u022a\7u\2\2"+
- "\u022a\u022c\7g\2\2\u022b\u0222\3\2\2\2\u022b\u0226\3\2\2\2\u022cj\3\2"+
- "\2\2\u022d\u0230\5m\67\2\u022e\u0230\5u;\2\u022f\u022d\3\2\2\2\u022f\u022e"+
- "\3\2\2\2\u0230l\3\2\2\2\u0231\u0235\5o8\2\u0232\u0235\5q9\2\u0233\u0235"+
- "\5s:\2\u0234\u0231\3\2\2\2\u0234\u0232\3\2\2\2\u0234\u0233\3\2\2\2\u0235"+
- "n\3\2\2\2\u0236\u023c\7\'\2\2\u0237\u0238\7\62\2\2\u0238\u023c\7d\2\2"+
- "\u0239\u023a\7\62\2\2\u023a\u023c\7D\2\2\u023b\u0236\3\2\2\2\u023b\u0237"+
- "\3\2\2\2\u023b\u0239\3\2\2\2\u023c\u0240\3\2\2\2\u023d\u023f\5}?\2\u023e"+
- "\u023d\3\2\2\2\u023f\u0242\3\2\2\2\u0240\u023e\3\2\2\2\u0240\u0241\3\2"+
- "\2\2\u0241\u0243\3\2\2\2\u0242\u0240\3\2\2\2\u0243\u0245\7\60\2\2\u0244"+
- "\u0246\5}?\2\u0245\u0244\3\2\2\2\u0246\u0247\3\2\2\2\u0247\u0245\3\2\2"+
- "\2\u0247\u0248\3\2\2\2\u0248p\3\2\2\2\u0249\u024b\5\177@\2\u024a\u0249"+
- "\3\2\2\2\u024b\u024e\3\2\2\2\u024c\u024a\3\2\2\2\u024c\u024d\3\2\2\2\u024d"+
- "\u024f\3\2\2\2\u024e\u024c\3\2\2\2\u024f\u0251\7\60\2\2\u0250\u0252\5"+
- "\177@\2\u0251\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0251\3\2\2\2\u0253"+
- "\u0254\3\2\2\2\u0254r\3\2\2\2\u0255\u025b\7&\2\2\u0256\u0257\7\62\2\2"+
- "\u0257\u025b\7z\2\2\u0258\u0259\7\62\2\2\u0259\u025b\7Z\2\2\u025a\u0255"+
- "\3\2\2\2\u025a\u0256\3\2\2\2\u025a\u0258\3\2\2\2\u025b\u025f\3\2\2\2\u025c"+
- "\u025e\5\u0081A\2\u025d\u025c\3\2\2\2\u025e\u0261\3\2\2\2\u025f\u025d"+
- "\3\2\2\2\u025f\u0260\3\2\2\2\u0260\u0262\3\2\2\2\u0261\u025f\3\2\2\2\u0262"+
- "\u0264\7\60\2\2\u0263\u0265\5\u0081A\2\u0264\u0263\3\2\2\2\u0265\u0266"+
- "\3\2\2\2\u0266\u0264\3\2\2\2\u0266\u0267\3\2\2\2\u0267t\3\2\2\2\u0268"+
- "\u026c\5y=\2\u0269\u026c\5{>\2\u026a\u026c\5w<\2\u026b\u0268\3\2\2\2\u026b"+
- "\u0269\3\2\2\2\u026b\u026a\3\2\2\2\u026cv\3\2\2\2\u026d\u026e\7\62\2\2"+
- "\u026e\u0270\t\4\2\2\u026f\u0271\5}?\2\u0270\u026f\3\2\2\2\u0271\u0272"+
- "\3\2\2\2\u0272\u0270\3\2\2\2\u0272\u0273\3\2\2\2\u0273\u027b\3\2\2\2\u0274"+
- "\u0276\7\'\2\2\u0275\u0277\5}?\2\u0276\u0275\3\2\2\2\u0277\u0278\3\2\2"+
- "\2\u0278\u0276\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u027b\3\2\2\2\u027a\u026d"+
- "\3\2\2\2\u027a\u0274\3\2\2\2\u027bx\3\2\2\2\u027c\u027e\5\177@\2\u027d"+
- "\u027c\3\2\2\2\u027e\u027f\3\2\2\2\u027f\u027d\3\2\2\2\u027f\u0280\3\2"+
- "\2\2\u0280z\3\2\2\2\u0281\u0287\7&\2\2\u0282\u0283\7\62\2\2\u0283\u0287"+
- "\7z\2\2\u0284\u0285\7\62\2\2\u0285\u0287\7Z\2\2\u0286\u0281\3\2\2\2\u0286"+
- "\u0282\3\2\2\2\u0286\u0284\3\2\2\2\u0287\u0289\3\2\2\2\u0288\u028a\5\u0081"+
- "A\2\u0289\u0288\3\2\2\2\u028a\u028b\3\2\2\2\u028b\u0289\3\2\2\2\u028b"+
- "\u028c\3\2\2\2\u028c|\3\2\2\2\u028d\u028e\t\5\2\2\u028e~\3\2\2\2\u028f"+
- "\u0290\t\6\2\2\u0290\u0080\3\2\2\2\u0291\u0292\t\7\2\2\u0292\u0082\3\2"+
- "\2\2\u0293\u0297\5\u0085C\2\u0294\u0296\5\u0087D\2\u0295\u0294\3\2\2\2"+
- "\u0296\u0299\3\2\2\2\u0297\u0295\3\2\2\2\u0297\u0298\3\2\2\2\u0298\u0084"+
- "\3\2\2\2\u0299\u0297\3\2\2\2\u029a\u029b\t\b\2\2\u029b\u0086\3\2\2\2\u029c"+
- "\u029d\t\t\2\2\u029d\u0088\3\2\2\2\u029e\u02a2\7#\2\2\u029f\u02a1\t\n"+
- "\2\2\u02a0\u029f\3\2\2\2\u02a1\u02a4\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a2"+
- "\u02a3\3\2\2\2\u02a3\u008a\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a5\u02a7\t\13"+
- "\2\2\u02a6\u02a5\3\2\2\2\u02a7\u02a8\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8"+
- "\u02a9\3\2\2\2\u02a9\u02aa\3\2\2\2\u02aa\u02ab\bF\2\2\u02ab\u008c\3\2"+
- "\2\2\u02ac\u02ad\7\61\2\2\u02ad\u02ae\7\61\2\2\u02ae\u02b2\3\2\2\2\u02af"+
- "\u02b1\n\f\2\2\u02b0\u02af\3\2\2\2\u02b1\u02b4\3\2\2\2\u02b2\u02b0\3\2"+
- "\2\2\u02b2\u02b3\3\2\2\2\u02b3\u02b5\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b5"+
- "\u02b6\bG\2\2\u02b6\u008e\3\2\2\2\u02b7\u02b8\7\61\2\2\u02b8\u02b9\7,"+
- "\2\2\u02b9\u02bd\3\2\2\2\u02ba\u02bc\13\2\2\2\u02bb\u02ba\3\2\2\2\u02bc"+
- "\u02bf\3\2\2\2\u02bd\u02be\3\2\2\2\u02bd\u02bb\3\2\2\2\u02be\u02c0\3\2"+
- "\2\2\u02bf\u02bd\3\2\2\2\u02c0\u02c1\7,\2\2\u02c1\u02c2\7\61\2\2\u02c2"+
- "\u02c3\3\2\2\2\u02c3\u02c4\bH\2\2\u02c4\u0090\3\2\2\2\37\2\u01f8\u020d"+
- "\u0213\u0215\u021e\u022b\u022f\u0234\u023b\u0240\u0247\u024c\u0253\u025a"+
- "\u025f\u0266\u026b\u0272\u0278\u027a\u027f\u0286\u028b\u0297\u02a2\u02a8"+
- "\u02b2\u02bd\3\b\2\2";
+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
+ "\tI\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3"+
+ "\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\f\3\f\3\f"+
+ "\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3"+
+ "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\23\3"+
+ "\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\26\3\26\3\27\3"+
+ "\27\3\30\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3"+
+ "\35\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%"+
+ "\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-"+
+ "\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\60\3\60\3\60\3\61\3\61\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62"+
+ "\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\62\5\62\u0204\n\62\3\63"+
+ "\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63\3\63"+
+ "\3\63\3\63\3\63\3\63\5\63\u0219\n\63\3\64\3\64\3\64\3\64\7\64\u021f\n"+
+ "\64\f\64\16\64\u0222\13\64\3\64\3\64\3\65\3\65\3\65\3\65\5\65\u022a\n"+
+ "\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\5\66\u0237"+
+ "\n\66\3\67\3\67\5\67\u023b\n\67\38\38\38\58\u0240\n8\39\39\39\39\39\5"+
+ "9\u0247\n9\39\79\u024a\n9\f9\169\u024d\139\39\39\69\u0251\n9\r9\169\u0252"+
+ "\3:\7:\u0256\n:\f:\16:\u0259\13:\3:\3:\6:\u025d\n:\r:\16:\u025e\3;\3;"+
+ "\3;\3;\3;\5;\u0266\n;\3;\7;\u0269\n;\f;\16;\u026c\13;\3;\3;\6;\u0270\n"+
+ ";\r;\16;\u0271\3<\3<\3<\5<\u0277\n<\3=\3=\3=\6=\u027c\n=\r=\16=\u027d"+
+ "\3=\3=\6=\u0282\n=\r=\16=\u0283\5=\u0286\n=\3>\6>\u0289\n>\r>\16>\u028a"+
+ "\3?\3?\3?\3?\3?\5?\u0292\n?\3?\6?\u0295\n?\r?\16?\u0296\3@\3@\3A\3A\3"+
+ "B\3B\3C\3C\7C\u02a1\nC\fC\16C\u02a4\13C\3D\3D\3E\3E\3F\3F\7F\u02ac\nF"+
+ "\fF\16F\u02af\13F\3G\6G\u02b2\nG\rG\16G\u02b3\3G\3G\3H\3H\3H\3H\7H\u02bc"+
+ "\nH\fH\16H\u02bf\13H\3H\3H\3I\3I\3I\3I\7I\u02c7\nI\fI\16I\u02ca\13I\3"+
+ "I\3I\3I\3I\3I\3\u02c8\2J\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+
+ "\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+
+ "\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+
+ "c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177\2\u0081\2\u0083\2\u0085A\u0087"+
+ "\2\u0089\2\u008bB\u008dC\u008fD\u0091E\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62"+
+ "\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\5\2\13\f\17"+
+ "\17\"\"\4\2\f\f\17\17\2\u0335\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t"+
+ "\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2"+
+ "\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2"+
+ "\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2"+
+ "+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2"+
+ "\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2"+
+ "C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3"+
+ "\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2"+
+ "\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2"+
+ "i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3"+
+ "\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\u0085\3\2\2\2\2\u008b"+
+ "\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\3\u0093\3\2\2"+
+ "\2\5\u009a\3\2\2\2\7\u009c\3\2\2\2\t\u009e\3\2\2\2\13\u00a0\3\2\2\2\r"+
+ "\u00a2\3\2\2\2\17\u00a4\3\2\2\2\21\u00aa\3\2\2\2\23\u00ac\3\2\2\2\25\u00ae"+
+ "\3\2\2\2\27\u00b1\3\2\2\2\31\u00b6\3\2\2\2\33\u00bc\3\2\2\2\35\u00bf\3"+
+ "\2\2\2\37\u00c3\3\2\2\2!\u00ca\3\2\2\2#\u00ce\3\2\2\2%\u00d0\3\2\2\2\'"+
+ "\u00d3\3\2\2\2)\u00da\3\2\2\2+\u00dc\3\2\2\2-\u00de\3\2\2\2/\u00e0\3\2"+
+ "\2\2\61\u00e3\3\2\2\2\63\u00e6\3\2\2\2\65\u00e8\3\2\2\2\67\u00ea\3\2\2"+
+ "\29\u00ec\3\2\2\2;\u00ee\3\2\2\2=\u00f0\3\2\2\2?\u00f3\3\2\2\2A\u00f6"+
+ "\3\2\2\2C\u00f8\3\2\2\2E\u00fa\3\2\2\2G\u00fc\3\2\2\2I\u00fe\3\2\2\2K"+
+ "\u0101\3\2\2\2M\u0104\3\2\2\2O\u0107\3\2\2\2Q\u010a\3\2\2\2S\u010d\3\2"+
+ "\2\2U\u0110\3\2\2\2W\u0113\3\2\2\2Y\u0115\3\2\2\2[\u0117\3\2\2\2]\u011a"+
+ "\3\2\2\2_\u011d\3\2\2\2a\u0123\3\2\2\2c\u0203\3\2\2\2e\u0218\3\2\2\2g"+
+ "\u021a\3\2\2\2i\u0225\3\2\2\2k\u0236\3\2\2\2m\u023a\3\2\2\2o\u023f\3\2"+
+ "\2\2q\u0246\3\2\2\2s\u0257\3\2\2\2u\u0265\3\2\2\2w\u0276\3\2\2\2y\u0285"+
+ "\3\2\2\2{\u0288\3\2\2\2}\u0291\3\2\2\2\177\u0298\3\2\2\2\u0081\u029a\3"+
+ "\2\2\2\u0083\u029c\3\2\2\2\u0085\u029e\3\2\2\2\u0087\u02a5\3\2\2\2\u0089"+
+ "\u02a7\3\2\2\2\u008b\u02a9\3\2\2\2\u008d\u02b1\3\2\2\2\u008f\u02b7\3\2"+
+ "\2\2\u0091\u02c2\3\2\2\2\u0093\u0094\7k\2\2\u0094\u0095\7o\2\2\u0095\u0096"+
+ "\7r\2\2\u0096\u0097\7q\2\2\u0097\u0098\7t\2\2\u0098\u0099\7v\2\2\u0099"+
+ "\4\3\2\2\2\u009a\u009b\7*\2\2\u009b\6\3\2\2\2\u009c\u009d\7+\2\2\u009d"+
+ "\b\3\2\2\2\u009e\u009f\7}\2\2\u009f\n\3\2\2\2\u00a0\u00a1\7\177\2\2\u00a1"+
+ "\f\3\2\2\2\u00a2\u00a3\7.\2\2\u00a3\16\3\2\2\2\u00a4\u00a5\7e\2\2\u00a5"+
+ "\u00a6\7q\2\2\u00a6\u00a7\7p\2\2\u00a7\u00a8\7u\2\2\u00a8\u00a9\7v\2\2"+
+ "\u00a9\20\3\2\2\2\u00aa\u00ab\7?\2\2\u00ab\22\3\2\2\2\u00ac\u00ad\7=\2"+
+ "\2\u00ad\24\3\2\2\2\u00ae\u00af\7k\2\2\u00af\u00b0\7h\2\2\u00b0\26\3\2"+
+ "\2\2\u00b1\u00b2\7g\2\2\u00b2\u00b3\7n\2\2\u00b3\u00b4\7u\2\2\u00b4\u00b5"+
+ "\7g\2\2\u00b5\30\3\2\2\2\u00b6\u00b7\7y\2\2\u00b7\u00b8\7j\2\2\u00b8\u00b9"+
+ "\7k\2\2\u00b9\u00ba\7n\2\2\u00ba\u00bb\7g\2\2\u00bb\32\3\2\2\2\u00bc\u00bd"+
+ "\7f\2\2\u00bd\u00be\7q\2\2\u00be\34\3\2\2\2\u00bf\u00c0\7h\2\2\u00c0\u00c1"+
+ "\7q\2\2\u00c1\u00c2\7t\2\2\u00c2\36\3\2\2\2\u00c3\u00c4\7t\2\2\u00c4\u00c5"+
+ "\7g\2\2\u00c5\u00c6\7v\2\2\u00c6\u00c7\7w\2\2\u00c7\u00c8\7t\2\2\u00c8"+
+ "\u00c9\7p\2\2\u00c9 \3\2\2\2\u00ca\u00cb\7c\2\2\u00cb\u00cc\7u\2\2\u00cc"+
+ "\u00cd\7o\2\2\u00cd\"\3\2\2\2\u00ce\u00cf\7<\2\2\u00cf$\3\2\2\2\u00d0"+
+ "\u00d1\7\60\2\2\u00d1\u00d2\7\60\2\2\u00d2&\3\2\2\2\u00d3\u00d4\7u\2\2"+
+ "\u00d4\u00d5\7k\2\2\u00d5\u00d6\7i\2\2\u00d6\u00d7\7p\2\2\u00d7\u00d8"+
+ "\7g\2\2\u00d8\u00d9\7f\2\2\u00d9(\3\2\2\2\u00da\u00db\7,\2\2\u00db*\3"+
+ "\2\2\2\u00dc\u00dd\7]\2\2\u00dd,\3\2\2\2\u00de\u00df\7_\2\2\u00df.\3\2"+
+ "\2\2\u00e0\u00e1\7/\2\2\u00e1\u00e2\7/\2\2\u00e2\60\3\2\2\2\u00e3\u00e4"+
+ "\7-\2\2\u00e4\u00e5\7-\2\2\u00e5\62\3\2\2\2\u00e6\u00e7\7-\2\2\u00e7\64"+
+ "\3\2\2\2\u00e8\u00e9\7/\2\2\u00e9\66\3\2\2\2\u00ea\u00eb\7#\2\2\u00eb"+
+ "8\3\2\2\2\u00ec\u00ed\7(\2\2\u00ed:\3\2\2\2\u00ee\u00ef\7\u0080\2\2\u00ef"+
+ "<\3\2\2\2\u00f0\u00f1\7@\2\2\u00f1\u00f2\7@\2\2\u00f2>\3\2\2\2\u00f3\u00f4"+
+ "\7>\2\2\u00f4\u00f5\7>\2\2\u00f5@\3\2\2\2\u00f6\u00f7\7\61\2\2\u00f7B"+
+ "\3\2\2\2\u00f8\u00f9\7\'\2\2\u00f9D\3\2\2\2\u00fa\u00fb\7>\2\2\u00fbF"+
+ "\3\2\2\2\u00fc\u00fd\7@\2\2\u00fdH\3\2\2\2\u00fe\u00ff\7?\2\2\u00ff\u0100"+
+ "\7?\2\2\u0100J\3\2\2\2\u0101\u0102\7#\2\2\u0102\u0103\7?\2\2\u0103L\3"+
+ "\2\2\2\u0104\u0105\7>\2\2\u0105\u0106\7@\2\2\u0106N\3\2\2\2\u0107\u0108"+
+ "\7>\2\2\u0108\u0109\7?\2\2\u0109P\3\2\2\2\u010a\u010b\7?\2\2\u010b\u010c"+
+ "\7>\2\2\u010cR\3\2\2\2\u010d\u010e\7@\2\2\u010e\u010f\7?\2\2\u010fT\3"+
+ "\2\2\2\u0110\u0111\7?\2\2\u0111\u0112\7@\2\2\u0112V\3\2\2\2\u0113\u0114"+
+ "\7`\2\2\u0114X\3\2\2\2\u0115\u0116\7~\2\2\u0116Z\3\2\2\2\u0117\u0118\7"+
+ "(\2\2\u0118\u0119\7(\2\2\u0119\\\3\2\2\2\u011a\u011b\7~\2\2\u011b\u011c"+
+ "\7~\2\2\u011c^\3\2\2\2\u011d\u011e\7\60\2\2\u011e\u011f\7d\2\2\u011f\u0120"+
+ "\7{\2\2\u0120\u0121\7v\2\2\u0121\u0122\7g\2\2\u0122`\3\2\2\2\u0123\u0124"+
+ "\7%\2\2\u0124b\3\2\2\2\u0125\u0126\7d\2\2\u0126\u0127\7t\2\2\u0127\u0204"+
+ "\7m\2\2\u0128\u0129\7q\2\2\u0129\u012a\7t\2\2\u012a\u0204\7c\2\2\u012b"+
+ "\u012c\7m\2\2\u012c\u012d\7k\2\2\u012d\u0204\7n\2\2\u012e\u012f\7u\2\2"+
+ "\u012f\u0130\7n\2\2\u0130\u0204\7q\2\2\u0131\u0132\7p\2\2\u0132\u0133"+
+ "\7q\2\2\u0133\u0204\7r\2\2\u0134\u0135\7c\2\2\u0135\u0136\7u\2\2\u0136"+
+ "\u0204\7n\2\2\u0137\u0138\7r\2\2\u0138\u0139\7j\2\2\u0139\u0204\7r\2\2"+
+ "\u013a\u013b\7c\2\2\u013b\u013c\7p\2\2\u013c\u0204\7e\2\2\u013d\u013e"+
+ "\7d\2\2\u013e\u013f\7r\2\2\u013f\u0204\7n\2\2\u0140\u0141\7e\2\2\u0141"+
+ "\u0142\7n\2\2\u0142\u0204\7e\2\2\u0143\u0144\7l\2\2\u0144\u0145\7u\2\2"+
+ "\u0145\u0204\7t\2\2\u0146\u0147\7c\2\2\u0147\u0148\7p\2\2\u0148\u0204"+
+ "\7f\2\2\u0149\u014a\7t\2\2\u014a\u014b\7n\2\2\u014b\u0204\7c\2\2\u014c"+
+ "\u014d\7d\2\2\u014d\u014e\7k\2\2\u014e\u0204\7v\2\2\u014f\u0150\7t\2\2"+
+ "\u0150\u0151\7q\2\2\u0151\u0204\7n\2\2\u0152\u0153\7r\2\2\u0153\u0154"+
+ "\7n\2\2\u0154\u0204\7c\2\2\u0155\u0156\7r\2\2\u0156\u0157\7n\2\2\u0157"+
+ "\u0204\7r\2\2\u0158\u0159\7d\2\2\u0159\u015a\7o\2\2\u015a\u0204\7k\2\2"+
+ "\u015b\u015c\7u\2\2\u015c\u015d\7g\2\2\u015d\u0204\7e\2\2\u015e\u015f"+
+ "\7t\2\2\u015f\u0160\7v\2\2\u0160\u0204\7k\2\2\u0161\u0162\7g\2\2\u0162"+
+ "\u0163\7q\2\2\u0163\u0204\7t\2\2\u0164\u0165\7u\2\2\u0165\u0166\7t\2\2"+
+ "\u0166\u0204\7g\2\2\u0167\u0168\7n\2\2\u0168\u0169\7u\2\2\u0169\u0204"+
+ "\7t\2\2\u016a\u016b\7r\2\2\u016b\u016c\7j\2\2\u016c\u0204\7c\2\2\u016d"+
+ "\u016e\7c\2\2\u016e\u016f\7n\2\2\u016f\u0204\7t\2\2\u0170\u0171\7l\2\2"+
+ "\u0171\u0172\7o\2\2\u0172\u0204\7r\2\2\u0173\u0174\7d\2\2\u0174\u0175"+
+ "\7x\2\2\u0175\u0204\7e\2\2\u0176\u0177\7e\2\2\u0177\u0178\7n\2\2\u0178"+
+ "\u0204\7k\2\2\u0179\u017a\7t\2\2\u017a\u017b\7v\2\2\u017b\u0204\7u\2\2"+
+ "\u017c\u017d\7c\2\2\u017d\u017e\7f\2\2\u017e\u0204\7e\2\2\u017f\u0180"+
+ "\7t\2\2\u0180\u0181\7t\2\2\u0181\u0204\7c\2\2\u0182\u0183\7d\2\2\u0183"+
+ "\u0184\7x\2\2\u0184\u0204\7u\2\2\u0185\u0186\7u\2\2\u0186\u0187\7g\2\2"+
+ "\u0187\u0204\7k\2\2\u0188\u0189\7u\2\2\u0189\u018a\7c\2\2\u018a\u0204"+
+ "\7z\2\2\u018b\u018c\7u\2\2\u018c\u018d\7v\2\2\u018d\u0204\7{\2\2\u018e"+
+ "\u018f\7u\2\2\u018f\u0190\7v\2\2\u0190\u0204\7c\2\2\u0191\u0192\7u\2\2"+
+ "\u0192\u0193\7v\2\2\u0193\u0204\7z\2\2\u0194\u0195\7f\2\2\u0195\u0196"+
+ "\7g\2\2\u0196\u0204\7{\2\2\u0197\u0198\7v\2\2\u0198\u0199\7z\2\2\u0199"+
+ "\u0204\7c\2\2\u019a\u019b\7z\2\2\u019b\u019c\7c\2\2\u019c\u0204\7c\2\2"+
+ "\u019d\u019e\7d\2\2\u019e\u019f\7e\2\2\u019f\u0204\7e\2\2\u01a0\u01a1"+
+ "\7c\2\2\u01a1\u01a2\7j\2\2\u01a2\u0204\7z\2\2\u01a3\u01a4\7v\2\2\u01a4"+
+ "\u01a5\7{\2\2\u01a5\u0204\7c\2\2\u01a6\u01a7\7v\2\2\u01a7\u01a8\7z\2\2"+
+ "\u01a8\u0204\7u\2\2\u01a9\u01aa\7v\2\2\u01aa\u01ab\7c\2\2\u01ab\u0204"+
+ "\7u\2\2\u01ac\u01ad\7u\2\2\u01ad\u01ae\7j\2\2\u01ae\u0204\7{\2\2\u01af"+
+ "\u01b0\7u\2\2\u01b0\u01b1\7j\2\2\u01b1\u0204\7z\2\2\u01b2\u01b3\7n\2\2"+
+ "\u01b3\u01b4\7f\2\2\u01b4\u0204\7{\2\2\u01b5\u01b6\7n\2\2\u01b6\u01b7"+
+ "\7f\2\2\u01b7\u0204\7c\2\2\u01b8\u01b9\7n\2\2\u01b9\u01ba\7f\2\2\u01ba"+
+ "\u0204\7z\2\2\u01bb\u01bc\7n\2\2\u01bc\u01bd\7c\2\2\u01bd\u0204\7z\2\2"+
+ "\u01be\u01bf\7v\2\2\u01bf\u01c0\7c\2\2\u01c0\u0204\7{\2\2\u01c1\u01c2"+
+ "\7v\2\2\u01c2\u01c3\7c\2\2\u01c3\u0204\7z\2\2\u01c4\u01c5\7d\2\2\u01c5"+
+ "\u01c6\7e\2\2\u01c6\u0204\7u\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9\7n\2\2"+
+ "\u01c9\u0204\7x\2\2\u01ca\u01cb\7v\2\2\u01cb\u01cc\7u\2\2\u01cc\u0204"+
+ "\7z\2\2\u01cd\u01ce\7n\2\2\u01ce\u01cf\7c\2\2\u01cf\u0204\7u\2\2\u01d0"+
+ "\u01d1\7e\2\2\u01d1\u01d2\7r\2\2\u01d2\u0204\7{\2\2\u01d3\u01d4\7e\2\2"+
+ "\u01d4\u01d5\7o\2\2\u01d5\u0204\7r\2\2\u01d6\u01d7\7e\2\2\u01d7\u01d8"+
+ "\7r\2\2\u01d8\u0204\7z\2\2\u01d9\u01da\7f\2\2\u01da\u01db\7e\2\2\u01db"+
+ "\u0204\7r\2\2\u01dc\u01dd\7f\2\2\u01dd\u01de\7g\2\2\u01de\u0204\7e\2\2"+
+ "\u01df\u01e0\7k\2\2\u01e0\u01e1\7p\2\2\u01e1\u0204\7e\2\2\u01e2\u01e3"+
+ "\7c\2\2\u01e3\u01e4\7z\2\2\u01e4\u0204\7u\2\2\u01e5\u01e6\7d\2\2\u01e6"+
+ "\u01e7\7p\2\2\u01e7\u0204\7g\2\2\u01e8\u01e9\7e\2\2\u01e9\u01ea\7n\2\2"+
+ "\u01ea\u0204\7f\2\2\u01eb\u01ec\7u\2\2\u01ec\u01ed\7d\2\2\u01ed\u0204"+
+ "\7e\2\2\u01ee\u01ef\7k\2\2\u01ef\u01f0\7u\2\2\u01f0\u0204\7e\2\2\u01f1"+
+ "\u01f2\7k\2\2\u01f2\u01f3\7p\2\2\u01f3\u0204\7z\2\2\u01f4\u01f5\7d\2\2"+
+ "\u01f5\u01f6\7g\2\2\u01f6\u0204\7s\2\2\u01f7\u01f8\7u\2\2\u01f8\u01f9"+
+ "\7g\2\2\u01f9\u0204\7f\2\2\u01fa\u01fb\7f\2\2\u01fb\u01fc\7g\2\2\u01fc"+
+ "\u0204\7z\2\2\u01fd\u01fe\7k\2\2\u01fe\u01ff\7p\2\2\u01ff\u0204\7{\2\2"+
+ "\u0200\u0201\7t\2\2\u0201\u0202\7q\2\2\u0202\u0204\7t\2\2\u0203\u0125"+
+ "\3\2\2\2\u0203\u0128\3\2\2\2\u0203\u012b\3\2\2\2\u0203\u012e\3\2\2\2\u0203"+
+ "\u0131\3\2\2\2\u0203\u0134\3\2\2\2\u0203\u0137\3\2\2\2\u0203\u013a\3\2"+
+ "\2\2\u0203\u013d\3\2\2\2\u0203\u0140\3\2\2\2\u0203\u0143\3\2\2\2\u0203"+
+ "\u0146\3\2\2\2\u0203\u0149\3\2\2\2\u0203\u014c\3\2\2\2\u0203\u014f\3\2"+
+ "\2\2\u0203\u0152\3\2\2\2\u0203\u0155\3\2\2\2\u0203\u0158\3\2\2\2\u0203"+
+ "\u015b\3\2\2\2\u0203\u015e\3\2\2\2\u0203\u0161\3\2\2\2\u0203\u0164\3\2"+
+ "\2\2\u0203\u0167\3\2\2\2\u0203\u016a\3\2\2\2\u0203\u016d\3\2\2\2\u0203"+
+ "\u0170\3\2\2\2\u0203\u0173\3\2\2\2\u0203\u0176\3\2\2\2\u0203\u0179\3\2"+
+ "\2\2\u0203\u017c\3\2\2\2\u0203\u017f\3\2\2\2\u0203\u0182\3\2\2\2\u0203"+
+ "\u0185\3\2\2\2\u0203\u0188\3\2\2\2\u0203\u018b\3\2\2\2\u0203\u018e\3\2"+
+ "\2\2\u0203\u0191\3\2\2\2\u0203\u0194\3\2\2\2\u0203\u0197\3\2\2\2\u0203"+
+ "\u019a\3\2\2\2\u0203\u019d\3\2\2\2\u0203\u01a0\3\2\2\2\u0203\u01a3\3\2"+
+ "\2\2\u0203\u01a6\3\2\2\2\u0203\u01a9\3\2\2\2\u0203\u01ac\3\2\2\2\u0203"+
+ "\u01af\3\2\2\2\u0203\u01b2\3\2\2\2\u0203\u01b5\3\2\2\2\u0203\u01b8\3\2"+
+ "\2\2\u0203\u01bb\3\2\2\2\u0203\u01be\3\2\2\2\u0203\u01c1\3\2\2\2\u0203"+
+ "\u01c4\3\2\2\2\u0203\u01c7\3\2\2\2\u0203\u01ca\3\2\2\2\u0203\u01cd\3\2"+
+ "\2\2\u0203\u01d0\3\2\2\2\u0203\u01d3\3\2\2\2\u0203\u01d6\3\2\2\2\u0203"+
+ "\u01d9\3\2\2\2\u0203\u01dc\3\2\2\2\u0203\u01df\3\2\2\2\u0203\u01e2\3\2"+
+ "\2\2\u0203\u01e5\3\2\2\2\u0203\u01e8\3\2\2\2\u0203\u01eb\3\2\2\2\u0203"+
+ "\u01ee\3\2\2\2\u0203\u01f1\3\2\2\2\u0203\u01f4\3\2\2\2\u0203\u01f7\3\2"+
+ "\2\2\u0203\u01fa\3\2\2\2\u0203\u01fd\3\2\2\2\u0203\u0200\3\2\2\2\u0204"+
+ "d\3\2\2\2\u0205\u0206\7d\2\2\u0206\u0207\7{\2\2\u0207\u0208\7v\2\2\u0208"+
+ "\u0219\7g\2\2\u0209\u020a\7y\2\2\u020a\u020b\7q\2\2\u020b\u020c\7t\2\2"+
+ "\u020c\u0219\7f\2\2\u020d\u020e\7d\2\2\u020e\u020f\7q\2\2\u020f\u0210"+
+ "\7q\2\2\u0210\u0211\7n\2\2\u0211\u0212\7g\2\2\u0212\u0213\7c\2\2\u0213"+
+ "\u0219\7p\2\2\u0214\u0215\7x\2\2\u0215\u0216\7q\2\2\u0216\u0217\7k\2\2"+
+ "\u0217\u0219\7f\2\2\u0218\u0205\3\2\2\2\u0218\u0209\3\2\2\2\u0218\u020d"+
+ "\3\2\2\2\u0218\u0214\3\2\2\2\u0219f\3\2\2\2\u021a\u0220\7$\2\2\u021b\u021c"+
+ "\7^\2\2\u021c\u021f\7$\2\2\u021d\u021f\n\2\2\2\u021e\u021b\3\2\2\2\u021e"+
+ "\u021d\3\2\2\2\u021f\u0222\3\2\2\2\u0220\u021e\3\2\2\2\u0220\u0221\3\2"+
+ "\2\2\u0221\u0223\3\2\2\2\u0222\u0220\3\2\2\2\u0223\u0224\7$\2\2\u0224"+
+ "h\3\2\2\2\u0225\u0229\7)\2\2\u0226\u0227\7^\2\2\u0227\u022a\7)\2\2\u0228"+
+ "\u022a\n\3\2\2\u0229\u0226\3\2\2\2\u0229\u0228\3\2\2\2\u022a\u022b\3\2"+
+ "\2\2\u022b\u022c\7)\2\2\u022cj\3\2\2\2\u022d\u022e\7v\2\2\u022e\u022f"+
+ "\7t\2\2\u022f\u0230\7w\2\2\u0230\u0237\7g\2\2\u0231\u0232\7h\2\2\u0232"+
+ "\u0233\7c\2\2\u0233\u0234\7n\2\2\u0234\u0235\7u\2\2\u0235\u0237\7g\2\2"+
+ "\u0236\u022d\3\2\2\2\u0236\u0231\3\2\2\2\u0237l\3\2\2\2\u0238\u023b\5"+
+ "o8\2\u0239\u023b\5w<\2\u023a\u0238\3\2\2\2\u023a\u0239\3\2\2\2\u023bn"+
+ "\3\2\2\2\u023c\u0240\5q9\2\u023d\u0240\5s:\2\u023e\u0240\5u;\2\u023f\u023c"+
+ "\3\2\2\2\u023f\u023d\3\2\2\2\u023f\u023e\3\2\2\2\u0240p\3\2\2\2\u0241"+
+ "\u0247\7\'\2\2\u0242\u0243\7\62\2\2\u0243\u0247\7d\2\2\u0244\u0245\7\62"+
+ "\2\2\u0245\u0247\7D\2\2\u0246\u0241\3\2\2\2\u0246\u0242\3\2\2\2\u0246"+
+ "\u0244\3\2\2\2\u0247\u024b\3\2\2\2\u0248\u024a\5\177@\2\u0249\u0248\3"+
+ "\2\2\2\u024a\u024d\3\2\2\2\u024b\u0249\3\2\2\2\u024b\u024c\3\2\2\2\u024c"+
+ "\u024e\3\2\2\2\u024d\u024b\3\2\2\2\u024e\u0250\7\60\2\2\u024f\u0251\5"+
+ "\177@\2\u0250\u024f\3\2\2\2\u0251\u0252\3\2\2\2\u0252\u0250\3\2\2\2\u0252"+
+ "\u0253\3\2\2\2\u0253r\3\2\2\2\u0254\u0256\5\u0081A\2\u0255\u0254\3\2\2"+
+ "\2\u0256\u0259\3\2\2\2\u0257\u0255\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u025a"+
+ "\3\2\2\2\u0259\u0257\3\2\2\2\u025a\u025c\7\60\2\2\u025b\u025d\5\u0081"+
+ "A\2\u025c\u025b\3\2\2\2\u025d\u025e\3\2\2\2\u025e\u025c\3\2\2\2\u025e"+
+ "\u025f\3\2\2\2\u025ft\3\2\2\2\u0260\u0266\7&\2\2\u0261\u0262\7\62\2\2"+
+ "\u0262\u0266\7z\2\2\u0263\u0264\7\62\2\2\u0264\u0266\7Z\2\2\u0265\u0260"+
+ "\3\2\2\2\u0265\u0261\3\2\2\2\u0265\u0263\3\2\2\2\u0266\u026a\3\2\2\2\u0267"+
+ "\u0269\5\u0083B\2\u0268\u0267\3\2\2\2\u0269\u026c\3\2\2\2\u026a\u0268"+
+ "\3\2\2\2\u026a\u026b\3\2\2\2\u026b\u026d\3\2\2\2\u026c\u026a\3\2\2\2\u026d"+
+ "\u026f\7\60\2\2\u026e\u0270\5\u0083B\2\u026f\u026e\3\2\2\2\u0270\u0271"+
+ "\3\2\2\2\u0271\u026f\3\2\2\2\u0271\u0272\3\2\2\2\u0272v\3\2\2\2\u0273"+
+ "\u0277\5{>\2\u0274\u0277\5}?\2\u0275\u0277\5y=\2\u0276\u0273\3\2\2\2\u0276"+
+ "\u0274\3\2\2\2\u0276\u0275\3\2\2\2\u0277x\3\2\2\2\u0278\u0279\7\62\2\2"+
+ "\u0279\u027b\t\4\2\2\u027a\u027c\5\177@\2\u027b\u027a\3\2\2\2\u027c\u027d"+
+ "\3\2\2\2\u027d\u027b\3\2\2\2\u027d\u027e\3\2\2\2\u027e\u0286\3\2\2\2\u027f"+
+ "\u0281\7\'\2\2\u0280\u0282\5\177@\2\u0281\u0280\3\2\2\2\u0282\u0283\3"+
+ "\2\2\2\u0283\u0281\3\2\2\2\u0283\u0284\3\2\2\2\u0284\u0286\3\2\2\2\u0285"+
+ "\u0278\3\2\2\2\u0285\u027f\3\2\2\2\u0286z\3\2\2\2\u0287\u0289\5\u0081"+
+ "A\2\u0288\u0287\3\2\2\2\u0289\u028a\3\2\2\2\u028a\u0288\3\2\2\2\u028a"+
+ "\u028b\3\2\2\2\u028b|\3\2\2\2\u028c\u0292\7&\2\2\u028d\u028e\7\62\2\2"+
+ "\u028e\u0292\7z\2\2\u028f\u0290\7\62\2\2\u0290\u0292\7Z\2\2\u0291\u028c"+
+ "\3\2\2\2\u0291\u028d\3\2\2\2\u0291\u028f\3\2\2\2\u0292\u0294\3\2\2\2\u0293"+
+ "\u0295\5\u0083B\2\u0294\u0293\3\2\2\2\u0295\u0296\3\2\2\2\u0296\u0294"+
+ "\3\2\2\2\u0296\u0297\3\2\2\2\u0297~\3\2\2\2\u0298\u0299\t\5\2\2\u0299"+
+ "\u0080\3\2\2\2\u029a\u029b\t\6\2\2\u029b\u0082\3\2\2\2\u029c\u029d\t\7"+
+ "\2\2\u029d\u0084\3\2\2\2\u029e\u02a2\5\u0087D\2\u029f\u02a1\5\u0089E\2"+
+ "\u02a0\u029f\3\2\2\2\u02a1\u02a4\3\2\2\2\u02a2\u02a0\3\2\2\2\u02a2\u02a3"+
+ "\3\2\2\2\u02a3\u0086\3\2\2\2\u02a4\u02a2\3\2\2\2\u02a5\u02a6\t\b\2\2\u02a6"+
+ "\u0088\3\2\2\2\u02a7\u02a8\t\t\2\2\u02a8\u008a\3\2\2\2\u02a9\u02ad\7#"+
+ "\2\2\u02aa\u02ac\t\n\2\2\u02ab\u02aa\3\2\2\2\u02ac\u02af\3\2\2\2\u02ad"+
+ "\u02ab\3\2\2\2\u02ad\u02ae\3\2\2\2\u02ae\u008c\3\2\2\2\u02af\u02ad\3\2"+
+ "\2\2\u02b0\u02b2\t\13\2\2\u02b1\u02b0\3\2\2\2\u02b2\u02b3\3\2\2\2\u02b3"+
+ "\u02b1\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5\u02b6\bG"+
+ "\2\2\u02b6\u008e\3\2\2\2\u02b7\u02b8\7\61\2\2\u02b8\u02b9\7\61\2\2\u02b9"+
+ "\u02bd\3\2\2\2\u02ba\u02bc\n\f\2\2\u02bb\u02ba\3\2\2\2\u02bc\u02bf\3\2"+
+ "\2\2\u02bd\u02bb\3\2\2\2\u02bd\u02be\3\2\2\2\u02be\u02c0\3\2\2\2\u02bf"+
+ "\u02bd\3\2\2\2\u02c0\u02c1\bH\2\2\u02c1\u0090\3\2\2\2\u02c2\u02c3\7\61"+
+ "\2\2\u02c3\u02c4\7,\2\2\u02c4\u02c8\3\2\2\2\u02c5\u02c7\13\2\2\2\u02c6"+
+ "\u02c5\3\2\2\2\u02c7\u02ca\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c8\u02c6\3\2"+
+ "\2\2\u02c9\u02cb\3\2\2\2\u02ca\u02c8\3\2\2\2\u02cb\u02cc\7,\2\2\u02cc"+
+ "\u02cd\7\61\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02cf\bI\2\2\u02cf\u0092\3\2"+
+ "\2\2\37\2\u0203\u0218\u021e\u0220\u0229\u0236\u023a\u023f\u0246\u024b"+
+ "\u0252\u0257\u025e\u0265\u026a\u0271\u0276\u027d\u0283\u0285\u028a\u0291"+
+ "\u0296\u02a2\u02ad\u02b3\u02bd\u02c8\3\b\2\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
index d142d4efa..64c972114 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
@@ -45,25 +45,26 @@ T__43=44
T__44=45
T__45=46
T__46=47
-MNEMONIC=48
-SIMPLETYPE=49
-STRING=50
-CHAR=51
-BOOLEAN=52
-NUMBER=53
-NUMFLOAT=54
-BINFLOAT=55
-DECFLOAT=56
-HEXFLOAT=57
-NUMINT=58
-BININTEGER=59
-DECINTEGER=60
-HEXINTEGER=61
-NAME=62
-ASMREL=63
-WS=64
-COMMENT_LINE=65
-COMMENT_BLOCK=66
+T__47=48
+MNEMONIC=49
+SIMPLETYPE=50
+STRING=51
+CHAR=52
+BOOLEAN=53
+NUMBER=54
+NUMFLOAT=55
+BINFLOAT=56
+DECFLOAT=57
+HEXFLOAT=58
+NUMINT=59
+BININTEGER=60
+DECINTEGER=61
+HEXINTEGER=62
+NAME=63
+ASMREL=64
+WS=65
+COMMENT_LINE=66
+COMMENT_BLOCK=67
'import'=1
'('=2
')'=3
@@ -110,4 +111,5 @@ COMMENT_BLOCK=66
'|'=44
'&&'=45
'||'=46
-'#'=47
+'.byte'=47
+'#'=48
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
index 308b1cfc0..1f9d1a3e5 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
@@ -555,6 +555,16 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitAsmInstruction(KickCParser.AsmInstructionContext ctx);
+ /**
+ * Enter a parse tree produced by {@link KickCParser#asmBytes}.
+ * @param ctx the parse tree
+ */
+ void enterAsmBytes(KickCParser.AsmBytesContext ctx);
+ /**
+ * Exit a parse tree produced by {@link KickCParser#asmBytes}.
+ * @param ctx the parse tree
+ */
+ void exitAsmBytes(KickCParser.AsmBytesContext ctx);
/**
* Enter a parse tree produced by the {@code asmModeAbs}
* labeled alternative in {@link KickCParser#asmParamMode}.
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
index 1262bde8b..63ea0d8a3 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
@@ -23,22 +23,22 @@ public class KickCParser extends Parser {
T__24=25, T__25=26, T__26=27, T__27=28, T__28=29, T__29=30, T__30=31,
T__31=32, T__32=33, T__33=34, T__34=35, T__35=36, T__36=37, T__37=38,
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
- T__45=46, T__46=47, MNEMONIC=48, SIMPLETYPE=49, STRING=50, CHAR=51, BOOLEAN=52,
- NUMBER=53, NUMFLOAT=54, BINFLOAT=55, DECFLOAT=56, HEXFLOAT=57, NUMINT=58,
- BININTEGER=59, DECINTEGER=60, HEXINTEGER=61, NAME=62, ASMREL=63, WS=64,
- COMMENT_LINE=65, COMMENT_BLOCK=66;
+ T__45=46, T__46=47, T__47=48, MNEMONIC=49, SIMPLETYPE=50, STRING=51, CHAR=52,
+ BOOLEAN=53, NUMBER=54, NUMFLOAT=55, BINFLOAT=56, DECFLOAT=57, HEXFLOAT=58,
+ NUMINT=59, BININTEGER=60, DECINTEGER=61, HEXINTEGER=62, NAME=63, ASMREL=64,
+ WS=65, COMMENT_LINE=66, COMMENT_BLOCK=67;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3,
RULE_declSeq = 4, RULE_decl = 5, RULE_parameterListDecl = 6, RULE_parameterDecl = 7,
RULE_declVar = 8, RULE_stmtSeq = 9, RULE_stmt = 10, RULE_forDeclaration = 11,
RULE_forIteration = 12, RULE_typeDecl = 13, RULE_expr = 14, RULE_parameterList = 15,
RULE_asmLines = 16, RULE_asmLine = 17, RULE_asmLabel = 18, RULE_asmInstruction = 19,
- RULE_asmParamMode = 20, RULE_asmExpr = 21;
+ RULE_asmBytes = 20, RULE_asmParamMode = 21, RULE_asmExpr = 22;
public static final String[] ruleNames = {
"file", "asmFile", "importSeq", "importDecl", "declSeq", "decl", "parameterListDecl",
"parameterDecl", "declVar", "stmtSeq", "stmt", "forDeclaration", "forIteration",
"typeDecl", "expr", "parameterList", "asmLines", "asmLine", "asmLabel",
- "asmInstruction", "asmParamMode", "asmExpr"
+ "asmInstruction", "asmBytes", "asmParamMode", "asmExpr"
};
private static final String[] _LITERAL_NAMES = {
@@ -47,16 +47,16 @@ public class KickCParser extends Parser {
"':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'",
"'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'",
"'=='", "'!='", "'<>'", "'<='", "'=<'", "'>='", "'=>'", "'^'", "'|'",
- "'&&'", "'||'", "'#'"
+ "'&&'", "'||'", "'.byte'", "'#'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT",
- "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER",
- "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
+ null, "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER",
+ "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER",
+ "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@@ -140,11 +140,11 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(44);
- importSeq();
- setState(45);
- declSeq();
setState(46);
+ importSeq();
+ setState(47);
+ declSeq();
+ setState(48);
match(EOF);
}
}
@@ -189,9 +189,9 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(48);
+ setState(50);
asmLines();
- setState(49);
+ setState(51);
match(EOF);
}
}
@@ -239,17 +239,17 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(54);
+ setState(56);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__0) {
{
{
- setState(51);
+ setState(53);
importDecl();
}
}
- setState(56);
+ setState(58);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -293,9 +293,9 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(57);
+ setState(59);
match(T__0);
- setState(58);
+ setState(60);
match(STRING);
}
}
@@ -343,17 +343,17 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(61);
+ setState(63);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(60);
+ setState(62);
decl();
}
}
- setState(63);
+ setState(65);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__6) | (1L << T__18) | (1L << SIMPLETYPE))) != 0) );
@@ -432,44 +432,44 @@ public class KickCParser extends Parser {
enterRule(_localctx, 10, RULE_decl);
int _la;
try {
- setState(79);
+ setState(81);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) {
case 1:
_localctx = new DeclMethodContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(65);
- typeDecl(0);
- setState(66);
- match(NAME);
setState(67);
- match(T__1);
+ typeDecl(0);
+ setState(68);
+ match(NAME);
setState(69);
+ match(T__1);
+ setState(71);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__18 || _la==SIMPLETYPE) {
{
- setState(68);
+ setState(70);
parameterListDecl();
}
}
- setState(71);
+ setState(73);
match(T__2);
- setState(72);
- match(T__3);
setState(74);
+ match(T__3);
+ setState(76);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__6) | (1L << T__9) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__18) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
- setState(73);
+ setState(75);
stmtSeq();
}
}
- setState(76);
+ setState(78);
match(T__4);
}
break;
@@ -477,7 +477,7 @@ public class KickCParser extends Parser {
_localctx = new DeclVariableContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(78);
+ setState(80);
declVar();
}
break;
@@ -527,21 +527,21 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(81);
+ setState(83);
parameterDecl();
- setState(86);
+ setState(88);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__5) {
{
{
- setState(82);
+ setState(84);
match(T__5);
- setState(83);
+ setState(85);
parameterDecl();
}
}
- setState(88);
+ setState(90);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -588,9 +588,9 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(89);
+ setState(91);
typeDecl(0);
- setState(90);
+ setState(92);
match(NAME);
}
}
@@ -639,33 +639,33 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(93);
+ setState(95);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__6) {
{
- setState(92);
+ setState(94);
match(T__6);
}
}
- setState(95);
+ setState(97);
typeDecl(0);
- setState(96);
+ setState(98);
match(NAME);
- setState(99);
+ setState(101);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__7) {
{
- setState(97);
+ setState(99);
match(T__7);
- setState(98);
+ setState(100);
expr(0);
}
}
- setState(101);
+ setState(103);
match(T__8);
}
}
@@ -713,17 +713,17 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(104);
+ setState(106);
_errHandler.sync(this);
_la = _input.LA(1);
do {
{
{
- setState(103);
+ setState(105);
stmt();
}
}
- setState(106);
+ setState(108);
_errHandler.sync(this);
_la = _input.LA(1);
} while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__6) | (1L << T__9) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__18) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0) );
@@ -946,14 +946,14 @@ public class KickCParser extends Parser {
enterRule(_localctx, 20, RULE_stmt);
int _la;
try {
- setState(159);
+ setState(161);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) {
case 1:
_localctx = new StmtDeclVarContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(108);
+ setState(110);
declVar();
}
break;
@@ -961,19 +961,19 @@ public class KickCParser extends Parser {
_localctx = new StmtBlockContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(109);
- match(T__3);
setState(111);
+ match(T__3);
+ setState(113);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__6) | (1L << T__9) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__18) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << SIMPLETYPE) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
- setState(110);
+ setState(112);
stmtSeq();
}
}
- setState(113);
+ setState(115);
match(T__4);
}
break;
@@ -981,9 +981,9 @@ public class KickCParser extends Parser {
_localctx = new StmtExprContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(114);
+ setState(116);
expr(0);
- setState(115);
+ setState(117);
match(T__8);
}
break;
@@ -991,24 +991,24 @@ public class KickCParser extends Parser {
_localctx = new StmtIfElseContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(117);
- match(T__9);
- setState(118);
- match(T__1);
setState(119);
- expr(0);
+ match(T__9);
setState(120);
- match(T__2);
+ match(T__1);
setState(121);
+ expr(0);
+ setState(122);
+ match(T__2);
+ setState(123);
stmt();
- setState(124);
+ setState(126);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) {
case 1:
{
- setState(122);
+ setState(124);
match(T__10);
- setState(123);
+ setState(125);
stmt();
}
break;
@@ -1019,15 +1019,15 @@ public class KickCParser extends Parser {
_localctx = new StmtWhileContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(126);
- match(T__11);
- setState(127);
- match(T__1);
setState(128);
- expr(0);
+ match(T__11);
setState(129);
- match(T__2);
+ match(T__1);
setState(130);
+ expr(0);
+ setState(131);
+ match(T__2);
+ setState(132);
stmt();
}
break;
@@ -1035,19 +1035,19 @@ public class KickCParser extends Parser {
_localctx = new StmtDoWhileContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(132);
- match(T__12);
- setState(133);
- stmt();
setState(134);
- match(T__11);
+ match(T__12);
setState(135);
- match(T__1);
+ stmt();
setState(136);
- expr(0);
+ match(T__11);
setState(137);
- match(T__2);
+ match(T__1);
setState(138);
+ expr(0);
+ setState(139);
+ match(T__2);
+ setState(140);
match(T__8);
}
break;
@@ -1055,25 +1055,25 @@ public class KickCParser extends Parser {
_localctx = new StmtForContext(_localctx);
enterOuterAlt(_localctx, 7);
{
- setState(140);
+ setState(142);
match(T__13);
- setState(141);
- match(T__1);
setState(143);
+ match(T__1);
+ setState(145);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << SIMPLETYPE) | (1L << NAME))) != 0)) {
{
- setState(142);
+ setState(144);
forDeclaration();
}
}
- setState(145);
- forIteration();
- setState(146);
- match(T__2);
setState(147);
+ forIteration();
+ setState(148);
+ match(T__2);
+ setState(149);
stmt();
}
break;
@@ -1081,19 +1081,19 @@ public class KickCParser extends Parser {
_localctx = new StmtReturnContext(_localctx);
enterOuterAlt(_localctx, 8);
{
- setState(149);
- match(T__14);
setState(151);
+ match(T__14);
+ setState(153);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
- setState(150);
+ setState(152);
expr(0);
}
}
- setState(153);
+ setState(155);
match(T__8);
}
break;
@@ -1101,13 +1101,13 @@ public class KickCParser extends Parser {
_localctx = new StmtAsmContext(_localctx);
enterOuterAlt(_localctx, 9);
{
- setState(154);
- match(T__15);
- setState(155);
- match(T__3);
setState(156);
- asmLines();
+ match(T__15);
setState(157);
+ match(T__3);
+ setState(158);
+ asmLines();
+ setState(159);
match(T__4);
}
break;
@@ -1167,26 +1167,26 @@ public class KickCParser extends Parser {
_localctx = new ForDeclContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(162);
+ setState(164);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__18 || _la==SIMPLETYPE) {
{
- setState(161);
+ setState(163);
typeDecl(0);
}
}
- setState(164);
+ setState(166);
match(NAME);
- setState(167);
+ setState(169);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__7) {
{
- setState(165);
+ setState(167);
match(T__7);
- setState(166);
+ setState(168);
expr(0);
}
}
@@ -1264,36 +1264,36 @@ public class KickCParser extends Parser {
ForIterationContext _localctx = new ForIterationContext(_ctx, getState());
enterRule(_localctx, 24, RULE_forIteration);
try {
- setState(179);
+ setState(181);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__8:
_localctx = new ForClassicContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(169);
- match(T__8);
- setState(170);
- expr(0);
setState(171);
match(T__8);
setState(172);
expr(0);
+ setState(173);
+ match(T__8);
+ setState(174);
+ expr(0);
}
break;
case T__16:
_localctx = new ForRangeContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(174);
+ setState(176);
match(T__16);
- setState(175);
+ setState(177);
expr(0);
{
- setState(176);
+ setState(178);
match(T__17);
}
- setState(177);
+ setState(179);
expr(0);
}
break;
@@ -1415,7 +1415,7 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(185);
+ setState(187);
_errHandler.sync(this);
switch (_input.LA(1)) {
case SIMPLETYPE:
@@ -1424,7 +1424,7 @@ public class KickCParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(182);
+ setState(184);
match(SIMPLETYPE);
}
break;
@@ -1433,9 +1433,9 @@ public class KickCParser extends Parser {
_localctx = new TypeSignedSimpleContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(183);
+ setState(185);
match(T__18);
- setState(184);
+ setState(186);
match(SIMPLETYPE);
}
break;
@@ -1443,7 +1443,7 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
- setState(197);
+ setState(199);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,20,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -1451,16 +1451,16 @@ public class KickCParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(195);
+ setState(197);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) {
case 1:
{
_localctx = new TypePtrContext(new TypeDeclContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_typeDecl);
- setState(187);
+ setState(189);
if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)");
- setState(188);
+ setState(190);
match(T__19);
}
break;
@@ -1468,28 +1468,28 @@ public class KickCParser extends Parser {
{
_localctx = new TypeArrayContext(new TypeDeclContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_typeDecl);
- setState(189);
+ setState(191);
if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)");
- setState(190);
- match(T__20);
setState(192);
+ match(T__20);
+ setState(194);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
- setState(191);
+ setState(193);
expr(0);
}
}
- setState(194);
+ setState(196);
match(T__21);
}
break;
}
}
}
- setState(199);
+ setState(201);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,20,_ctx);
}
@@ -1844,7 +1844,7 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(240);
+ setState(242);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) {
case 1:
@@ -1853,11 +1853,11 @@ public class KickCParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(201);
- match(T__1);
- setState(202);
- expr(0);
setState(203);
+ match(T__1);
+ setState(204);
+ expr(0);
+ setState(205);
match(T__2);
}
break;
@@ -1866,21 +1866,21 @@ public class KickCParser extends Parser {
_localctx = new ExprCallContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(205);
+ setState(207);
match(NAME);
- setState(206);
- match(T__1);
setState(208);
+ match(T__1);
+ setState(210);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__1) | (1L << T__3) | (1L << T__19) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__33) | (1L << T__34) | (1L << STRING) | (1L << CHAR) | (1L << BOOLEAN) | (1L << NUMBER) | (1L << NAME))) != 0)) {
{
- setState(207);
+ setState(209);
parameterList();
}
}
- setState(210);
+ setState(212);
match(T__2);
}
break;
@@ -1889,13 +1889,13 @@ public class KickCParser extends Parser {
_localctx = new ExprCastContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(211);
- match(T__1);
- setState(212);
- typeDecl(0);
setState(213);
- match(T__2);
+ match(T__1);
setState(214);
+ typeDecl(0);
+ setState(215);
+ match(T__2);
+ setState(216);
expr(23);
}
break;
@@ -1904,7 +1904,7 @@ public class KickCParser extends Parser {
_localctx = new ExprPreModContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(216);
+ setState(218);
_la = _input.LA(1);
if ( !(_la==T__22 || _la==T__23) ) {
_errHandler.recoverInline(this);
@@ -1914,7 +1914,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(217);
+ setState(219);
expr(21);
}
break;
@@ -1923,9 +1923,9 @@ public class KickCParser extends Parser {
_localctx = new ExprPtrContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(218);
+ setState(220);
match(T__19);
- setState(219);
+ setState(221);
expr(19);
}
break;
@@ -1934,7 +1934,7 @@ public class KickCParser extends Parser {
_localctx = new ExprUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(220);
+ setState(222);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -1944,7 +1944,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(221);
+ setState(223);
expr(18);
}
break;
@@ -1953,7 +1953,7 @@ public class KickCParser extends Parser {
_localctx = new ExprUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(222);
+ setState(224);
_la = _input.LA(1);
if ( !(_la==T__33 || _la==T__34) ) {
_errHandler.recoverInline(this);
@@ -1963,7 +1963,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(223);
+ setState(225);
expr(14);
}
break;
@@ -1972,27 +1972,27 @@ public class KickCParser extends Parser {
_localctx = new InitListContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(224);
+ setState(226);
match(T__3);
- setState(225);
+ setState(227);
expr(0);
- setState(230);
+ setState(232);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__5) {
{
{
- setState(226);
+ setState(228);
match(T__5);
- setState(227);
+ setState(229);
expr(0);
}
}
- setState(232);
+ setState(234);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(233);
+ setState(235);
match(T__4);
}
break;
@@ -2001,7 +2001,7 @@ public class KickCParser extends Parser {
_localctx = new ExprIdContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(235);
+ setState(237);
match(NAME);
}
break;
@@ -2010,7 +2010,7 @@ public class KickCParser extends Parser {
_localctx = new ExprNumberContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(236);
+ setState(238);
match(NUMBER);
}
break;
@@ -2019,7 +2019,7 @@ public class KickCParser extends Parser {
_localctx = new ExprStringContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(237);
+ setState(239);
match(STRING);
}
break;
@@ -2028,7 +2028,7 @@ public class KickCParser extends Parser {
_localctx = new ExprCharContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(238);
+ setState(240);
match(CHAR);
}
break;
@@ -2037,13 +2037,13 @@ public class KickCParser extends Parser {
_localctx = new ExprBoolContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(239);
+ setState(241);
match(BOOLEAN);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(281);
+ setState(283);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,25,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
@@ -2051,16 +2051,16 @@ public class KickCParser extends Parser {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(279);
+ setState(281);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) {
case 1:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(242);
+ setState(244);
if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)");
- setState(243);
+ setState(245);
_la = _input.LA(1);
if ( !(_la==T__29 || _la==T__30) ) {
_errHandler.recoverInline(this);
@@ -2070,7 +2070,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(244);
+ setState(246);
expr(18);
}
break;
@@ -2078,9 +2078,9 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(245);
+ setState(247);
if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)");
- setState(246);
+ setState(248);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__19) | (1L << T__31) | (1L << T__32))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -2090,7 +2090,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(247);
+ setState(249);
expr(17);
}
break;
@@ -2098,9 +2098,9 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(248);
+ setState(250);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
- setState(249);
+ setState(251);
_la = _input.LA(1);
if ( !(_la==T__24 || _la==T__25) ) {
_errHandler.recoverInline(this);
@@ -2110,7 +2110,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(250);
+ setState(252);
expr(16);
}
break;
@@ -2118,9 +2118,9 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(251);
+ setState(253);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
- setState(252);
+ setState(254);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -2130,7 +2130,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(253);
+ setState(255);
expr(14);
}
break;
@@ -2138,13 +2138,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(254);
+ setState(256);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
{
- setState(255);
+ setState(257);
match(T__27);
}
- setState(256);
+ setState(258);
expr(13);
}
break;
@@ -2152,13 +2152,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(257);
+ setState(259);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
{
- setState(258);
+ setState(260);
match(T__42);
}
- setState(259);
+ setState(261);
expr(12);
}
break;
@@ -2166,13 +2166,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(260);
+ setState(262);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
{
- setState(261);
+ setState(263);
match(T__43);
}
- setState(262);
+ setState(264);
expr(11);
}
break;
@@ -2180,13 +2180,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(263);
+ setState(265);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
{
- setState(264);
+ setState(266);
match(T__44);
}
- setState(265);
+ setState(267);
expr(10);
}
break;
@@ -2194,13 +2194,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(266);
+ setState(268);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
{
- setState(267);
+ setState(269);
match(T__45);
}
- setState(268);
+ setState(270);
expr(9);
}
break;
@@ -2208,11 +2208,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(269);
- if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(270);
- match(T__7);
setState(271);
+ if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
+ setState(272);
+ match(T__7);
+ setState(273);
expr(7);
}
break;
@@ -2220,13 +2220,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(272);
- if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)");
- setState(273);
- match(T__20);
setState(274);
- expr(0);
+ if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)");
setState(275);
+ match(T__20);
+ setState(276);
+ expr(0);
+ setState(277);
match(T__21);
}
break;
@@ -2234,9 +2234,9 @@ public class KickCParser extends Parser {
{
_localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(277);
+ setState(279);
if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)");
- setState(278);
+ setState(280);
_la = _input.LA(1);
if ( !(_la==T__22 || _la==T__23) ) {
_errHandler.recoverInline(this);
@@ -2251,7 +2251,7 @@ public class KickCParser extends Parser {
}
}
}
- setState(283);
+ setState(285);
_errHandler.sync(this);
_alt = getInterpreter().adaptivePredict(_input,25,_ctx);
}
@@ -2301,21 +2301,21 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(284);
+ setState(286);
expr(0);
- setState(289);
+ setState(291);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__5) {
{
{
- setState(285);
+ setState(287);
match(T__5);
- setState(286);
+ setState(288);
expr(0);
}
}
- setState(291);
+ setState(293);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2365,17 +2365,17 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(295);
+ setState(297);
_errHandler.sync(this);
_la = _input.LA(1);
- while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << MNEMONIC) | (1L << NAME))) != 0)) {
+ while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__46) | (1L << MNEMONIC) | (1L << NAME))) != 0)) {
{
{
- setState(292);
+ setState(294);
asmLine();
}
}
- setState(297);
+ setState(299);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -2399,6 +2399,9 @@ public class KickCParser extends Parser {
public AsmInstructionContext asmInstruction() {
return getRuleContext(AsmInstructionContext.class,0);
}
+ public AsmBytesContext asmBytes() {
+ return getRuleContext(AsmBytesContext.class,0);
+ }
public AsmLineContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
}
@@ -2422,24 +2425,31 @@ public class KickCParser extends Parser {
AsmLineContext _localctx = new AsmLineContext(_ctx, getState());
enterRule(_localctx, 34, RULE_asmLine);
try {
- setState(300);
+ setState(303);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__26:
case NAME:
enterOuterAlt(_localctx, 1);
{
- setState(298);
+ setState(300);
asmLabel();
}
break;
case MNEMONIC:
enterOuterAlt(_localctx, 2);
{
- setState(299);
+ setState(301);
asmInstruction();
}
break;
+ case T__46:
+ enterOuterAlt(_localctx, 3);
+ {
+ setState(302);
+ asmBytes();
+ }
+ break;
default:
throw new NoViableAltException(this);
}
@@ -2480,24 +2490,24 @@ public class KickCParser extends Parser {
AsmLabelContext _localctx = new AsmLabelContext(_ctx, getState());
enterRule(_localctx, 36, RULE_asmLabel);
try {
- setState(306);
+ setState(309);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NAME:
enterOuterAlt(_localctx, 1);
{
- setState(302);
+ setState(305);
match(NAME);
- setState(303);
+ setState(306);
match(T__16);
}
break;
case T__26:
enterOuterAlt(_localctx, 2);
{
- setState(304);
+ setState(307);
match(T__26);
- setState(305);
+ setState(308);
match(T__16);
}
break;
@@ -2546,14 +2556,14 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(308);
+ setState(311);
match(MNEMONIC);
- setState(310);
+ setState(313);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) {
case 1:
{
- setState(309);
+ setState(312);
asmParamMode();
}
break;
@@ -2571,6 +2581,72 @@ public class KickCParser extends Parser {
return _localctx;
}
+ public static class AsmBytesContext extends ParserRuleContext {
+ public List asmExpr() {
+ return getRuleContexts(AsmExprContext.class);
+ }
+ public AsmExprContext asmExpr(int i) {
+ return getRuleContext(AsmExprContext.class,i);
+ }
+ public AsmBytesContext(ParserRuleContext parent, int invokingState) {
+ super(parent, invokingState);
+ }
+ @Override public int getRuleIndex() { return RULE_asmBytes; }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof KickCListener ) ((KickCListener)listener).enterAsmBytes(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof KickCListener ) ((KickCListener)listener).exitAsmBytes(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof KickCVisitor ) return ((KickCVisitor extends T>)visitor).visitAsmBytes(this);
+ else return visitor.visitChildren(this);
+ }
+ }
+
+ public final AsmBytesContext asmBytes() throws RecognitionException {
+ AsmBytesContext _localctx = new AsmBytesContext(_ctx, getState());
+ enterRule(_localctx, 40, RULE_asmBytes);
+ int _la;
+ try {
+ enterOuterAlt(_localctx, 1);
+ {
+ setState(315);
+ match(T__46);
+ setState(316);
+ asmExpr(0);
+ setState(321);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ while (_la==T__5) {
+ {
+ {
+ setState(317);
+ match(T__5);
+ setState(318);
+ asmExpr(0);
+ }
+ }
+ setState(323);
+ _errHandler.sync(this);
+ _la = _input.LA(1);
+ }
+ }
+ }
+ catch (RecognitionException re) {
+ _localctx.exception = re;
+ _errHandler.reportError(this, re);
+ _errHandler.recover(this, re);
+ }
+ finally {
+ exitRule();
+ }
+ return _localctx;
+ }
+
public static class AsmParamModeContext extends ParserRuleContext {
public AsmParamModeContext(ParserRuleContext parent, int invokingState) {
super(parent, invokingState);
@@ -2702,16 +2778,16 @@ public class KickCParser extends Parser {
public final AsmParamModeContext asmParamMode() throws RecognitionException {
AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState());
- enterRule(_localctx, 40, RULE_asmParamMode);
+ enterRule(_localctx, 42, RULE_asmParamMode);
try {
- setState(335);
+ setState(347);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) {
case 1:
_localctx = new AsmModeAbsContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(312);
+ setState(324);
asmExpr(0);
}
break;
@@ -2719,9 +2795,9 @@ public class KickCParser extends Parser {
_localctx = new AsmModeImmContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(313);
- match(T__46);
- setState(314);
+ setState(325);
+ match(T__47);
+ setState(326);
asmExpr(0);
}
break;
@@ -2729,11 +2805,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeAbsXYContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(315);
+ setState(327);
asmExpr(0);
- setState(316);
+ setState(328);
match(T__5);
- setState(317);
+ setState(329);
match(NAME);
}
break;
@@ -2741,15 +2817,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndIdxXYContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(319);
+ setState(331);
match(T__1);
- setState(320);
+ setState(332);
asmExpr(0);
- setState(321);
+ setState(333);
match(T__2);
- setState(322);
+ setState(334);
match(T__5);
- setState(323);
+ setState(335);
match(NAME);
}
break;
@@ -2757,15 +2833,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIdxIndXYContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(325);
+ setState(337);
match(T__1);
- setState(326);
+ setState(338);
asmExpr(0);
- setState(327);
+ setState(339);
match(T__5);
- setState(328);
+ setState(340);
match(NAME);
- setState(329);
+ setState(341);
match(T__2);
}
break;
@@ -2773,11 +2849,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(331);
+ setState(343);
match(T__1);
- setState(332);
+ setState(344);
asmExpr(0);
- setState(333);
+ setState(345);
match(T__2);
}
break;
@@ -2941,14 +3017,14 @@ public class KickCParser extends Parser {
int _parentState = getState();
AsmExprContext _localctx = new AsmExprContext(_ctx, _parentState);
AsmExprContext _prevctx = _localctx;
- int _startState = 42;
- enterRecursionRule(_localctx, 42, RULE_asmExpr, _p);
+ int _startState = 44;
+ enterRecursionRule(_localctx, 44, RULE_asmExpr, _p);
int _la;
try {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(347);
+ setState(359);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__24:
@@ -2960,7 +3036,7 @@ public class KickCParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(338);
+ setState(350);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__24) | (1L << T__25) | (1L << T__33) | (1L << T__34))) != 0)) ) {
_errHandler.recoverInline(this);
@@ -2970,7 +3046,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(339);
+ setState(351);
asmExpr(8);
}
break;
@@ -2979,7 +3055,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(340);
+ setState(352);
match(NAME);
}
break;
@@ -2988,7 +3064,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelRelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(341);
+ setState(353);
match(ASMREL);
}
break;
@@ -2997,11 +3073,11 @@ public class KickCParser extends Parser {
_localctx = new AsmExprReplaceContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(342);
+ setState(354);
match(T__3);
- setState(343);
+ setState(355);
match(NAME);
- setState(344);
+ setState(356);
match(T__4);
}
break;
@@ -3010,7 +3086,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprIntContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(345);
+ setState(357);
match(NUMBER);
}
break;
@@ -3019,7 +3095,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprCharContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(346);
+ setState(358);
match(CHAR);
}
break;
@@ -3027,24 +3103,24 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
- setState(357);
+ setState(369);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,34,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(355);
+ setState(367);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) {
case 1:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(349);
+ setState(361);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(350);
+ setState(362);
_la = _input.LA(1);
if ( !(_la==T__19 || _la==T__31) ) {
_errHandler.recoverInline(this);
@@ -3054,7 +3130,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(351);
+ setState(363);
asmExpr(8);
}
break;
@@ -3062,9 +3138,9 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(352);
+ setState(364);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(353);
+ setState(365);
_la = _input.LA(1);
if ( !(_la==T__24 || _la==T__25) ) {
_errHandler.recoverInline(this);
@@ -3074,16 +3150,16 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(354);
+ setState(366);
asmExpr(7);
}
break;
}
}
}
- setState(359);
+ setState(371);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,34,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,35,_ctx);
}
}
}
@@ -3104,7 +3180,7 @@ public class KickCParser extends Parser {
return typeDecl_sempred((TypeDeclContext)_localctx, predIndex);
case 14:
return expr_sempred((ExprContext)_localctx, predIndex);
- case 21:
+ case 22:
return asmExpr_sempred((AsmExprContext)_localctx, predIndex);
}
return true;
@@ -3158,142 +3234,147 @@ public class KickCParser extends Parser {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3D\u016b\4\2\t\2\4"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3E\u0177\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\3\2\3\2\3\2\3\2\3\3"+
- "\3\3\3\3\3\4\7\4\67\n\4\f\4\16\4:\13\4\3\5\3\5\3\5\3\6\6\6@\n\6\r\6\16"+
- "\6A\3\7\3\7\3\7\3\7\5\7H\n\7\3\7\3\7\3\7\5\7M\n\7\3\7\3\7\3\7\5\7R\n\7"+
- "\3\b\3\b\3\b\7\bW\n\b\f\b\16\bZ\13\b\3\t\3\t\3\t\3\n\5\n`\n\n\3\n\3\n"+
- "\3\n\3\n\5\nf\n\n\3\n\3\n\3\13\6\13k\n\13\r\13\16\13l\3\f\3\f\3\f\5\f"+
- "r\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\177\n\f\3\f\3\f"+
- "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u0092"+
- "\n\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u009a\n\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f"+
- "\u00a2\n\f\3\r\5\r\u00a5\n\r\3\r\3\r\3\r\5\r\u00aa\n\r\3\16\3\16\3\16"+
- "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u00b6\n\16\3\17\3\17\3\17\3\17"+
- "\5\17\u00bc\n\17\3\17\3\17\3\17\3\17\3\17\5\17\u00c3\n\17\3\17\7\17\u00c6"+
- "\n\17\f\17\16\17\u00c9\13\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5"+
- "\20\u00d3\n\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
- "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u00e7\n\20\f\20\16\20\u00ea\13"+
- "\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00f3\n\20\3\20\3\20\3\20"+
+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\3\2\3\2\3"+
+ "\2\3\2\3\3\3\3\3\3\3\4\7\49\n\4\f\4\16\4<\13\4\3\5\3\5\3\5\3\6\6\6B\n"+
+ "\6\r\6\16\6C\3\7\3\7\3\7\3\7\5\7J\n\7\3\7\3\7\3\7\5\7O\n\7\3\7\3\7\3\7"+
+ "\5\7T\n\7\3\b\3\b\3\b\7\bY\n\b\f\b\16\b\\\13\b\3\t\3\t\3\t\3\n\5\nb\n"+
+ "\n\3\n\3\n\3\n\3\n\5\nh\n\n\3\n\3\n\3\13\6\13m\n\13\r\13\16\13n\3\f\3"+
+ "\f\3\f\5\ft\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u0081"+
+ "\n\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3"+
+ "\f\5\f\u0094\n\f\3\f\3\f\3\f\3\f\3\f\3\f\5\f\u009c\n\f\3\f\3\f\3\f\3\f"+
+ "\3\f\3\f\5\f\u00a4\n\f\3\r\5\r\u00a7\n\r\3\r\3\r\3\r\5\r\u00ac\n\r\3\16"+
+ "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u00b8\n\16\3\17\3\17"+
+ "\3\17\3\17\5\17\u00be\n\17\3\17\3\17\3\17\3\17\3\17\5\17\u00c5\n\17\3"+
+ "\17\7\17\u00c8\n\17\f\17\16\17\u00cb\13\17\3\20\3\20\3\20\3\20\3\20\3"+
+ "\20\3\20\3\20\5\20\u00d5\n\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u00e9\n\20\f\20"+
+ "\16\20\u00ec\13\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00f5\n\20"+
"\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
"\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20"+
- "\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u011a\n\20\f\20\16\20\u011d\13\20"+
- "\3\21\3\21\3\21\7\21\u0122\n\21\f\21\16\21\u0125\13\21\3\22\7\22\u0128"+
- "\n\22\f\22\16\22\u012b\13\22\3\23\3\23\5\23\u012f\n\23\3\24\3\24\3\24"+
- "\3\24\5\24\u0135\n\24\3\25\3\25\5\25\u0139\n\25\3\26\3\26\3\26\3\26\3"+
- "\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3"+
- "\26\3\26\3\26\3\26\3\26\5\26\u0152\n\26\3\27\3\27\3\27\3\27\3\27\3\27"+
- "\3\27\3\27\3\27\3\27\5\27\u015e\n\27\3\27\3\27\3\27\3\27\3\27\3\27\7\27"+
- "\u0166\n\27\f\27\16\27\u0169\13\27\3\27\2\5\34\36,\30\2\4\6\b\n\f\16\20"+
- "\22\24\26\30\32\34\36 \"$&(*,\2\13\3\2\31\32\3\2\33\37\3\2$%\3\2 !\4\2"+
- "\26\26\"#\3\2\33\34\3\2$,\4\2\33\34$%\4\2\26\26\"\"\2\u019b\2.\3\2\2\2"+
- "\4\62\3\2\2\2\68\3\2\2\2\b;\3\2\2\2\n?\3\2\2\2\fQ\3\2\2\2\16S\3\2\2\2"+
- "\20[\3\2\2\2\22_\3\2\2\2\24j\3\2\2\2\26\u00a1\3\2\2\2\30\u00a4\3\2\2\2"+
- "\32\u00b5\3\2\2\2\34\u00bb\3\2\2\2\36\u00f2\3\2\2\2 \u011e\3\2\2\2\"\u0129"+
- "\3\2\2\2$\u012e\3\2\2\2&\u0134\3\2\2\2(\u0136\3\2\2\2*\u0151\3\2\2\2,"+
- "\u015d\3\2\2\2./\5\6\4\2/\60\5\n\6\2\60\61\7\2\2\3\61\3\3\2\2\2\62\63"+
- "\5\"\22\2\63\64\7\2\2\3\64\5\3\2\2\2\65\67\5\b\5\2\66\65\3\2\2\2\67:\3"+
- "\2\2\28\66\3\2\2\289\3\2\2\29\7\3\2\2\2:8\3\2\2\2;<\7\3\2\2<=\7\64\2\2"+
- "=\t\3\2\2\2>@\5\f\7\2?>\3\2\2\2@A\3\2\2\2A?\3\2\2\2AB\3\2\2\2B\13\3\2"+
- "\2\2CD\5\34\17\2DE\7@\2\2EG\7\4\2\2FH\5\16\b\2GF\3\2\2\2GH\3\2\2\2HI\3"+
- "\2\2\2IJ\7\5\2\2JL\7\6\2\2KM\5\24\13\2LK\3\2\2\2LM\3\2\2\2MN\3\2\2\2N"+
- "O\7\7\2\2OR\3\2\2\2PR\5\22\n\2QC\3\2\2\2QP\3\2\2\2R\r\3\2\2\2SX\5\20\t"+
- "\2TU\7\b\2\2UW\5\20\t\2VT\3\2\2\2WZ\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y\17\3"+
- "\2\2\2ZX\3\2\2\2[\\\5\34\17\2\\]\7@\2\2]\21\3\2\2\2^`\7\t\2\2_^\3\2\2"+
- "\2_`\3\2\2\2`a\3\2\2\2ab\5\34\17\2be\7@\2\2cd\7\n\2\2df\5\36\20\2ec\3"+
- "\2\2\2ef\3\2\2\2fg\3\2\2\2gh\7\13\2\2h\23\3\2\2\2ik\5\26\f\2ji\3\2\2\2"+
- "kl\3\2\2\2lj\3\2\2\2lm\3\2\2\2m\25\3\2\2\2n\u00a2\5\22\n\2oq\7\6\2\2p"+
- "r\5\24\13\2qp\3\2\2\2qr\3\2\2\2rs\3\2\2\2s\u00a2\7\7\2\2tu\5\36\20\2u"+
- "v\7\13\2\2v\u00a2\3\2\2\2wx\7\f\2\2xy\7\4\2\2yz\5\36\20\2z{\7\5\2\2{~"+
- "\5\26\f\2|}\7\r\2\2}\177\5\26\f\2~|\3\2\2\2~\177\3\2\2\2\177\u00a2\3\2"+
- "\2\2\u0080\u0081\7\16\2\2\u0081\u0082\7\4\2\2\u0082\u0083\5\36\20\2\u0083"+
- "\u0084\7\5\2\2\u0084\u0085\5\26\f\2\u0085\u00a2\3\2\2\2\u0086\u0087\7"+
- "\17\2\2\u0087\u0088\5\26\f\2\u0088\u0089\7\16\2\2\u0089\u008a\7\4\2\2"+
- "\u008a\u008b\5\36\20\2\u008b\u008c\7\5\2\2\u008c\u008d\7\13\2\2\u008d"+
- "\u00a2\3\2\2\2\u008e\u008f\7\20\2\2\u008f\u0091\7\4\2\2\u0090\u0092\5"+
- "\30\r\2\u0091\u0090\3\2\2\2\u0091\u0092\3\2\2\2\u0092\u0093\3\2\2\2\u0093"+
- "\u0094\5\32\16\2\u0094\u0095\7\5\2\2\u0095\u0096\5\26\f\2\u0096\u00a2"+
- "\3\2\2\2\u0097\u0099\7\21\2\2\u0098\u009a\5\36\20\2\u0099\u0098\3\2\2"+
- "\2\u0099\u009a\3\2\2\2\u009a\u009b\3\2\2\2\u009b\u00a2\7\13\2\2\u009c"+
- "\u009d\7\22\2\2\u009d\u009e\7\6\2\2\u009e\u009f\5\"\22\2\u009f\u00a0\7"+
- "\7\2\2\u00a0\u00a2\3\2\2\2\u00a1n\3\2\2\2\u00a1o\3\2\2\2\u00a1t\3\2\2"+
- "\2\u00a1w\3\2\2\2\u00a1\u0080\3\2\2\2\u00a1\u0086\3\2\2\2\u00a1\u008e"+
- "\3\2\2\2\u00a1\u0097\3\2\2\2\u00a1\u009c\3\2\2\2\u00a2\27\3\2\2\2\u00a3"+
- "\u00a5\5\34\17\2\u00a4\u00a3\3\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a6\3"+
- "\2\2\2\u00a6\u00a9\7@\2\2\u00a7\u00a8\7\n\2\2\u00a8\u00aa\5\36\20\2\u00a9"+
- "\u00a7\3\2\2\2\u00a9\u00aa\3\2\2\2\u00aa\31\3\2\2\2\u00ab\u00ac\7\13\2"+
- "\2\u00ac\u00ad\5\36\20\2\u00ad\u00ae\7\13\2\2\u00ae\u00af\5\36\20\2\u00af"+
- "\u00b6\3\2\2\2\u00b0\u00b1\7\23\2\2\u00b1\u00b2\5\36\20\2\u00b2\u00b3"+
- "\7\24\2\2\u00b3\u00b4\5\36\20\2\u00b4\u00b6\3\2\2\2\u00b5\u00ab\3\2\2"+
- "\2\u00b5\u00b0\3\2\2\2\u00b6\33\3\2\2\2\u00b7\u00b8\b\17\1\2\u00b8\u00bc"+
- "\7\63\2\2\u00b9\u00ba\7\25\2\2\u00ba\u00bc\7\63\2\2\u00bb\u00b7\3\2\2"+
- "\2\u00bb\u00b9\3\2\2\2\u00bc\u00c7\3\2\2\2\u00bd\u00be\f\4\2\2\u00be\u00c6"+
- "\7\26\2\2\u00bf\u00c0\f\3\2\2\u00c0\u00c2\7\27\2\2\u00c1\u00c3\5\36\20"+
- "\2\u00c2\u00c1\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4\u00c6"+
- "\7\30\2\2\u00c5\u00bd\3\2\2\2\u00c5\u00bf\3\2\2\2\u00c6\u00c9\3\2\2\2"+
- "\u00c7\u00c5\3\2\2\2\u00c7\u00c8\3\2\2\2\u00c8\35\3\2\2\2\u00c9\u00c7"+
- "\3\2\2\2\u00ca\u00cb\b\20\1\2\u00cb\u00cc\7\4\2\2\u00cc\u00cd\5\36\20"+
- "\2\u00cd\u00ce\7\5\2\2\u00ce\u00f3\3\2\2\2\u00cf\u00d0\7@\2\2\u00d0\u00d2"+
- "\7\4\2\2\u00d1\u00d3\5 \21\2\u00d2\u00d1\3\2\2\2\u00d2\u00d3\3\2\2\2\u00d3"+
- "\u00d4\3\2\2\2\u00d4\u00f3\7\5\2\2\u00d5\u00d6\7\4\2\2\u00d6\u00d7\5\34"+
- "\17\2\u00d7\u00d8\7\5\2\2\u00d8\u00d9\5\36\20\31\u00d9\u00f3\3\2\2\2\u00da"+
- "\u00db\t\2\2\2\u00db\u00f3\5\36\20\27\u00dc\u00dd\7\26\2\2\u00dd\u00f3"+
- "\5\36\20\25\u00de\u00df\t\3\2\2\u00df\u00f3\5\36\20\24\u00e0\u00e1\t\4"+
- "\2\2\u00e1\u00f3\5\36\20\20\u00e2\u00e3\7\6\2\2\u00e3\u00e8\5\36\20\2"+
- "\u00e4\u00e5\7\b\2\2\u00e5\u00e7\5\36\20\2\u00e6\u00e4\3\2\2\2\u00e7\u00ea"+
- "\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u00eb\3\2\2\2\u00ea"+
- "\u00e8\3\2\2\2\u00eb\u00ec\7\7\2\2\u00ec\u00f3\3\2\2\2\u00ed\u00f3\7@"+
- "\2\2\u00ee\u00f3\7\67\2\2\u00ef\u00f3\7\64\2\2\u00f0\u00f3\7\65\2\2\u00f1"+
- "\u00f3\7\66\2\2\u00f2\u00ca\3\2\2\2\u00f2\u00cf\3\2\2\2\u00f2\u00d5\3"+
- "\2\2\2\u00f2\u00da\3\2\2\2\u00f2\u00dc\3\2\2\2\u00f2\u00de\3\2\2\2\u00f2"+
- "\u00e0\3\2\2\2\u00f2\u00e2\3\2\2\2\u00f2\u00ed\3\2\2\2\u00f2\u00ee\3\2"+
- "\2\2\u00f2\u00ef\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f2\u00f1\3\2\2\2\u00f3"+
- "\u011b\3\2\2\2\u00f4\u00f5\f\23\2\2\u00f5\u00f6\t\5\2\2\u00f6\u011a\5"+
- "\36\20\24\u00f7\u00f8\f\22\2\2\u00f8\u00f9\t\6\2\2\u00f9\u011a\5\36\20"+
- "\23\u00fa\u00fb\f\21\2\2\u00fb\u00fc\t\7\2\2\u00fc\u011a\5\36\20\22\u00fd"+
- "\u00fe\f\17\2\2\u00fe\u00ff\t\b\2\2\u00ff\u011a\5\36\20\20\u0100\u0101"+
- "\f\16\2\2\u0101\u0102\7\36\2\2\u0102\u011a\5\36\20\17\u0103\u0104\f\r"+
- "\2\2\u0104\u0105\7-\2\2\u0105\u011a\5\36\20\16\u0106\u0107\f\f\2\2\u0107"+
- "\u0108\7.\2\2\u0108\u011a\5\36\20\r\u0109\u010a\f\13\2\2\u010a\u010b\7"+
- "/\2\2\u010b\u011a\5\36\20\f\u010c\u010d\f\n\2\2\u010d\u010e\7\60\2\2\u010e"+
- "\u011a\5\36\20\13\u010f\u0110\f\t\2\2\u0110\u0111\7\n\2\2\u0111\u011a"+
- "\5\36\20\t\u0112\u0113\f\30\2\2\u0113\u0114\7\27\2\2\u0114\u0115\5\36"+
- "\20\2\u0115\u0116\7\30\2\2\u0116\u011a\3\2\2\2\u0117\u0118\f\26\2\2\u0118"+
- "\u011a\t\2\2\2\u0119\u00f4\3\2\2\2\u0119\u00f7\3\2\2\2\u0119\u00fa\3\2"+
- "\2\2\u0119\u00fd\3\2\2\2\u0119\u0100\3\2\2\2\u0119\u0103\3\2\2\2\u0119"+
- "\u0106\3\2\2\2\u0119\u0109\3\2\2\2\u0119\u010c\3\2\2\2\u0119\u010f\3\2"+
- "\2\2\u0119\u0112\3\2\2\2\u0119\u0117\3\2\2\2\u011a\u011d\3\2\2\2\u011b"+
- "\u0119\3\2\2\2\u011b\u011c\3\2\2\2\u011c\37\3\2\2\2\u011d\u011b\3\2\2"+
- "\2\u011e\u0123\5\36\20\2\u011f\u0120\7\b\2\2\u0120\u0122\5\36\20\2\u0121"+
- "\u011f\3\2\2\2\u0122\u0125\3\2\2\2\u0123\u0121\3\2\2\2\u0123\u0124\3\2"+
- "\2\2\u0124!\3\2\2\2\u0125\u0123\3\2\2\2\u0126\u0128\5$\23\2\u0127\u0126"+
- "\3\2\2\2\u0128\u012b\3\2\2\2\u0129\u0127\3\2\2\2\u0129\u012a\3\2\2\2\u012a"+
- "#\3\2\2\2\u012b\u0129\3\2\2\2\u012c\u012f\5&\24\2\u012d\u012f\5(\25\2"+
- "\u012e\u012c\3\2\2\2\u012e\u012d\3\2\2\2\u012f%\3\2\2\2\u0130\u0131\7"+
- "@\2\2\u0131\u0135\7\23\2\2\u0132\u0133\7\35\2\2\u0133\u0135\7\23\2\2\u0134"+
- "\u0130\3\2\2\2\u0134\u0132\3\2\2\2\u0135\'\3\2\2\2\u0136\u0138\7\62\2"+
- "\2\u0137\u0139\5*\26\2\u0138\u0137\3\2\2\2\u0138\u0139\3\2\2\2\u0139)"+
- "\3\2\2\2\u013a\u0152\5,\27\2\u013b\u013c\7\61\2\2\u013c\u0152\5,\27\2"+
- "\u013d\u013e\5,\27\2\u013e\u013f\7\b\2\2\u013f\u0140\7@\2\2\u0140\u0152"+
- "\3\2\2\2\u0141\u0142\7\4\2\2\u0142\u0143\5,\27\2\u0143\u0144\7\5\2\2\u0144"+
- "\u0145\7\b\2\2\u0145\u0146\7@\2\2\u0146\u0152\3\2\2\2\u0147\u0148\7\4"+
- "\2\2\u0148\u0149\5,\27\2\u0149\u014a\7\b\2\2\u014a\u014b\7@\2\2\u014b"+
- "\u014c\7\5\2\2\u014c\u0152\3\2\2\2\u014d\u014e\7\4\2\2\u014e\u014f\5,"+
- "\27\2\u014f\u0150\7\5\2\2\u0150\u0152\3\2\2\2\u0151\u013a\3\2\2\2\u0151"+
- "\u013b\3\2\2\2\u0151\u013d\3\2\2\2\u0151\u0141\3\2\2\2\u0151\u0147\3\2"+
- "\2\2\u0151\u014d\3\2\2\2\u0152+\3\2\2\2\u0153\u0154\b\27\1\2\u0154\u0155"+
- "\t\t\2\2\u0155\u015e\5,\27\n\u0156\u015e\7@\2\2\u0157\u015e\7A\2\2\u0158"+
- "\u0159\7\6\2\2\u0159\u015a\7@\2\2\u015a\u015e\7\7\2\2\u015b\u015e\7\67"+
- "\2\2\u015c\u015e\7\65\2\2\u015d\u0153\3\2\2\2\u015d\u0156\3\2\2\2\u015d"+
- "\u0157\3\2\2\2\u015d\u0158\3\2\2\2\u015d\u015b\3\2\2\2\u015d\u015c\3\2"+
- "\2\2\u015e\u0167\3\2\2\2\u015f\u0160\f\t\2\2\u0160\u0161\t\n\2\2\u0161"+
- "\u0166\5,\27\n\u0162\u0163\f\b\2\2\u0163\u0164\t\7\2\2\u0164\u0166\5,"+
- "\27\t\u0165\u015f\3\2\2\2\u0165\u0162\3\2\2\2\u0166\u0169\3\2\2\2\u0167"+
- "\u0165\3\2\2\2\u0167\u0168\3\2\2\2\u0168-\3\2\2\2\u0169\u0167\3\2\2\2"+
- "%8AGLQX_elq~\u0091\u0099\u00a1\u00a4\u00a9\u00b5\u00bb\u00c2\u00c5\u00c7"+
- "\u00d2\u00e8\u00f2\u0119\u011b\u0123\u0129\u012e\u0134\u0138\u0151\u015d"+
- "\u0165\u0167";
+ "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\7\20\u011c\n\20\f\20\16"+
+ "\20\u011f\13\20\3\21\3\21\3\21\7\21\u0124\n\21\f\21\16\21\u0127\13\21"+
+ "\3\22\7\22\u012a\n\22\f\22\16\22\u012d\13\22\3\23\3\23\3\23\5\23\u0132"+
+ "\n\23\3\24\3\24\3\24\3\24\5\24\u0138\n\24\3\25\3\25\5\25\u013c\n\25\3"+
+ "\26\3\26\3\26\3\26\7\26\u0142\n\26\f\26\16\26\u0145\13\26\3\27\3\27\3"+
+ "\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3"+
+ "\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u015e\n\27\3\30\3\30\3\30\3\30"+
+ "\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u016a\n\30\3\30\3\30\3\30\3\30\3\30"+
+ "\3\30\7\30\u0172\n\30\f\30\16\30\u0175\13\30\3\30\2\5\34\36.\31\2\4\6"+
+ "\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\2\13\3\2\31\32\3\2\33\37\3"+
+ "\2$%\3\2 !\4\2\26\26\"#\3\2\33\34\3\2$,\4\2\33\34$%\4\2\26\26\"\"\2\u01a8"+
+ "\2\60\3\2\2\2\4\64\3\2\2\2\6:\3\2\2\2\b=\3\2\2\2\nA\3\2\2\2\fS\3\2\2\2"+
+ "\16U\3\2\2\2\20]\3\2\2\2\22a\3\2\2\2\24l\3\2\2\2\26\u00a3\3\2\2\2\30\u00a6"+
+ "\3\2\2\2\32\u00b7\3\2\2\2\34\u00bd\3\2\2\2\36\u00f4\3\2\2\2 \u0120\3\2"+
+ "\2\2\"\u012b\3\2\2\2$\u0131\3\2\2\2&\u0137\3\2\2\2(\u0139\3\2\2\2*\u013d"+
+ "\3\2\2\2,\u015d\3\2\2\2.\u0169\3\2\2\2\60\61\5\6\4\2\61\62\5\n\6\2\62"+
+ "\63\7\2\2\3\63\3\3\2\2\2\64\65\5\"\22\2\65\66\7\2\2\3\66\5\3\2\2\2\67"+
+ "9\5\b\5\28\67\3\2\2\29<\3\2\2\2:8\3\2\2\2:;\3\2\2\2;\7\3\2\2\2<:\3\2\2"+
+ "\2=>\7\3\2\2>?\7\65\2\2?\t\3\2\2\2@B\5\f\7\2A@\3\2\2\2BC\3\2\2\2CA\3\2"+
+ "\2\2CD\3\2\2\2D\13\3\2\2\2EF\5\34\17\2FG\7A\2\2GI\7\4\2\2HJ\5\16\b\2I"+
+ "H\3\2\2\2IJ\3\2\2\2JK\3\2\2\2KL\7\5\2\2LN\7\6\2\2MO\5\24\13\2NM\3\2\2"+
+ "\2NO\3\2\2\2OP\3\2\2\2PQ\7\7\2\2QT\3\2\2\2RT\5\22\n\2SE\3\2\2\2SR\3\2"+
+ "\2\2T\r\3\2\2\2UZ\5\20\t\2VW\7\b\2\2WY\5\20\t\2XV\3\2\2\2Y\\\3\2\2\2Z"+
+ "X\3\2\2\2Z[\3\2\2\2[\17\3\2\2\2\\Z\3\2\2\2]^\5\34\17\2^_\7A\2\2_\21\3"+
+ "\2\2\2`b\7\t\2\2a`\3\2\2\2ab\3\2\2\2bc\3\2\2\2cd\5\34\17\2dg\7A\2\2ef"+
+ "\7\n\2\2fh\5\36\20\2ge\3\2\2\2gh\3\2\2\2hi\3\2\2\2ij\7\13\2\2j\23\3\2"+
+ "\2\2km\5\26\f\2lk\3\2\2\2mn\3\2\2\2nl\3\2\2\2no\3\2\2\2o\25\3\2\2\2p\u00a4"+
+ "\5\22\n\2qs\7\6\2\2rt\5\24\13\2sr\3\2\2\2st\3\2\2\2tu\3\2\2\2u\u00a4\7"+
+ "\7\2\2vw\5\36\20\2wx\7\13\2\2x\u00a4\3\2\2\2yz\7\f\2\2z{\7\4\2\2{|\5\36"+
+ "\20\2|}\7\5\2\2}\u0080\5\26\f\2~\177\7\r\2\2\177\u0081\5\26\f\2\u0080"+
+ "~\3\2\2\2\u0080\u0081\3\2\2\2\u0081\u00a4\3\2\2\2\u0082\u0083\7\16\2\2"+
+ "\u0083\u0084\7\4\2\2\u0084\u0085\5\36\20\2\u0085\u0086\7\5\2\2\u0086\u0087"+
+ "\5\26\f\2\u0087\u00a4\3\2\2\2\u0088\u0089\7\17\2\2\u0089\u008a\5\26\f"+
+ "\2\u008a\u008b\7\16\2\2\u008b\u008c\7\4\2\2\u008c\u008d\5\36\20\2\u008d"+
+ "\u008e\7\5\2\2\u008e\u008f\7\13\2\2\u008f\u00a4\3\2\2\2\u0090\u0091\7"+
+ "\20\2\2\u0091\u0093\7\4\2\2\u0092\u0094\5\30\r\2\u0093\u0092\3\2\2\2\u0093"+
+ "\u0094\3\2\2\2\u0094\u0095\3\2\2\2\u0095\u0096\5\32\16\2\u0096\u0097\7"+
+ "\5\2\2\u0097\u0098\5\26\f\2\u0098\u00a4\3\2\2\2\u0099\u009b\7\21\2\2\u009a"+
+ "\u009c\5\36\20\2\u009b\u009a\3\2\2\2\u009b\u009c\3\2\2\2\u009c\u009d\3"+
+ "\2\2\2\u009d\u00a4\7\13\2\2\u009e\u009f\7\22\2\2\u009f\u00a0\7\6\2\2\u00a0"+
+ "\u00a1\5\"\22\2\u00a1\u00a2\7\7\2\2\u00a2\u00a4\3\2\2\2\u00a3p\3\2\2\2"+
+ "\u00a3q\3\2\2\2\u00a3v\3\2\2\2\u00a3y\3\2\2\2\u00a3\u0082\3\2\2\2\u00a3"+
+ "\u0088\3\2\2\2\u00a3\u0090\3\2\2\2\u00a3\u0099\3\2\2\2\u00a3\u009e\3\2"+
+ "\2\2\u00a4\27\3\2\2\2\u00a5\u00a7\5\34\17\2\u00a6\u00a5\3\2\2\2\u00a6"+
+ "\u00a7\3\2\2\2\u00a7\u00a8\3\2\2\2\u00a8\u00ab\7A\2\2\u00a9\u00aa\7\n"+
+ "\2\2\u00aa\u00ac\5\36\20\2\u00ab\u00a9\3\2\2\2\u00ab\u00ac\3\2\2\2\u00ac"+
+ "\31\3\2\2\2\u00ad\u00ae\7\13\2\2\u00ae\u00af\5\36\20\2\u00af\u00b0\7\13"+
+ "\2\2\u00b0\u00b1\5\36\20\2\u00b1\u00b8\3\2\2\2\u00b2\u00b3\7\23\2\2\u00b3"+
+ "\u00b4\5\36\20\2\u00b4\u00b5\7\24\2\2\u00b5\u00b6\5\36\20\2\u00b6\u00b8"+
+ "\3\2\2\2\u00b7\u00ad\3\2\2\2\u00b7\u00b2\3\2\2\2\u00b8\33\3\2\2\2\u00b9"+
+ "\u00ba\b\17\1\2\u00ba\u00be\7\64\2\2\u00bb\u00bc\7\25\2\2\u00bc\u00be"+
+ "\7\64\2\2\u00bd\u00b9\3\2\2\2\u00bd\u00bb\3\2\2\2\u00be\u00c9\3\2\2\2"+
+ "\u00bf\u00c0\f\4\2\2\u00c0\u00c8\7\26\2\2\u00c1\u00c2\f\3\2\2\u00c2\u00c4"+
+ "\7\27\2\2\u00c3\u00c5\5\36\20\2\u00c4\u00c3\3\2\2\2\u00c4\u00c5\3\2\2"+
+ "\2\u00c5\u00c6\3\2\2\2\u00c6\u00c8\7\30\2\2\u00c7\u00bf\3\2\2\2\u00c7"+
+ "\u00c1\3\2\2\2\u00c8\u00cb\3\2\2\2\u00c9\u00c7\3\2\2\2\u00c9\u00ca\3\2"+
+ "\2\2\u00ca\35\3\2\2\2\u00cb\u00c9\3\2\2\2\u00cc\u00cd\b\20\1\2\u00cd\u00ce"+
+ "\7\4\2\2\u00ce\u00cf\5\36\20\2\u00cf\u00d0\7\5\2\2\u00d0\u00f5\3\2\2\2"+
+ "\u00d1\u00d2\7A\2\2\u00d2\u00d4\7\4\2\2\u00d3\u00d5\5 \21\2\u00d4\u00d3"+
+ "\3\2\2\2\u00d4\u00d5\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00f5\7\5\2\2\u00d7"+
+ "\u00d8\7\4\2\2\u00d8\u00d9\5\34\17\2\u00d9\u00da\7\5\2\2\u00da\u00db\5"+
+ "\36\20\31\u00db\u00f5\3\2\2\2\u00dc\u00dd\t\2\2\2\u00dd\u00f5\5\36\20"+
+ "\27\u00de\u00df\7\26\2\2\u00df\u00f5\5\36\20\25\u00e0\u00e1\t\3\2\2\u00e1"+
+ "\u00f5\5\36\20\24\u00e2\u00e3\t\4\2\2\u00e3\u00f5\5\36\20\20\u00e4\u00e5"+
+ "\7\6\2\2\u00e5\u00ea\5\36\20\2\u00e6\u00e7\7\b\2\2\u00e7\u00e9\5\36\20"+
+ "\2\u00e8\u00e6\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea\u00eb"+
+ "\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\7\2\2\u00ee"+
+ "\u00f5\3\2\2\2\u00ef\u00f5\7A\2\2\u00f0\u00f5\78\2\2\u00f1\u00f5\7\65"+
+ "\2\2\u00f2\u00f5\7\66\2\2\u00f3\u00f5\7\67\2\2\u00f4\u00cc\3\2\2\2\u00f4"+
+ "\u00d1\3\2\2\2\u00f4\u00d7\3\2\2\2\u00f4\u00dc\3\2\2\2\u00f4\u00de\3\2"+
+ "\2\2\u00f4\u00e0\3\2\2\2\u00f4\u00e2\3\2\2\2\u00f4\u00e4\3\2\2\2\u00f4"+
+ "\u00ef\3\2\2\2\u00f4\u00f0\3\2\2\2\u00f4\u00f1\3\2\2\2\u00f4\u00f2\3\2"+
+ "\2\2\u00f4\u00f3\3\2\2\2\u00f5\u011d\3\2\2\2\u00f6\u00f7\f\23\2\2\u00f7"+
+ "\u00f8\t\5\2\2\u00f8\u011c\5\36\20\24\u00f9\u00fa\f\22\2\2\u00fa\u00fb"+
+ "\t\6\2\2\u00fb\u011c\5\36\20\23\u00fc\u00fd\f\21\2\2\u00fd\u00fe\t\7\2"+
+ "\2\u00fe\u011c\5\36\20\22\u00ff\u0100\f\17\2\2\u0100\u0101\t\b\2\2\u0101"+
+ "\u011c\5\36\20\20\u0102\u0103\f\16\2\2\u0103\u0104\7\36\2\2\u0104\u011c"+
+ "\5\36\20\17\u0105\u0106\f\r\2\2\u0106\u0107\7-\2\2\u0107\u011c\5\36\20"+
+ "\16\u0108\u0109\f\f\2\2\u0109\u010a\7.\2\2\u010a\u011c\5\36\20\r\u010b"+
+ "\u010c\f\13\2\2\u010c\u010d\7/\2\2\u010d\u011c\5\36\20\f\u010e\u010f\f"+
+ "\n\2\2\u010f\u0110\7\60\2\2\u0110\u011c\5\36\20\13\u0111\u0112\f\t\2\2"+
+ "\u0112\u0113\7\n\2\2\u0113\u011c\5\36\20\t\u0114\u0115\f\30\2\2\u0115"+
+ "\u0116\7\27\2\2\u0116\u0117\5\36\20\2\u0117\u0118\7\30\2\2\u0118\u011c"+
+ "\3\2\2\2\u0119\u011a\f\26\2\2\u011a\u011c\t\2\2\2\u011b\u00f6\3\2\2\2"+
+ "\u011b\u00f9\3\2\2\2\u011b\u00fc\3\2\2\2\u011b\u00ff\3\2\2\2\u011b\u0102"+
+ "\3\2\2\2\u011b\u0105\3\2\2\2\u011b\u0108\3\2\2\2\u011b\u010b\3\2\2\2\u011b"+
+ "\u010e\3\2\2\2\u011b\u0111\3\2\2\2\u011b\u0114\3\2\2\2\u011b\u0119\3\2"+
+ "\2\2\u011c\u011f\3\2\2\2\u011d\u011b\3\2\2\2\u011d\u011e\3\2\2\2\u011e"+
+ "\37\3\2\2\2\u011f\u011d\3\2\2\2\u0120\u0125\5\36\20\2\u0121\u0122\7\b"+
+ "\2\2\u0122\u0124\5\36\20\2\u0123\u0121\3\2\2\2\u0124\u0127\3\2\2\2\u0125"+
+ "\u0123\3\2\2\2\u0125\u0126\3\2\2\2\u0126!\3\2\2\2\u0127\u0125\3\2\2\2"+
+ "\u0128\u012a\5$\23\2\u0129\u0128\3\2\2\2\u012a\u012d\3\2\2\2\u012b\u0129"+
+ "\3\2\2\2\u012b\u012c\3\2\2\2\u012c#\3\2\2\2\u012d\u012b\3\2\2\2\u012e"+
+ "\u0132\5&\24\2\u012f\u0132\5(\25\2\u0130\u0132\5*\26\2\u0131\u012e\3\2"+
+ "\2\2\u0131\u012f\3\2\2\2\u0131\u0130\3\2\2\2\u0132%\3\2\2\2\u0133\u0134"+
+ "\7A\2\2\u0134\u0138\7\23\2\2\u0135\u0136\7\35\2\2\u0136\u0138\7\23\2\2"+
+ "\u0137\u0133\3\2\2\2\u0137\u0135\3\2\2\2\u0138\'\3\2\2\2\u0139\u013b\7"+
+ "\63\2\2\u013a\u013c\5,\27\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c"+
+ ")\3\2\2\2\u013d\u013e\7\61\2\2\u013e\u0143\5.\30\2\u013f\u0140\7\b\2\2"+
+ "\u0140\u0142\5.\30\2\u0141\u013f\3\2\2\2\u0142\u0145\3\2\2\2\u0143\u0141"+
+ "\3\2\2\2\u0143\u0144\3\2\2\2\u0144+\3\2\2\2\u0145\u0143\3\2\2\2\u0146"+
+ "\u015e\5.\30\2\u0147\u0148\7\62\2\2\u0148\u015e\5.\30\2\u0149\u014a\5"+
+ ".\30\2\u014a\u014b\7\b\2\2\u014b\u014c\7A\2\2\u014c\u015e\3\2\2\2\u014d"+
+ "\u014e\7\4\2\2\u014e\u014f\5.\30\2\u014f\u0150\7\5\2\2\u0150\u0151\7\b"+
+ "\2\2\u0151\u0152\7A\2\2\u0152\u015e\3\2\2\2\u0153\u0154\7\4\2\2\u0154"+
+ "\u0155\5.\30\2\u0155\u0156\7\b\2\2\u0156\u0157\7A\2\2\u0157\u0158\7\5"+
+ "\2\2\u0158\u015e\3\2\2\2\u0159\u015a\7\4\2\2\u015a\u015b\5.\30\2\u015b"+
+ "\u015c\7\5\2\2\u015c\u015e\3\2\2\2\u015d\u0146\3\2\2\2\u015d\u0147\3\2"+
+ "\2\2\u015d\u0149\3\2\2\2\u015d\u014d\3\2\2\2\u015d\u0153\3\2\2\2\u015d"+
+ "\u0159\3\2\2\2\u015e-\3\2\2\2\u015f\u0160\b\30\1\2\u0160\u0161\t\t\2\2"+
+ "\u0161\u016a\5.\30\n\u0162\u016a\7A\2\2\u0163\u016a\7B\2\2\u0164\u0165"+
+ "\7\6\2\2\u0165\u0166\7A\2\2\u0166\u016a\7\7\2\2\u0167\u016a\78\2\2\u0168"+
+ "\u016a\7\66\2\2\u0169\u015f\3\2\2\2\u0169\u0162\3\2\2\2\u0169\u0163\3"+
+ "\2\2\2\u0169\u0164\3\2\2\2\u0169\u0167\3\2\2\2\u0169\u0168\3\2\2\2\u016a"+
+ "\u0173\3\2\2\2\u016b\u016c\f\t\2\2\u016c\u016d\t\n\2\2\u016d\u0172\5."+
+ "\30\n\u016e\u016f\f\b\2\2\u016f\u0170\t\7\2\2\u0170\u0172\5.\30\t\u0171"+
+ "\u016b\3\2\2\2\u0171\u016e\3\2\2\2\u0172\u0175\3\2\2\2\u0173\u0171\3\2"+
+ "\2\2\u0173\u0174\3\2\2\2\u0174/\3\2\2\2\u0175\u0173\3\2\2\2&:CINSZagn"+
+ "s\u0080\u0093\u009b\u00a3\u00a6\u00ab\u00b7\u00bd\u00c4\u00c7\u00c9\u00d4"+
+ "\u00ea\u00f4\u011b\u011d\u0125\u012b\u0131\u0137\u013b\u0143\u015d\u0169"+
+ "\u0171\u0173";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
index 16ee589c2..2ecf652b3 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
@@ -332,6 +332,12 @@ public interface KickCVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitAsmInstruction(KickCParser.AsmInstructionContext ctx);
+ /**
+ * Visit a parse tree produced by {@link KickCParser#asmBytes}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitAsmBytes(KickCParser.AsmBytesContext ctx);
/**
* Visit a parse tree produced by the {@code asmModeAbs}
* labeled alternative in {@link KickCParser#asmParamMode}.
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1ExtractInlineStrings.java b/src/main/java/dk/camelot64/kickc/passes/Pass1ExtractInlineStrings.java
index 1e57f484e..d9e853f3f 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass1ExtractInlineStrings.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass1ExtractInlineStrings.java
@@ -40,17 +40,6 @@ public class Pass1ExtractInlineStrings extends Pass1Base {
return false;
}
- private void execute(ValueReplacer.ReplaceableValue replaceable, Scope blockScope, String nameHint) {
- RValue value = replaceable.get();
- if(value instanceof ConstantString) {
- ConstantVar strConst = createStringConstantVar(blockScope, (ConstantString) replaceable.get(), nameHint);
- replaceable.set(strConst.getRef());
- }
- for (ValueReplacer.ReplaceableValue subValue : replaceable.getSubValues()) {
- execute(subValue, blockScope, nameHint);
- }
- }
-
private ConstantVar createStringConstantVar(Scope blockScope, ConstantString constantString, String nameHint) {
String name;
if (nameHint == null) {
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java b/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java
index 4e5c62196..21fd29dcc 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass5AsmOptimization.java
@@ -30,6 +30,10 @@ public abstract class Pass5AsmOptimization {
*/
public abstract boolean optimize();
+ public Program getProgram() {
+ return program;
+ }
+
public AsmProgram getAsmProgram() {
return program.getAsm();
}
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass5UnusedLabelElimination.java b/src/main/java/dk/camelot64/kickc/passes/Pass5UnusedLabelElimination.java
index c52a8f63c..e2c4a0c4e 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass5UnusedLabelElimination.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass5UnusedLabelElimination.java
@@ -2,6 +2,8 @@ package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.asm.*;
import dk.camelot64.kickc.model.Program;
+import dk.camelot64.kickc.model.Statement;
+import dk.camelot64.kickc.model.StatementAsm;
import java.util.ArrayList;
import java.util.LinkedHashSet;
@@ -37,6 +39,14 @@ public class Pass5UnusedLabelElimination extends Pass5AsmOptimization {
}
List removeLines = new ArrayList<>();
for (AsmSegment segment : getAsmProgram().getSegments()) {
+ Integer statementIdx = segment.getStatementIdx();
+ if(statementIdx!=null) {
+ Statement statement = getProgram().getStatementInfos().getStatement(statementIdx);
+ if(statement instanceof StatementAsm) {
+ // Skip ASM statement
+ continue;
+ }
+ }
for (AsmLine line : segment.getLines()) {
if(line instanceof AsmScopeBegin) {
currentScope = ((AsmScopeBegin) line).getLabel();
diff --git a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java
index 2aaf3eb49..02224c438 100644
--- a/src/main/java/dk/camelot64/kickc/test/TestPrograms.java
+++ b/src/main/java/dk/camelot64/kickc/test/TestPrograms.java
@@ -22,6 +22,10 @@ public class TestPrograms extends TestCase {
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
}
+ public void testMultiply() throws IOException, URISyntaxException {
+ compileAndCompare("multiply");
+ }
+
public void testArraysInit() throws IOException, URISyntaxException {
compileAndCompare("arrays-init");
}
diff --git a/src/main/java/dk/camelot64/kickc/test/multiply.kc b/src/main/java/dk/camelot64/kickc/test/multiply.kc
new file mode 100644
index 000000000..a2b986b8d
--- /dev/null
+++ b/src/main/java/dk/camelot64/kickc/test/multiply.kc
@@ -0,0 +1,66 @@
+// Implementation of the Seriously Fast Multiplication
+// See http://codebase64.org/doku.php?id=base:seriously_fast_multiplication
+// Utilizes the fact that a*b = ((a+b)/2)^2 - ((a-b)/2)^2
+
+byte* BGCOL = $d021;
+
+void main() {
+ init_mul_tables();
+ init_mul_tables_asm();
+ mul_tables_compare();
+}
+
+// mul_sqr tables will contain f(x)=int(x*x/4).
+byte[512] mul_sqr_lo;
+byte[512] mul_sqr_hi;
+
+void init_mul_tables() {
+ // If f(x) = x*x then f(x+1) = f(x) + 2*x + 1
+
+}
+
+// ASM based multiplication tables
+byte[512] asm_mul_sqr_lo;
+byte[512] asm_mul_sqr_hi;
+// Initialize the multiplication tables using ASM code from
+// http://codebase64.org/doku.php?id=base:seriously_fast_multiplication
+void init_mul_tables_asm() {
+ asm{
+ ldx #$00
+ txa
+ .byte $c9
+ lb1:
+ tya
+ adc #$00
+ ml1:
+ sta asm_mul_sqr_hi,x
+ tay
+ cmp #$40
+ txa
+ ror
+ ml9:
+ adc #$00
+ sta ml9+1
+ inx
+ ml0:
+ sta asm_mul_sqr_lo,x
+ bne lb1
+ inc ml0+2
+ inc ml1+2
+ clc
+ iny
+ bne lb1
+ }
+
+}
+
+void mul_tables_compare() {
+ for( byte i: 0..255) {
+ if(mul_sqr_lo[i]!=asm_mul_sqr_lo[i]) {
+ *BGCOL = 2;
+ }
+ if(mul_sqr_hi[i]!=asm_mul_sqr_hi[i]) {
+ *BGCOL = 2;
+ }
+ }
+}
\ No newline at end of file