diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 77f3c7c07..c5c67ae5c 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -32,9 +32,9 @@ public class Compiler { public Program compile(String fileName) throws IOException { try { - StatementSequenceGenerator statementSequenceGenerator = new StatementSequenceGenerator(program); - loadAndParseFile(fileName, program, statementSequenceGenerator); - StatementSequence sequence = statementSequenceGenerator.getSequence(); + Pass0GenerateStatementSequence pass0GenerateStatementSequence = new Pass0GenerateStatementSequence(program); + loadAndParseFile(fileName, program, pass0GenerateStatementSequence); + StatementSequence sequence = pass0GenerateStatementSequence.getSequence(); sequence.addStatement(new StatementCall(null, "main", new ArrayList<>())); program.setStatementSequence(sequence); pass1GenerateSSA(); @@ -50,7 +50,7 @@ public class Compiler { } } - public static void loadAndParseFile(String fileName, Program program, StatementSequenceGenerator statementSequenceGenerator) { + public static void loadAndParseFile(String fileName, Program program, Pass0GenerateStatementSequence pass0GenerateStatementSequence) { try { File file = loadFile(fileName, program); List imported = program.getImported(); @@ -76,7 +76,7 @@ public class Compiler { throw new CompileError("Error parsing file " + fileStream.getSourceName() + "\n - Line: " + line + "\n - Message: " + msg); } }); - statementSequenceGenerator.generate(parser.file()); + pass0GenerateStatementSequence.generate(parser.file()); } catch (IOException e) { throw new CompileError("Error loading file " + fileName, e); } diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmDataAlignment.java b/src/main/java/dk/camelot64/kickc/asm/AsmDataAlignment.java new file mode 100644 index 000000000..2173b0a6e --- /dev/null +++ b/src/main/java/dk/camelot64/kickc/asm/AsmDataAlignment.java @@ -0,0 +1,41 @@ +package dk.camelot64.kickc.asm; + +/** Data alignment directive. */ +public class AsmDataAlignment implements AsmLine { + + private String alignment; + private int index; + + public AsmDataAlignment(String alignment) { + this.alignment = alignment; + } + + @Override + public int getLineBytes() { + return 0; + } + + @Override + public double getLineCycles() { + return 0; + } + + @Override + public String getAsm() { + StringBuilder asm = new StringBuilder(); + asm.append(".align "); + asm.append(alignment); + return asm.toString(); + } + + @Override + public int getIndex() { + return index; + } + + @Override + public void setIndex(int index) { + this.index = index; + } + +} diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmDataFill.java b/src/main/java/dk/camelot64/kickc/asm/AsmDataFill.java index a6335d89f..4b1959aa4 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmDataFill.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmDataFill.java @@ -1,5 +1,7 @@ package dk.camelot64.kickc.asm; +import dk.camelot64.kickc.fragment.AsmFragment; + /** A labelled numeric data directive. */ public class AsmDataFill implements AsmLine { @@ -36,7 +38,7 @@ public class AsmDataFill implements AsmLine { StringBuilder asm = new StringBuilder(); asm.append(label+": "); asm.append(".fill "); - asm.append(size*type.bytes); + asm.append(AsmFragment.getAsmNumber(size*type.bytes)); asm.append(", "); asm.append(fillValue); return asm.toString(); diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java b/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java index c5c6c0400..0a8715a78 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmProgram.java @@ -103,9 +103,8 @@ public class AsmProgram { addLine(new AsmDataFill(label, type, size, fillValue)); } - /** - * Add a string data declaration tot the ASM + * Add a string data declaration to the ASM * @param label The label of the data * @param value The value of the string */ @@ -113,6 +112,14 @@ public class AsmProgram { addLine(new AsmDataString(label, value)); } + /** + * Add data alignment to the ASM + * @param alignment The number to align the address of the next data to + */ + public void addDataAlignment(String alignment) { + addLine(new AsmDataAlignment(alignment)); + } + /** * Get the number of bytes the segment occupies in memory. diff --git a/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java b/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java index ebf9615cc..54ac86350 100644 --- a/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java +++ b/src/main/java/dk/camelot64/kickc/asm/AsmSegment.java @@ -166,7 +166,7 @@ public class AsmSegment { printState.decIndent(); } out.append(printState.getIndent()); - if (line instanceof AsmComment || line instanceof AsmInstruction || line instanceof AsmLabelDecl || line instanceof AsmConstant || line instanceof AsmDataNumeric || line instanceof AsmDataFill || line instanceof AsmDataString) { + if (line instanceof AsmComment || line instanceof AsmInstruction || line instanceof AsmLabelDecl || line instanceof AsmConstant || line instanceof AsmDataNumeric || line instanceof AsmDataFill || line instanceof AsmDataString|| line instanceof AsmDataAlignment) { out.append(" "); } out.append(line.getAsm() + "\n"); diff --git a/src/main/java/dk/camelot64/kickc/model/ConstantVar.java b/src/main/java/dk/camelot64/kickc/model/ConstantVar.java index 2e6ad0cf1..c6cdfb08f 100644 --- a/src/main/java/dk/camelot64/kickc/model/ConstantVar.java +++ b/src/main/java/dk/camelot64/kickc/model/ConstantVar.java @@ -21,6 +21,8 @@ public class ConstantVar implements Symbol { /** A short name used for the variable in ASM code. If possible variable names of ZP variables are shortened in ASM code. This is possible, when all versions of the var use the same register. */ private String asmName; + /** Specifies that the variable must be aligned in memory. Only allowed for arrays & strings. */ + private Integer declaredAlignment; public ConstantVar(String name, Scope scope, SymbolType type, ConstantValue value) { this.name = name; @@ -51,7 +53,6 @@ public class ConstantVar implements Symbol { this.asmName = asmName; } - @Override public SymbolType getType() { return type; @@ -88,6 +89,13 @@ public class ConstantVar implements Symbol { return new ConstantRef(this); } + public Integer getDeclaredAlignment() { + return declaredAlignment; + } + + public void setDeclaredAlignment(Integer declaredAlignment) { + this.declaredAlignment = declaredAlignment; + } @Override public String toString(Program program) { diff --git a/src/main/java/dk/camelot64/kickc/model/Variable.java b/src/main/java/dk/camelot64/kickc/model/Variable.java index d6a5f25c1..d16829599 100644 --- a/src/main/java/dk/camelot64/kickc/model/Variable.java +++ b/src/main/java/dk/camelot64/kickc/model/Variable.java @@ -24,9 +24,12 @@ public abstract class Variable implements Symbol { /** A short name used for the variable in ASM code. If possible variable names of ZP variables are shortened in ASM code. This is possible, when all versions of the var use the same register. */ private String asmName; - /** Speciies that the variableis declared a constant. It willb replaced by a ConstantVar when possible. */ + /** Specifies that the variable is declared a constant. It will be replaced by a ConstantVar when possible. */ private boolean declaredConstant; + /** Specifies that the variable must be aligned in memory. Only allowed for arrays & strings. */ + private Integer declaredAlignment; + public Variable(String name, Scope scope, SymbolType type) { this.name = name; this.scope = scope; @@ -126,6 +129,14 @@ public abstract class Variable implements Symbol { this.declaredConstant = declaredConstant; } + public Integer getDeclaredAlignment() { + return declaredAlignment; + } + + public void setDeclaredAlignment(Integer declaredAlignment) { + this.declaredAlignment = declaredAlignment; + } + @Override public String toString() { return toString(null); diff --git a/src/main/java/dk/camelot64/kickc/model/VariableUnversioned.java b/src/main/java/dk/camelot64/kickc/model/VariableUnversioned.java index 412ad0f87..97b1d5a17 100644 --- a/src/main/java/dk/camelot64/kickc/model/VariableUnversioned.java +++ b/src/main/java/dk/camelot64/kickc/model/VariableUnversioned.java @@ -5,9 +5,7 @@ package dk.camelot64.kickc.model; */ public class VariableUnversioned extends Variable { - /** - * The number of the next version - */ + /** The number of the next version */ private Integer nextVersionNumber; public VariableUnversioned( diff --git a/src/main/java/dk/camelot64/kickc/model/VariableVersion.java b/src/main/java/dk/camelot64/kickc/model/VariableVersion.java index ebe87e11f..206ad7ed8 100644 --- a/src/main/java/dk/camelot64/kickc/model/VariableVersion.java +++ b/src/main/java/dk/camelot64/kickc/model/VariableVersion.java @@ -11,6 +11,7 @@ public class VariableVersion extends Variable { public VariableVersion(VariableUnversioned versionOf, int version) { super(versionOf.getLocalName()+"#"+version, versionOf.getScope(), versionOf.getType()); + this.setDeclaredAlignment(versionOf.getDeclaredAlignment()); this.versionOfName = versionOf.getLocalName(); } diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 index b28f89362..8c79c93e2 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 @@ -33,7 +33,16 @@ parameterDecl : typeDecl NAME ; declVar - : ('const')? typeDecl NAME ('=' expr)? ';' + : directives? typeDecl directives? NAME ('=' expr)? ';' + ; + +directives + : directive+ + ; + +directive + : 'const' #directiveConst + | 'align' '(' NUMBER ')' #directiveAlign ; stmtSeq diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens index 64c972114..33a7fd43f 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens @@ -46,70 +46,72 @@ T__44=45 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 +T__48=49 +MNEMONIC=50 +SIMPLETYPE=51 +STRING=52 +CHAR=53 +BOOLEAN=54 +NUMBER=55 +NUMFLOAT=56 +BINFLOAT=57 +DECFLOAT=58 +HEXFLOAT=59 +NUMINT=60 +BININTEGER=61 +DECINTEGER=62 +HEXINTEGER=63 +NAME=64 +ASMREL=65 +WS=66 +COMMENT_LINE=67 +COMMENT_BLOCK=68 'import'=1 '('=2 ')'=3 '{'=4 '}'=5 ','=6 -'const'=7 -'='=8 -';'=9 -'if'=10 -'else'=11 -'while'=12 -'do'=13 -'for'=14 -'return'=15 -'asm'=16 -':'=17 -'..'=18 -'signed'=19 -'*'=20 -'['=21 -']'=22 -'--'=23 -'++'=24 -'+'=25 -'-'=26 -'!'=27 -'&'=28 -'~'=29 -'>>'=30 -'<<'=31 -'/'=32 -'%'=33 -'<'=34 -'>'=35 -'=='=36 -'!='=37 -'<>'=38 -'<='=39 -'=<'=40 -'>='=41 -'=>'=42 -'^'=43 -'|'=44 -'&&'=45 -'||'=46 -'.byte'=47 -'#'=48 +'='=7 +';'=8 +'const'=9 +'align'=10 +'if'=11 +'else'=12 +'while'=13 +'do'=14 +'for'=15 +'return'=16 +'asm'=17 +':'=18 +'..'=19 +'signed'=20 +'*'=21 +'['=22 +']'=23 +'--'=24 +'++'=25 +'+'=26 +'-'=27 +'!'=28 +'&'=29 +'~'=30 +'>>'=31 +'<<'=32 +'/'=33 +'%'=34 +'<'=35 +'>'=36 +'=='=37 +'!='=38 +'<>'=39 +'<='=40 +'=<'=41 +'>='=42 +'=>'=43 +'^'=44 +'|'=45 +'&&'=46 +'||'=47 +'.byte'=48 +'#'=49 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java index 5c8823130..9ad21a4e1 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.ParserRuleContext; @@ -131,6 +131,42 @@ public class KickCBaseListener implements KickCListener { *

The default implementation does nothing.

*/ @Override public void exitDeclVar(KickCParser.DeclVarContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDirectives(KickCParser.DirectivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectives(KickCParser.DirectivesContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDirectiveConst(KickCParser.DirectiveConstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectiveConst(KickCParser.DirectiveConstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDirectiveAlign(KickCParser.DirectiveAlignContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectiveAlign(KickCParser.DirectiveAlignContext 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 2d1e971e0..a73032c13 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -81,6 +81,27 @@ public class KickCBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitDeclVar(KickCParser.DeclVarContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDirectives(KickCParser.DirectivesContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDirectiveConst(KickCParser.DirectiveConstContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitDirectiveAlign(KickCParser.DirectiveAlignContext 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 ebb64f500..b65fef421 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -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, 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; + T__45=46, T__46=47, T__47=48, T__48=49, MNEMONIC=50, SIMPLETYPE=51, STRING=52, + CHAR=53, BOOLEAN=54, NUMBER=55, NUMFLOAT=56, BINFLOAT=57, DECFLOAT=58, + HEXFLOAT=59, NUMINT=60, BININTEGER=61, DECINTEGER=62, HEXINTEGER=63, NAME=64, + ASMREL=65, WS=66, COMMENT_LINE=67, COMMENT_BLOCK=68; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -41,16 +41,16 @@ 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", "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" + "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", + "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 = { - null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'const'", "'='", - "';'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'", + null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'='", "';'", "'const'", + "'align'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<>'", "'<='", "'=<'", "'>='", "'=>'", "'^'", "'|'", @@ -61,7 +61,7 @@ public class KickCLexer extends Lexer { 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", + null, null, "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" }; @@ -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\2E\u02d0\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2F\u02d8\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"+ @@ -132,267 +132,270 @@ public class KickCLexer extends Lexer { ",\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\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"; + "\tI\4J\tJ\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\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3"+ + "\13\3\13\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16"+ + "\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\22\3\22\3\22\3\22\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25"+ + "\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30\3\31\3\31\3\31\3\32\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 \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\61\3\61\3"+ + "\61\3\61\3\61\3\61\3\62\3\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\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\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\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\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\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\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\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\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\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\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\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\u020c\n\63\3\64\3\64\3\64\3\64\3\64\3\64\3\64"+ + "\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\3\64\5\64\u0221"+ + "\n\64\3\65\3\65\3\65\3\65\7\65\u0227\n\65\f\65\16\65\u022a\13\65\3\65"+ + "\3\65\3\66\3\66\3\66\3\66\5\66\u0232\n\66\3\66\3\66\3\67\3\67\3\67\3\67"+ + "\3\67\3\67\3\67\3\67\3\67\5\67\u023f\n\67\38\38\58\u0243\n8\39\39\39\5"+ + "9\u0248\n9\3:\3:\3:\3:\3:\5:\u024f\n:\3:\7:\u0252\n:\f:\16:\u0255\13:"+ + "\3:\3:\6:\u0259\n:\r:\16:\u025a\3;\7;\u025e\n;\f;\16;\u0261\13;\3;\3;"+ + "\6;\u0265\n;\r;\16;\u0266\3<\3<\3<\3<\3<\5<\u026e\n<\3<\7<\u0271\n<\f"+ + "<\16<\u0274\13<\3<\3<\6<\u0278\n<\r<\16<\u0279\3=\3=\3=\5=\u027f\n=\3"+ + ">\3>\3>\6>\u0284\n>\r>\16>\u0285\3>\3>\6>\u028a\n>\r>\16>\u028b\5>\u028e"+ + "\n>\3?\6?\u0291\n?\r?\16?\u0292\3@\3@\3@\3@\3@\5@\u029a\n@\3@\6@\u029d"+ + "\n@\r@\16@\u029e\3A\3A\3B\3B\3C\3C\3D\3D\7D\u02a9\nD\fD\16D\u02ac\13D"+ + "\3E\3E\3F\3F\3G\3G\7G\u02b4\nG\fG\16G\u02b7\13G\3H\6H\u02ba\nH\rH\16H"+ + "\u02bb\3H\3H\3I\3I\3I\3I\7I\u02c4\nI\fI\16I\u02c7\13I\3I\3I\3J\3J\3J\3"+ + "J\7J\u02cf\nJ\fJ\16J\u02d2\13J\3J\3J\3J\3J\3J\3\u02d0\2K\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{"+ + "?}@\177A\u0081\2\u0083\2\u0085\2\u0087B\u0089\2\u008b\2\u008dC\u008fD"+ + "\u0091E\u0093F\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHc"+ + "h\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\5\2\13\f\17\17\"\"\4\2\f\f\17\17\2"+ + "\u033d\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\2"+ + "G\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\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\177\3\2\2\2\2\u0087\3\2\2\2\2\u008d\3\2"+ + "\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\3\u0095\3\2\2\2\5"+ + "\u009c\3\2\2\2\7\u009e\3\2\2\2\t\u00a0\3\2\2\2\13\u00a2\3\2\2\2\r\u00a4"+ + "\3\2\2\2\17\u00a6\3\2\2\2\21\u00a8\3\2\2\2\23\u00aa\3\2\2\2\25\u00b0\3"+ + "\2\2\2\27\u00b6\3\2\2\2\31\u00b9\3\2\2\2\33\u00be\3\2\2\2\35\u00c4\3\2"+ + "\2\2\37\u00c7\3\2\2\2!\u00cb\3\2\2\2#\u00d2\3\2\2\2%\u00d6\3\2\2\2\'\u00d8"+ + "\3\2\2\2)\u00db\3\2\2\2+\u00e2\3\2\2\2-\u00e4\3\2\2\2/\u00e6\3\2\2\2\61"+ + "\u00e8\3\2\2\2\63\u00eb\3\2\2\2\65\u00ee\3\2\2\2\67\u00f0\3\2\2\29\u00f2"+ + "\3\2\2\2;\u00f4\3\2\2\2=\u00f6\3\2\2\2?\u00f8\3\2\2\2A\u00fb\3\2\2\2C"+ + "\u00fe\3\2\2\2E\u0100\3\2\2\2G\u0102\3\2\2\2I\u0104\3\2\2\2K\u0106\3\2"+ + "\2\2M\u0109\3\2\2\2O\u010c\3\2\2\2Q\u010f\3\2\2\2S\u0112\3\2\2\2U\u0115"+ + "\3\2\2\2W\u0118\3\2\2\2Y\u011b\3\2\2\2[\u011d\3\2\2\2]\u011f\3\2\2\2_"+ + "\u0122\3\2\2\2a\u0125\3\2\2\2c\u012b\3\2\2\2e\u020b\3\2\2\2g\u0220\3\2"+ + "\2\2i\u0222\3\2\2\2k\u022d\3\2\2\2m\u023e\3\2\2\2o\u0242\3\2\2\2q\u0247"+ + "\3\2\2\2s\u024e\3\2\2\2u\u025f\3\2\2\2w\u026d\3\2\2\2y\u027e\3\2\2\2{"+ + "\u028d\3\2\2\2}\u0290\3\2\2\2\177\u0299\3\2\2\2\u0081\u02a0\3\2\2\2\u0083"+ + "\u02a2\3\2\2\2\u0085\u02a4\3\2\2\2\u0087\u02a6\3\2\2\2\u0089\u02ad\3\2"+ + "\2\2\u008b\u02af\3\2\2\2\u008d\u02b1\3\2\2\2\u008f\u02b9\3\2\2\2\u0091"+ + "\u02bf\3\2\2\2\u0093\u02ca\3\2\2\2\u0095\u0096\7k\2\2\u0096\u0097\7o\2"+ + "\2\u0097\u0098\7r\2\2\u0098\u0099\7q\2\2\u0099\u009a\7t\2\2\u009a\u009b"+ + "\7v\2\2\u009b\4\3\2\2\2\u009c\u009d\7*\2\2\u009d\6\3\2\2\2\u009e\u009f"+ + "\7+\2\2\u009f\b\3\2\2\2\u00a0\u00a1\7}\2\2\u00a1\n\3\2\2\2\u00a2\u00a3"+ + "\7\177\2\2\u00a3\f\3\2\2\2\u00a4\u00a5\7.\2\2\u00a5\16\3\2\2\2\u00a6\u00a7"+ + "\7?\2\2\u00a7\20\3\2\2\2\u00a8\u00a9\7=\2\2\u00a9\22\3\2\2\2\u00aa\u00ab"+ + "\7e\2\2\u00ab\u00ac\7q\2\2\u00ac\u00ad\7p\2\2\u00ad\u00ae\7u\2\2\u00ae"+ + "\u00af\7v\2\2\u00af\24\3\2\2\2\u00b0\u00b1\7c\2\2\u00b1\u00b2\7n\2\2\u00b2"+ + "\u00b3\7k\2\2\u00b3\u00b4\7i\2\2\u00b4\u00b5\7p\2\2\u00b5\26\3\2\2\2\u00b6"+ + "\u00b7\7k\2\2\u00b7\u00b8\7h\2\2\u00b8\30\3\2\2\2\u00b9\u00ba\7g\2\2\u00ba"+ + "\u00bb\7n\2\2\u00bb\u00bc\7u\2\2\u00bc\u00bd\7g\2\2\u00bd\32\3\2\2\2\u00be"+ + "\u00bf\7y\2\2\u00bf\u00c0\7j\2\2\u00c0\u00c1\7k\2\2\u00c1\u00c2\7n\2\2"+ + "\u00c2\u00c3\7g\2\2\u00c3\34\3\2\2\2\u00c4\u00c5\7f\2\2\u00c5\u00c6\7"+ + "q\2\2\u00c6\36\3\2\2\2\u00c7\u00c8\7h\2\2\u00c8\u00c9\7q\2\2\u00c9\u00ca"+ + "\7t\2\2\u00ca \3\2\2\2\u00cb\u00cc\7t\2\2\u00cc\u00cd\7g\2\2\u00cd\u00ce"+ + "\7v\2\2\u00ce\u00cf\7w\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1\7p\2\2\u00d1"+ + "\"\3\2\2\2\u00d2\u00d3\7c\2\2\u00d3\u00d4\7u\2\2\u00d4\u00d5\7o\2\2\u00d5"+ + "$\3\2\2\2\u00d6\u00d7\7<\2\2\u00d7&\3\2\2\2\u00d8\u00d9\7\60\2\2\u00d9"+ + "\u00da\7\60\2\2\u00da(\3\2\2\2\u00db\u00dc\7u\2\2\u00dc\u00dd\7k\2\2\u00dd"+ + "\u00de\7i\2\2\u00de\u00df\7p\2\2\u00df\u00e0\7g\2\2\u00e0\u00e1\7f\2\2"+ + "\u00e1*\3\2\2\2\u00e2\u00e3\7,\2\2\u00e3,\3\2\2\2\u00e4\u00e5\7]\2\2\u00e5"+ + ".\3\2\2\2\u00e6\u00e7\7_\2\2\u00e7\60\3\2\2\2\u00e8\u00e9\7/\2\2\u00e9"+ + "\u00ea\7/\2\2\u00ea\62\3\2\2\2\u00eb\u00ec\7-\2\2\u00ec\u00ed\7-\2\2\u00ed"+ + "\64\3\2\2\2\u00ee\u00ef\7-\2\2\u00ef\66\3\2\2\2\u00f0\u00f1\7/\2\2\u00f1"+ + "8\3\2\2\2\u00f2\u00f3\7#\2\2\u00f3:\3\2\2\2\u00f4\u00f5\7(\2\2\u00f5<"+ + "\3\2\2\2\u00f6\u00f7\7\u0080\2\2\u00f7>\3\2\2\2\u00f8\u00f9\7@\2\2\u00f9"+ + "\u00fa\7@\2\2\u00fa@\3\2\2\2\u00fb\u00fc\7>\2\2\u00fc\u00fd\7>\2\2\u00fd"+ + "B\3\2\2\2\u00fe\u00ff\7\61\2\2\u00ffD\3\2\2\2\u0100\u0101\7\'\2\2\u0101"+ + "F\3\2\2\2\u0102\u0103\7>\2\2\u0103H\3\2\2\2\u0104\u0105\7@\2\2\u0105J"+ + "\3\2\2\2\u0106\u0107\7?\2\2\u0107\u0108\7?\2\2\u0108L\3\2\2\2\u0109\u010a"+ + "\7#\2\2\u010a\u010b\7?\2\2\u010bN\3\2\2\2\u010c\u010d\7>\2\2\u010d\u010e"+ + "\7@\2\2\u010eP\3\2\2\2\u010f\u0110\7>\2\2\u0110\u0111\7?\2\2\u0111R\3"+ + "\2\2\2\u0112\u0113\7?\2\2\u0113\u0114\7>\2\2\u0114T\3\2\2\2\u0115\u0116"+ + "\7@\2\2\u0116\u0117\7?\2\2\u0117V\3\2\2\2\u0118\u0119\7?\2\2\u0119\u011a"+ + "\7@\2\2\u011aX\3\2\2\2\u011b\u011c\7`\2\2\u011cZ\3\2\2\2\u011d\u011e\7"+ + "~\2\2\u011e\\\3\2\2\2\u011f\u0120\7(\2\2\u0120\u0121\7(\2\2\u0121^\3\2"+ + "\2\2\u0122\u0123\7~\2\2\u0123\u0124\7~\2\2\u0124`\3\2\2\2\u0125\u0126"+ + "\7\60\2\2\u0126\u0127\7d\2\2\u0127\u0128\7{\2\2\u0128\u0129\7v\2\2\u0129"+ + "\u012a\7g\2\2\u012ab\3\2\2\2\u012b\u012c\7%\2\2\u012cd\3\2\2\2\u012d\u012e"+ + "\7d\2\2\u012e\u012f\7t\2\2\u012f\u020c\7m\2\2\u0130\u0131\7q\2\2\u0131"+ + "\u0132\7t\2\2\u0132\u020c\7c\2\2\u0133\u0134\7m\2\2\u0134\u0135\7k\2\2"+ + "\u0135\u020c\7n\2\2\u0136\u0137\7u\2\2\u0137\u0138\7n\2\2\u0138\u020c"+ + "\7q\2\2\u0139\u013a\7p\2\2\u013a\u013b\7q\2\2\u013b\u020c\7r\2\2\u013c"+ + "\u013d\7c\2\2\u013d\u013e\7u\2\2\u013e\u020c\7n\2\2\u013f\u0140\7r\2\2"+ + "\u0140\u0141\7j\2\2\u0141\u020c\7r\2\2\u0142\u0143\7c\2\2\u0143\u0144"+ + "\7p\2\2\u0144\u020c\7e\2\2\u0145\u0146\7d\2\2\u0146\u0147\7r\2\2\u0147"+ + "\u020c\7n\2\2\u0148\u0149\7e\2\2\u0149\u014a\7n\2\2\u014a\u020c\7e\2\2"+ + "\u014b\u014c\7l\2\2\u014c\u014d\7u\2\2\u014d\u020c\7t\2\2\u014e\u014f"+ + "\7c\2\2\u014f\u0150\7p\2\2\u0150\u020c\7f\2\2\u0151\u0152\7t\2\2\u0152"+ + "\u0153\7n\2\2\u0153\u020c\7c\2\2\u0154\u0155\7d\2\2\u0155\u0156\7k\2\2"+ + "\u0156\u020c\7v\2\2\u0157\u0158\7t\2\2\u0158\u0159\7q\2\2\u0159\u020c"+ + "\7n\2\2\u015a\u015b\7r\2\2\u015b\u015c\7n\2\2\u015c\u020c\7c\2\2\u015d"+ + "\u015e\7r\2\2\u015e\u015f\7n\2\2\u015f\u020c\7r\2\2\u0160\u0161\7d\2\2"+ + "\u0161\u0162\7o\2\2\u0162\u020c\7k\2\2\u0163\u0164\7u\2\2\u0164\u0165"+ + "\7g\2\2\u0165\u020c\7e\2\2\u0166\u0167\7t\2\2\u0167\u0168\7v\2\2\u0168"+ + "\u020c\7k\2\2\u0169\u016a\7g\2\2\u016a\u016b\7q\2\2\u016b\u020c\7t\2\2"+ + "\u016c\u016d\7u\2\2\u016d\u016e\7t\2\2\u016e\u020c\7g\2\2\u016f\u0170"+ + "\7n\2\2\u0170\u0171\7u\2\2\u0171\u020c\7t\2\2\u0172\u0173\7r\2\2\u0173"+ + "\u0174\7j\2\2\u0174\u020c\7c\2\2\u0175\u0176\7c\2\2\u0176\u0177\7n\2\2"+ + "\u0177\u020c\7t\2\2\u0178\u0179\7l\2\2\u0179\u017a\7o\2\2\u017a\u020c"+ + "\7r\2\2\u017b\u017c\7d\2\2\u017c\u017d\7x\2\2\u017d\u020c\7e\2\2\u017e"+ + "\u017f\7e\2\2\u017f\u0180\7n\2\2\u0180\u020c\7k\2\2\u0181\u0182\7t\2\2"+ + "\u0182\u0183\7v\2\2\u0183\u020c\7u\2\2\u0184\u0185\7c\2\2\u0185\u0186"+ + "\7f\2\2\u0186\u020c\7e\2\2\u0187\u0188\7t\2\2\u0188\u0189\7t\2\2\u0189"+ + "\u020c\7c\2\2\u018a\u018b\7d\2\2\u018b\u018c\7x\2\2\u018c\u020c\7u\2\2"+ + "\u018d\u018e\7u\2\2\u018e\u018f\7g\2\2\u018f\u020c\7k\2\2\u0190\u0191"+ + "\7u\2\2\u0191\u0192\7c\2\2\u0192\u020c\7z\2\2\u0193\u0194\7u\2\2\u0194"+ + "\u0195\7v\2\2\u0195\u020c\7{\2\2\u0196\u0197\7u\2\2\u0197\u0198\7v\2\2"+ + "\u0198\u020c\7c\2\2\u0199\u019a\7u\2\2\u019a\u019b\7v\2\2\u019b\u020c"+ + "\7z\2\2\u019c\u019d\7f\2\2\u019d\u019e\7g\2\2\u019e\u020c\7{\2\2\u019f"+ + "\u01a0\7v\2\2\u01a0\u01a1\7z\2\2\u01a1\u020c\7c\2\2\u01a2\u01a3\7z\2\2"+ + "\u01a3\u01a4\7c\2\2\u01a4\u020c\7c\2\2\u01a5\u01a6\7d\2\2\u01a6\u01a7"+ + "\7e\2\2\u01a7\u020c\7e\2\2\u01a8\u01a9\7c\2\2\u01a9\u01aa\7j\2\2\u01aa"+ + "\u020c\7z\2\2\u01ab\u01ac\7v\2\2\u01ac\u01ad\7{\2\2\u01ad\u020c\7c\2\2"+ + "\u01ae\u01af\7v\2\2\u01af\u01b0\7z\2\2\u01b0\u020c\7u\2\2\u01b1\u01b2"+ + "\7v\2\2\u01b2\u01b3\7c\2\2\u01b3\u020c\7u\2\2\u01b4\u01b5\7u\2\2\u01b5"+ + "\u01b6\7j\2\2\u01b6\u020c\7{\2\2\u01b7\u01b8\7u\2\2\u01b8\u01b9\7j\2\2"+ + "\u01b9\u020c\7z\2\2\u01ba\u01bb\7n\2\2\u01bb\u01bc\7f\2\2\u01bc\u020c"+ + "\7{\2\2\u01bd\u01be\7n\2\2\u01be\u01bf\7f\2\2\u01bf\u020c\7c\2\2\u01c0"+ + "\u01c1\7n\2\2\u01c1\u01c2\7f\2\2\u01c2\u020c\7z\2\2\u01c3\u01c4\7n\2\2"+ + "\u01c4\u01c5\7c\2\2\u01c5\u020c\7z\2\2\u01c6\u01c7\7v\2\2\u01c7\u01c8"+ + "\7c\2\2\u01c8\u020c\7{\2\2\u01c9\u01ca\7v\2\2\u01ca\u01cb\7c\2\2\u01cb"+ + "\u020c\7z\2\2\u01cc\u01cd\7d\2\2\u01cd\u01ce\7e\2\2\u01ce\u020c\7u\2\2"+ + "\u01cf\u01d0\7e\2\2\u01d0\u01d1\7n\2\2\u01d1\u020c\7x\2\2\u01d2\u01d3"+ + "\7v\2\2\u01d3\u01d4\7u\2\2\u01d4\u020c\7z\2\2\u01d5\u01d6\7n\2\2\u01d6"+ + "\u01d7\7c\2\2\u01d7\u020c\7u\2\2\u01d8\u01d9\7e\2\2\u01d9\u01da\7r\2\2"+ + "\u01da\u020c\7{\2\2\u01db\u01dc\7e\2\2\u01dc\u01dd\7o\2\2\u01dd\u020c"+ + "\7r\2\2\u01de\u01df\7e\2\2\u01df\u01e0\7r\2\2\u01e0\u020c\7z\2\2\u01e1"+ + "\u01e2\7f\2\2\u01e2\u01e3\7e\2\2\u01e3\u020c\7r\2\2\u01e4\u01e5\7f\2\2"+ + "\u01e5\u01e6\7g\2\2\u01e6\u020c\7e\2\2\u01e7\u01e8\7k\2\2\u01e8\u01e9"+ + "\7p\2\2\u01e9\u020c\7e\2\2\u01ea\u01eb\7c\2\2\u01eb\u01ec\7z\2\2\u01ec"+ + "\u020c\7u\2\2\u01ed\u01ee\7d\2\2\u01ee\u01ef\7p\2\2\u01ef\u020c\7g\2\2"+ + "\u01f0\u01f1\7e\2\2\u01f1\u01f2\7n\2\2\u01f2\u020c\7f\2\2\u01f3\u01f4"+ + "\7u\2\2\u01f4\u01f5\7d\2\2\u01f5\u020c\7e\2\2\u01f6\u01f7\7k\2\2\u01f7"+ + "\u01f8\7u\2\2\u01f8\u020c\7e\2\2\u01f9\u01fa\7k\2\2\u01fa\u01fb\7p\2\2"+ + "\u01fb\u020c\7z\2\2\u01fc\u01fd\7d\2\2\u01fd\u01fe\7g\2\2\u01fe\u020c"+ + "\7s\2\2\u01ff\u0200\7u\2\2\u0200\u0201\7g\2\2\u0201\u020c\7f\2\2\u0202"+ + "\u0203\7f\2\2\u0203\u0204\7g\2\2\u0204\u020c\7z\2\2\u0205\u0206\7k\2\2"+ + "\u0206\u0207\7p\2\2\u0207\u020c\7{\2\2\u0208\u0209\7t\2\2\u0209\u020a"+ + "\7q\2\2\u020a\u020c\7t\2\2\u020b\u012d\3\2\2\2\u020b\u0130\3\2\2\2\u020b"+ + "\u0133\3\2\2\2\u020b\u0136\3\2\2\2\u020b\u0139\3\2\2\2\u020b\u013c\3\2"+ + "\2\2\u020b\u013f\3\2\2\2\u020b\u0142\3\2\2\2\u020b\u0145\3\2\2\2\u020b"+ + "\u0148\3\2\2\2\u020b\u014b\3\2\2\2\u020b\u014e\3\2\2\2\u020b\u0151\3\2"+ + "\2\2\u020b\u0154\3\2\2\2\u020b\u0157\3\2\2\2\u020b\u015a\3\2\2\2\u020b"+ + "\u015d\3\2\2\2\u020b\u0160\3\2\2\2\u020b\u0163\3\2\2\2\u020b\u0166\3\2"+ + "\2\2\u020b\u0169\3\2\2\2\u020b\u016c\3\2\2\2\u020b\u016f\3\2\2\2\u020b"+ + "\u0172\3\2\2\2\u020b\u0175\3\2\2\2\u020b\u0178\3\2\2\2\u020b\u017b\3\2"+ + "\2\2\u020b\u017e\3\2\2\2\u020b\u0181\3\2\2\2\u020b\u0184\3\2\2\2\u020b"+ + "\u0187\3\2\2\2\u020b\u018a\3\2\2\2\u020b\u018d\3\2\2\2\u020b\u0190\3\2"+ + "\2\2\u020b\u0193\3\2\2\2\u020b\u0196\3\2\2\2\u020b\u0199\3\2\2\2\u020b"+ + "\u019c\3\2\2\2\u020b\u019f\3\2\2\2\u020b\u01a2\3\2\2\2\u020b\u01a5\3\2"+ + "\2\2\u020b\u01a8\3\2\2\2\u020b\u01ab\3\2\2\2\u020b\u01ae\3\2\2\2\u020b"+ + "\u01b1\3\2\2\2\u020b\u01b4\3\2\2\2\u020b\u01b7\3\2\2\2\u020b\u01ba\3\2"+ + "\2\2\u020b\u01bd\3\2\2\2\u020b\u01c0\3\2\2\2\u020b\u01c3\3\2\2\2\u020b"+ + "\u01c6\3\2\2\2\u020b\u01c9\3\2\2\2\u020b\u01cc\3\2\2\2\u020b\u01cf\3\2"+ + "\2\2\u020b\u01d2\3\2\2\2\u020b\u01d5\3\2\2\2\u020b\u01d8\3\2\2\2\u020b"+ + "\u01db\3\2\2\2\u020b\u01de\3\2\2\2\u020b\u01e1\3\2\2\2\u020b\u01e4\3\2"+ + "\2\2\u020b\u01e7\3\2\2\2\u020b\u01ea\3\2\2\2\u020b\u01ed\3\2\2\2\u020b"+ + "\u01f0\3\2\2\2\u020b\u01f3\3\2\2\2\u020b\u01f6\3\2\2\2\u020b\u01f9\3\2"+ + "\2\2\u020b\u01fc\3\2\2\2\u020b\u01ff\3\2\2\2\u020b\u0202\3\2\2\2\u020b"+ + "\u0205\3\2\2\2\u020b\u0208\3\2\2\2\u020cf\3\2\2\2\u020d\u020e\7d\2\2\u020e"+ + "\u020f\7{\2\2\u020f\u0210\7v\2\2\u0210\u0221\7g\2\2\u0211\u0212\7y\2\2"+ + "\u0212\u0213\7q\2\2\u0213\u0214\7t\2\2\u0214\u0221\7f\2\2\u0215\u0216"+ + "\7d\2\2\u0216\u0217\7q\2\2\u0217\u0218\7q\2\2\u0218\u0219\7n\2\2\u0219"+ + "\u021a\7g\2\2\u021a\u021b\7c\2\2\u021b\u0221\7p\2\2\u021c\u021d\7x\2\2"+ + "\u021d\u021e\7q\2\2\u021e\u021f\7k\2\2\u021f\u0221\7f\2\2\u0220\u020d"+ + "\3\2\2\2\u0220\u0211\3\2\2\2\u0220\u0215\3\2\2\2\u0220\u021c\3\2\2\2\u0221"+ + "h\3\2\2\2\u0222\u0228\7$\2\2\u0223\u0224\7^\2\2\u0224\u0227\7$\2\2\u0225"+ + "\u0227\n\2\2\2\u0226\u0223\3\2\2\2\u0226\u0225\3\2\2\2\u0227\u022a\3\2"+ + "\2\2\u0228\u0226\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u022b\3\2\2\2\u022a"+ + "\u0228\3\2\2\2\u022b\u022c\7$\2\2\u022cj\3\2\2\2\u022d\u0231\7)\2\2\u022e"+ + "\u022f\7^\2\2\u022f\u0232\7)\2\2\u0230\u0232\n\3\2\2\u0231\u022e\3\2\2"+ + "\2\u0231\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233\u0234\7)\2\2\u0234l\3"+ + "\2\2\2\u0235\u0236\7v\2\2\u0236\u0237\7t\2\2\u0237\u0238\7w\2\2\u0238"+ + "\u023f\7g\2\2\u0239\u023a\7h\2\2\u023a\u023b\7c\2\2\u023b\u023c\7n\2\2"+ + "\u023c\u023d\7u\2\2\u023d\u023f\7g\2\2\u023e\u0235\3\2\2\2\u023e\u0239"+ + "\3\2\2\2\u023fn\3\2\2\2\u0240\u0243\5q9\2\u0241\u0243\5y=\2\u0242\u0240"+ + "\3\2\2\2\u0242\u0241\3\2\2\2\u0243p\3\2\2\2\u0244\u0248\5s:\2\u0245\u0248"+ + "\5u;\2\u0246\u0248\5w<\2\u0247\u0244\3\2\2\2\u0247\u0245\3\2\2\2\u0247"+ + "\u0246\3\2\2\2\u0248r\3\2\2\2\u0249\u024f\7\'\2\2\u024a\u024b\7\62\2\2"+ + "\u024b\u024f\7d\2\2\u024c\u024d\7\62\2\2\u024d\u024f\7D\2\2\u024e\u0249"+ + "\3\2\2\2\u024e\u024a\3\2\2\2\u024e\u024c\3\2\2\2\u024f\u0253\3\2\2\2\u0250"+ + "\u0252\5\u0081A\2\u0251\u0250\3\2\2\2\u0252\u0255\3\2\2\2\u0253\u0251"+ + "\3\2\2\2\u0253\u0254\3\2\2\2\u0254\u0256\3\2\2\2\u0255\u0253\3\2\2\2\u0256"+ + "\u0258\7\60\2\2\u0257\u0259\5\u0081A\2\u0258\u0257\3\2\2\2\u0259\u025a"+ + "\3\2\2\2\u025a\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025bt\3\2\2\2\u025c"+ + "\u025e\5\u0083B\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\u0083B\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\u0267v\3\2\2\2\u0268"+ + "\u026e\7&\2\2\u0269\u026a\7\62\2\2\u026a\u026e\7z\2\2\u026b\u026c\7\62"+ + "\2\2\u026c\u026e\7Z\2\2\u026d\u0268\3\2\2\2\u026d\u0269\3\2\2\2\u026d"+ + "\u026b\3\2\2\2\u026e\u0272\3\2\2\2\u026f\u0271\5\u0085C\2\u0270\u026f"+ + "\3\2\2\2\u0271\u0274\3\2\2\2\u0272\u0270\3\2\2\2\u0272\u0273\3\2\2\2\u0273"+ + "\u0275\3\2\2\2\u0274\u0272\3\2\2\2\u0275\u0277\7\60\2\2\u0276\u0278\5"+ + "\u0085C\2\u0277\u0276\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u0277\3\2\2\2"+ + "\u0279\u027a\3\2\2\2\u027ax\3\2\2\2\u027b\u027f\5}?\2\u027c\u027f\5\177"+ + "@\2\u027d\u027f\5{>\2\u027e\u027b\3\2\2\2\u027e\u027c\3\2\2\2\u027e\u027d"+ + "\3\2\2\2\u027fz\3\2\2\2\u0280\u0281\7\62\2\2\u0281\u0283\t\4\2\2\u0282"+ + "\u0284\5\u0081A\2\u0283\u0282\3\2\2\2\u0284\u0285\3\2\2\2\u0285\u0283"+ + "\3\2\2\2\u0285\u0286\3\2\2\2\u0286\u028e\3\2\2\2\u0287\u0289\7\'\2\2\u0288"+ + "\u028a\5\u0081A\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\u028e\3\2\2\2\u028d\u0280\3\2\2\2\u028d"+ + "\u0287\3\2\2\2\u028e|\3\2\2\2\u028f\u0291\5\u0083B\2\u0290\u028f\3\2\2"+ + "\2\u0291\u0292\3\2\2\2\u0292\u0290\3\2\2\2\u0292\u0293\3\2\2\2\u0293~"+ + "\3\2\2\2\u0294\u029a\7&\2\2\u0295\u0296\7\62\2\2\u0296\u029a\7z\2\2\u0297"+ + "\u0298\7\62\2\2\u0298\u029a\7Z\2\2\u0299\u0294\3\2\2\2\u0299\u0295\3\2"+ + "\2\2\u0299\u0297\3\2\2\2\u029a\u029c\3\2\2\2\u029b\u029d\5\u0085C\2\u029c"+ + "\u029b\3\2\2\2\u029d\u029e\3\2\2\2\u029e\u029c\3\2\2\2\u029e\u029f\3\2"+ + "\2\2\u029f\u0080\3\2\2\2\u02a0\u02a1\t\5\2\2\u02a1\u0082\3\2\2\2\u02a2"+ + "\u02a3\t\6\2\2\u02a3\u0084\3\2\2\2\u02a4\u02a5\t\7\2\2\u02a5\u0086\3\2"+ + "\2\2\u02a6\u02aa\5\u0089E\2\u02a7\u02a9\5\u008bF\2\u02a8\u02a7\3\2\2\2"+ + "\u02a9\u02ac\3\2\2\2\u02aa\u02a8\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab\u0088"+ + "\3\2\2\2\u02ac\u02aa\3\2\2\2\u02ad\u02ae\t\b\2\2\u02ae\u008a\3\2\2\2\u02af"+ + "\u02b0\t\t\2\2\u02b0\u008c\3\2\2\2\u02b1\u02b5\7#\2\2\u02b2\u02b4\t\n"+ + "\2\2\u02b3\u02b2\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b5"+ + "\u02b6\3\2\2\2\u02b6\u008e\3\2\2\2\u02b7\u02b5\3\2\2\2\u02b8\u02ba\t\13"+ + "\2\2\u02b9\u02b8\3\2\2\2\u02ba\u02bb\3\2\2\2\u02bb\u02b9\3\2\2\2\u02bb"+ + "\u02bc\3\2\2\2\u02bc\u02bd\3\2\2\2\u02bd\u02be\bH\2\2\u02be\u0090\3\2"+ + "\2\2\u02bf\u02c0\7\61\2\2\u02c0\u02c1\7\61\2\2\u02c1\u02c5\3\2\2\2\u02c2"+ + "\u02c4\n\f\2\2\u02c3\u02c2\3\2\2\2\u02c4\u02c7\3\2\2\2\u02c5\u02c3\3\2"+ + "\2\2\u02c5\u02c6\3\2\2\2\u02c6\u02c8\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c8"+ + "\u02c9\bI\2\2\u02c9\u0092\3\2\2\2\u02ca\u02cb\7\61\2\2\u02cb\u02cc\7,"+ + "\2\2\u02cc\u02d0\3\2\2\2\u02cd\u02cf\13\2\2\2\u02ce\u02cd\3\2\2\2\u02cf"+ + "\u02d2\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d0\u02ce\3\2\2\2\u02d1\u02d3\3\2"+ + "\2\2\u02d2\u02d0\3\2\2\2\u02d3\u02d4\7,\2\2\u02d4\u02d5\7\61\2\2\u02d5"+ + "\u02d6\3\2\2\2\u02d6\u02d7\bJ\2\2\u02d7\u0094\3\2\2\2\37\2\u020b\u0220"+ + "\u0226\u0228\u0231\u023e\u0242\u0247\u024e\u0253\u025a\u025f\u0266\u026d"+ + "\u0272\u0279\u027e\u0285\u028b\u028d\u0292\u0299\u029e\u02aa\u02b5\u02bb"+ + "\u02c5\u02d0\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 64c972114..33a7fd43f 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens @@ -46,70 +46,72 @@ T__44=45 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 +T__48=49 +MNEMONIC=50 +SIMPLETYPE=51 +STRING=52 +CHAR=53 +BOOLEAN=54 +NUMBER=55 +NUMFLOAT=56 +BINFLOAT=57 +DECFLOAT=58 +HEXFLOAT=59 +NUMINT=60 +BININTEGER=61 +DECINTEGER=62 +HEXINTEGER=63 +NAME=64 +ASMREL=65 +WS=66 +COMMENT_LINE=67 +COMMENT_BLOCK=68 'import'=1 '('=2 ')'=3 '{'=4 '}'=5 ','=6 -'const'=7 -'='=8 -';'=9 -'if'=10 -'else'=11 -'while'=12 -'do'=13 -'for'=14 -'return'=15 -'asm'=16 -':'=17 -'..'=18 -'signed'=19 -'*'=20 -'['=21 -']'=22 -'--'=23 -'++'=24 -'+'=25 -'-'=26 -'!'=27 -'&'=28 -'~'=29 -'>>'=30 -'<<'=31 -'/'=32 -'%'=33 -'<'=34 -'>'=35 -'=='=36 -'!='=37 -'<>'=38 -'<='=39 -'=<'=40 -'>='=41 -'=>'=42 -'^'=43 -'|'=44 -'&&'=45 -'||'=46 -'.byte'=47 -'#'=48 +'='=7 +';'=8 +'const'=9 +'align'=10 +'if'=11 +'else'=12 +'while'=13 +'do'=14 +'for'=15 +'return'=16 +'asm'=17 +':'=18 +'..'=19 +'signed'=20 +'*'=21 +'['=22 +']'=23 +'--'=24 +'++'=25 +'+'=26 +'-'=27 +'!'=28 +'&'=29 +'~'=30 +'>>'=31 +'<<'=32 +'/'=33 +'%'=34 +'<'=35 +'>'=36 +'=='=37 +'!='=38 +'<>'=39 +'<='=40 +'=<'=41 +'>='=42 +'=>'=43 +'^'=44 +'|'=45 +'&&'=46 +'||'=47 +'.byte'=48 +'#'=49 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java index 1f9d1a3e5..ec438230a 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.ParseTreeListener; @@ -111,6 +111,40 @@ public interface KickCListener extends ParseTreeListener { * @param ctx the parse tree */ void exitDeclVar(KickCParser.DeclVarContext ctx); + /** + * Enter a parse tree produced by {@link KickCParser#directives}. + * @param ctx the parse tree + */ + void enterDirectives(KickCParser.DirectivesContext ctx); + /** + * Exit a parse tree produced by {@link KickCParser#directives}. + * @param ctx the parse tree + */ + void exitDirectives(KickCParser.DirectivesContext ctx); + /** + * Enter a parse tree produced by the {@code directiveConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void enterDirectiveConst(KickCParser.DirectiveConstContext ctx); + /** + * Exit a parse tree produced by the {@code directiveConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void exitDirectiveConst(KickCParser.DirectiveConstContext ctx); + /** + * Enter a parse tree produced by the {@code directiveAlign} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void enterDirectiveAlign(KickCParser.DirectiveAlignContext ctx); + /** + * Exit a parse tree produced by the {@code directiveAlign} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void exitDirectiveAlign(KickCParser.DirectiveAlignContext ctx); /** * Enter a parse tree produced by {@link KickCParser#stmtSeq}. * @param ctx the parse tree diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 63ea0d8a3..af18a65b1 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -23,27 +23,29 @@ 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, 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; + T__45=46, T__46=47, T__47=48, T__48=49, MNEMONIC=50, SIMPLETYPE=51, STRING=52, + CHAR=53, BOOLEAN=54, NUMBER=55, NUMFLOAT=56, BINFLOAT=57, DECFLOAT=58, + HEXFLOAT=59, NUMINT=60, BININTEGER=61, DECINTEGER=62, HEXINTEGER=63, NAME=64, + ASMREL=65, WS=66, COMMENT_LINE=67, COMMENT_BLOCK=68; 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_asmBytes = 20, RULE_asmParamMode = 21, RULE_asmExpr = 22; + RULE_declVar = 8, RULE_directives = 9, RULE_directive = 10, RULE_stmtSeq = 11, + RULE_stmt = 12, RULE_forDeclaration = 13, RULE_forIteration = 14, RULE_typeDecl = 15, + RULE_expr = 16, RULE_parameterList = 17, RULE_asmLines = 18, RULE_asmLine = 19, + RULE_asmLabel = 20, RULE_asmInstruction = 21, RULE_asmBytes = 22, RULE_asmParamMode = 23, + RULE_asmExpr = 24; 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", "asmBytes", "asmParamMode", "asmExpr" + "parameterDecl", "declVar", "directives", "directive", "stmtSeq", "stmt", + "forDeclaration", "forIteration", "typeDecl", "expr", "parameterList", + "asmLines", "asmLine", "asmLabel", "asmInstruction", "asmBytes", "asmParamMode", + "asmExpr" }; private static final String[] _LITERAL_NAMES = { - null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'const'", "'='", - "';'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'", + null, "'import'", "'('", "')'", "'{'", "'}'", "','", "'='", "';'", "'const'", + "'align'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", "'asm'", "':'", "'..'", "'signed'", "'*'", "'['", "']'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<>'", "'<='", "'=<'", "'>='", "'=>'", "'^'", "'|'", @@ -54,7 +56,7 @@ public class KickCParser extends Parser { 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", + null, null, "MNEMONIC", "SIMPLETYPE", "STRING", "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK" }; @@ -140,11 +142,11 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(46); + setState(50); importSeq(); - setState(47); + setState(51); declSeq(); - setState(48); + setState(52); match(EOF); } } @@ -189,9 +191,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(50); + setState(54); asmLines(); - setState(51); + setState(55); match(EOF); } } @@ -239,17 +241,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(56); + setState(60); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__0) { { { - setState(53); + setState(57); importDecl(); } } - setState(58); + setState(62); _errHandler.sync(this); _la = _input.LA(1); } @@ -293,9 +295,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(59); + setState(63); match(T__0); - setState(60); + setState(64); match(STRING); } } @@ -343,20 +345,20 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(63); + setState(67); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(62); + setState(66); decl(); } } - setState(65); + setState(69); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__6) | (1L << T__18) | (1L << SIMPLETYPE))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__19) | (1L << SIMPLETYPE))) != 0) ); } } catch (RecognitionException re) { @@ -432,44 +434,44 @@ public class KickCParser extends Parser { enterRule(_localctx, 10, RULE_decl); int _la; try { - setState(81); + setState(85); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: _localctx = new DeclMethodContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(67); - typeDecl(0); - setState(68); - match(NAME); - setState(69); - match(T__1); setState(71); + typeDecl(0); + setState(72); + match(NAME); + setState(73); + match(T__1); + setState(75); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__18 || _la==SIMPLETYPE) { + if (_la==T__19 || _la==SIMPLETYPE) { { - setState(70); + setState(74); parameterListDecl(); } } - setState(73); + setState(77); match(T__2); - setState(74); + setState(78); match(T__3); - setState(76); + setState(80); _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)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__8 - 2)) | (1L << (T__9 - 2)) | (1L << (T__10 - 2)) | (1L << (T__12 - 2)) | (1L << (T__13 - 2)) | (1L << (T__14 - 2)) | (1L << (T__15 - 2)) | (1L << (T__16 - 2)) | (1L << (T__19 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (SIMPLETYPE - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0)) { { - setState(75); + setState(79); stmtSeq(); } } - setState(78); + setState(82); match(T__4); } break; @@ -477,7 +479,7 @@ public class KickCParser extends Parser { _localctx = new DeclVariableContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(80); + setState(84); declVar(); } break; @@ -527,21 +529,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(83); + setState(87); parameterDecl(); - setState(88); + setState(92); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(84); + setState(88); match(T__5); - setState(85); + setState(89); parameterDecl(); } } - setState(90); + setState(94); _errHandler.sync(this); _la = _input.LA(1); } @@ -588,9 +590,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(91); + setState(95); typeDecl(0); - setState(92); + setState(96); match(NAME); } } @@ -610,6 +612,12 @@ public class KickCParser extends Parser { return getRuleContext(TypeDeclContext.class,0); } public TerminalNode NAME() { return getToken(KickCParser.NAME, 0); } + public List directives() { + return getRuleContexts(DirectivesContext.class); + } + public DirectivesContext directives(int i) { + return getRuleContext(DirectivesContext.class,i); + } public ExprContext expr() { return getRuleContext(ExprContext.class,0); } @@ -639,34 +647,193 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(95); + setState(99); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__8 || _la==T__9) { + { + setState(98); + directives(); + } + } + + setState(101); + typeDecl(0); + setState(103); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==T__8 || _la==T__9) { + { + setState(102); + directives(); + } + } + + setState(105); + match(NAME); + setState(108); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__6) { { - setState(94); + setState(106); match(T__6); - } - } - - setState(97); - typeDecl(0); - setState(98); - match(NAME); - setState(101); - _errHandler.sync(this); - _la = _input.LA(1); - if (_la==T__7) { - { - setState(99); - match(T__7); - setState(100); + setState(107); expr(0); } } - setState(103); - match(T__8); + setState(110); + match(T__7); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DirectivesContext extends ParserRuleContext { + public List directive() { + return getRuleContexts(DirectiveContext.class); + } + public DirectiveContext directive(int i) { + return getRuleContext(DirectiveContext.class,i); + } + public DirectivesContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directives; } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterDirectives(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitDirectives(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitDirectives(this); + else return visitor.visitChildren(this); + } + } + + public final DirectivesContext directives() throws RecognitionException { + DirectivesContext _localctx = new DirectivesContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_directives); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(113); + _errHandler.sync(this); + _la = _input.LA(1); + do { + { + { + setState(112); + directive(); + } + } + setState(115); + _errHandler.sync(this); + _la = _input.LA(1); + } while ( _la==T__8 || _la==T__9 ); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class DirectiveContext extends ParserRuleContext { + public DirectiveContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_directive; } + + public DirectiveContext() { } + public void copyFrom(DirectiveContext ctx) { + super.copyFrom(ctx); + } + } + public static class DirectiveConstContext extends DirectiveContext { + public DirectiveConstContext(DirectiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterDirectiveConst(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitDirectiveConst(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitDirectiveConst(this); + else return visitor.visitChildren(this); + } + } + public static class DirectiveAlignContext extends DirectiveContext { + public TerminalNode NUMBER() { return getToken(KickCParser.NUMBER, 0); } + public DirectiveAlignContext(DirectiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterDirectiveAlign(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitDirectiveAlign(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitDirectiveAlign(this); + else return visitor.visitChildren(this); + } + } + + public final DirectiveContext directive() throws RecognitionException { + DirectiveContext _localctx = new DirectiveContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_directive); + try { + setState(122); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__8: + _localctx = new DirectiveConstContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(117); + match(T__8); + } + break; + case T__9: + _localctx = new DirectiveAlignContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(118); + match(T__9); + setState(119); + match(T__1); + setState(120); + match(NUMBER); + setState(121); + match(T__2); + } + break; + default: + throw new NoViableAltException(this); } } catch (RecognitionException re) { @@ -708,25 +875,25 @@ public class KickCParser extends Parser { public final StmtSeqContext stmtSeq() throws RecognitionException { StmtSeqContext _localctx = new StmtSeqContext(_ctx, getState()); - enterRule(_localctx, 18, RULE_stmtSeq); + enterRule(_localctx, 22, RULE_stmtSeq); int _la; try { enterOuterAlt(_localctx, 1); { - setState(106); + setState(125); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(105); + setState(124); stmt(); } } - setState(108); + setState(127); _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) ); + } while ( ((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__8 - 2)) | (1L << (T__9 - 2)) | (1L << (T__10 - 2)) | (1L << (T__12 - 2)) | (1L << (T__13 - 2)) | (1L << (T__14 - 2)) | (1L << (T__15 - 2)) | (1L << (T__16 - 2)) | (1L << (T__19 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (SIMPLETYPE - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0) ); } } catch (RecognitionException re) { @@ -943,17 +1110,17 @@ public class KickCParser extends Parser { public final StmtContext stmt() throws RecognitionException { StmtContext _localctx = new StmtContext(_ctx, getState()); - enterRule(_localctx, 20, RULE_stmt); + enterRule(_localctx, 24, RULE_stmt); int _la; try { - setState(161); + setState(180); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: _localctx = new StmtDeclVarContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(110); + setState(129); declVar(); } break; @@ -961,19 +1128,19 @@ public class KickCParser extends Parser { _localctx = new StmtBlockContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(111); + setState(130); match(T__3); - setState(113); + setState(132); _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)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__8 - 2)) | (1L << (T__9 - 2)) | (1L << (T__10 - 2)) | (1L << (T__12 - 2)) | (1L << (T__13 - 2)) | (1L << (T__14 - 2)) | (1L << (T__15 - 2)) | (1L << (T__16 - 2)) | (1L << (T__19 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (SIMPLETYPE - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0)) { { - setState(112); + setState(131); stmtSeq(); } } - setState(115); + setState(134); match(T__4); } break; @@ -981,34 +1148,34 @@ public class KickCParser extends Parser { _localctx = new StmtExprContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(116); + setState(135); expr(0); - setState(117); - match(T__8); + setState(136); + match(T__7); } break; case 4: _localctx = new StmtIfElseContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(119); - match(T__9); - setState(120); + setState(138); + match(T__10); + setState(139); match(T__1); - setState(121); + setState(140); expr(0); - setState(122); + setState(141); match(T__2); - setState(123); + setState(142); stmt(); - setState(126); + setState(145); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: { - setState(124); - match(T__10); - setState(125); + setState(143); + match(T__11); + setState(144); stmt(); } break; @@ -1019,15 +1186,15 @@ public class KickCParser extends Parser { _localctx = new StmtWhileContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(128); - match(T__11); - setState(129); + setState(147); + match(T__12); + setState(148); match(T__1); - setState(130); + setState(149); expr(0); - setState(131); + setState(150); match(T__2); - setState(132); + setState(151); stmt(); } break; @@ -1035,45 +1202,45 @@ public class KickCParser extends Parser { _localctx = new StmtDoWhileContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(134); - match(T__12); - setState(135); + setState(153); + match(T__13); + setState(154); stmt(); - setState(136); - match(T__11); - setState(137); + setState(155); + match(T__12); + setState(156); match(T__1); - setState(138); + setState(157); expr(0); - setState(139); + setState(158); match(T__2); - setState(140); - match(T__8); + setState(159); + match(T__7); } break; case 7: _localctx = new StmtForContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(142); - match(T__13); - setState(143); + setState(161); + match(T__14); + setState(162); match(T__1); - setState(145); + setState(164); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__18) | (1L << SIMPLETYPE) | (1L << NAME))) != 0)) { + if (((((_la - 20)) & ~0x3f) == 0 && ((1L << (_la - 20)) & ((1L << (T__19 - 20)) | (1L << (SIMPLETYPE - 20)) | (1L << (NAME - 20)))) != 0)) { { - setState(144); + setState(163); forDeclaration(); } } - setState(147); + setState(166); forIteration(); - setState(148); + setState(167); match(T__2); - setState(149); + setState(168); stmt(); } break; @@ -1081,33 +1248,33 @@ public class KickCParser extends Parser { _localctx = new StmtReturnContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(151); - match(T__14); - setState(153); + setState(170); + match(T__15); + setState(172); _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)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0)) { { - setState(152); + setState(171); expr(0); } } - setState(155); - match(T__8); + setState(174); + match(T__7); } break; case 9: _localctx = new StmtAsmContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(156); - match(T__15); - setState(157); + setState(175); + match(T__16); + setState(176); match(T__3); - setState(158); + setState(177); asmLines(); - setState(159); + setState(178); match(T__4); } break; @@ -1161,32 +1328,32 @@ public class KickCParser extends Parser { public final ForDeclarationContext forDeclaration() throws RecognitionException { ForDeclarationContext _localctx = new ForDeclarationContext(_ctx, getState()); - enterRule(_localctx, 22, RULE_forDeclaration); + enterRule(_localctx, 26, RULE_forDeclaration); int _la; try { _localctx = new ForDeclContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(164); + setState(183); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__18 || _la==SIMPLETYPE) { + if (_la==T__19 || _la==SIMPLETYPE) { { - setState(163); + setState(182); typeDecl(0); } } - setState(166); + setState(185); match(NAME); - setState(169); + setState(188); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__7) { + if (_la==T__6) { { - setState(167); - match(T__7); - setState(168); + setState(186); + match(T__6); + setState(187); expr(0); } } @@ -1262,38 +1429,38 @@ public class KickCParser extends Parser { public final ForIterationContext forIteration() throws RecognitionException { ForIterationContext _localctx = new ForIterationContext(_ctx, getState()); - enterRule(_localctx, 24, RULE_forIteration); + enterRule(_localctx, 28, RULE_forIteration); try { - setState(181); + setState(200); _errHandler.sync(this); switch (_input.LA(1)) { - case T__8: + case T__7: _localctx = new ForClassicContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(171); - match(T__8); - setState(172); + setState(190); + match(T__7); + setState(191); expr(0); - setState(173); - match(T__8); - setState(174); + setState(192); + match(T__7); + setState(193); expr(0); } break; - case T__16: + case T__17: _localctx = new ForRangeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(176); - match(T__16); - setState(177); + setState(195); + match(T__17); + setState(196); expr(0); { - setState(178); - match(T__17); + setState(197); + match(T__18); } - setState(179); + setState(198); expr(0); } break; @@ -1408,14 +1575,14 @@ public class KickCParser extends Parser { int _parentState = getState(); TypeDeclContext _localctx = new TypeDeclContext(_ctx, _parentState); TypeDeclContext _prevctx = _localctx; - int _startState = 26; - enterRecursionRule(_localctx, 26, RULE_typeDecl, _p); + int _startState = 30; + enterRecursionRule(_localctx, 30, RULE_typeDecl, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(187); + setState(206); _errHandler.sync(this); switch (_input.LA(1)) { case SIMPLETYPE: @@ -1424,18 +1591,18 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(184); + setState(203); match(SIMPLETYPE); } break; - case T__18: + case T__19: { _localctx = new TypeSignedSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(185); - match(T__18); - setState(186); + setState(204); + match(T__19); + setState(205); match(SIMPLETYPE); } break; @@ -1443,55 +1610,55 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(199); + setState(218); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(197); + setState(216); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,19,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { case 1: { _localctx = new TypePtrContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(189); + setState(208); if (!(precpred(_ctx, 2))) throw new FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(190); - match(T__19); + setState(209); + match(T__20); } break; case 2: { _localctx = new TypeArrayContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(191); + setState(210); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(192); - match(T__20); - setState(194); + setState(211); + match(T__21); + setState(213); _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)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0)) { { - setState(193); + setState(212); expr(0); } } - setState(196); - match(T__21); + setState(215); + match(T__22); } break; } } } - setState(201); + setState(220); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,20,_ctx); + _alt = getInterpreter().adaptivePredict(_input,23,_ctx); } } } @@ -1837,27 +2004,27 @@ public class KickCParser extends Parser { int _parentState = getState(); ExprContext _localctx = new ExprContext(_ctx, _parentState); ExprContext _prevctx = _localctx; - int _startState = 28; - enterRecursionRule(_localctx, 28, RULE_expr, _p); + int _startState = 32; + enterRecursionRule(_localctx, 32, RULE_expr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(242); + setState(261); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { case 1: { _localctx = new ExprParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(203); + setState(222); match(T__1); - setState(204); + setState(223); expr(0); - setState(205); + setState(224); match(T__2); } break; @@ -1866,21 +2033,21 @@ public class KickCParser extends Parser { _localctx = new ExprCallContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(207); + setState(226); match(NAME); - setState(208); + setState(227); match(T__1); - setState(210); + setState(229); _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)) { + if (((((_la - 2)) & ~0x3f) == 0 && ((1L << (_la - 2)) & ((1L << (T__1 - 2)) | (1L << (T__3 - 2)) | (1L << (T__20 - 2)) | (1L << (T__23 - 2)) | (1L << (T__24 - 2)) | (1L << (T__25 - 2)) | (1L << (T__26 - 2)) | (1L << (T__27 - 2)) | (1L << (T__28 - 2)) | (1L << (T__29 - 2)) | (1L << (T__34 - 2)) | (1L << (T__35 - 2)) | (1L << (STRING - 2)) | (1L << (CHAR - 2)) | (1L << (BOOLEAN - 2)) | (1L << (NUMBER - 2)) | (1L << (NAME - 2)))) != 0)) { { - setState(209); + setState(228); parameterList(); } } - setState(212); + setState(231); match(T__2); } break; @@ -1889,13 +2056,13 @@ public class KickCParser extends Parser { _localctx = new ExprCastContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(213); + setState(232); match(T__1); - setState(214); + setState(233); typeDecl(0); - setState(215); + setState(234); match(T__2); - setState(216); + setState(235); expr(23); } break; @@ -1904,9 +2071,9 @@ public class KickCParser extends Parser { _localctx = new ExprPreModContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(218); + setState(237); _la = _input.LA(1); - if ( !(_la==T__22 || _la==T__23) ) { + if ( !(_la==T__23 || _la==T__24) ) { _errHandler.recoverInline(this); } else { @@ -1914,7 +2081,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(219); + setState(238); expr(21); } break; @@ -1923,9 +2090,9 @@ public class KickCParser extends Parser { _localctx = new ExprPtrContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(220); - match(T__19); - setState(221); + setState(239); + match(T__20); + setState(240); expr(19); } break; @@ -1934,9 +2101,9 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(222); + setState(241); _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)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -1944,7 +2111,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(223); + setState(242); expr(18); } break; @@ -1953,9 +2120,9 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(224); + setState(243); _la = _input.LA(1); - if ( !(_la==T__33 || _la==T__34) ) { + if ( !(_la==T__34 || _la==T__35) ) { _errHandler.recoverInline(this); } else { @@ -1963,7 +2130,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(225); + setState(244); expr(14); } break; @@ -1972,27 +2139,27 @@ public class KickCParser extends Parser { _localctx = new InitListContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(226); + setState(245); match(T__3); - setState(227); + setState(246); expr(0); - setState(232); + setState(251); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(228); + setState(247); match(T__5); - setState(229); + setState(248); expr(0); } } - setState(234); + setState(253); _errHandler.sync(this); _la = _input.LA(1); } - setState(235); + setState(254); match(T__4); } break; @@ -2001,7 +2168,7 @@ public class KickCParser extends Parser { _localctx = new ExprIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(237); + setState(256); match(NAME); } break; @@ -2010,7 +2177,7 @@ public class KickCParser extends Parser { _localctx = new ExprNumberContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(238); + setState(257); match(NUMBER); } break; @@ -2019,7 +2186,7 @@ public class KickCParser extends Parser { _localctx = new ExprStringContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(239); + setState(258); match(STRING); } break; @@ -2028,7 +2195,7 @@ public class KickCParser extends Parser { _localctx = new ExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(240); + setState(259); match(CHAR); } break; @@ -2037,32 +2204,32 @@ public class KickCParser extends Parser { _localctx = new ExprBoolContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(241); + setState(260); match(BOOLEAN); } break; } _ctx.stop = _input.LT(-1); - setState(283); + setState(302); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,25,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(281); + setState(300); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,24,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { case 1: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(244); + setState(263); if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(245); + setState(264); _la = _input.LA(1); - if ( !(_la==T__29 || _la==T__30) ) { + if ( !(_la==T__30 || _la==T__31) ) { _errHandler.recoverInline(this); } else { @@ -2070,7 +2237,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(246); + setState(265); expr(18); } break; @@ -2078,11 +2245,11 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(247); + setState(266); if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); - setState(248); + setState(267); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__19) | (1L << T__31) | (1L << T__32))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__20) | (1L << T__32) | (1L << T__33))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2090,7 +2257,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(249); + setState(268); expr(17); } break; @@ -2098,11 +2265,11 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(250); + setState(269); if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(251); + setState(270); _la = _input.LA(1); - if ( !(_la==T__24 || _la==T__25) ) { + if ( !(_la==T__25 || _la==T__26) ) { _errHandler.recoverInline(this); } else { @@ -2110,7 +2277,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(252); + setState(271); expr(16); } break; @@ -2118,11 +2285,11 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(253); + setState(272); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(254); + setState(273); _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)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2130,7 +2297,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(255); + setState(274); expr(14); } break; @@ -2138,13 +2305,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(256); + setState(275); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); { - setState(257); - match(T__27); + setState(276); + match(T__28); } - setState(258); + setState(277); expr(13); } break; @@ -2152,13 +2319,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(259); + setState(278); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); { - setState(260); - match(T__42); + setState(279); + match(T__43); } - setState(261); + setState(280); expr(12); } break; @@ -2166,13 +2333,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(262); + setState(281); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(263); - match(T__43); + setState(282); + match(T__44); } - setState(264); + setState(283); expr(11); } break; @@ -2180,13 +2347,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(265); + setState(284); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); { - setState(266); - match(T__44); + setState(285); + match(T__45); } - setState(267); + setState(286); expr(10); } break; @@ -2194,13 +2361,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(268); + setState(287); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); { - setState(269); - match(T__45); + setState(288); + match(T__46); } - setState(270); + setState(289); expr(9); } break; @@ -2208,11 +2375,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(271); + setState(290); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(272); - match(T__7); - setState(273); + setState(291); + match(T__6); + setState(292); expr(7); } break; @@ -2220,25 +2387,25 @@ public class KickCParser extends Parser { { _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(274); + setState(293); if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); - setState(275); - match(T__20); - setState(276); - expr(0); - setState(277); + setState(294); match(T__21); + setState(295); + expr(0); + setState(296); + match(T__22); } break; case 12: { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(279); + setState(298); if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); - setState(280); + setState(299); _la = _input.LA(1); - if ( !(_la==T__22 || _la==T__23) ) { + if ( !(_la==T__23 || _la==T__24) ) { _errHandler.recoverInline(this); } else { @@ -2251,9 +2418,9 @@ public class KickCParser extends Parser { } } } - setState(285); + setState(304); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,25,_ctx); + _alt = getInterpreter().adaptivePredict(_input,28,_ctx); } } } @@ -2296,26 +2463,26 @@ public class KickCParser extends Parser { public final ParameterListContext parameterList() throws RecognitionException { ParameterListContext _localctx = new ParameterListContext(_ctx, getState()); - enterRule(_localctx, 30, RULE_parameterList); + enterRule(_localctx, 34, RULE_parameterList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(286); + setState(305); expr(0); - setState(291); + setState(310); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(287); + setState(306); match(T__5); - setState(288); + setState(307); expr(0); } } - setState(293); + setState(312); _errHandler.sync(this); _la = _input.LA(1); } @@ -2360,22 +2527,22 @@ public class KickCParser extends Parser { public final AsmLinesContext asmLines() throws RecognitionException { AsmLinesContext _localctx = new AsmLinesContext(_ctx, getState()); - enterRule(_localctx, 32, RULE_asmLines); + enterRule(_localctx, 36, RULE_asmLines); int _la; try { enterOuterAlt(_localctx, 1); { - setState(297); + setState(316); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__46) | (1L << MNEMONIC) | (1L << NAME))) != 0)) { + while (((((_la - 28)) & ~0x3f) == 0 && ((1L << (_la - 28)) & ((1L << (T__27 - 28)) | (1L << (T__47 - 28)) | (1L << (MNEMONIC - 28)) | (1L << (NAME - 28)))) != 0)) { { { - setState(294); + setState(313); asmLine(); } } - setState(299); + setState(318); _errHandler.sync(this); _la = _input.LA(1); } @@ -2423,30 +2590,30 @@ public class KickCParser extends Parser { public final AsmLineContext asmLine() throws RecognitionException { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); - enterRule(_localctx, 34, RULE_asmLine); + enterRule(_localctx, 38, RULE_asmLine); try { - setState(303); + setState(322); _errHandler.sync(this); switch (_input.LA(1)) { - case T__26: + case T__27: case NAME: enterOuterAlt(_localctx, 1); { - setState(300); + setState(319); asmLabel(); } break; case MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(301); + setState(320); asmInstruction(); } break; - case T__46: + case T__47: enterOuterAlt(_localctx, 3); { - setState(302); + setState(321); asmBytes(); } break; @@ -2488,27 +2655,27 @@ public class KickCParser extends Parser { public final AsmLabelContext asmLabel() throws RecognitionException { AsmLabelContext _localctx = new AsmLabelContext(_ctx, getState()); - enterRule(_localctx, 36, RULE_asmLabel); + enterRule(_localctx, 40, RULE_asmLabel); try { - setState(309); + setState(328); _errHandler.sync(this); switch (_input.LA(1)) { case NAME: enterOuterAlt(_localctx, 1); { - setState(305); + setState(324); match(NAME); - setState(306); - match(T__16); + setState(325); + match(T__17); } break; - case T__26: + case T__27: enterOuterAlt(_localctx, 2); { - setState(307); - match(T__26); - setState(308); - match(T__16); + setState(326); + match(T__27); + setState(327); + match(T__17); } break; default: @@ -2552,18 +2719,18 @@ public class KickCParser extends Parser { public final AsmInstructionContext asmInstruction() throws RecognitionException { AsmInstructionContext _localctx = new AsmInstructionContext(_ctx, getState()); - enterRule(_localctx, 38, RULE_asmInstruction); + enterRule(_localctx, 42, RULE_asmInstruction); try { enterOuterAlt(_localctx, 1); { - setState(311); + setState(330); match(MNEMONIC); - setState(313); + setState(332); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: { - setState(312); + setState(331); asmParamMode(); } break; @@ -2609,28 +2776,28 @@ public class KickCParser extends Parser { public final AsmBytesContext asmBytes() throws RecognitionException { AsmBytesContext _localctx = new AsmBytesContext(_ctx, getState()); - enterRule(_localctx, 40, RULE_asmBytes); + enterRule(_localctx, 44, RULE_asmBytes); int _la; try { enterOuterAlt(_localctx, 1); { - setState(315); - match(T__46); - setState(316); + setState(334); + match(T__47); + setState(335); asmExpr(0); - setState(321); + setState(340); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__5) { { { - setState(317); + setState(336); match(T__5); - setState(318); + setState(337); asmExpr(0); } } - setState(323); + setState(342); _errHandler.sync(this); _la = _input.LA(1); } @@ -2778,16 +2945,16 @@ public class KickCParser extends Parser { public final AsmParamModeContext asmParamMode() throws RecognitionException { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); - enterRule(_localctx, 42, RULE_asmParamMode); + enterRule(_localctx, 46, RULE_asmParamMode); try { - setState(347); + setState(366); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(324); + setState(343); asmExpr(0); } break; @@ -2795,9 +2962,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(325); - match(T__47); - setState(326); + setState(344); + match(T__48); + setState(345); asmExpr(0); } break; @@ -2805,11 +2972,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(327); + setState(346); asmExpr(0); - setState(328); + setState(347); match(T__5); - setState(329); + setState(348); match(NAME); } break; @@ -2817,15 +2984,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(331); + setState(350); match(T__1); - setState(332); + setState(351); asmExpr(0); - setState(333); + setState(352); match(T__2); - setState(334); + setState(353); match(T__5); - setState(335); + setState(354); match(NAME); } break; @@ -2833,15 +3000,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIdxIndXYContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(337); + setState(356); match(T__1); - setState(338); + setState(357); asmExpr(0); - setState(339); + setState(358); match(T__5); - setState(340); + setState(359); match(NAME); - setState(341); + setState(360); match(T__2); } break; @@ -2849,11 +3016,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(343); + setState(362); match(T__1); - setState(344); + setState(363); asmExpr(0); - setState(345); + setState(364); match(T__2); } break; @@ -3017,28 +3184,28 @@ public class KickCParser extends Parser { int _parentState = getState(); AsmExprContext _localctx = new AsmExprContext(_ctx, _parentState); AsmExprContext _prevctx = _localctx; - int _startState = 44; - enterRecursionRule(_localctx, 44, RULE_asmExpr, _p); + int _startState = 48; + enterRecursionRule(_localctx, 48, RULE_asmExpr, _p); int _la; try { int _alt; enterOuterAlt(_localctx, 1); { - setState(359); + setState(378); _errHandler.sync(this); switch (_input.LA(1)) { - case T__24: case T__25: - case T__33: + case T__26: case T__34: + case T__35: { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(350); + setState(369); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__24) | (1L << T__25) | (1L << T__33) | (1L << T__34))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__34) | (1L << T__35))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3046,7 +3213,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(351); + setState(370); asmExpr(8); } break; @@ -3055,7 +3222,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(352); + setState(371); match(NAME); } break; @@ -3064,7 +3231,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(353); + setState(372); match(ASMREL); } break; @@ -3073,11 +3240,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(354); + setState(373); match(T__3); - setState(355); + setState(374); match(NAME); - setState(356); + setState(375); match(T__4); } break; @@ -3086,7 +3253,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(357); + setState(376); match(NUMBER); } break; @@ -3095,7 +3262,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(358); + setState(377); match(CHAR); } break; @@ -3103,26 +3270,26 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(369); + setState(388); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(367); + setState(386); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,34,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(361); + setState(380); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(362); + setState(381); _la = _input.LA(1); - if ( !(_la==T__19 || _la==T__31) ) { + if ( !(_la==T__20 || _la==T__32) ) { _errHandler.recoverInline(this); } else { @@ -3130,7 +3297,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(363); + setState(382); asmExpr(8); } break; @@ -3138,11 +3305,11 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(364); + setState(383); if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(365); + setState(384); _la = _input.LA(1); - if ( !(_la==T__24 || _la==T__25) ) { + if ( !(_la==T__25 || _la==T__26) ) { _errHandler.recoverInline(this); } else { @@ -3150,16 +3317,16 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(366); + setState(385); asmExpr(7); } break; } } } - setState(371); + setState(390); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,38,_ctx); } } } @@ -3176,11 +3343,11 @@ public class KickCParser extends Parser { public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { switch (ruleIndex) { - case 13: + case 15: return typeDecl_sempred((TypeDeclContext)_localctx, predIndex); - case 14: + case 16: return expr_sempred((ExprContext)_localctx, predIndex); - case 22: + case 24: return asmExpr_sempred((AsmExprContext)_localctx, predIndex); } return true; @@ -3234,147 +3401,154 @@ public class KickCParser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3E\u0177\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3F\u018a\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\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\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"; + "\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"+ + "\4\32\t\32\3\2\3\2\3\2\3\2\3\3\3\3\3\3\3\4\7\4=\n\4\f\4\16\4@\13\4\3\5"+ + "\3\5\3\5\3\6\6\6F\n\6\r\6\16\6G\3\7\3\7\3\7\3\7\5\7N\n\7\3\7\3\7\3\7\5"+ + "\7S\n\7\3\7\3\7\3\7\5\7X\n\7\3\b\3\b\3\b\7\b]\n\b\f\b\16\b`\13\b\3\t\3"+ + "\t\3\t\3\n\5\nf\n\n\3\n\3\n\5\nj\n\n\3\n\3\n\3\n\5\no\n\n\3\n\3\n\3\13"+ + "\6\13t\n\13\r\13\16\13u\3\f\3\f\3\f\3\f\3\f\5\f}\n\f\3\r\6\r\u0080\n\r"+ + "\r\r\16\r\u0081\3\16\3\16\3\16\5\16\u0087\n\16\3\16\3\16\3\16\3\16\3\16"+ + "\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u0094\n\16\3\16\3\16\3\16\3\16\3\16"+ + "\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u00a7"+ + "\n\16\3\16\3\16\3\16\3\16\3\16\3\16\5\16\u00af\n\16\3\16\3\16\3\16\3\16"+ + "\3\16\3\16\5\16\u00b7\n\16\3\17\5\17\u00ba\n\17\3\17\3\17\3\17\5\17\u00bf"+ + "\n\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\20\5\20\u00cb\n\20"+ + "\3\21\3\21\3\21\3\21\5\21\u00d1\n\21\3\21\3\21\3\21\3\21\3\21\5\21\u00d8"+ + "\n\21\3\21\7\21\u00db\n\21\f\21\16\21\u00de\13\21\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\5\22\u00e8\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u00fc\n\22"+ + "\f\22\16\22\u00ff\13\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\5\22\u0108"+ + "\n\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22"+ + "\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\7\22\u012f\n\22\f\22"+ + "\16\22\u0132\13\22\3\23\3\23\3\23\7\23\u0137\n\23\f\23\16\23\u013a\13"+ + "\23\3\24\7\24\u013d\n\24\f\24\16\24\u0140\13\24\3\25\3\25\3\25\5\25\u0145"+ + "\n\25\3\26\3\26\3\26\3\26\5\26\u014b\n\26\3\27\3\27\5\27\u014f\n\27\3"+ + "\30\3\30\3\30\3\30\7\30\u0155\n\30\f\30\16\30\u0158\13\30\3\31\3\31\3"+ + "\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3"+ + "\31\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u0171\n\31\3\32\3\32\3\32\3\32"+ + "\3\32\3\32\3\32\3\32\3\32\3\32\5\32\u017d\n\32\3\32\3\32\3\32\3\32\3\32"+ + "\3\32\7\32\u0185\n\32\f\32\16\32\u0188\13\32\3\32\2\5 \"\62\33\2\4\6\b"+ + "\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\2\13\3\2\32\33\3\2\34 "+ + "\3\2%&\3\2!\"\4\2\27\27#$\3\2\34\35\3\2%-\4\2\34\35%&\4\2\27\27##\2\u01bc"+ + "\2\64\3\2\2\2\48\3\2\2\2\6>\3\2\2\2\bA\3\2\2\2\nE\3\2\2\2\fW\3\2\2\2\16"+ + "Y\3\2\2\2\20a\3\2\2\2\22e\3\2\2\2\24s\3\2\2\2\26|\3\2\2\2\30\177\3\2\2"+ + "\2\32\u00b6\3\2\2\2\34\u00b9\3\2\2\2\36\u00ca\3\2\2\2 \u00d0\3\2\2\2\""+ + "\u0107\3\2\2\2$\u0133\3\2\2\2&\u013e\3\2\2\2(\u0144\3\2\2\2*\u014a\3\2"+ + "\2\2,\u014c\3\2\2\2.\u0150\3\2\2\2\60\u0170\3\2\2\2\62\u017c\3\2\2\2\64"+ + "\65\5\6\4\2\65\66\5\n\6\2\66\67\7\2\2\3\67\3\3\2\2\289\5&\24\29:\7\2\2"+ + "\3:\5\3\2\2\2;=\5\b\5\2<;\3\2\2\2=@\3\2\2\2><\3\2\2\2>?\3\2\2\2?\7\3\2"+ + "\2\2@>\3\2\2\2AB\7\3\2\2BC\7\66\2\2C\t\3\2\2\2DF\5\f\7\2ED\3\2\2\2FG\3"+ + "\2\2\2GE\3\2\2\2GH\3\2\2\2H\13\3\2\2\2IJ\5 \21\2JK\7B\2\2KM\7\4\2\2LN"+ + "\5\16\b\2ML\3\2\2\2MN\3\2\2\2NO\3\2\2\2OP\7\5\2\2PR\7\6\2\2QS\5\30\r\2"+ + "RQ\3\2\2\2RS\3\2\2\2ST\3\2\2\2TU\7\7\2\2UX\3\2\2\2VX\5\22\n\2WI\3\2\2"+ + "\2WV\3\2\2\2X\r\3\2\2\2Y^\5\20\t\2Z[\7\b\2\2[]\5\20\t\2\\Z\3\2\2\2]`\3"+ + "\2\2\2^\\\3\2\2\2^_\3\2\2\2_\17\3\2\2\2`^\3\2\2\2ab\5 \21\2bc\7B\2\2c"+ + "\21\3\2\2\2df\5\24\13\2ed\3\2\2\2ef\3\2\2\2fg\3\2\2\2gi\5 \21\2hj\5\24"+ + "\13\2ih\3\2\2\2ij\3\2\2\2jk\3\2\2\2kn\7B\2\2lm\7\t\2\2mo\5\"\22\2nl\3"+ + "\2\2\2no\3\2\2\2op\3\2\2\2pq\7\n\2\2q\23\3\2\2\2rt\5\26\f\2sr\3\2\2\2"+ + "tu\3\2\2\2us\3\2\2\2uv\3\2\2\2v\25\3\2\2\2w}\7\13\2\2xy\7\f\2\2yz\7\4"+ + "\2\2z{\79\2\2{}\7\5\2\2|w\3\2\2\2|x\3\2\2\2}\27\3\2\2\2~\u0080\5\32\16"+ + "\2\177~\3\2\2\2\u0080\u0081\3\2\2\2\u0081\177\3\2\2\2\u0081\u0082\3\2"+ + "\2\2\u0082\31\3\2\2\2\u0083\u00b7\5\22\n\2\u0084\u0086\7\6\2\2\u0085\u0087"+ + "\5\30\r\2\u0086\u0085\3\2\2\2\u0086\u0087\3\2\2\2\u0087\u0088\3\2\2\2"+ + "\u0088\u00b7\7\7\2\2\u0089\u008a\5\"\22\2\u008a\u008b\7\n\2\2\u008b\u00b7"+ + "\3\2\2\2\u008c\u008d\7\r\2\2\u008d\u008e\7\4\2\2\u008e\u008f\5\"\22\2"+ + "\u008f\u0090\7\5\2\2\u0090\u0093\5\32\16\2\u0091\u0092\7\16\2\2\u0092"+ + "\u0094\5\32\16\2\u0093\u0091\3\2\2\2\u0093\u0094\3\2\2\2\u0094\u00b7\3"+ + "\2\2\2\u0095\u0096\7\17\2\2\u0096\u0097\7\4\2\2\u0097\u0098\5\"\22\2\u0098"+ + "\u0099\7\5\2\2\u0099\u009a\5\32\16\2\u009a\u00b7\3\2\2\2\u009b\u009c\7"+ + "\20\2\2\u009c\u009d\5\32\16\2\u009d\u009e\7\17\2\2\u009e\u009f\7\4\2\2"+ + "\u009f\u00a0\5\"\22\2\u00a0\u00a1\7\5\2\2\u00a1\u00a2\7\n\2\2\u00a2\u00b7"+ + "\3\2\2\2\u00a3\u00a4\7\21\2\2\u00a4\u00a6\7\4\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\u00a9"+ + "\5\36\20\2\u00a9\u00aa\7\5\2\2\u00aa\u00ab\5\32\16\2\u00ab\u00b7\3\2\2"+ + "\2\u00ac\u00ae\7\22\2\2\u00ad\u00af\5\"\22\2\u00ae\u00ad\3\2\2\2\u00ae"+ + "\u00af\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b7\7\n\2\2\u00b1\u00b2\7\23"+ + "\2\2\u00b2\u00b3\7\6\2\2\u00b3\u00b4\5&\24\2\u00b4\u00b5\7\7\2\2\u00b5"+ + "\u00b7\3\2\2\2\u00b6\u0083\3\2\2\2\u00b6\u0084\3\2\2\2\u00b6\u0089\3\2"+ + "\2\2\u00b6\u008c\3\2\2\2\u00b6\u0095\3\2\2\2\u00b6\u009b\3\2\2\2\u00b6"+ + "\u00a3\3\2\2\2\u00b6\u00ac\3\2\2\2\u00b6\u00b1\3\2\2\2\u00b7\33\3\2\2"+ + "\2\u00b8\u00ba\5 \21\2\u00b9\u00b8\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb"+ + "\3\2\2\2\u00bb\u00be\7B\2\2\u00bc\u00bd\7\t\2\2\u00bd\u00bf\5\"\22\2\u00be"+ + "\u00bc\3\2\2\2\u00be\u00bf\3\2\2\2\u00bf\35\3\2\2\2\u00c0\u00c1\7\n\2"+ + "\2\u00c1\u00c2\5\"\22\2\u00c2\u00c3\7\n\2\2\u00c3\u00c4\5\"\22\2\u00c4"+ + "\u00cb\3\2\2\2\u00c5\u00c6\7\24\2\2\u00c6\u00c7\5\"\22\2\u00c7\u00c8\7"+ + "\25\2\2\u00c8\u00c9\5\"\22\2\u00c9\u00cb\3\2\2\2\u00ca\u00c0\3\2\2\2\u00ca"+ + "\u00c5\3\2\2\2\u00cb\37\3\2\2\2\u00cc\u00cd\b\21\1\2\u00cd\u00d1\7\65"+ + "\2\2\u00ce\u00cf\7\26\2\2\u00cf\u00d1\7\65\2\2\u00d0\u00cc\3\2\2\2\u00d0"+ + "\u00ce\3\2\2\2\u00d1\u00dc\3\2\2\2\u00d2\u00d3\f\4\2\2\u00d3\u00db\7\27"+ + "\2\2\u00d4\u00d5\f\3\2\2\u00d5\u00d7\7\30\2\2\u00d6\u00d8\5\"\22\2\u00d7"+ + "\u00d6\3\2\2\2\u00d7\u00d8\3\2\2\2\u00d8\u00d9\3\2\2\2\u00d9\u00db\7\31"+ + "\2\2\u00da\u00d2\3\2\2\2\u00da\u00d4\3\2\2\2\u00db\u00de\3\2\2\2\u00dc"+ + "\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd!\3\2\2\2\u00de\u00dc\3\2\2\2"+ + "\u00df\u00e0\b\22\1\2\u00e0\u00e1\7\4\2\2\u00e1\u00e2\5\"\22\2\u00e2\u00e3"+ + "\7\5\2\2\u00e3\u0108\3\2\2\2\u00e4\u00e5\7B\2\2\u00e5\u00e7\7\4\2\2\u00e6"+ + "\u00e8\5$\23\2\u00e7\u00e6\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00e9\3\2"+ + "\2\2\u00e9\u0108\7\5\2\2\u00ea\u00eb\7\4\2\2\u00eb\u00ec\5 \21\2\u00ec"+ + "\u00ed\7\5\2\2\u00ed\u00ee\5\"\22\31\u00ee\u0108\3\2\2\2\u00ef\u00f0\t"+ + "\2\2\2\u00f0\u0108\5\"\22\27\u00f1\u00f2\7\27\2\2\u00f2\u0108\5\"\22\25"+ + "\u00f3\u00f4\t\3\2\2\u00f4\u0108\5\"\22\24\u00f5\u00f6\t\4\2\2\u00f6\u0108"+ + "\5\"\22\20\u00f7\u00f8\7\6\2\2\u00f8\u00fd\5\"\22\2\u00f9\u00fa\7\b\2"+ + "\2\u00fa\u00fc\5\"\22\2\u00fb\u00f9\3\2\2\2\u00fc\u00ff\3\2\2\2\u00fd"+ + "\u00fb\3\2\2\2\u00fd\u00fe\3\2\2\2\u00fe\u0100\3\2\2\2\u00ff\u00fd\3\2"+ + "\2\2\u0100\u0101\7\7\2\2\u0101\u0108\3\2\2\2\u0102\u0108\7B\2\2\u0103"+ + "\u0108\79\2\2\u0104\u0108\7\66\2\2\u0105\u0108\7\67\2\2\u0106\u0108\7"+ + "8\2\2\u0107\u00df\3\2\2\2\u0107\u00e4\3\2\2\2\u0107\u00ea\3\2\2\2\u0107"+ + "\u00ef\3\2\2\2\u0107\u00f1\3\2\2\2\u0107\u00f3\3\2\2\2\u0107\u00f5\3\2"+ + "\2\2\u0107\u00f7\3\2\2\2\u0107\u0102\3\2\2\2\u0107\u0103\3\2\2\2\u0107"+ + "\u0104\3\2\2\2\u0107\u0105\3\2\2\2\u0107\u0106\3\2\2\2\u0108\u0130\3\2"+ + "\2\2\u0109\u010a\f\23\2\2\u010a\u010b\t\5\2\2\u010b\u012f\5\"\22\24\u010c"+ + "\u010d\f\22\2\2\u010d\u010e\t\6\2\2\u010e\u012f\5\"\22\23\u010f\u0110"+ + "\f\21\2\2\u0110\u0111\t\7\2\2\u0111\u012f\5\"\22\22\u0112\u0113\f\17\2"+ + "\2\u0113\u0114\t\b\2\2\u0114\u012f\5\"\22\20\u0115\u0116\f\16\2\2\u0116"+ + "\u0117\7\37\2\2\u0117\u012f\5\"\22\17\u0118\u0119\f\r\2\2\u0119\u011a"+ + "\7.\2\2\u011a\u012f\5\"\22\16\u011b\u011c\f\f\2\2\u011c\u011d\7/\2\2\u011d"+ + "\u012f\5\"\22\r\u011e\u011f\f\13\2\2\u011f\u0120\7\60\2\2\u0120\u012f"+ + "\5\"\22\f\u0121\u0122\f\n\2\2\u0122\u0123\7\61\2\2\u0123\u012f\5\"\22"+ + "\13\u0124\u0125\f\t\2\2\u0125\u0126\7\t\2\2\u0126\u012f\5\"\22\t\u0127"+ + "\u0128\f\30\2\2\u0128\u0129\7\30\2\2\u0129\u012a\5\"\22\2\u012a\u012b"+ + "\7\31\2\2\u012b\u012f\3\2\2\2\u012c\u012d\f\26\2\2\u012d\u012f\t\2\2\2"+ + "\u012e\u0109\3\2\2\2\u012e\u010c\3\2\2\2\u012e\u010f\3\2\2\2\u012e\u0112"+ + "\3\2\2\2\u012e\u0115\3\2\2\2\u012e\u0118\3\2\2\2\u012e\u011b\3\2\2\2\u012e"+ + "\u011e\3\2\2\2\u012e\u0121\3\2\2\2\u012e\u0124\3\2\2\2\u012e\u0127\3\2"+ + "\2\2\u012e\u012c\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2\2\u0130"+ + "\u0131\3\2\2\2\u0131#\3\2\2\2\u0132\u0130\3\2\2\2\u0133\u0138\5\"\22\2"+ + "\u0134\u0135\7\b\2\2\u0135\u0137\5\"\22\2\u0136\u0134\3\2\2\2\u0137\u013a"+ + "\3\2\2\2\u0138\u0136\3\2\2\2\u0138\u0139\3\2\2\2\u0139%\3\2\2\2\u013a"+ + "\u0138\3\2\2\2\u013b\u013d\5(\25\2\u013c\u013b\3\2\2\2\u013d\u0140\3\2"+ + "\2\2\u013e\u013c\3\2\2\2\u013e\u013f\3\2\2\2\u013f\'\3\2\2\2\u0140\u013e"+ + "\3\2\2\2\u0141\u0145\5*\26\2\u0142\u0145\5,\27\2\u0143\u0145\5.\30\2\u0144"+ + "\u0141\3\2\2\2\u0144\u0142\3\2\2\2\u0144\u0143\3\2\2\2\u0145)\3\2\2\2"+ + "\u0146\u0147\7B\2\2\u0147\u014b\7\24\2\2\u0148\u0149\7\36\2\2\u0149\u014b"+ + "\7\24\2\2\u014a\u0146\3\2\2\2\u014a\u0148\3\2\2\2\u014b+\3\2\2\2\u014c"+ + "\u014e\7\64\2\2\u014d\u014f\5\60\31\2\u014e\u014d\3\2\2\2\u014e\u014f"+ + "\3\2\2\2\u014f-\3\2\2\2\u0150\u0151\7\62\2\2\u0151\u0156\5\62\32\2\u0152"+ + "\u0153\7\b\2\2\u0153\u0155\5\62\32\2\u0154\u0152\3\2\2\2\u0155\u0158\3"+ + "\2\2\2\u0156\u0154\3\2\2\2\u0156\u0157\3\2\2\2\u0157/\3\2\2\2\u0158\u0156"+ + "\3\2\2\2\u0159\u0171\5\62\32\2\u015a\u015b\7\63\2\2\u015b\u0171\5\62\32"+ + "\2\u015c\u015d\5\62\32\2\u015d\u015e\7\b\2\2\u015e\u015f\7B\2\2\u015f"+ + "\u0171\3\2\2\2\u0160\u0161\7\4\2\2\u0161\u0162\5\62\32\2\u0162\u0163\7"+ + "\5\2\2\u0163\u0164\7\b\2\2\u0164\u0165\7B\2\2\u0165\u0171\3\2\2\2\u0166"+ + "\u0167\7\4\2\2\u0167\u0168\5\62\32\2\u0168\u0169\7\b\2\2\u0169\u016a\7"+ + "B\2\2\u016a\u016b\7\5\2\2\u016b\u0171\3\2\2\2\u016c\u016d\7\4\2\2\u016d"+ + "\u016e\5\62\32\2\u016e\u016f\7\5\2\2\u016f\u0171\3\2\2\2\u0170\u0159\3"+ + "\2\2\2\u0170\u015a\3\2\2\2\u0170\u015c\3\2\2\2\u0170\u0160\3\2\2\2\u0170"+ + "\u0166\3\2\2\2\u0170\u016c\3\2\2\2\u0171\61\3\2\2\2\u0172\u0173\b\32\1"+ + "\2\u0173\u0174\t\t\2\2\u0174\u017d\5\62\32\n\u0175\u017d\7B\2\2\u0176"+ + "\u017d\7C\2\2\u0177\u0178\7\6\2\2\u0178\u0179\7B\2\2\u0179\u017d\7\7\2"+ + "\2\u017a\u017d\79\2\2\u017b\u017d\7\67\2\2\u017c\u0172\3\2\2\2\u017c\u0175"+ + "\3\2\2\2\u017c\u0176\3\2\2\2\u017c\u0177\3\2\2\2\u017c\u017a\3\2\2\2\u017c"+ + "\u017b\3\2\2\2\u017d\u0186\3\2\2\2\u017e\u017f\f\t\2\2\u017f\u0180\t\n"+ + "\2\2\u0180\u0185\5\62\32\n\u0181\u0182\f\b\2\2\u0182\u0183\t\7\2\2\u0183"+ + "\u0185\5\62\32\t\u0184\u017e\3\2\2\2\u0184\u0181\3\2\2\2\u0185\u0188\3"+ + "\2\2\2\u0186\u0184\3\2\2\2\u0186\u0187\3\2\2\2\u0187\63\3\2\2\2\u0188"+ + "\u0186\3\2\2\2)>GMRW^einu|\u0081\u0086\u0093\u00a6\u00ae\u00b6\u00b9\u00be"+ + "\u00ca\u00d0\u00d7\u00da\u00dc\u00e7\u00fd\u0107\u012e\u0130\u0138\u013e"+ + "\u0144\u014a\u014e\u0156\u0170\u017c\u0184\u0186"; 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 2ecf652b3..6d6318c9c 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java @@ -1,4 +1,4 @@ -// Generated from /Users/jespergravgaard/c64/src/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -72,6 +72,26 @@ public interface KickCVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitDeclVar(KickCParser.DeclVarContext ctx); + /** + * Visit a parse tree produced by {@link KickCParser#directives}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDirectives(KickCParser.DirectivesContext ctx); + /** + * Visit a parse tree produced by the {@code directiveConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDirectiveConst(KickCParser.DirectiveConstContext ctx); + /** + * Visit a parse tree produced by the {@code directiveAlign} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDirectiveAlign(KickCParser.DirectiveAlignContext ctx); /** * Visit a parse tree produced by {@link KickCParser#stmtSeq}. * @param ctx the parse tree diff --git a/src/main/java/dk/camelot64/kickc/passes/StatementSequenceGenerator.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java similarity index 90% rename from src/main/java/dk/camelot64/kickc/passes/StatementSequenceGenerator.java rename to src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 5ad84333e..3b8bfbeb0 100644 --- a/src/main/java/dk/camelot64/kickc/passes/StatementSequenceGenerator.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -9,19 +9,20 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.TerminalNode; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Stack; /** * Generates program SSA form by visiting the ANTLR4 parse tree */ -public class StatementSequenceGenerator extends KickCBaseVisitor { +public class Pass0GenerateStatementSequence extends KickCBaseVisitor { private Program program; private Stack scopeStack; private StatementSequence sequence; - public StatementSequenceGenerator(Program program) { + public Pass0GenerateStatementSequence(Program program) { this.program = program; this.scopeStack = new Stack<>(); scopeStack.push(program.getScope()); @@ -139,9 +140,25 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { SymbolType type = (SymbolType) visit(ctx.typeDecl()); String varName = ctx.NAME().getText(); VariableUnversioned lValue = getCurrentSymbols().addVariable(varName, type); - if(ctx.getChild(0).getText().equals("const")) { - lValue.setDeclaredConstant(true); + + List directives = new ArrayList<>(); + for(KickCParser.DirectivesContext directivesContext : ctx.directives()) { + directives.addAll((Collection) this.visit(directivesContext)); } + for(Directive directive : directives) { + if(directive instanceof DirectiveConst) { + lValue.setDeclaredConstant(true); + } else if(directive instanceof DirectiveAlign) { + if(type instanceof SymbolTypeArray || type.equals(SymbolType.STRING)) { + lValue.setDeclaredAlignment(((DirectiveAlign) directive).getAlignment()); + } else { + throw new CompileError("Error! Cannot align variable that is not a string or an array " +lValue.toString(program)); + } + } else { + throw new CompileError("Unknown directive " + directive); + } + } + // Array / String variables are implicitly constant if(type instanceof SymbolTypeArray || type.equals(SymbolType.STRING)) { lValue.setDeclaredConstant(true); } @@ -152,8 +169,8 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { // Add an zero-array initializer SymbolTypeArray typeArray = (SymbolTypeArray) type; Integer size = typeArray.getSize(); - if(size==null) { - throw new CompileError("Error! Cannot determine array size. "+lValue.toString(program)); + if(size == null) { + throw new CompileError("Error! Cannot determine array size. " + lValue.toString(program)); } Statement stmt = new StatementAssignment(lValue, new ConstantArrayFilled(typeArray.getElementType(), size)); sequence.addStatement(stmt); @@ -161,6 +178,45 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { return null; } + /** A declaration directive.*/ + private interface Directive {} + + @Override + public List visitDirectives(KickCParser.DirectivesContext ctx) { + ArrayList directives = new ArrayList<>(); + for(KickCParser.DirectiveContext directiveContext : ctx.directive()) { + directives.add((Directive) this.visit(directiveContext)); + } + return directives; + } + + /** Variable declared constant. */ + private static class DirectiveConst implements Directive { } + + @Override + public Directive visitDirectiveConst(KickCParser.DirectiveConstContext ctx) { + return new DirectiveConst(); + } + + /** Variable memory alignment. */ + private static class DirectiveAlign implements Directive { + private int alignment; + + public DirectiveAlign(int alignment) { + this.alignment = alignment; + } + + public int getAlignment() { + return alignment; + } + } + + @Override + public Directive visitDirectiveAlign(KickCParser.DirectiveAlignContext ctx) { + Number alignment = NumberParser.parseLiteral(ctx.NUMBER().getText()); + return new DirectiveAlign(alignment.intValue()); + } + @Override public Void visitStmtSeq(KickCParser.StmtSeqContext ctx) { for(int i = 0; i < ctx.getChildCount(); i++) { @@ -599,9 +655,9 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { private List postMods; private List preMods; - private StatementSequenceGenerator mainParser; + private Pass0GenerateStatementSequence mainParser; - public PrePostModifierHandler(StatementSequenceGenerator mainParser) { + public PrePostModifierHandler(Pass0GenerateStatementSequence mainParser) { this.mainParser = mainParser; preMods = new ArrayList<>(); postMods = new ArrayList<>(); @@ -615,14 +671,14 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { return postMods; } - public static void addPostModifiers(StatementSequenceGenerator parser, ParserRuleContext ctx) { + public static void addPostModifiers(Pass0GenerateStatementSequence parser, ParserRuleContext ctx) { PrePostModifierHandler prePostModifierHandler = new PrePostModifierHandler(parser); prePostModifierHandler.visit(ctx); List modifiers = prePostModifierHandler.getPostMods(); addModifierStatements(parser, modifiers); } - public static void addPreModifiers(StatementSequenceGenerator parser, ParserRuleContext ctx) { + public static void addPreModifiers(Pass0GenerateStatementSequence parser, ParserRuleContext ctx) { PrePostModifierHandler modifierHandler = new PrePostModifierHandler(parser); modifierHandler.visit(ctx); List modifiers = modifierHandler.getPreMods(); @@ -630,7 +686,7 @@ public class StatementSequenceGenerator extends KickCBaseVisitor { } private static void addModifierStatements( - StatementSequenceGenerator parser, + Pass0GenerateStatementSequence parser, List modifiers) { for(PrePostModifier mod : modifiers) { Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java index e4f732e7e..f1dc904df 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java @@ -53,6 +53,7 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization { constScope, constType, constVal); + constantVar.setDeclaredAlignment(variable.getDeclaredAlignment()); constScope.remove(variable); constScope.add(constantVar); constAliases.put(constRef, constantVar.getRef()); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 87d34f6b5..056e35dff 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -44,7 +44,6 @@ public class Pass4CodeGeneration { asm.startSegment(null, "Global Constants & labels"); addConstants(asm, currentScope); addZpLabels(asm, currentScope); - addData(asm, currentScope); for (ControlFlowBlock block : getGraph().getAllBlocks()) { if (!block.getScope().equals(currentScope)) { if (!ScopeRef.ROOT.equals(currentScope)) { @@ -90,6 +89,7 @@ public class Pass4CodeGeneration { addData(asm, currentScope); asm.addScopeEnd(); } + addData(asm, ScopeRef.ROOT); program.setAsm(asm); } @@ -125,6 +125,11 @@ public class Pass4CodeGeneration { Collection scopeConstants = scope.getAllConstants(false); Set added = new LinkedHashSet<>(); for (ConstantVar constantVar : scopeConstants) { + Integer declaredAlignment = constantVar.getDeclaredAlignment(); + if(declaredAlignment !=null) { + String alignment = AsmFragment.getAsmNumber(declaredAlignment); + asm.addDataAlignment(alignment); + } if(constantVar.getValue() instanceof ConstantArrayList) { ConstantArrayList constantArrayList = (ConstantArrayList) constantVar.getValue(); String asmName = constantVar.getAsmName() == null ? constantVar.getLocalName() : constantVar.getAsmName(); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass5DoubleJumpElimination.java b/src/main/java/dk/camelot64/kickc/passes/Pass5DoubleJumpElimination.java index f413b9097..ec3e78509 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass5DoubleJumpElimination.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass5DoubleJumpElimination.java @@ -36,7 +36,7 @@ public class Pass5DoubleJumpElimination extends Pass5AsmOptimization { currentLabel = ((AsmLabel) line).getLabel(); } else if (line instanceof AsmComment || line instanceof AsmConstant || line instanceof AsmLabelDecl) { // ignore - } else if (line instanceof AsmBasicUpstart || line instanceof AsmDataNumeric || line instanceof AsmDataFill || line instanceof AsmDataString || line instanceof AsmSetPc) { + } else if (line instanceof AsmBasicUpstart || line instanceof AsmDataNumeric || line instanceof AsmDataFill || line instanceof AsmDataString || line instanceof AsmDataAlignment || line instanceof AsmSetPc) { currentLabel = null; } else if (line instanceof AsmInstruction) { if (currentLabel != null) { diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 492065450..90db216f1 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/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 testMemAlignment() throws IOException, URISyntaxException { + compileAndCompare("mem-alignment"); + } + public void testMultiply() throws IOException, URISyntaxException { compileAndCompare("multiply"); } @@ -363,6 +367,10 @@ public class TestPrograms extends TestCase { assertError("string-length-mismatch", "Array length mismatch"); } + public void testIllegalAlignment() throws IOException, URISyntaxException { + assertError("illegal-alignment", "Cannot align variable"); + } + private void assertError(String kcFile, String expectError) throws IOException, URISyntaxException { try { compileAndCompare(kcFile); diff --git a/src/test/java/dk/camelot64/kickc/test/illegal-alignment.kc b/src/test/java/dk/camelot64/kickc/test/illegal-alignment.kc new file mode 100644 index 000000000..a13cc0aaf --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/illegal-alignment.kc @@ -0,0 +1,3 @@ + +byte align($100) b; + diff --git a/src/test/java/dk/camelot64/kickc/test/mem-alignment.kc b/src/test/java/dk/camelot64/kickc/test/mem-alignment.kc new file mode 100644 index 000000000..f8057bdb2 --- /dev/null +++ b/src/test/java/dk/camelot64/kickc/test/mem-alignment.kc @@ -0,0 +1,16 @@ +// Test that memory alignment of arrays work + +byte[$100] align($100) bs; + +void main() { + byte[$100] align($100) cs; + for( byte i: 0..255) { + bs[i] = i; + } + byte j=255; + for( i: 0..255) { + cs[i] = bs[j--]; + } + + +} \ No newline at end of file diff --git a/src/test/java/dk/camelot64/kickc/test/multiply.kc b/src/test/java/dk/camelot64/kickc/test/multiply.kc index 930d7bded..0d25bba96 100644 --- a/src/test/java/dk/camelot64/kickc/test/multiply.kc +++ b/src/test/java/dk/camelot64/kickc/test/multiply.kc @@ -14,13 +14,13 @@ void main() { // mul_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255). // f(x) = >(( x * x )/4) -byte[512] mul_sqr1_hi; +byte[512] align($100) mul_sqr1_hi; // g(x) = >((( x - 255) * ( x - 255 ))/4) -byte[512] mul_sqr2_hi; +byte[512] align($100) mul_sqr2_hi; // Initialize the mul_sqr multiplication tables with f(x)=int(x*x/4) void init_mul_tables() { @@ -58,13 +58,13 @@ void init_mul_tables() { // ASM based multiplication tables // <(( x * x )/4) -byte[512] asm_mul_sqr1_lo; +byte[512] align($100) asm_mul_sqr1_lo; // >(( x * x )/4) -byte[512] asm_mul_sqr1_hi; +byte[512] align($100) asm_mul_sqr1_hi; // <((( x - 255) * ( x - 255 ))/4) -byte[512] asm_mul_sqr2_lo; +byte[512] align($100) asm_mul_sqr2_lo; // >((( x - 255) * ( x - 255 ))/4) -byte[512] asm_mul_sqr2_hi; +byte[512] align($100) asm_mul_sqr2_hi; // Initialize the multiplication tables using ASM code from // http://codebase64.org/doku.php?id=base:seriously_fast_multiplication void init_mul_tables_asm() { diff --git a/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.asm b/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.asm index 441c07195..09d3e580e 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.asm @@ -2,9 +2,6 @@ :BasicUpstart(main) .pc = $80d "Program" .const SCREEN = $400 - b: .fill 3, 0 - c: .byte 'c', 'm', 'l' - d: .text "cml" jsr main main: { lda #'c' @@ -16,3 +13,6 @@ main: { sta SCREEN+2 rts } + b: .fill 3, 0 + c: .byte 'c', 'm', 'l' + d: .text "cml" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.log b/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.log index 9d321e3b8..9f6f9d5aa 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/arrays-init.log @@ -213,9 +213,6 @@ INITIAL ASM .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - b: .fill 3, 0 - c: .byte 'c', 'm', 'l' - d: .text "cml" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -250,6 +247,9 @@ main: { //SEG14 [8] return [ ] ( main:2 [ ] ) rts } + b: .fill 3, 0 + c: .byte 'c', 'm', 'l' + d: .text "cml" REGISTER UPLIFT POTENTIAL REGISTERS Statement [4] *((const byte[3]) b#0+(byte/signed byte/word/signed word) 0) ← (byte) 'c' [ ] ( main:2 [ ] ) always clobbers reg byte a @@ -271,9 +271,6 @@ ASSEMBLER BEFORE OPTIMIZATION .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - b: .fill 3, 0 - c: .byte 'c', 'm', 'l' - d: .text "cml" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -308,6 +305,9 @@ main: { //SEG14 [8] return [ ] ( main:2 [ ] ) rts } + b: .fill 3, 0 + c: .byte 'c', 'm', 'l' + d: .text "cml" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -349,9 +349,6 @@ FINAL ASSEMBLER .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - b: .fill 3, 0 - c: .byte 'c', 'm', 'l' - d: .text "cml" //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -376,4 +373,7 @@ main: { //SEG14 [8] return [ ] ( main:2 [ ] ) rts } + b: .fill 3, 0 + c: .byte 'c', 'm', 'l' + d: .text "cml" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm index 6477ba1aa..348b8f93c 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.asm @@ -11,13 +11,6 @@ .const SCREEN = $400 .const BITMAP = $2000 .const lines_cnt = 8 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 - lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c - lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a jsr main main: { lda #0 @@ -444,3 +437,10 @@ init_screen: { bne b2 rts } + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 + lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c + lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log index d2a3e7116..65e720e4b 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-bresenham.log @@ -4321,13 +4321,6 @@ INITIAL ASM .const SCREEN = $400 .const BITMAP = $2000 .const lines_cnt = 8 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 - lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c - lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] @@ -5340,6 +5333,13 @@ init_screen: { //SEG355 [190] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 + lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c + lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a REGISTER UPLIFT POTENTIAL REGISTERS Equivalence Class zp ZP_BYTE:63 [ init_plot_tables::$7 ] has ALU potential. @@ -5688,13 +5688,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const SCREEN = $400 .const BITMAP = $2000 .const lines_cnt = 8 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 - lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c - lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] @@ -6629,6 +6622,13 @@ init_screen: { //SEG355 [190] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 + lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c + lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a ASSEMBLER OPTIMIZATIONS Removing instruction jmp b10 @@ -7150,13 +7150,6 @@ FINAL ASSEMBLER .const SCREEN = $400 .const BITMAP = $2000 .const lines_cnt = 8 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 - lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c - lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a //SEG2 @begin //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] //SEG4 @10 @@ -7943,4 +7936,11 @@ init_screen: { //SEG355 [190] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 + lines_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28, $3c + lines_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28, $a diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.asm b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.asm index 7473a2701..514bd3f43 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.asm @@ -12,13 +12,6 @@ .const SCREEN = $400 .const BITMAP = $2000 .const plots_cnt = 8 - plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 - plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 jsr main main: { lda #0 @@ -179,3 +172,10 @@ init_screen: { bne b2 rts } + plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 + plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log index 4a4e356d2..83a39e0ba 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/bitmap-plotter.log @@ -1757,13 +1757,6 @@ INITIAL ASM .const SCREEN = $400 .const BITMAP = $2000 .const plots_cnt = 8 - plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 - plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] @@ -2166,6 +2159,13 @@ init_screen: { //SEG123 [72] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 + plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 REGISTER UPLIFT POTENTIAL REGISTERS Equivalence Class zp ZP_BYTE:31 [ init_plot_tables::$7 ] has ALU potential. @@ -2295,13 +2295,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const SCREEN = $400 .const BITMAP = $2000 .const plots_cnt = 8 - plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 - plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] @@ -2651,6 +2644,13 @@ init_screen: { //SEG123 [72] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 + plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b5 @@ -2890,13 +2890,6 @@ FINAL ASSEMBLER .const SCREEN = $400 .const BITMAP = $2000 .const plots_cnt = 8 - plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 - plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 - plot_xlo: .fill 256, 0 - plot_xhi: .fill 256, 0 - plot_ylo: .fill 256, 0 - plot_yhi: .fill 256, 0 - plot_bit: .fill 256, 0 //SEG2 @begin //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] //SEG4 @5 @@ -3179,4 +3172,11 @@ init_screen: { //SEG123 [72] return [ ] ( main:2::init_screen:8 [ ] ) rts } + plots_x: .byte $3c, $50, $6e, $50, $3c, $28, $a, $28 + plots_y: .byte $a, $28, $3c, $50, $6e, $50, $3c, $28 + plot_xlo: .fill $100, 0 + plot_xhi: .fill $100, 0 + plot_ylo: .fill $100, 0 + plot_yhi: .fill $100, 0 + plot_bit: .fill $100, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm index f36460fc6..2bb4643c8 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.asm @@ -3,8 +3,6 @@ .pc = $80d "Program" .const RASTER = $d012 .const SCREEN = $400 - buffer1: .fill 256, 0 - buffer2: .fill 256, 0 jsr main main: { jsr prepare @@ -100,3 +98,5 @@ prepare: { bne b1 rts } + buffer1: .fill $100, 0 + buffer2: .fill $100, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log index 0f8e21a40..2c9cb74b4 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/flipper-rex2.log @@ -1175,8 +1175,6 @@ INITIAL ASM //SEG1 Global Constants & labels .const RASTER = $d012 .const SCREEN = $400 - buffer1: .fill 256, 0 - buffer2: .fill 256, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @4 [phi:@begin->@4] @@ -1468,6 +1466,8 @@ prepare: { //SEG111 [49] return [ ] ( main:2::prepare:5 [ ] ) rts } + buffer1: .fill $100, 0 + buffer2: .fill $100, 0 REGISTER UPLIFT POTENTIAL REGISTERS Statement [7] if(*((const byte*) RASTER#0)!=(byte/word/signed word) 254) goto main::@3 [ main::c#4 ] ( main:2 [ main::c#4 ] ) always clobbers reg byte a @@ -1536,8 +1536,6 @@ ASSEMBLER BEFORE OPTIMIZATION //SEG1 Global Constants & labels .const RASTER = $d012 .const SCREEN = $400 - buffer1: .fill 256, 0 - buffer2: .fill 256, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @4 [phi:@begin->@4] @@ -1808,6 +1806,8 @@ prepare: { //SEG111 [49] return [ ] ( main:2::prepare:5 [ ] ) rts } + buffer1: .fill $100, 0 + buffer2: .fill $100, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b4 @@ -1987,8 +1987,6 @@ FINAL ASSEMBLER //SEG1 Global Constants & labels .const RASTER = $d012 .const SCREEN = $400 - buffer1: .fill 256, 0 - buffer2: .fill 256, 0 //SEG2 @begin //SEG3 [1] phi from @begin to @4 [phi:@begin->@4] //SEG4 @4 @@ -2194,4 +2192,6 @@ prepare: { //SEG111 [49] return [ ] ( main:2::prepare:5 [ ] ) rts } + buffer1: .fill $100, 0 + buffer2: .fill $100, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.asm b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.asm index 8a7f501d5..986d189f0 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.asm @@ -6,7 +6,6 @@ .const PROCPORT = 1 .const D018 = $d018 .const CHARSET4 = $2800 - bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 jsr main main: { .label _1 = 6 @@ -144,3 +143,4 @@ main: { sta D018 rts } + bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log index ddec1948d..5f2fb8e14 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/halfscii.log @@ -1320,7 +1320,6 @@ INITIAL ASM .const PROCPORT = 1 .const D018 = $d018 .const CHARSET4 = $2800 - bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -1669,6 +1668,7 @@ main: { //SEG91 [59] return [ ] ( main:2 [ ] ) rts } + bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 REGISTER UPLIFT POTENTIAL REGISTERS Statement [5] *((const byte*) PROCPORT#0) ← (byte/signed byte/word/signed word) 50 [ ] ( main:2 [ ] ) always clobbers reg byte a @@ -1848,7 +1848,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const PROCPORT = 1 .const D018 = $d018 .const CHARSET4 = $2800 - bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -2121,6 +2120,7 @@ main: { //SEG91 [59] return [ ] ( main:2 [ ] ) rts } + bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -2302,7 +2302,6 @@ FINAL ASSEMBLER .const PROCPORT = 1 .const D018 = $d018 .const CHARSET4 = $2800 - bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -2530,4 +2529,5 @@ main: { //SEG91 [59] return [ ] ( main:2 [ ] ) rts } + bits_count: .byte 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.asm b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.asm index 4d290ddee..b7a717179 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.asm @@ -3,7 +3,6 @@ .pc = $80d "Program" .label char_cursor = 6 .label line_cursor = 2 - txt: .text "camelot@" jsr main main: { jsr print_cls @@ -101,3 +100,4 @@ print_cls: { bne b1 rts } + txt: .text "camelot@" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log index be6f13461..4cccde487 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/incrementinarray.log @@ -887,7 +887,6 @@ INITIAL ASM //SEG1 Global Constants & labels .label char_cursor = 7 .label line_cursor = 3 - txt: .text "camelot@" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] @@ -1093,6 +1092,7 @@ print_cls: { //SEG68 [32] return [ ] ( main:2::print_cls:5 [ ] ) rts } + txt: .text "camelot@" REGISTER UPLIFT POTENTIAL REGISTERS Statement [10] *((const string) txt#0+(byte/signed byte/word/signed word) 1) ← ++ *((const string) txt#0+(byte/signed byte/word/signed word) 1) [ main::i#2 line_cursor#1 ] ( main:2 [ main::i#2 line_cursor#1 ] ) always clobbers reg byte a @@ -1144,7 +1144,6 @@ ASSEMBLER BEFORE OPTIMIZATION //SEG1 Global Constants & labels .label char_cursor = 6 .label line_cursor = 2 - txt: .text "camelot@" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] @@ -1347,6 +1346,7 @@ print_cls: { //SEG68 [32] return [ ] ( main:2::print_cls:5 [ ] ) rts } + txt: .text "camelot@" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b7 @@ -1452,7 +1452,6 @@ FINAL ASSEMBLER //SEG1 Global Constants & labels .label char_cursor = 6 .label line_cursor = 2 - txt: .text "camelot@" //SEG2 @begin //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] //SEG4 @7 @@ -1617,4 +1616,5 @@ print_cls: { //SEG68 [32] return [ ] ( main:2::print_cls:5 [ ] ) rts } + txt: .text "camelot@" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.asm b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.asm index ce52508e1..58abe0e0f 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.asm @@ -2,7 +2,6 @@ :BasicUpstart(main) .pc = $80d "Program" .label screen = 2 - msg1: .text "message 1 @" jsr main main: { lda #<$400 @@ -50,3 +49,4 @@ print: { !: jmp b1 } + msg1: .text "message 1 @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log index 968dd5a64..36418623f 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/inline-string.log @@ -443,7 +443,6 @@ INITIAL ASM .pc = $80d "Program" //SEG1 Global Constants & labels .label screen = 2 - msg1: .text "message 1 @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] @@ -554,6 +553,7 @@ print: { !: jmp b1_from_b2 } + msg1: .text "message 1 @" REGISTER UPLIFT POTENTIAL REGISTERS Statement [13] if(*((byte*) print::msg#4)!=(byte) '@') goto print::@2 [ screen#12 print::msg#4 ] ( main:2::print:5 [ screen#12 print::msg#4 ] main:2::print:7 [ screen#12 print::msg#4 ] main:2::print:9 [ screen#12 print::msg#4 ] ) always clobbers reg byte a reg byte y @@ -577,7 +577,6 @@ ASSEMBLER BEFORE OPTIMIZATION .pc = $80d "Program" //SEG1 Global Constants & labels .label screen = 2 - msg1: .text "message 1 @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] @@ -688,6 +687,7 @@ print: { !: jmp b1_from_b2 } + msg1: .text "message 1 @" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b2 @@ -758,7 +758,6 @@ FINAL ASSEMBLER .pc = $80d "Program" //SEG1 Global Constants & labels .label screen = 2 - msg1: .text "message 1 @" //SEG2 @begin //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] //SEG4 @2 @@ -844,4 +843,5 @@ print: { !: jmp b1 } + msg1: .text "message 1 @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.asm b/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.asm index 0ef834a38..d779b1f52 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.asm @@ -2,7 +2,6 @@ :BasicUpstart(main) .pc = $80d "Program" .const SCREEN = $400 - TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 jsr main main: { ldx #0 @@ -20,3 +19,4 @@ main: { bne b1 rts } + TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.log b/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.log index 44c258080..1b48c4f24 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/inmemarray.log @@ -332,7 +332,6 @@ INITIAL ASM .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -409,6 +408,7 @@ main: { //SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy jmp b2 } + TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 REGISTER UPLIFT POTENTIAL REGISTERS Statement [6] *((const byte*) SCREEN#0 + (byte) main::i#2) ← *((const byte[]) TXT#0 + (byte) main::j#3) [ main::j#3 main::i#2 ] ( main:2 [ main::j#3 main::i#2 ] ) always clobbers reg byte a @@ -432,7 +432,6 @@ ASSEMBLER BEFORE OPTIMIZATION .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -500,6 +499,7 @@ main: { //SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy jmp b2 } + TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -566,7 +566,6 @@ FINAL ASSEMBLER .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -613,4 +612,5 @@ main: { //SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2] //SEG30 [9] phi (byte) main::j#4 = (byte) main::j#1 [phi:main::@6->main::@2#0] -- register_copy } + TXT: .byte 3, 1, $d, 5, $c, $f, $14, $20 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.asm b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.asm index f313e6c7f..295983791 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.asm @@ -2,7 +2,6 @@ :BasicUpstart(main) .pc = $80d "Program" .const SCREEN = $400 - TEXT: .text "camelot " jsr main main: { .label cursor = 2 @@ -34,3 +33,4 @@ main: { !: rts } + TEXT: .text "camelot " diff --git a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log index 7bd65db03..1836dbc32 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/inmemstring.log @@ -347,7 +347,6 @@ INITIAL ASM .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "camelot " //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -434,6 +433,7 @@ main: { //SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy jmp b2 } + TEXT: .text "camelot " REGISTER UPLIFT POTENTIAL REGISTERS Statement [6] *((byte*) main::cursor#2) ← *((const string) TEXT#0 + (byte) main::i#3) [ main::i#3 main::cursor#2 ] ( main:2 [ main::i#3 main::cursor#2 ] ) always clobbers reg byte a reg byte y @@ -460,7 +460,6 @@ ASSEMBLER BEFORE OPTIMIZATION .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "camelot " //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -542,6 +541,7 @@ main: { //SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy jmp b2 } + TEXT: .text "camelot " ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -609,7 +609,6 @@ FINAL ASSEMBLER .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "camelot " //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -670,4 +669,5 @@ main: { //SEG29 [9] phi from main::@6 to main::@2 [phi:main::@6->main::@2] //SEG30 [9] phi (byte) main::i#4 = (byte) main::i#1 [phi:main::@6->main::@2#0] -- register_copy } + TEXT: .text "camelot " diff --git a/src/test/java/dk/camelot64/kickc/test/ref/literals.asm b/src/test/java/dk/camelot64/kickc/test/ref/literals.asm index d32a16902..ff1677952 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/literals.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/literals.asm @@ -4,8 +4,6 @@ .const SCREEN = $400 .const char = 'a' .const num = 1 - nums: .byte 2, 3, 4, 5 - str: .text "bc"+"d"+'e' jsr main main: { lda #char @@ -23,3 +21,5 @@ main: { bne b1 rts } + nums: .byte 2, 3, 4, 5 + str: .text "bc"+"d"+'e' diff --git a/src/test/java/dk/camelot64/kickc/test/ref/literals.log b/src/test/java/dk/camelot64/kickc/test/ref/literals.log index 694fc3096..a645b381e 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/literals.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/literals.log @@ -325,8 +325,6 @@ INITIAL ASM .const SCREEN = $400 .const char = 'a' .const num = 1 - nums: .byte 2, 3, 4, 5 - str: .text "bc"+"d"+'e' //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -382,6 +380,8 @@ main: { //SEG21 [11] return [ ] ( main:2 [ ] ) rts } + nums: .byte 2, 3, 4, 5 + str: .text "bc"+"d"+'e' REGISTER UPLIFT POTENTIAL REGISTERS Statement [4] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word) 0) ← (const byte) char#0 [ ] ( main:2 [ ] ) always clobbers reg byte a @@ -411,8 +411,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const SCREEN = $400 .const char = 'a' .const num = 1 - nums: .byte 2, 3, 4, 5 - str: .text "bc"+"d"+'e' //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -463,6 +461,8 @@ main: { //SEG21 [11] return [ ] ( main:2 [ ] ) rts } + nums: .byte 2, 3, 4, 5 + str: .text "bc"+"d"+'e' ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -517,8 +517,6 @@ FINAL ASSEMBLER .const SCREEN = $400 .const char = 'a' .const num = 1 - nums: .byte 2, 3, 4, 5 - str: .text "bc"+"d"+'e' //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -556,4 +554,6 @@ main: { //SEG21 [11] return [ ] ( main:2 [ ] ) rts } + nums: .byte 2, 3, 4, 5 + str: .text "bc"+"d"+'e' diff --git a/src/test/java/dk/camelot64/kickc/test/ref/multiply.asm b/src/test/java/dk/camelot64/kickc/test/ref/multiply.asm index f4bda260a..ba7aaec52 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/multiply.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/multiply.asm @@ -3,14 +3,6 @@ .pc = $80d "Program" .const BGCOL = $d021 .label char_cursor = 6 - mul_sqr1_lo: .fill 512, 0 - mul_sqr1_hi: .fill 512, 0 - mul_sqr2_lo: .fill 512, 0 - mul_sqr2_hi: .fill 512, 0 - asm_mul_sqr1_lo: .fill 512, 0 - asm_mul_sqr1_hi: .fill 512, 0 - asm_mul_sqr2_lo: .fill 512, 0 - asm_mul_sqr2_hi: .fill 512, 0 jsr main main: { jsr init_mul_tables @@ -322,3 +314,19 @@ init_mul_tables: { sta mul_sqr2_hi+$1ff rts } + .align $100 + mul_sqr1_lo: .fill $200, 0 + .align $100 + mul_sqr1_hi: .fill $200, 0 + .align $100 + mul_sqr2_lo: .fill $200, 0 + .align $100 + mul_sqr2_hi: .fill $200, 0 + .align $100 + asm_mul_sqr1_lo: .fill $200, 0 + .align $100 + asm_mul_sqr1_hi: .fill $200, 0 + .align $100 + asm_mul_sqr2_lo: .fill $200, 0 + .align $100 + asm_mul_sqr2_hi: .fill $200, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/multiply.log b/src/test/java/dk/camelot64/kickc/test/ref/multiply.log index b578fd82a..2e7bbd7a0 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/multiply.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/multiply.log @@ -15,13 +15,13 @@ void main() { // mul_sqr tables will contain f(x)=int(x*x/4) and g(x) = f(x-255). // f(x) = >(( x * x )/4) -byte[512] mul_sqr1_hi; +byte[512] align($100) mul_sqr1_hi; // g(x) = >((( x - 255) * ( x - 255 ))/4) -byte[512] mul_sqr2_hi; +byte[512] align($100) mul_sqr2_hi; // Initialize the mul_sqr multiplication tables with f(x)=int(x*x/4) void init_mul_tables() { @@ -59,13 +59,13 @@ void init_mul_tables() { // ASM based multiplication tables // <(( x * x )/4) -byte[512] asm_mul_sqr1_lo; +byte[512] align($100) asm_mul_sqr1_lo; // >(( x * x )/4) -byte[512] asm_mul_sqr1_hi; +byte[512] align($100) asm_mul_sqr1_hi; // <((( x - 255) * ( x - 255 ))/4) -byte[512] asm_mul_sqr2_lo; +byte[512] align($100) asm_mul_sqr2_lo; // >((( x - 255) * ( x - 255 ))/4) -byte[512] asm_mul_sqr2_hi; +byte[512] align($100) asm_mul_sqr2_hi; // Initialize the multiplication tables using ASM code from // http://codebase64.org/doku.php?id=base:seriously_fast_multiplication void init_mul_tables_asm() { @@ -2234,14 +2234,6 @@ INITIAL ASM //SEG1 Global Constants & labels .const BGCOL = $d021 .label char_cursor = $a - mul_sqr1_lo: .fill 512, 0 - mul_sqr1_hi: .fill 512, 0 - mul_sqr2_lo: .fill 512, 0 - mul_sqr2_hi: .fill 512, 0 - asm_mul_sqr1_lo: .fill 512, 0 - asm_mul_sqr1_hi: .fill 512, 0 - asm_mul_sqr2_lo: .fill 512, 0 - asm_mul_sqr2_hi: .fill 512, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] @@ -2869,6 +2861,22 @@ init_mul_tables: { //SEG193 [88] phi (byte) init_mul_tables::dir#3 = (byte) init_mul_tables::dir#2 [phi:init_mul_tables::@12->init_mul_tables::@4#0] -- register_copy jmp b4 } + .align $100 + mul_sqr1_lo: .fill $200, 0 + .align $100 + mul_sqr1_hi: .fill $200, 0 + .align $100 + mul_sqr2_lo: .fill $200, 0 + .align $100 + mul_sqr2_hi: .fill $200, 0 + .align $100 + asm_mul_sqr1_lo: .fill $200, 0 + .align $100 + asm_mul_sqr1_hi: .fill $200, 0 + .align $100 + asm_mul_sqr2_lo: .fill $200, 0 + .align $100 + asm_mul_sqr2_hi: .fill $200, 0 REGISTER UPLIFT POTENTIAL REGISTERS Statement [11] *((const byte*) BGCOL#0) ← (byte/signed byte/word/signed word) 5 [ ] ( main:2::mul_tables_compare:9 [ ] ) always clobbers reg byte a @@ -3013,14 +3021,6 @@ ASSEMBLER BEFORE OPTIMIZATION //SEG1 Global Constants & labels .const BGCOL = $d021 .label char_cursor = 6 - mul_sqr1_lo: .fill 512, 0 - mul_sqr1_hi: .fill 512, 0 - mul_sqr2_lo: .fill 512, 0 - mul_sqr2_hi: .fill 512, 0 - asm_mul_sqr1_lo: .fill 512, 0 - asm_mul_sqr1_hi: .fill 512, 0 - asm_mul_sqr2_lo: .fill 512, 0 - asm_mul_sqr2_hi: .fill 512, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] @@ -3621,6 +3621,22 @@ init_mul_tables: { //SEG193 [88] phi (byte) init_mul_tables::dir#3 = (byte) init_mul_tables::dir#2 [phi:init_mul_tables::@12->init_mul_tables::@4#0] -- register_copy jmp b4 } + .align $100 + mul_sqr1_lo: .fill $200, 0 + .align $100 + mul_sqr1_hi: .fill $200, 0 + .align $100 + mul_sqr2_lo: .fill $200, 0 + .align $100 + mul_sqr2_hi: .fill $200, 0 + .align $100 + asm_mul_sqr1_lo: .fill $200, 0 + .align $100 + asm_mul_sqr1_hi: .fill $200, 0 + .align $100 + asm_mul_sqr2_lo: .fill $200, 0 + .align $100 + asm_mul_sqr2_hi: .fill $200, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b10 @@ -3903,14 +3919,6 @@ FINAL ASSEMBLER //SEG1 Global Constants & labels .const BGCOL = $d021 .label char_cursor = 6 - mul_sqr1_lo: .fill 512, 0 - mul_sqr1_hi: .fill 512, 0 - mul_sqr2_lo: .fill 512, 0 - mul_sqr2_hi: .fill 512, 0 - asm_mul_sqr1_lo: .fill 512, 0 - asm_mul_sqr1_hi: .fill 512, 0 - asm_mul_sqr2_lo: .fill 512, 0 - asm_mul_sqr2_hi: .fill 512, 0 //SEG2 @begin //SEG3 [1] phi from @begin to @10 [phi:@begin->@10] //SEG4 @10 @@ -4414,4 +4422,20 @@ init_mul_tables: { //SEG192 [88] phi from init_mul_tables::@12 to init_mul_tables::@4 [phi:init_mul_tables::@12->init_mul_tables::@4] //SEG193 [88] phi (byte) init_mul_tables::dir#3 = (byte) init_mul_tables::dir#2 [phi:init_mul_tables::@12->init_mul_tables::@4#0] -- register_copy } + .align $100 + mul_sqr1_lo: .fill $200, 0 + .align $100 + mul_sqr1_hi: .fill $200, 0 + .align $100 + mul_sqr2_lo: .fill $200, 0 + .align $100 + mul_sqr2_hi: .fill $200, 0 + .align $100 + asm_mul_sqr1_lo: .fill $200, 0 + .align $100 + asm_mul_sqr1_hi: .fill $200, 0 + .align $100 + asm_mul_sqr2_lo: .fill $200, 0 + .align $100 + asm_mul_sqr2_hi: .fill $200, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.asm b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.asm index f1883180f..244fc342b 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.asm @@ -3,9 +3,6 @@ .pc = $80d "Program" .label char_cursor = 6 .label line_cursor = 2 - msg: .text "hello world! @" - msg2: .text "hello c64! @" - msg3: .text "hello 2017! @" jsr main main: { lda #<$400 @@ -85,3 +82,6 @@ print_str: { !: jmp b1 } + msg: .text "hello world! @" + msg2: .text "hello c64! @" + msg3: .text "hello 2017! @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log index 89ce63dfa..9f9ea4116 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/printmsg.log @@ -875,9 +875,6 @@ INITIAL ASM //SEG1 Global Constants & labels .label char_cursor = 6 .label line_cursor = 2 - msg: .text "hello world! @" - msg2: .text "hello c64! @" - msg3: .text "hello 2017! @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] @@ -1058,6 +1055,9 @@ print_str: { !: jmp b1_from_b2 } + msg: .text "hello world! @" + msg2: .text "hello c64! @" + msg3: .text "hello 2017! @" REGISTER UPLIFT POTENTIAL REGISTERS Statement [8] (byte*~) char_cursor#31 ← (byte*) line_cursor#1 [ char_cursor#31 line_cursor#1 ] ( main:2 [ char_cursor#31 line_cursor#1 ] ) always clobbers reg byte a @@ -1089,9 +1089,6 @@ ASSEMBLER BEFORE OPTIMIZATION //SEG1 Global Constants & labels .label char_cursor = 6 .label line_cursor = 2 - msg: .text "hello world! @" - msg2: .text "hello c64! @" - msg3: .text "hello 2017! @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] @@ -1272,6 +1269,9 @@ print_str: { !: jmp b1_from_b2 } + msg: .text "hello world! @" + msg2: .text "hello c64! @" + msg3: .text "hello 2017! @" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b7 @@ -1374,9 +1374,6 @@ FINAL ASSEMBLER //SEG1 Global Constants & labels .label char_cursor = 6 .label line_cursor = 2 - msg: .text "hello world! @" - msg2: .text "hello c64! @" - msg3: .text "hello 2017! @" //SEG2 @begin //SEG3 [1] phi from @begin to @7 [phi:@begin->@7] //SEG4 @7 @@ -1517,4 +1514,7 @@ print_str: { !: jmp b1 } + msg: .text "hello world! @" + msg2: .text "hello c64! @" + msg3: .text "hello 2017! @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.asm b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.asm index 3c2e5fa85..0945ce7dd 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.asm @@ -2,7 +2,6 @@ :BasicUpstart(main) .pc = $80d "Program" .const SCREEN = $400 - TEXT: .text "01234567@" jsr main main: { .label nxt = 2 @@ -32,3 +31,4 @@ main: { !: jmp b1 } + TEXT: .text "01234567@" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log index 46ff3cd86..81d9e9782 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll-clobber.log @@ -368,7 +368,6 @@ INITIAL ASM .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "01234567@" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -457,6 +456,7 @@ main: { //SEG33 [14] return [ ] ( main:2 [ ] ) rts } + TEXT: .text "01234567@" REGISTER UPLIFT POTENTIAL REGISTERS Statement [6] (byte) main::c#0 ← *((byte*) main::nxt#3) [ main::nxt#3 main::i#2 main::c#0 ] ( main:2 [ main::nxt#3 main::i#2 main::c#0 ] ) always clobbers reg byte a reg byte y @@ -482,7 +482,6 @@ ASSEMBLER BEFORE OPTIMIZATION .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "01234567@" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] @@ -565,6 +564,7 @@ main: { //SEG33 [14] return [ ] ( main:2 [ ] ) rts } + TEXT: .text "01234567@" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b1 @@ -633,7 +633,6 @@ FINAL ASSEMBLER .pc = $80d "Program" //SEG1 Global Constants & labels .const SCREEN = $400 - TEXT: .text "01234567@" //SEG2 @begin //SEG3 [1] phi from @begin to @1 [phi:@begin->@1] //SEG4 @1 @@ -695,4 +694,5 @@ main: { //SEG32 main::@return //SEG33 [14] return [ ] ( main:2 [ ] ) } + TEXT: .text "01234567@" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll.asm b/src/test/java/dk/camelot64/kickc/test/ref/scroll.asm index b16c2f7ee..c26b982d4 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scroll.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll.asm @@ -5,7 +5,6 @@ .const RASTER = $d012 .const BGCOL = $d020 .const SCROLL = $d016 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" jsr main main: { .const line = SCREEN+$28 @@ -82,3 +81,4 @@ fillscreen: { !: rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scroll.log b/src/test/java/dk/camelot64/kickc/test/ref/scroll.log index 9072725d9..24fde2cc9 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scroll.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/scroll.log @@ -1033,7 +1033,6 @@ INITIAL ASM .const RASTER = $d012 .const BGCOL = $d020 .const SCROLL = $d016 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] @@ -1236,6 +1235,7 @@ fillscreen: { //SEG71 [32] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" REGISTER UPLIFT POTENTIAL REGISTERS Statement [7] if(*((const byte*) RASTER#0)!=(byte/word/signed word) 254) goto main::@2 [ main::scroll#7 main::nxt#9 ] ( main:2 [ main::scroll#7 main::nxt#9 ] ) always clobbers reg byte a @@ -1279,7 +1279,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const RASTER = $d012 .const BGCOL = $d020 .const SCROLL = $d016 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] @@ -1469,6 +1468,7 @@ fillscreen: { //SEG71 [32] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b2 @@ -1600,7 +1600,6 @@ FINAL ASSEMBLER .const RASTER = $d012 .const BGCOL = $d020 .const SCROLL = $d016 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin //SEG3 [1] phi from @begin to @2 [phi:@begin->@2] //SEG4 @2 @@ -1747,4 +1746,5 @@ fillscreen: { //SEG71 [32] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.asm b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.asm index df0ad59f1..d7c46785f 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.asm @@ -10,7 +10,6 @@ .label current_bit = 2 .label current_chargen = 3 .label nxt = 7 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" jsr main main: { jsr fillscreen @@ -187,3 +186,4 @@ fillscreen: { !: rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log index 04286a24e..c76b3b030 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/scrollbig.log @@ -2591,7 +2591,6 @@ INITIAL ASM .label current_bit = 3 .label current_chargen = 4 .label nxt = $b - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @6 [phi:@begin->@6] @@ -3044,6 +3043,7 @@ fillscreen: { //SEG150 [71] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" REGISTER UPLIFT POTENTIAL REGISTERS Statement [7] if(*((const byte*) RASTER#0)!=(byte/word/signed word) 254) goto main::@2 [ scroll#18 current_bit#29 nxt#31 current_chargen#27 ] ( main:2 [ scroll#18 current_bit#29 nxt#31 current_chargen#27 ] ) always clobbers reg byte a @@ -3154,7 +3154,6 @@ ASSEMBLER BEFORE OPTIMIZATION .label current_bit = 2 .label current_chargen = 3 .label nxt = 7 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @6 [phi:@begin->@6] @@ -3559,6 +3558,7 @@ fillscreen: { //SEG150 [71] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" ASSEMBLER OPTIMIZATIONS Removing instruction jmp b6 @@ -3804,7 +3804,6 @@ FINAL ASSEMBLER .label current_bit = 2 .label current_chargen = 3 .label nxt = 7 - TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" //SEG2 @begin //SEG3 [1] phi from @begin to @6 [phi:@begin->@6] //SEG4 @6 @@ -4132,4 +4131,5 @@ fillscreen: { //SEG150 [71] return [ ] ( main:2::fillscreen:5 [ ] ) rts } + TEXT: .text "-= this is rex of camelot testing a scroller created in kickc. kickc is an optimizing c-compiler for 6502 assembler. =- @" diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm index 5f4fa91db..197928d9b 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.asm @@ -23,8 +23,6 @@ .label progress_cursor = $a .label sin_idx_x = 2 .label sin_idx_y = 3 - sintab_x: .fill 221, 0 - sintab_y: .fill 197, 0 jsr main main: { jsr init @@ -571,3 +569,5 @@ place_sprites: { bne b1 rts } + sintab_x: .fill $dd, 0 + sintab_y: .fill $c5, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log index 87a8cb3d4..31efbe382 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/sinus-sprites.log @@ -6118,8 +6118,6 @@ INITIAL ASM .label progress_cursor = $13 .label sin_idx_x = 2 .label sin_idx_y = 3 - sintab_x: .fill 221, 0 - sintab_y: .fill 197, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @43 [phi:@begin->@43] @@ -7522,6 +7520,8 @@ place_sprites: { //SEG481 [231] return [ ] ( main:2::init:5::place_sprites:54 [ ] ) rts } + sintab_x: .fill $dd, 0 + sintab_y: .fill $c5, 0 REGISTER UPLIFT POTENTIAL REGISTERS Equivalence Class zp ZP_BYTE:53 [ anim::$3 ] has ALU potential. @@ -7897,8 +7897,6 @@ ASSEMBLER BEFORE OPTIMIZATION .label progress_cursor = $a .label sin_idx_x = 2 .label sin_idx_y = 3 - sintab_x: .fill 221, 0 - sintab_y: .fill 197, 0 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @43 [phi:@begin->@43] @@ -9206,6 +9204,8 @@ place_sprites: { //SEG481 [231] return [ ] ( main:2::init:5::place_sprites:54 [ ] ) rts } + sintab_x: .fill $dd, 0 + sintab_y: .fill $c5, 0 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b43 @@ -9896,8 +9896,6 @@ FINAL ASSEMBLER .label progress_cursor = $a .label sin_idx_x = 2 .label sin_idx_y = 3 - sintab_x: .fill 221, 0 - sintab_y: .fill 197, 0 //SEG2 @begin //SEG3 [1] phi from @begin to @43 [phi:@begin->@43] //SEG4 @43 @@ -10930,4 +10928,6 @@ place_sprites: { //SEG481 [231] return [ ] ( main:2::init:5::place_sprites:54 [ ] ) rts } + sintab_x: .fill $dd, 0 + sintab_y: .fill $c5, 0 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.asm b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.asm index 9593aebe9..c49f7c17b 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.asm +++ b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.asm @@ -5,9 +5,6 @@ .const COLORS = $d800 .const FILL = $e6 .const numpoints = 6 - XPOS: .byte 5, $f, 6, $22, $15, $1f - YPOS: .byte 5, 8, $e, 2, $11, $16 - COLS: .byte 1, 2, 3, 4, 5, 7 jsr main main: { jsr initscreen @@ -203,3 +200,6 @@ initscreen: { !: rts } + XPOS: .byte 5, $f, 6, $22, $15, $1f + YPOS: .byte 5, 8, $e, 2, $11, $16 + COLS: .byte 1, 2, 3, 4, 5, 7 diff --git a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log index 3b0d4327e..87f82147d 100644 --- a/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log +++ b/src/test/java/dk/camelot64/kickc/test/ref/voronoi.log @@ -1992,9 +1992,6 @@ INITIAL ASM .const COLORS = $d800 .const FILL = $e6 .const numpoints = 6 - XPOS: .byte 5, $f, 6, $22, $15, $1f - YPOS: .byte 5, 8, $e, 2, $11, $16 - COLS: .byte 1, 2, 3, 4, 5, 7 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] @@ -2489,6 +2486,9 @@ initscreen: { //SEG153 [83] return [ ] ( main:2::initscreen:5 [ ] ) rts } + XPOS: .byte 5, $f, 6, $22, $15, $1f + YPOS: .byte 5, 8, $e, 2, $11, $16 + COLS: .byte 1, 2, 3, 4, 5, 7 REGISTER UPLIFT POTENTIAL REGISTERS Statement [12] (byte/word~) animate::$0 ← *((const byte[]) XPOS#0+(byte/signed byte/word/signed word) 0) + (byte/signed byte/word/signed word) 1 [ animate::$0 ] ( main:2::animate:9 [ animate::$0 ] ) always clobbers reg byte a @@ -2633,9 +2633,6 @@ ASSEMBLER BEFORE OPTIMIZATION .const COLORS = $d800 .const FILL = $e6 .const numpoints = 6 - XPOS: .byte 5, $f, 6, $22, $15, $1f - YPOS: .byte 5, 8, $e, 2, $11, $16 - COLS: .byte 1, 2, 3, 4, 5, 7 //SEG2 @begin bbegin: //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] @@ -3075,6 +3072,9 @@ initscreen: { //SEG153 [83] return [ ] ( main:2::initscreen:5 [ ] ) rts } + XPOS: .byte 5, $f, 6, $22, $15, $1f + YPOS: .byte 5, 8, $e, 2, $11, $16 + COLS: .byte 1, 2, 3, 4, 5, 7 ASSEMBLER OPTIMIZATIONS Removing instruction jmp b5 @@ -3327,9 +3327,6 @@ FINAL ASSEMBLER .const COLORS = $d800 .const FILL = $e6 .const numpoints = 6 - XPOS: .byte 5, $f, 6, $22, $15, $1f - YPOS: .byte 5, 8, $e, 2, $11, $16 - COLS: .byte 1, 2, 3, 4, 5, 7 //SEG2 @begin //SEG3 [1] phi from @begin to @5 [phi:@begin->@5] //SEG4 @5 @@ -3680,4 +3677,7 @@ initscreen: { //SEG153 [83] return [ ] ( main:2::initscreen:5 [ ] ) rts } + XPOS: .byte 5, $f, 6, $22, $15, $1f + YPOS: .byte 5, 8, $e, 2, $11, $16 + COLS: .byte 1, 2, 3, 4, 5, 7