From a34abcbdff662eceb984e88b0cbf005738a84f79 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 20 Oct 2019 20:01:38 +0200 Subject: [PATCH] Added __notconst directive. --- .../kickc/model/ControlFlowGraph.java | 25 +- .../dk/camelot64/kickc/model/Directive.java | 10 +- .../kickc/model/DirectiveParserContext.java | 12 +- .../kickc/model/symbols/SymbolVariable.java | 26 +- .../dk/camelot64/kickc/parser/KickCLexer.g4 | 3 +- .../dk/camelot64/kickc/parser/KickCLexer.java | 1097 +++++------ .../camelot64/kickc/parser/KickCLexer.tokens | 270 +-- .../dk/camelot64/kickc/parser/KickCParser.g4 | 3 +- .../camelot64/kickc/parser/KickCParser.java | 1626 +++++++++-------- .../camelot64/kickc/parser/KickCParser.tokens | 270 +-- .../kickc/parser/KickCParserBaseListener.java | 36 +- .../kickc/parser/KickCParserBaseVisitor.java | 21 +- .../kickc/parser/KickCParserListener.java | 36 +- .../kickc/parser/KickCParserVisitor.java | 21 +- .../Pass0GenerateStatementSequence.java | 19 +- .../Pass1EarlyConstantIdentification.java | 3 + .../kickc/passes/Pass1ProcedureInline.java | 2 +- .../kickc/passes/Pass1UnwindBlockScopes.java | 2 +- .../kickc/passes/Pass1UnwindStructValues.java | 2 +- .../kickc/passes/Pass2AliasElimination.java | 2 +- .../passes/Pass2ConstantIdentification.java | 40 +- .../kickc/passes/PassNTypeInference.java | 4 +- src/test/kc/declared-memory-var-0.kc | 4 +- src/test/kc/declared-memory-var-1.kc | 2 +- src/test/kc/declared-memory-var-2.kc | 2 +- src/test/kc/declared-memory-var-3.kc | 2 +- src/test/kc/declared-memory-var-4.kc | 2 +- src/test/kc/declared-memory-var-5.kc | 2 +- src/test/kc/declared-memory-var-6.kc | 22 +- src/test/kc/declared-memory-var-7.kc | 2 +- src/test/kc/declared-memory-var-8.kc | 6 +- src/test/ref/declared-memory-var-0.asm | 2 +- src/test/ref/declared-memory-var-0.log | 6 +- src/test/ref/declared-memory-var-8.asm | 4 +- src/test/ref/declared-memory-var-8.log | 12 +- 35 files changed, 1875 insertions(+), 1723 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/model/ControlFlowGraph.java b/src/main/java/dk/camelot64/kickc/model/ControlFlowGraph.java index 613f52bb3..5517272a8 100644 --- a/src/main/java/dk/camelot64/kickc/model/ControlFlowGraph.java +++ b/src/main/java/dk/camelot64/kickc/model/ControlFlowGraph.java @@ -67,7 +67,7 @@ public class ControlFlowGraph implements Serializable { } /** - * Get the assignment of the passed variable. + * Get the assignment of the passed variable. Assumes that only a single assignment exists. * * @param variable The variable to find the assignment for * @return The assignment. null if the variable is not assigned. The variable is assigned by a Phi-statement instead. @@ -87,7 +87,28 @@ public class ControlFlowGraph implements Serializable { } /** - * Get the block containing the assignment of the passed variable. + * Get all assignments of the passed variable. + * + * @param variable The variable to find the assignment for + * @return All assignments. + */ + public List getAssignments(VariableRef variable) { + ArrayList assignments = new ArrayList<>(); + for(ControlFlowBlock block : getAllBlocks()) { + for(Statement statement : block.getStatements()) { + if(statement instanceof StatementLValue) { + StatementLValue assignment = (StatementLValue) statement; + if(variable.equals(assignment.getlValue())) { + assignments.add(assignment); + } + } + } + } + return assignments; + } + + /** + * Get the block containing the assignment of the passed variable. Assumes that only a single assignment exists. * * @param variable The variable to find the assignment for * @return The block containing the assignment. null if the variable is not assigned. diff --git a/src/main/java/dk/camelot64/kickc/model/Directive.java b/src/main/java/dk/camelot64/kickc/model/Directive.java index c60b74c6d..0191fb1d5 100644 --- a/src/main/java/dk/camelot64/kickc/model/Directive.java +++ b/src/main/java/dk/camelot64/kickc/model/Directive.java @@ -9,8 +9,16 @@ import java.util.List; public interface Directive { - /** Variable declared constant. */ + /** Variable declared const, __notconst or __maybeconst. */ class Const implements Directive { + + /** The const declaration. */ + SymbolVariable.ConstantDeclaration constantDeclaration; + + public Const(SymbolVariable.ConstantDeclaration constantDeclaration) { + this.constantDeclaration = constantDeclaration; + } + } /** Function with specific declared calling convention. */ diff --git a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java index 2b2bef55e..72499c3af 100644 --- a/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java +++ b/src/main/java/dk/camelot64/kickc/model/DirectiveParserContext.java @@ -135,7 +135,7 @@ public class DirectiveParserContext { //this.defaultDirectives.add(new Directive.Register(true, null)); this.registerImpliesDirectives = new ArrayList<>(); this.typeDirectives = new HashMap<>(); - this.typeDirectives.put(DirectiveType.ARRAY, Arrays.asList(new Directive.Const(), new Directive.MemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY, null), new Directive.Register(false, null))); + this.typeDirectives.put(DirectiveType.ARRAY, Arrays.asList(new Directive.Const(SymbolVariable.ConstantDeclaration.CONST), new Directive.MemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY, null))); //this.typeDirectives.put(DirectiveType.POINTER, Arrays.asList(new Directive.MemoryArea(SymbolVariable.MemoryArea.ZEROPAGE_MEMORY, null))); this.scopeDirectives = new HashMap<>(); this.scopeTypeDirectives = new HashMap<>(); @@ -165,10 +165,12 @@ public class DirectiveParserContext { Directive.Const constDirective = findDirective(Directive.Const.class, sourceDirectives, directiveScope, directiveType); if(constDirective != null) { - lValue.setDeclaredConstant(true); - lValue.setStorageStrategy(SymbolVariable.StorageStrategy.CONSTANT); - if(!(lValue.getType() instanceof SymbolTypePointer)) - lValue.setMemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY); + lValue.setConstantDeclaration(constDirective.constantDeclaration); + if(SymbolVariable.ConstantDeclaration.CONST.equals(constDirective.constantDeclaration)) { + lValue.setStorageStrategy(SymbolVariable.StorageStrategy.CONSTANT); + if(!(lValue.getType() instanceof SymbolTypePointer)) + lValue.setMemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY); + } } Directive.Volatile volatileDirective = findDirective(Directive.Volatile.class, sourceDirectives, directiveScope, directiveType); diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java b/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java index b82347fbd..4916730ea 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/SymbolVariable.java @@ -26,8 +26,13 @@ public abstract class SymbolVariable implements Symbol { /** A short name used for the variable in ASM code. If possible variable names of variables are shortened in ASM code. This is possible, when several versions of the var use the same register. */ private String asmName; + /** Specifies whether the symbol is declared to be constant, never constant or maybe constant. */ + public enum ConstantDeclaration { + CONST, NOT_CONST, MAYBE_CONST + } + /** Specifies that the variable is declared a constant. It will be replaced by a ConstantVar when possible. */ - private boolean declaredConstant; + private ConstantDeclaration constantDeclaration; /** Specifies that the variable must be aligned in memory. Only allowed for arrays & strings. */ private Integer declaredAlignment; @@ -87,6 +92,7 @@ public abstract class SymbolVariable implements Symbol { this.dataSegment = dataSegment; this.storageStrategy = storageStrategy; this.memoryArea = memoryArea; + this.constantDeclaration = ConstantDeclaration.MAYBE_CONST; setFullName(); } @@ -165,12 +171,20 @@ public abstract class SymbolVariable implements Symbol { } } - public boolean isDeclaredConstant() { - return declaredConstant; + public void setConstantDeclaration(ConstantDeclaration constantDeclaration) { + this.constantDeclaration = constantDeclaration; } - public void setDeclaredConstant(boolean declaredConstant) { - this.declaredConstant = declaredConstant; + public ConstantDeclaration getConstantDeclaration() { + return constantDeclaration; + } + + public boolean isDeclaredConstant() { + return ConstantDeclaration.CONST.equals(constantDeclaration); + } + + public boolean isDeclaredNotConstant() { + return ConstantDeclaration.NOT_CONST.equals(constantDeclaration); } public Integer getDeclaredAlignment() { @@ -206,7 +220,7 @@ public abstract class SymbolVariable implements Symbol { } public boolean isVolatile() { - return declaredVolatile || inferedVolatile || isStorageLoadStore(); + return declaredVolatile || inferedVolatile; } public boolean isDeclaredExport() { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.g4 b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.g4 index 7ed9044ef..ff6dc5405 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.g4 @@ -74,11 +74,12 @@ CODESEG:'code_seg'; DATASEG:'data_seg'; ENCODING:'encoding'; CONST: 'const' ; +NOTCONST: '__notconst' ; +MAYBECONST: '__maybeconst' ; EXTERN: 'extern' ; EXPORT: 'export' ; ALIGN: 'align' ; REGISTER: 'register' ; -NOTREGISTER: '__notregister' ; ADDRESS: '__address' ; ADDRESS_ZEROPAGE: '__zp' ; ADDRESS_MAINMEM: '__mem' ; diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java index 51abf5736..89406f388 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java @@ -27,24 +27,24 @@ public class KickCLexer extends Lexer { GREATER_THAN_EQUAL=32, GREATER_THAN=33, LOGIC_AND=34, LOGIC_OR=35, ASSIGN=36, ASSIGN_COMPOUND=37, IMPORT=38, TYPEDEF=39, PRAGMA=40, RESERVE=41, PC=42, TARGET=43, LINK=44, CPU=45, CODESEG=46, DATASEG=47, ENCODING=48, CONST=49, - EXTERN=50, EXPORT=51, ALIGN=52, REGISTER=53, NOTREGISTER=54, ADDRESS=55, - ADDRESS_ZEROPAGE=56, ADDRESS_MAINMEM=57, FORM_SSA=58, FORM_NOTSSA=59, - INLINE=60, VOLATILE=61, NOTVOLATILE=62, INTERRUPT=63, CALLING=64, CALLINGCONVENTION=65, - IF=66, ELSE=67, WHILE=68, DO=69, FOR=70, SWITCH=71, RETURN=72, BREAK=73, - CONTINUE=74, ASM=75, DEFAULT=76, CASE=77, STRUCT=78, ENUM=79, SIZEOF=80, - TYPEID=81, KICKASM=82, RESOURCE=83, USES=84, CLOBBERS=85, BYTES=86, CYCLES=87, - LOGIC_NOT=88, SIGNEDNESS=89, SIMPLETYPE=90, BOOLEAN=91, KICKASM_BODY=92, - STRING=93, CHAR=94, NUMBER=95, NUMFLOAT=96, BINFLOAT=97, DECFLOAT=98, - HEXFLOAT=99, NUMINT=100, BININTEGER=101, DECINTEGER=102, HEXINTEGER=103, - NAME=104, WS=105, COMMENT_LINE=106, COMMENT_BLOCK=107, ASM_BYTE=108, ASM_MNEMONIC=109, - ASM_IMM=110, ASM_COLON=111, ASM_COMMA=112, ASM_PAR_BEGIN=113, ASM_PAR_END=114, - ASM_BRACKET_BEGIN=115, ASM_BRACKET_END=116, ASM_DOT=117, ASM_SHIFT_LEFT=118, - ASM_SHIFT_RIGHT=119, ASM_PLUS=120, ASM_MINUS=121, ASM_LESS_THAN=122, ASM_GREATER_THAN=123, - ASM_MULTIPLY=124, ASM_DIVIDE=125, ASM_CURLY_BEGIN=126, ASM_CURLY_END=127, - ASM_NUMBER=128, ASM_NUMFLOAT=129, ASM_BINFLOAT=130, ASM_DECFLOAT=131, - ASM_HEXFLOAT=132, ASM_NUMINT=133, ASM_BININTEGER=134, ASM_DECINTEGER=135, - ASM_HEXINTEGER=136, ASM_CHAR=137, ASM_MULTI_REL=138, ASM_MULTI_NAME=139, - ASM_NAME=140, ASM_WS=141, ASM_COMMENT_LINE=142, ASM_COMMENT_BLOCK=143; + NOTCONST=50, MAYBECONST=51, EXTERN=52, EXPORT=53, ALIGN=54, REGISTER=55, + ADDRESS=56, ADDRESS_ZEROPAGE=57, ADDRESS_MAINMEM=58, FORM_SSA=59, FORM_NOTSSA=60, + INLINE=61, VOLATILE=62, NOTVOLATILE=63, INTERRUPT=64, CALLING=65, CALLINGCONVENTION=66, + IF=67, ELSE=68, WHILE=69, DO=70, FOR=71, SWITCH=72, RETURN=73, BREAK=74, + CONTINUE=75, ASM=76, DEFAULT=77, CASE=78, STRUCT=79, ENUM=80, SIZEOF=81, + TYPEID=82, KICKASM=83, RESOURCE=84, USES=85, CLOBBERS=86, BYTES=87, CYCLES=88, + LOGIC_NOT=89, SIGNEDNESS=90, SIMPLETYPE=91, BOOLEAN=92, KICKASM_BODY=93, + STRING=94, CHAR=95, NUMBER=96, NUMFLOAT=97, BINFLOAT=98, DECFLOAT=99, + HEXFLOAT=100, NUMINT=101, BININTEGER=102, DECINTEGER=103, HEXINTEGER=104, + NAME=105, WS=106, COMMENT_LINE=107, COMMENT_BLOCK=108, ASM_BYTE=109, ASM_MNEMONIC=110, + ASM_IMM=111, ASM_COLON=112, ASM_COMMA=113, ASM_PAR_BEGIN=114, ASM_PAR_END=115, + ASM_BRACKET_BEGIN=116, ASM_BRACKET_END=117, ASM_DOT=118, ASM_SHIFT_LEFT=119, + ASM_SHIFT_RIGHT=120, ASM_PLUS=121, ASM_MINUS=122, ASM_LESS_THAN=123, ASM_GREATER_THAN=124, + ASM_MULTIPLY=125, ASM_DIVIDE=126, ASM_CURLY_BEGIN=127, ASM_CURLY_END=128, + ASM_NUMBER=129, ASM_NUMFLOAT=130, ASM_BINFLOAT=131, ASM_DECFLOAT=132, + ASM_HEXFLOAT=133, ASM_NUMINT=134, ASM_BININTEGER=135, ASM_DECINTEGER=136, + ASM_HEXINTEGER=137, ASM_CHAR=138, ASM_MULTI_REL=139, ASM_MULTI_NAME=140, + ASM_NAME=141, ASM_WS=142, ASM_COMMENT_LINE=143, ASM_COMMENT_BLOCK=144; public static final int ASM_MODE=1; public static String[] channelNames = { @@ -63,24 +63,25 @@ public class KickCLexer extends Lexer { "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL", "GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND", "IMPORT", "TYPEDEF", "PRAGMA", "RESERVE", "PC", "TARGET", "LINK", "CPU", "CODESEG", "DATASEG", - "ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", "REGISTER", "NOTREGISTER", - "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", "FORM_SSA", "FORM_NOTSSA", - "INLINE", "VOLATILE", "NOTVOLATILE", "INTERRUPT", "CALLING", "CALLINGCONVENTION", - "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK", "CONTINUE", - "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", "TYPEID", "KICKASM", - "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", "LOGIC_NOT", "SIGNEDNESS", - "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "STRING", "CHAR", "NUMBER", "NUMFLOAT", - "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", "BININTEGER", "DECINTEGER", - "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", "NAME", "NAME_START", - "NAME_CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", "ASM_BYTE", "ASM_MNEMONIC", - "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN", "ASM_PAR_END", "ASM_BRACKET_BEGIN", - "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT", "ASM_SHIFT_RIGHT", "ASM_PLUS", - "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN", "ASM_MULTIPLY", "ASM_DIVIDE", - "ASM_CURLY_BEGIN", "ASM_CURLY_END", "ASM_NUMBER", "ASM_NUMFLOAT", "ASM_BINFLOAT", - "ASM_DECFLOAT", "ASM_HEXFLOAT", "ASM_NUMINT", "ASM_BININTEGER", "ASM_DECINTEGER", - "ASM_HEXINTEGER", "ASM_BINDIGIT", "ASM_DECDIGIT", "ASM_HEXDIGIT", "ASM_CHAR", - "ASM_MULTI_REL", "ASM_MULTI_NAME", "ASM_NAME", "ASM_NAME_START", "ASM_NAME_CHAR", - "ASM_WS", "ASM_COMMENT_LINE", "ASM_COMMENT_BLOCK" + "ENCODING", "CONST", "NOTCONST", "MAYBECONST", "EXTERN", "EXPORT", "ALIGN", + "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", "FORM_SSA", + "FORM_NOTSSA", "INLINE", "VOLATILE", "NOTVOLATILE", "INTERRUPT", "CALLING", + "CALLINGCONVENTION", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", + "BREAK", "CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", "SIZEOF", + "TYPEID", "KICKASM", "RESOURCE", "USES", "CLOBBERS", "BYTES", "CYCLES", + "LOGIC_NOT", "SIGNEDNESS", "SIMPLETYPE", "BOOLEAN", "KICKASM_BODY", "STRING", + "CHAR", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT", + "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT", + "NAME", "NAME_START", "NAME_CHAR", "WS", "COMMENT_LINE", "COMMENT_BLOCK", + "ASM_BYTE", "ASM_MNEMONIC", "ASM_IMM", "ASM_COLON", "ASM_COMMA", "ASM_PAR_BEGIN", + "ASM_PAR_END", "ASM_BRACKET_BEGIN", "ASM_BRACKET_END", "ASM_DOT", "ASM_SHIFT_LEFT", + "ASM_SHIFT_RIGHT", "ASM_PLUS", "ASM_MINUS", "ASM_LESS_THAN", "ASM_GREATER_THAN", + "ASM_MULTIPLY", "ASM_DIVIDE", "ASM_CURLY_BEGIN", "ASM_CURLY_END", "ASM_NUMBER", + "ASM_NUMFLOAT", "ASM_BINFLOAT", "ASM_DECFLOAT", "ASM_HEXFLOAT", "ASM_NUMINT", + "ASM_BININTEGER", "ASM_DECINTEGER", "ASM_HEXINTEGER", "ASM_BINDIGIT", + "ASM_DECDIGIT", "ASM_HEXDIGIT", "ASM_CHAR", "ASM_MULTI_REL", "ASM_MULTI_NAME", + "ASM_NAME", "ASM_NAME_START", "ASM_NAME_CHAR", "ASM_WS", "ASM_COMMENT_LINE", + "ASM_COMMENT_BLOCK" }; private static final String[] _LITERAL_NAMES = { @@ -89,15 +90,15 @@ public class KickCLexer extends Lexer { "'~'", "'^'", "'|'", null, null, "'=='", "'!='", null, "'<='", "'>='", null, "'&&'", "'||'", "'='", null, "'import'", "'typedef'", "'#pragma'", "'reserve'", "'pc'", "'target'", "'link'", "'cpu'", "'code_seg'", "'data_seg'", - "'encoding'", "'const'", "'extern'", "'export'", "'align'", "'register'", - "'__notregister'", "'__address'", "'__zp'", "'__mem'", "'__ssa'", "'__notssa'", - "'inline'", "'volatile'", "'__notvolatile'", "'interrupt'", "'calling'", - null, "'if'", "'else'", "'while'", "'do'", "'for'", "'switch'", "'return'", - "'break'", "'continue'", "'asm'", "'default'", "'case'", "'struct'", "'enum'", - "'sizeof'", "'typeid'", "'kickasm'", "'resource'", "'uses'", "'clobbers'", - "'bytes'", "'cycles'", "'!'", null, null, null, null, null, null, null, + "'encoding'", "'const'", "'__notconst'", "'__maybeconst'", "'extern'", + "'export'", "'align'", "'register'", "'__address'", "'__zp'", "'__mem'", + "'__ssa'", "'__notssa'", "'inline'", "'volatile'", "'__notvolatile'", + "'interrupt'", "'calling'", null, "'if'", "'else'", "'while'", "'do'", + "'for'", "'switch'", "'return'", "'break'", "'continue'", "'asm'", "'default'", + "'case'", "'struct'", "'enum'", "'sizeof'", "'typeid'", "'kickasm'", "'resource'", + "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - "'.byte'", null, "'#'" + null, null, null, null, "'.byte'", null, "'#'" }; private static final String[] _SYMBOLIC_NAMES = { null, "TYPEDEFNAME", "CURLY_BEGIN", "CURLY_END", "BRACKET_BEGIN", "BRACKET_END", @@ -107,8 +108,8 @@ public class KickCLexer extends Lexer { "EQUAL", "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL", "GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND", "IMPORT", "TYPEDEF", "PRAGMA", "RESERVE", "PC", "TARGET", "LINK", "CPU", - "CODESEG", "DATASEG", "ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", - "REGISTER", "NOTREGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", + "CODESEG", "DATASEG", "ENCODING", "CONST", "NOTCONST", "MAYBECONST", "EXTERN", + "EXPORT", "ALIGN", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", "FORM_SSA", "FORM_NOTSSA", "INLINE", "VOLATILE", "NOTVOLATILE", "INTERRUPT", "CALLING", "CALLINGCONVENTION", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK", "CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", @@ -207,19 +208,19 @@ public class KickCLexer extends Lexer { case 36: IMPORT_action((RuleContext)_localctx, actionIndex); break; - case 73: + case 74: ASM_action((RuleContext)_localctx, actionIndex); break; - case 91: + case 92: STRING_action((RuleContext)_localctx, actionIndex); break; - case 105: + case 106: NAME_action((RuleContext)_localctx, actionIndex); break; - case 129: + case 130: ASM_CURLY_BEGIN_action((RuleContext)_localctx, actionIndex); break; - case 130: + case 131: ASM_CURLY_END_action((RuleContext)_localctx, actionIndex); break; } @@ -275,7 +276,7 @@ public class KickCLexer extends Lexer { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0091\u05b5\b\1\b"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0092\u05c1\b\1\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"+ @@ -294,96 +295,97 @@ public class KickCLexer extends Lexer { "\t\u0089\4\u008a\t\u008a\4\u008b\t\u008b\4\u008c\t\u008c\4\u008d\t\u008d"+ "\4\u008e\t\u008e\4\u008f\t\u008f\4\u0090\t\u0090\4\u0091\t\u0091\4\u0092"+ "\t\u0092\4\u0093\t\u0093\4\u0094\t\u0094\4\u0095\t\u0095\4\u0096\t\u0096"+ - "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\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\13\3\13\3\13"+ - "\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\22\3\22"+ - "\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3\26\3\26\3\27\3\27\3\30\3\30"+ - "\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\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%\5%\u019e"+ - "\n%\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"+ - "+\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\60\3\60\3\60\3\61\3\61\3"+ - "\61\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\62\3\62\3\62\3\63\3\63\3\63\3"+ - "\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3"+ - "\65\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3\66\3"+ - "\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3\67\3"+ - "\67\38\38\38\38\38\39\39\39\39\39\39\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>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3?\3?\3@\3@"+ - "\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A\3A"+ - "\3A\3A\3A\5A\u0288\nA\3B\3B\3B\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3E\3E"+ - "\3E\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I"+ - "\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L"+ - "\3L\3L\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P"+ - "\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S"+ - "\3S\3S\3S\3S\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V"+ - "\3V\3W\3W\3W\3W\3W\3W\3W\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y"+ - "\3Y\5Y\u0325\nY\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z"+ - "\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u034c\nZ"+ - "\3[\3[\3[\3[\3[\3[\3[\3[\3[\5[\u0357\n[\3\\\3\\\3\\\3\\\7\\\u035d\n\\"+ - "\f\\\16\\\u0360\13\\\3\\\3\\\3\\\3]\3]\3]\3]\7]\u0369\n]\f]\16]\u036c"+ - "\13]\3]\3]\5]\u0370\n]\3]\3]\5]\u0374\n]\5]\u0376\n]\3]\5]\u0379\n]\3"+ - "]\3]\3^\3^\3^\3^\5^\u0381\n^\3^\3^\3_\3_\5_\u0387\n_\3`\3`\3`\5`\u038c"+ - "\n`\3a\3a\3a\3a\3a\5a\u0393\na\3a\7a\u0396\na\fa\16a\u0399\13a\3a\3a\6"+ - "a\u039d\na\ra\16a\u039e\3b\7b\u03a2\nb\fb\16b\u03a5\13b\3b\3b\6b\u03a9"+ - "\nb\rb\16b\u03aa\3c\3c\3c\3c\3c\5c\u03b2\nc\3c\7c\u03b5\nc\fc\16c\u03b8"+ - "\13c\3c\3c\6c\u03bc\nc\rc\16c\u03bd\3d\3d\3d\5d\u03c3\nd\3d\3d\3d\5d\u03c8"+ - "\nd\3e\3e\3e\6e\u03cd\ne\re\16e\u03ce\3e\3e\6e\u03d3\ne\re\16e\u03d4\5"+ - "e\u03d7\ne\3f\6f\u03da\nf\rf\16f\u03db\3g\3g\3g\3g\3g\5g\u03e3\ng\3g\6"+ - "g\u03e6\ng\rg\16g\u03e7\3h\3h\3i\3i\3j\3j\3k\3k\7k\u03f2\nk\fk\16k\u03f5"+ - "\13k\3k\3k\3l\3l\3m\3m\3n\6n\u03fe\nn\rn\16n\u03ff\3n\3n\3o\3o\3o\3o\7"+ - "o\u0408\no\fo\16o\u040b\13o\3o\3o\3p\3p\3p\3p\7p\u0413\np\fp\16p\u0416"+ - "\13p\3p\3p\3p\3p\3p\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3r\3"+ - "r\3r\3r\3r\3r\5r\u0501\nr\3s\3s\3t\3t\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\3"+ - "z\3z\3{\3{\3{\3|\3|\3|\3}\3}\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081"+ - "\3\u0081\3\u0082\3\u0082\3\u0083\3\u0083\3\u0083\3\u0084\3\u0084\3\u0084"+ - "\3\u0085\3\u0085\5\u0085\u052d\n\u0085\3\u0086\3\u0086\3\u0086\5\u0086"+ - "\u0532\n\u0086\3\u0087\3\u0087\7\u0087\u0536\n\u0087\f\u0087\16\u0087"+ - "\u0539\13\u0087\3\u0087\3\u0087\6\u0087\u053d\n\u0087\r\u0087\16\u0087"+ - "\u053e\3\u0088\7\u0088\u0542\n\u0088\f\u0088\16\u0088\u0545\13\u0088\3"+ - "\u0088\3\u0088\6\u0088\u0549\n\u0088\r\u0088\16\u0088\u054a\3\u0089\3"+ - "\u0089\7\u0089\u054f\n\u0089\f\u0089\16\u0089\u0552\13\u0089\3\u0089\3"+ - "\u0089\6\u0089\u0556\n\u0089\r\u0089\16\u0089\u0557\3\u008a\3\u008a\3"+ - "\u008a\5\u008a\u055d\n\u008a\3\u008b\3\u008b\6\u008b\u0561\n\u008b\r\u008b"+ - "\16\u008b\u0562\3\u008c\6\u008c\u0566\n\u008c\r\u008c\16\u008c\u0567\3"+ - "\u008d\3\u008d\6\u008d\u056c\n\u008d\r\u008d\16\u008d\u056d\3\u008e\3"+ - "\u008e\3\u008f\3\u008f\3\u0090\3\u0090\3\u0091\3\u0091\3\u0091\3\u0091"+ - "\5\u0091\u057a\n\u0091\3\u0091\3\u0091\3\u0092\3\u0092\6\u0092\u0580\n"+ - "\u0092\r\u0092\16\u0092\u0581\3\u0093\3\u0093\7\u0093\u0586\n\u0093\f"+ - "\u0093\16\u0093\u0589\13\u0093\3\u0094\3\u0094\7\u0094\u058d\n\u0094\f"+ - "\u0094\16\u0094\u0590\13\u0094\3\u0095\3\u0095\3\u0096\3\u0096\3\u0097"+ - "\6\u0097\u0597\n\u0097\r\u0097\16\u0097\u0598\3\u0097\3\u0097\3\u0098"+ - "\3\u0098\3\u0098\3\u0098\7\u0098\u05a1\n\u0098\f\u0098\16\u0098\u05a4"+ - "\13\u0098\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099\3\u0099\7\u0099\u05ac"+ - "\n\u0099\f\u0099\16\u0099\u05af\13\u0099\3\u0099\3\u0099\3\u0099\3\u0099"+ - "\3\u0099\5\u035e\u0414\u05ad\2\u009a\4\4\6\5\b\6\n\7\f\b\16\t\20\n\22"+ - "\13\24\f\26\r\30\16\32\17\34\20\36\21 \22\"\23$\24&\25(\26*\27,\30.\31"+ - "\60\32\62\33\64\34\66\358\36:\37< >!@\"B#D$F%H&J\'L(N)P*R+T,V-X.Z/\\\60"+ - "^\61`\62b\63d\64f\65h\66j\67l8n9p:r;tz?|@~A\u0080B\u0082C\u0084D"+ - "\u0086E\u0088F\u008aG\u008cH\u008eI\u0090J\u0092K\u0094L\u0096M\u0098"+ - "N\u009aO\u009cP\u009eQ\u00a0R\u00a2S\u00a4T\u00a6U\u00a8V\u00aaW\u00ac"+ - "X\u00aeY\u00b0Z\u00b2[\u00b4\\\u00b6]\u00b8^\u00ba_\u00bc`\u00bea\u00c0"+ - "b\u00c2c\u00c4d\u00c6e\u00c8f\u00cag\u00cch\u00cei\u00d0\2\u00d2\2\u00d4"+ - "\2\u00d6j\u00d8\2\u00da\2\u00dck\u00del\u00e0m\u00e2n\u00e4o\u00e6p\u00e8"+ - "q\u00ear\u00ecs\u00eet\u00f0u\u00f2v\u00f4w\u00f6x\u00f8y\u00faz\u00fc"+ - "{\u00fe|\u0100}\u0102~\u0104\177\u0106\u0080\u0108\u0081\u010a\u0082\u010c"+ - "\u0083\u010e\u0084\u0110\u0085\u0112\u0086\u0114\u0087\u0116\u0088\u0118"+ - "\u0089\u011a\u008a\u011c\2\u011e\2\u0120\2\u0122\u008b\u0124\u008c\u0126"+ - "\u008d\u0128\u008e\u012a\2\u012c\2\u012e\u008f\u0130\u0090\u0132\u0091"+ + "\4\u0097\t\u0097\4\u0098\t\u0098\4\u0099\t\u0099\4\u009a\t\u009a\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\13\3\13\3\13\3\f\3\f\3\r\3\r\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\21"+ + "\3\21\3\22\3\22\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3\26\3\26\3\27"+ + "\3\27\3\30\3\30\3\31\3\31\3\32\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34"+ + "\3\35\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%\5%\u01a0\n%\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+\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\60\3"+ + "\60\3\60\3\61\3\61\3\61\3\61\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\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\64\3\64\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3"+ + "\65\3\65\3\65\3\65\3\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\3\67\3\67\3"+ + "\67\3\67\3\67\3\67\3\67\38\38\38\38\38\38\38\38\38\38\39\39\39\39\39\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?\3?\3?\3?\3"+ + "?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3A\3A\3"+ + "B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\3B\5B\u0294\n"+ + "B\3C\3C\3C\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G\3H\3"+ + "H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3"+ + "K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3"+ + "N\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3"+ + "R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3T\3T\3T\3U\3U\3"+ + "U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3"+ + "X\3X\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\5Z\u0331\nZ\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[\5[\u0358\n[\3\\\3\\\3\\\3\\\3\\"+ + "\3\\\3\\\3\\\3\\\5\\\u0363\n\\\3]\3]\3]\3]\7]\u0369\n]\f]\16]\u036c\13"+ + "]\3]\3]\3]\3^\3^\3^\3^\7^\u0375\n^\f^\16^\u0378\13^\3^\3^\5^\u037c\n^"+ + "\3^\3^\5^\u0380\n^\5^\u0382\n^\3^\5^\u0385\n^\3^\3^\3_\3_\3_\3_\5_\u038d"+ + "\n_\3_\3_\3`\3`\5`\u0393\n`\3a\3a\3a\5a\u0398\na\3b\3b\3b\3b\3b\5b\u039f"+ + "\nb\3b\7b\u03a2\nb\fb\16b\u03a5\13b\3b\3b\6b\u03a9\nb\rb\16b\u03aa\3c"+ + "\7c\u03ae\nc\fc\16c\u03b1\13c\3c\3c\6c\u03b5\nc\rc\16c\u03b6\3d\3d\3d"+ + "\3d\3d\5d\u03be\nd\3d\7d\u03c1\nd\fd\16d\u03c4\13d\3d\3d\6d\u03c8\nd\r"+ + "d\16d\u03c9\3e\3e\3e\5e\u03cf\ne\3e\3e\3e\5e\u03d4\ne\3f\3f\3f\6f\u03d9"+ + "\nf\rf\16f\u03da\3f\3f\6f\u03df\nf\rf\16f\u03e0\5f\u03e3\nf\3g\6g\u03e6"+ + "\ng\rg\16g\u03e7\3h\3h\3h\3h\3h\5h\u03ef\nh\3h\6h\u03f2\nh\rh\16h\u03f3"+ + "\3i\3i\3j\3j\3k\3k\3l\3l\7l\u03fe\nl\fl\16l\u0401\13l\3l\3l\3m\3m\3n\3"+ + "n\3o\6o\u040a\no\ro\16o\u040b\3o\3o\3p\3p\3p\3p\7p\u0414\np\fp\16p\u0417"+ + "\13p\3p\3p\3q\3q\3q\3q\7q\u041f\nq\fq\16q\u0422\13q\3q\3q\3q\3q\3q\3r"+ + "\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\3s\5s\u050d"+ + "\ns\3t\3t\3u\3u\3v\3v\3w\3w\3x\3x\3y\3y\3z\3z\3{\3{\3|\3|\3|\3}\3}\3}"+ + "\3~\3~\3\177\3\177\3\u0080\3\u0080\3\u0081\3\u0081\3\u0082\3\u0082\3\u0083"+ + "\3\u0083\3\u0084\3\u0084\3\u0084\3\u0085\3\u0085\3\u0085\3\u0086\3\u0086"+ + "\5\u0086\u0539\n\u0086\3\u0087\3\u0087\3\u0087\5\u0087\u053e\n\u0087\3"+ + "\u0088\3\u0088\7\u0088\u0542\n\u0088\f\u0088\16\u0088\u0545\13\u0088\3"+ + "\u0088\3\u0088\6\u0088\u0549\n\u0088\r\u0088\16\u0088\u054a\3\u0089\7"+ + "\u0089\u054e\n\u0089\f\u0089\16\u0089\u0551\13\u0089\3\u0089\3\u0089\6"+ + "\u0089\u0555\n\u0089\r\u0089\16\u0089\u0556\3\u008a\3\u008a\7\u008a\u055b"+ + "\n\u008a\f\u008a\16\u008a\u055e\13\u008a\3\u008a\3\u008a\6\u008a\u0562"+ + "\n\u008a\r\u008a\16\u008a\u0563\3\u008b\3\u008b\3\u008b\5\u008b\u0569"+ + "\n\u008b\3\u008c\3\u008c\6\u008c\u056d\n\u008c\r\u008c\16\u008c\u056e"+ + "\3\u008d\6\u008d\u0572\n\u008d\r\u008d\16\u008d\u0573\3\u008e\3\u008e"+ + "\6\u008e\u0578\n\u008e\r\u008e\16\u008e\u0579\3\u008f\3\u008f\3\u0090"+ + "\3\u0090\3\u0091\3\u0091\3\u0092\3\u0092\3\u0092\3\u0092\5\u0092\u0586"+ + "\n\u0092\3\u0092\3\u0092\3\u0093\3\u0093\6\u0093\u058c\n\u0093\r\u0093"+ + "\16\u0093\u058d\3\u0094\3\u0094\7\u0094\u0592\n\u0094\f\u0094\16\u0094"+ + "\u0595\13\u0094\3\u0095\3\u0095\7\u0095\u0599\n\u0095\f\u0095\16\u0095"+ + "\u059c\13\u0095\3\u0096\3\u0096\3\u0097\3\u0097\3\u0098\6\u0098\u05a3"+ + "\n\u0098\r\u0098\16\u0098\u05a4\3\u0098\3\u0098\3\u0099\3\u0099\3\u0099"+ + "\3\u0099\7\u0099\u05ad\n\u0099\f\u0099\16\u0099\u05b0\13\u0099\3\u0099"+ + "\3\u0099\3\u009a\3\u009a\3\u009a\3\u009a\7\u009a\u05b8\n\u009a\f\u009a"+ + "\16\u009a\u05bb\13\u009a\3\u009a\3\u009a\3\u009a\3\u009a\3\u009a\5\u036a"+ + "\u0420\u05b9\2\u009b\4\4\6\5\b\6\n\7\f\b\16\t\20\n\22\13\24\f\26\r\30"+ + "\16\32\17\34\20\36\21 \22\"\23$\24&\25(\26*\27,\30.\31\60\32\62\33\64"+ + "\34\66\358\36:\37< >!@\"B#D$F%H&J\'L(N)P*R+T,V-X.Z/\\\60^\61`\62b\63d"+ + "\64f\65h\66j\67l8n9p:r;tz?|@~A\u0080B\u0082C\u0084D\u0086E\u0088"+ + "F\u008aG\u008cH\u008eI\u0090J\u0092K\u0094L\u0096M\u0098N\u009aO\u009c"+ + "P\u009eQ\u00a0R\u00a2S\u00a4T\u00a6U\u00a8V\u00aaW\u00acX\u00aeY\u00b0"+ + "Z\u00b2[\u00b4\\\u00b6]\u00b8^\u00ba_\u00bc`\u00bea\u00c0b\u00c2c\u00c4"+ + "d\u00c6e\u00c8f\u00cag\u00cch\u00cei\u00d0j\u00d2\2\u00d4\2\u00d6\2\u00d8"+ + "k\u00da\2\u00dc\2\u00del\u00e0m\u00e2n\u00e4o\u00e6p\u00e8q\u00ear\u00ec"+ + "s\u00eet\u00f0u\u00f2v\u00f4w\u00f6x\u00f8y\u00faz\u00fc{\u00fe|\u0100"+ + "}\u0102~\u0104\177\u0106\u0080\u0108\u0081\u010a\u0082\u010c\u0083\u010e"+ + "\u0084\u0110\u0085\u0112\u0086\u0114\u0087\u0116\u0088\u0118\u0089\u011a"+ + "\u008a\u011c\u008b\u011e\2\u0120\2\u0122\2\u0124\u008c\u0126\u008d\u0128"+ + "\u008e\u012a\u008f\u012c\2\u012e\2\u0130\u0090\u0132\u0091\u0134\u0092"+ "\4\2\3\23\3\2$$\3\2||\4\2rruu\4\2ooww\7\2$$))hhpptt\3\2))\4\2uuww\7\2"+ "dfkknnuuyy\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\"+ - "aac|\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\4\2--//\2\u063f\2\4"+ + "aac|\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\4\2--//\2\u064b\2\4"+ "\3\2\2\2\2\6\3\2\2\2\2\b\3\2\2\2\2\n\3\2\2\2\2\f\3\2\2\2\2\16\3\2\2\2"+ "\2\20\3\2\2\2\2\22\3\2\2\2\2\24\3\2\2\2\2\26\3\2\2\2\2\30\3\2\2\2\2\32"+ "\3\2\2\2\2\34\3\2\2\2\2\36\3\2\2\2\2 \3\2\2\2\2\"\3\2\2\2\2$\3\2\2\2\2"+ @@ -403,420 +405,423 @@ public class KickCLexer extends Lexer { "\2\2\u00b4\3\2\2\2\2\u00b6\3\2\2\2\2\u00b8\3\2\2\2\2\u00ba\3\2\2\2\2\u00bc"+ "\3\2\2\2\2\u00be\3\2\2\2\2\u00c0\3\2\2\2\2\u00c2\3\2\2\2\2\u00c4\3\2\2"+ "\2\2\u00c6\3\2\2\2\2\u00c8\3\2\2\2\2\u00ca\3\2\2\2\2\u00cc\3\2\2\2\2\u00ce"+ - "\3\2\2\2\2\u00d6\3\2\2\2\2\u00dc\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ - "\2\3\u00e2\3\2\2\2\3\u00e4\3\2\2\2\3\u00e6\3\2\2\2\3\u00e8\3\2\2\2\3\u00ea"+ + "\3\2\2\2\2\u00d0\3\2\2\2\2\u00d8\3\2\2\2\2\u00de\3\2\2\2\2\u00e0\3\2\2"+ + "\2\2\u00e2\3\2\2\2\3\u00e4\3\2\2\2\3\u00e6\3\2\2\2\3\u00e8\3\2\2\2\3\u00ea"+ "\3\2\2\2\3\u00ec\3\2\2\2\3\u00ee\3\2\2\2\3\u00f0\3\2\2\2\3\u00f2\3\2\2"+ "\2\3\u00f4\3\2\2\2\3\u00f6\3\2\2\2\3\u00f8\3\2\2\2\3\u00fa\3\2\2\2\3\u00fc"+ "\3\2\2\2\3\u00fe\3\2\2\2\3\u0100\3\2\2\2\3\u0102\3\2\2\2\3\u0104\3\2\2"+ "\2\3\u0106\3\2\2\2\3\u0108\3\2\2\2\3\u010a\3\2\2\2\3\u010c\3\2\2\2\3\u010e"+ "\3\2\2\2\3\u0110\3\2\2\2\3\u0112\3\2\2\2\3\u0114\3\2\2\2\3\u0116\3\2\2"+ - "\2\3\u0118\3\2\2\2\3\u011a\3\2\2\2\3\u0122\3\2\2\2\3\u0124\3\2\2\2\3\u0126"+ - "\3\2\2\2\3\u0128\3\2\2\2\3\u012e\3\2\2\2\3\u0130\3\2\2\2\3\u0132\3\2\2"+ - "\2\4\u0134\3\2\2\2\6\u0137\3\2\2\2\b\u0139\3\2\2\2\n\u013b\3\2\2\2\f\u013d"+ - "\3\2\2\2\16\u013f\3\2\2\2\20\u0141\3\2\2\2\22\u0143\3\2\2\2\24\u0145\3"+ - "\2\2\2\26\u0147\3\2\2\2\30\u014a\3\2\2\2\32\u014c\3\2\2\2\34\u014e\3\2"+ - "\2\2\36\u0151\3\2\2\2 \u0153\3\2\2\2\"\u0155\3\2\2\2$\u0157\3\2\2\2&\u0159"+ - "\3\2\2\2(\u015b\3\2\2\2*\u015e\3\2\2\2,\u0161\3\2\2\2.\u0163\3\2\2\2\60"+ - "\u0165\3\2\2\2\62\u0167\3\2\2\2\64\u0169\3\2\2\2\66\u016c\3\2\2\28\u016f"+ - "\3\2\2\2:\u0172\3\2\2\2<\u0175\3\2\2\2>\u0177\3\2\2\2@\u017a\3\2\2\2B"+ - "\u017d\3\2\2\2D\u017f\3\2\2\2F\u0182\3\2\2\2H\u0185\3\2\2\2J\u019d\3\2"+ - "\2\2L\u019f\3\2\2\2N\u01a8\3\2\2\2P\u01b0\3\2\2\2R\u01b8\3\2\2\2T\u01c0"+ - "\3\2\2\2V\u01c3\3\2\2\2X\u01ca\3\2\2\2Z\u01cf\3\2\2\2\\\u01d3\3\2\2\2"+ - "^\u01dc\3\2\2\2`\u01e5\3\2\2\2b\u01ee\3\2\2\2d\u01f4\3\2\2\2f\u01fb\3"+ - "\2\2\2h\u0202\3\2\2\2j\u0208\3\2\2\2l\u0211\3\2\2\2n\u021f\3\2\2\2p\u0229"+ - "\3\2\2\2r\u022e\3\2\2\2t\u0234\3\2\2\2v\u023a\3\2\2\2x\u0243\3\2\2\2z"+ - "\u024a\3\2\2\2|\u0253\3\2\2\2~\u0261\3\2\2\2\u0080\u026b\3\2\2\2\u0082"+ - "\u0287\3\2\2\2\u0084\u0289\3\2\2\2\u0086\u028c\3\2\2\2\u0088\u0291\3\2"+ - "\2\2\u008a\u0297\3\2\2\2\u008c\u029a\3\2\2\2\u008e\u029e\3\2\2\2\u0090"+ - "\u02a5\3\2\2\2\u0092\u02ac\3\2\2\2\u0094\u02b2\3\2\2\2\u0096\u02bb\3\2"+ - "\2\2\u0098\u02c1\3\2\2\2\u009a\u02c9\3\2\2\2\u009c\u02ce\3\2\2\2\u009e"+ - "\u02d5\3\2\2\2\u00a0\u02da\3\2\2\2\u00a2\u02e1\3\2\2\2\u00a4\u02e8\3\2"+ - "\2\2\u00a6\u02f0\3\2\2\2\u00a8\u02f9\3\2\2\2\u00aa\u02fe\3\2\2\2\u00ac"+ - "\u0307\3\2\2\2\u00ae\u030d\3\2\2\2\u00b0\u0314\3\2\2\2\u00b2\u0324\3\2"+ - "\2\2\u00b4\u034b\3\2\2\2\u00b6\u0356\3\2\2\2\u00b8\u0358\3\2\2\2\u00ba"+ - "\u0364\3\2\2\2\u00bc\u037c\3\2\2\2\u00be\u0386\3\2\2\2\u00c0\u038b\3\2"+ - "\2\2\u00c2\u0392\3\2\2\2\u00c4\u03a3\3\2\2\2\u00c6\u03b1\3\2\2\2\u00c8"+ - "\u03c2\3\2\2\2\u00ca\u03d6\3\2\2\2\u00cc\u03d9\3\2\2\2\u00ce\u03e2\3\2"+ - "\2\2\u00d0\u03e9\3\2\2\2\u00d2\u03eb\3\2\2\2\u00d4\u03ed\3\2\2\2\u00d6"+ - "\u03ef\3\2\2\2\u00d8\u03f8\3\2\2\2\u00da\u03fa\3\2\2\2\u00dc\u03fd\3\2"+ - "\2\2\u00de\u0403\3\2\2\2\u00e0\u040e\3\2\2\2\u00e2\u041c\3\2\2\2\u00e4"+ - "\u0500\3\2\2\2\u00e6\u0502\3\2\2\2\u00e8\u0504\3\2\2\2\u00ea\u0506\3\2"+ - "\2\2\u00ec\u0508\3\2\2\2\u00ee\u050a\3\2\2\2\u00f0\u050c\3\2\2\2\u00f2"+ - "\u050e\3\2\2\2\u00f4\u0510\3\2\2\2\u00f6\u0512\3\2\2\2\u00f8\u0515\3\2"+ - "\2\2\u00fa\u0518\3\2\2\2\u00fc\u051a\3\2\2\2\u00fe\u051c\3\2\2\2\u0100"+ - "\u051e\3\2\2\2\u0102\u0520\3\2\2\2\u0104\u0522\3\2\2\2\u0106\u0524\3\2"+ - "\2\2\u0108\u0527\3\2\2\2\u010a\u052c\3\2\2\2\u010c\u0531\3\2\2\2\u010e"+ - "\u0533\3\2\2\2\u0110\u0543\3\2\2\2\u0112\u054c\3\2\2\2\u0114\u055c\3\2"+ - "\2\2\u0116\u055e\3\2\2\2\u0118\u0565\3\2\2\2\u011a\u0569\3\2\2\2\u011c"+ - "\u056f\3\2\2\2\u011e\u0571\3\2\2\2\u0120\u0573\3\2\2\2\u0122\u0575\3\2"+ - "\2\2\u0124\u057d\3\2\2\2\u0126\u0583\3\2\2\2\u0128\u058a\3\2\2\2\u012a"+ - "\u0591\3\2\2\2\u012c\u0593\3\2\2\2\u012e\u0596\3\2\2\2\u0130\u059c\3\2"+ - "\2\2\u0132\u05a7\3\2\2\2\u0134\u0135\7}\2\2\u0135\u0136\b\2\2\2\u0136"+ - "\5\3\2\2\2\u0137\u0138\7\177\2\2\u0138\7\3\2\2\2\u0139\u013a\7]\2\2\u013a"+ - "\t\3\2\2\2\u013b\u013c\7_\2\2\u013c\13\3\2\2\2\u013d\u013e\7*\2\2\u013e"+ - "\r\3\2\2\2\u013f\u0140\7+\2\2\u0140\17\3\2\2\2\u0141\u0142\7=\2\2\u0142"+ - "\21\3\2\2\2\u0143\u0144\7<\2\2\u0144\23\3\2\2\2\u0145\u0146\7.\2\2\u0146"+ - "\25\3\2\2\2\u0147\u0148\7\60\2\2\u0148\u0149\7\60\2\2\u0149\27\3\2\2\2"+ - "\u014a\u014b\7A\2\2\u014b\31\3\2\2\2\u014c\u014d\7\60\2\2\u014d\33\3\2"+ - "\2\2\u014e\u014f\7/\2\2\u014f\u0150\7@\2\2\u0150\35\3\2\2\2\u0151\u0152"+ - "\7-\2\2\u0152\37\3\2\2\2\u0153\u0154\7/\2\2\u0154!\3\2\2\2\u0155\u0156"+ - "\7,\2\2\u0156#\3\2\2\2\u0157\u0158\7\61\2\2\u0158%\3\2\2\2\u0159\u015a"+ - "\7\'\2\2\u015a\'\3\2\2\2\u015b\u015c\7-\2\2\u015c\u015d\7-\2\2\u015d)"+ - "\3\2\2\2\u015e\u015f\7/\2\2\u015f\u0160\7/\2\2\u0160+\3\2\2\2\u0161\u0162"+ - "\7(\2\2\u0162-\3\2\2\2\u0163\u0164\7\u0080\2\2\u0164/\3\2\2\2\u0165\u0166"+ - "\7`\2\2\u0166\61\3\2\2\2\u0167\u0168\7~\2\2\u0168\63\3\2\2\2\u0169\u016a"+ - "\7>\2\2\u016a\u016b\7>\2\2\u016b\65\3\2\2\2\u016c\u016d\7@\2\2\u016d\u016e"+ - "\7@\2\2\u016e\67\3\2\2\2\u016f\u0170\7?\2\2\u0170\u0171\7?\2\2\u01719"+ - "\3\2\2\2\u0172\u0173\7#\2\2\u0173\u0174\7?\2\2\u0174;\3\2\2\2\u0175\u0176"+ - "\7>\2\2\u0176=\3\2\2\2\u0177\u0178\7>\2\2\u0178\u0179\7?\2\2\u0179?\3"+ - "\2\2\2\u017a\u017b\7@\2\2\u017b\u017c\7?\2\2\u017cA\3\2\2\2\u017d\u017e"+ - "\7@\2\2\u017eC\3\2\2\2\u017f\u0180\7(\2\2\u0180\u0181\7(\2\2\u0181E\3"+ - "\2\2\2\u0182\u0183\7~\2\2\u0183\u0184\7~\2\2\u0184G\3\2\2\2\u0185\u0186"+ - "\7?\2\2\u0186I\3\2\2\2\u0187\u0188\7-\2\2\u0188\u019e\7?\2\2\u0189\u018a"+ - "\7/\2\2\u018a\u019e\7?\2\2\u018b\u018c\7,\2\2\u018c\u019e\7?\2\2\u018d"+ - "\u018e\7\61\2\2\u018e\u019e\7?\2\2\u018f\u0190\7\'\2\2\u0190\u019e\7?"+ - "\2\2\u0191\u0192\7>\2\2\u0192\u0193\7>\2\2\u0193\u019e\7?\2\2\u0194\u0195"+ - "\7@\2\2\u0195\u0196\7@\2\2\u0196\u019e\7?\2\2\u0197\u0198\7(\2\2\u0198"+ - "\u019e\7?\2\2\u0199\u019a\7~\2\2\u019a\u019e\7?\2\2\u019b\u019c\7`\2\2"+ - "\u019c\u019e\7?\2\2\u019d\u0187\3\2\2\2\u019d\u0189\3\2\2\2\u019d\u018b"+ - "\3\2\2\2\u019d\u018d\3\2\2\2\u019d\u018f\3\2\2\2\u019d\u0191\3\2\2\2\u019d"+ - "\u0194\3\2\2\2\u019d\u0197\3\2\2\2\u019d\u0199\3\2\2\2\u019d\u019b\3\2"+ - "\2\2\u019eK\3\2\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7o\2\2\u01a1\u01a2"+ - "\7r\2\2\u01a2\u01a3\7q\2\2\u01a3\u01a4\7t\2\2\u01a4\u01a5\7v\2\2\u01a5"+ - "\u01a6\3\2\2\2\u01a6\u01a7\b&\3\2\u01a7M\3\2\2\2\u01a8\u01a9\7v\2\2\u01a9"+ - "\u01aa\7{\2\2\u01aa\u01ab\7r\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7f\2\2"+ - "\u01ad\u01ae\7g\2\2\u01ae\u01af\7h\2\2\u01afO\3\2\2\2\u01b0\u01b1\7%\2"+ - "\2\u01b1\u01b2\7r\2\2\u01b2\u01b3\7t\2\2\u01b3\u01b4\7c\2\2\u01b4\u01b5"+ - "\7i\2\2\u01b5\u01b6\7o\2\2\u01b6\u01b7\7c\2\2\u01b7Q\3\2\2\2\u01b8\u01b9"+ - "\7t\2\2\u01b9\u01ba\7g\2\2\u01ba\u01bb\7u\2\2\u01bb\u01bc\7g\2\2\u01bc"+ - "\u01bd\7t\2\2\u01bd\u01be\7x\2\2\u01be\u01bf\7g\2\2\u01bfS\3\2\2\2\u01c0"+ - "\u01c1\7r\2\2\u01c1\u01c2\7e\2\2\u01c2U\3\2\2\2\u01c3\u01c4\7v\2\2\u01c4"+ - "\u01c5\7c\2\2\u01c5\u01c6\7t\2\2\u01c6\u01c7\7i\2\2\u01c7\u01c8\7g\2\2"+ - "\u01c8\u01c9\7v\2\2\u01c9W\3\2\2\2\u01ca\u01cb\7n\2\2\u01cb\u01cc\7k\2"+ - "\2\u01cc\u01cd\7p\2\2\u01cd\u01ce\7m\2\2\u01ceY\3\2\2\2\u01cf\u01d0\7"+ - "e\2\2\u01d0\u01d1\7r\2\2\u01d1\u01d2\7w\2\2\u01d2[\3\2\2\2\u01d3\u01d4"+ - "\7e\2\2\u01d4\u01d5\7q\2\2\u01d5\u01d6\7f\2\2\u01d6\u01d7\7g\2\2\u01d7"+ - "\u01d8\7a\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da\7g\2\2\u01da\u01db\7i\2\2"+ - "\u01db]\3\2\2\2\u01dc\u01dd\7f\2\2\u01dd\u01de\7c\2\2\u01de\u01df\7v\2"+ - "\2\u01df\u01e0\7c\2\2\u01e0\u01e1\7a\2\2\u01e1\u01e2\7u\2\2\u01e2\u01e3"+ - "\7g\2\2\u01e3\u01e4\7i\2\2\u01e4_\3\2\2\2\u01e5\u01e6\7g\2\2\u01e6\u01e7"+ - "\7p\2\2\u01e7\u01e8\7e\2\2\u01e8\u01e9\7q\2\2\u01e9\u01ea\7f\2\2\u01ea"+ - "\u01eb\7k\2\2\u01eb\u01ec\7p\2\2\u01ec\u01ed\7i\2\2\u01eda\3\2\2\2\u01ee"+ - "\u01ef\7e\2\2\u01ef\u01f0\7q\2\2\u01f0\u01f1\7p\2\2\u01f1\u01f2\7u\2\2"+ - "\u01f2\u01f3\7v\2\2\u01f3c\3\2\2\2\u01f4\u01f5\7g\2\2\u01f5\u01f6\7z\2"+ - "\2\u01f6\u01f7\7v\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa"+ - "\7p\2\2\u01fae\3\2\2\2\u01fb\u01fc\7g\2\2\u01fc\u01fd\7z\2\2\u01fd\u01fe"+ - "\7r\2\2\u01fe\u01ff\7q\2\2\u01ff\u0200\7t\2\2\u0200\u0201\7v\2\2\u0201"+ - "g\3\2\2\2\u0202\u0203\7c\2\2\u0203\u0204\7n\2\2\u0204\u0205\7k\2\2\u0205"+ - "\u0206\7i\2\2\u0206\u0207\7p\2\2\u0207i\3\2\2\2\u0208\u0209\7t\2\2\u0209"+ - "\u020a\7g\2\2\u020a\u020b\7i\2\2\u020b\u020c\7k\2\2\u020c\u020d\7u\2\2"+ - "\u020d\u020e\7v\2\2\u020e\u020f\7g\2\2\u020f\u0210\7t\2\2\u0210k\3\2\2"+ - "\2\u0211\u0212\7a\2\2\u0212\u0213\7a\2\2\u0213\u0214\7p\2\2\u0214\u0215"+ - "\7q\2\2\u0215\u0216\7v\2\2\u0216\u0217\7t\2\2\u0217\u0218\7g\2\2\u0218"+ - "\u0219\7i\2\2\u0219\u021a\7k\2\2\u021a\u021b\7u\2\2\u021b\u021c\7v\2\2"+ - "\u021c\u021d\7g\2\2\u021d\u021e\7t\2\2\u021em\3\2\2\2\u021f\u0220\7a\2"+ - "\2\u0220\u0221\7a\2\2\u0221\u0222\7c\2\2\u0222\u0223\7f\2\2\u0223\u0224"+ - "\7f\2\2\u0224\u0225\7t\2\2\u0225\u0226\7g\2\2\u0226\u0227\7u\2\2\u0227"+ - "\u0228\7u\2\2\u0228o\3\2\2\2\u0229\u022a\7a\2\2\u022a\u022b\7a\2\2\u022b"+ - "\u022c\7|\2\2\u022c\u022d\7r\2\2\u022dq\3\2\2\2\u022e\u022f\7a\2\2\u022f"+ - "\u0230\7a\2\2\u0230\u0231\7o\2\2\u0231\u0232\7g\2\2\u0232\u0233\7o\2\2"+ - "\u0233s\3\2\2\2\u0234\u0235\7a\2\2\u0235\u0236\7a\2\2\u0236\u0237\7u\2"+ - "\2\u0237\u0238\7u\2\2\u0238\u0239\7c\2\2\u0239u\3\2\2\2\u023a\u023b\7"+ - "a\2\2\u023b\u023c\7a\2\2\u023c\u023d\7p\2\2\u023d\u023e\7q\2\2\u023e\u023f"+ - "\7v\2\2\u023f\u0240\7u\2\2\u0240\u0241\7u\2\2\u0241\u0242\7c\2\2\u0242"+ - "w\3\2\2\2\u0243\u0244\7k\2\2\u0244\u0245\7p\2\2\u0245\u0246\7n\2\2\u0246"+ - "\u0247\7k\2\2\u0247\u0248\7p\2\2\u0248\u0249\7g\2\2\u0249y\3\2\2\2\u024a"+ - "\u024b\7x\2\2\u024b\u024c\7q\2\2\u024c\u024d\7n\2\2\u024d\u024e\7c\2\2"+ - "\u024e\u024f\7v\2\2\u024f\u0250\7k\2\2\u0250\u0251\7n\2\2\u0251\u0252"+ - "\7g\2\2\u0252{\3\2\2\2\u0253\u0254\7a\2\2\u0254\u0255\7a\2\2\u0255\u0256"+ - "\7p\2\2\u0256\u0257\7q\2\2\u0257\u0258\7v\2\2\u0258\u0259\7x\2\2\u0259"+ - "\u025a\7q\2\2\u025a\u025b\7n\2\2\u025b\u025c\7c\2\2\u025c\u025d\7v\2\2"+ - "\u025d\u025e\7k\2\2\u025e\u025f\7n\2\2\u025f\u0260\7g\2\2\u0260}\3\2\2"+ - "\2\u0261\u0262\7k\2\2\u0262\u0263\7p\2\2\u0263\u0264\7v\2\2\u0264\u0265"+ - "\7g\2\2\u0265\u0266\7t\2\2\u0266\u0267\7t\2\2\u0267\u0268\7w\2\2\u0268"+ - "\u0269\7r\2\2\u0269\u026a\7v\2\2\u026a\177\3\2\2\2\u026b\u026c\7e\2\2"+ - "\u026c\u026d\7c\2\2\u026d\u026e\7n\2\2\u026e\u026f\7n\2\2\u026f\u0270"+ - "\7k\2\2\u0270\u0271\7p\2\2\u0271\u0272\7i\2\2\u0272\u0081\3\2\2\2\u0273"+ - "\u0274\7a\2\2\u0274\u0275\7a\2\2\u0275\u0276\7u\2\2\u0276\u0277\7v\2\2"+ - "\u0277\u0278\7c\2\2\u0278\u0279\7e\2\2\u0279\u027a\7m\2\2\u027a\u027b"+ - "\7e\2\2\u027b\u027c\7c\2\2\u027c\u027d\7n\2\2\u027d\u0288\7n\2\2\u027e"+ - "\u027f\7a\2\2\u027f\u0280\7a\2\2\u0280\u0281\7r\2\2\u0281\u0282\7j\2\2"+ - "\u0282\u0283\7k\2\2\u0283\u0284\7e\2\2\u0284\u0285\7c\2\2\u0285\u0286"+ - "\7n\2\2\u0286\u0288\7n\2\2\u0287\u0273\3\2\2\2\u0287\u027e\3\2\2\2\u0288"+ - "\u0083\3\2\2\2\u0289\u028a\7k\2\2\u028a\u028b\7h\2\2\u028b\u0085\3\2\2"+ - "\2\u028c\u028d\7g\2\2\u028d\u028e\7n\2\2\u028e\u028f\7u\2\2\u028f\u0290"+ - "\7g\2\2\u0290\u0087\3\2\2\2\u0291\u0292\7y\2\2\u0292\u0293\7j\2\2\u0293"+ - "\u0294\7k\2\2\u0294\u0295\7n\2\2\u0295\u0296\7g\2\2\u0296\u0089\3\2\2"+ - "\2\u0297\u0298\7f\2\2\u0298\u0299\7q\2\2\u0299\u008b\3\2\2\2\u029a\u029b"+ - "\7h\2\2\u029b\u029c\7q\2\2\u029c\u029d\7t\2\2\u029d\u008d\3\2\2\2\u029e"+ - "\u029f\7u\2\2\u029f\u02a0\7y\2\2\u02a0\u02a1\7k\2\2\u02a1\u02a2\7v\2\2"+ - "\u02a2\u02a3\7e\2\2\u02a3\u02a4\7j\2\2\u02a4\u008f\3\2\2\2\u02a5\u02a6"+ - "\7t\2\2\u02a6\u02a7\7g\2\2\u02a7\u02a8\7v\2\2\u02a8\u02a9\7w\2\2\u02a9"+ - "\u02aa\7t\2\2\u02aa\u02ab\7p\2\2\u02ab\u0091\3\2\2\2\u02ac\u02ad\7d\2"+ - "\2\u02ad\u02ae\7t\2\2\u02ae\u02af\7g\2\2\u02af\u02b0\7c\2\2\u02b0\u02b1"+ - "\7m\2\2\u02b1\u0093\3\2\2\2\u02b2\u02b3\7e\2\2\u02b3\u02b4\7q\2\2\u02b4"+ - "\u02b5\7p\2\2\u02b5\u02b6\7v\2\2\u02b6\u02b7\7k\2\2\u02b7\u02b8\7p\2\2"+ - "\u02b8\u02b9\7w\2\2\u02b9\u02ba\7g\2\2\u02ba\u0095\3\2\2\2\u02bb\u02bc"+ - "\7c\2\2\u02bc\u02bd\7u\2\2\u02bd\u02be\7o\2\2\u02be\u02bf\3\2\2\2\u02bf"+ - "\u02c0\bK\4\2\u02c0\u0097\3\2\2\2\u02c1\u02c2\7f\2\2\u02c2\u02c3\7g\2"+ - "\2\u02c3\u02c4\7h\2\2\u02c4\u02c5\7c\2\2\u02c5\u02c6\7w\2\2\u02c6\u02c7"+ - "\7n\2\2\u02c7\u02c8\7v\2\2\u02c8\u0099\3\2\2\2\u02c9\u02ca\7e\2\2\u02ca"+ - "\u02cb\7c\2\2\u02cb\u02cc\7u\2\2\u02cc\u02cd\7g\2\2\u02cd\u009b\3\2\2"+ - "\2\u02ce\u02cf\7u\2\2\u02cf\u02d0\7v\2\2\u02d0\u02d1\7t\2\2\u02d1\u02d2"+ - "\7w\2\2\u02d2\u02d3\7e\2\2\u02d3\u02d4\7v\2\2\u02d4\u009d\3\2\2\2\u02d5"+ - "\u02d6\7g\2\2\u02d6\u02d7\7p\2\2\u02d7\u02d8\7w\2\2\u02d8\u02d9\7o\2\2"+ - "\u02d9\u009f\3\2\2\2\u02da\u02db\7u\2\2\u02db\u02dc\7k\2\2\u02dc\u02dd"+ - "\7|\2\2\u02dd\u02de\7g\2\2\u02de\u02df\7q\2\2\u02df\u02e0\7h\2\2\u02e0"+ - "\u00a1\3\2\2\2\u02e1\u02e2\7v\2\2\u02e2\u02e3\7{\2\2\u02e3\u02e4\7r\2"+ - "\2\u02e4\u02e5\7g\2\2\u02e5\u02e6\7k\2\2\u02e6\u02e7\7f\2\2\u02e7\u00a3"+ - "\3\2\2\2\u02e8\u02e9\7m\2\2\u02e9\u02ea\7k\2\2\u02ea\u02eb\7e\2\2\u02eb"+ - "\u02ec\7m\2\2\u02ec\u02ed\7c\2\2\u02ed\u02ee\7u\2\2\u02ee\u02ef\7o\2\2"+ - "\u02ef\u00a5\3\2\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7g\2\2\u02f2\u02f3"+ - "\7u\2\2\u02f3\u02f4\7q\2\2\u02f4\u02f5\7w\2\2\u02f5\u02f6\7t\2\2\u02f6"+ - "\u02f7\7e\2\2\u02f7\u02f8\7g\2\2\u02f8\u00a7\3\2\2\2\u02f9\u02fa\7w\2"+ - "\2\u02fa\u02fb\7u\2\2\u02fb\u02fc\7g\2\2\u02fc\u02fd\7u\2\2\u02fd\u00a9"+ - "\3\2\2\2\u02fe\u02ff\7e\2\2\u02ff\u0300\7n\2\2\u0300\u0301\7q\2\2\u0301"+ - "\u0302\7d\2\2\u0302\u0303\7d\2\2\u0303\u0304\7g\2\2\u0304\u0305\7t\2\2"+ - "\u0305\u0306\7u\2\2\u0306\u00ab\3\2\2\2\u0307\u0308\7d\2\2\u0308\u0309"+ - "\7{\2\2\u0309\u030a\7v\2\2\u030a\u030b\7g\2\2\u030b\u030c\7u\2\2\u030c"+ - "\u00ad\3\2\2\2\u030d\u030e\7e\2\2\u030e\u030f\7{\2\2\u030f\u0310\7e\2"+ - "\2\u0310\u0311\7n\2\2\u0311\u0312\7g\2\2\u0312\u0313\7u\2\2\u0313\u00af"+ - "\3\2\2\2\u0314\u0315\7#\2\2\u0315\u00b1\3\2\2\2\u0316\u0317\7u\2\2\u0317"+ - "\u0318\7k\2\2\u0318\u0319\7i\2\2\u0319\u031a\7p\2\2\u031a\u031b\7g\2\2"+ - "\u031b\u0325\7f\2\2\u031c\u031d\7w\2\2\u031d\u031e\7p\2\2\u031e\u031f"+ - "\7u\2\2\u031f\u0320\7k\2\2\u0320\u0321\7i\2\2\u0321\u0322\7p\2\2\u0322"+ - "\u0323\7g\2\2\u0323\u0325\7f\2\2\u0324\u0316\3\2\2\2\u0324\u031c\3\2\2"+ - "\2\u0325\u00b3\3\2\2\2\u0326\u0327\7d\2\2\u0327\u0328\7{\2\2\u0328\u0329"+ - "\7v\2\2\u0329\u034c\7g\2\2\u032a\u032b\7y\2\2\u032b\u032c\7q\2\2\u032c"+ - "\u032d\7t\2\2\u032d\u034c\7f\2\2\u032e\u032f\7f\2\2\u032f\u0330\7y\2\2"+ - "\u0330\u0331\7q\2\2\u0331\u0332\7t\2\2\u0332\u034c\7f\2\2\u0333\u0334"+ - "\7d\2\2\u0334\u0335\7q\2\2\u0335\u0336\7q\2\2\u0336\u034c\7n\2\2\u0337"+ - "\u0338\7e\2\2\u0338\u0339\7j\2\2\u0339\u033a\7c\2\2\u033a\u034c\7t\2\2"+ - "\u033b\u033c\7u\2\2\u033c\u033d\7j\2\2\u033d\u033e\7q\2\2\u033e\u033f"+ - "\7t\2\2\u033f\u034c\7v\2\2\u0340\u0341\7k\2\2\u0341\u0342\7p\2\2\u0342"+ - "\u034c\7v\2\2\u0343\u0344\7n\2\2\u0344\u0345\7q\2\2\u0345\u0346\7p\2\2"+ - "\u0346\u034c\7i\2\2\u0347\u0348\7x\2\2\u0348\u0349\7q\2\2\u0349\u034a"+ - "\7k\2\2\u034a\u034c\7f\2\2\u034b\u0326\3\2\2\2\u034b\u032a\3\2\2\2\u034b"+ - "\u032e\3\2\2\2\u034b\u0333\3\2\2\2\u034b\u0337\3\2\2\2\u034b\u033b\3\2"+ - "\2\2\u034b\u0340\3\2\2\2\u034b\u0343\3\2\2\2\u034b\u0347\3\2\2\2\u034c"+ - "\u00b5\3\2\2\2\u034d\u034e\7v\2\2\u034e\u034f\7t\2\2\u034f\u0350\7w\2"+ - "\2\u0350\u0357\7g\2\2\u0351\u0352\7h\2\2\u0352\u0353\7c\2\2\u0353\u0354"+ - "\7n\2\2\u0354\u0355\7u\2\2\u0355\u0357\7g\2\2\u0356\u034d\3\2\2\2\u0356"+ - "\u0351\3\2\2\2\u0357\u00b7\3\2\2\2\u0358\u0359\7}\2\2\u0359\u035a\7}\2"+ - "\2\u035a\u035e\3\2\2\2\u035b\u035d\13\2\2\2\u035c\u035b\3\2\2\2\u035d"+ - "\u0360\3\2\2\2\u035e\u035f\3\2\2\2\u035e\u035c\3\2\2\2\u035f\u0361\3\2"+ - "\2\2\u0360\u035e\3\2\2\2\u0361\u0362\7\177\2\2\u0362\u0363\7\177\2\2\u0363"+ - "\u00b9\3\2\2\2\u0364\u036a\7$\2\2\u0365\u0366\7^\2\2\u0366\u0369\7$\2"+ - "\2\u0367\u0369\n\2\2\2\u0368\u0365\3\2\2\2\u0368\u0367\3\2\2\2\u0369\u036c"+ - "\3\2\2\2\u036a\u0368\3\2\2\2\u036a\u036b\3\2\2\2\u036b\u036d\3\2\2\2\u036c"+ - "\u036a\3\2\2\2\u036d\u036f\7$\2\2\u036e\u0370\t\3\2\2\u036f\u036e\3\2"+ - "\2\2\u036f\u0370\3\2\2\2\u0370\u0375\3\2\2\2\u0371\u0373\t\4\2\2\u0372"+ - "\u0374\t\5\2\2\u0373\u0372\3\2\2\2\u0373\u0374\3\2\2\2\u0374\u0376\3\2"+ - "\2\2\u0375\u0371\3\2\2\2\u0375\u0376\3\2\2\2\u0376\u0378\3\2\2\2\u0377"+ - "\u0379\t\3\2\2\u0378\u0377\3\2\2\2\u0378\u0379\3\2\2\2\u0379\u037a\3\2"+ - "\2\2\u037a\u037b\b]\5\2\u037b\u00bb\3\2\2\2\u037c\u0380\7)\2\2\u037d\u037e"+ - "\7^\2\2\u037e\u0381\t\6\2\2\u037f\u0381\n\7\2\2\u0380\u037d\3\2\2\2\u0380"+ - "\u037f\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0383\7)\2\2\u0383\u00bd\3\2"+ - "\2\2\u0384\u0387\5\u00c0`\2\u0385\u0387\5\u00c8d\2\u0386\u0384\3\2\2\2"+ - "\u0386\u0385\3\2\2\2\u0387\u00bf\3\2\2\2\u0388\u038c\5\u00c2a\2\u0389"+ - "\u038c\5\u00c4b\2\u038a\u038c\5\u00c6c\2\u038b\u0388\3\2\2\2\u038b\u0389"+ - "\3\2\2\2\u038b\u038a\3\2\2\2\u038c\u00c1\3\2\2\2\u038d\u0393\7\'\2\2\u038e"+ - "\u038f\7\62\2\2\u038f\u0393\7d\2\2\u0390\u0391\7\62\2\2\u0391\u0393\7"+ - "D\2\2\u0392\u038d\3\2\2\2\u0392\u038e\3\2\2\2\u0392\u0390\3\2\2\2\u0393"+ - "\u0397\3\2\2\2\u0394\u0396\5\u00d0h\2\u0395\u0394\3\2\2\2\u0396\u0399"+ - "\3\2\2\2\u0397\u0395\3\2\2\2\u0397\u0398\3\2\2\2\u0398\u039a\3\2\2\2\u0399"+ - "\u0397\3\2\2\2\u039a\u039c\7\60\2\2\u039b\u039d\5\u00d0h\2\u039c\u039b"+ - "\3\2\2\2\u039d\u039e\3\2\2\2\u039e\u039c\3\2\2\2\u039e\u039f\3\2\2\2\u039f"+ - "\u00c3\3\2\2\2\u03a0\u03a2\5\u00d2i\2\u03a1\u03a0\3\2\2\2\u03a2\u03a5"+ + "\2\3\u0118\3\2\2\2\3\u011a\3\2\2\2\3\u011c\3\2\2\2\3\u0124\3\2\2\2\3\u0126"+ + "\3\2\2\2\3\u0128\3\2\2\2\3\u012a\3\2\2\2\3\u0130\3\2\2\2\3\u0132\3\2\2"+ + "\2\3\u0134\3\2\2\2\4\u0136\3\2\2\2\6\u0139\3\2\2\2\b\u013b\3\2\2\2\n\u013d"+ + "\3\2\2\2\f\u013f\3\2\2\2\16\u0141\3\2\2\2\20\u0143\3\2\2\2\22\u0145\3"+ + "\2\2\2\24\u0147\3\2\2\2\26\u0149\3\2\2\2\30\u014c\3\2\2\2\32\u014e\3\2"+ + "\2\2\34\u0150\3\2\2\2\36\u0153\3\2\2\2 \u0155\3\2\2\2\"\u0157\3\2\2\2"+ + "$\u0159\3\2\2\2&\u015b\3\2\2\2(\u015d\3\2\2\2*\u0160\3\2\2\2,\u0163\3"+ + "\2\2\2.\u0165\3\2\2\2\60\u0167\3\2\2\2\62\u0169\3\2\2\2\64\u016b\3\2\2"+ + "\2\66\u016e\3\2\2\28\u0171\3\2\2\2:\u0174\3\2\2\2<\u0177\3\2\2\2>\u0179"+ + "\3\2\2\2@\u017c\3\2\2\2B\u017f\3\2\2\2D\u0181\3\2\2\2F\u0184\3\2\2\2H"+ + "\u0187\3\2\2\2J\u019f\3\2\2\2L\u01a1\3\2\2\2N\u01aa\3\2\2\2P\u01b2\3\2"+ + "\2\2R\u01ba\3\2\2\2T\u01c2\3\2\2\2V\u01c5\3\2\2\2X\u01cc\3\2\2\2Z\u01d1"+ + "\3\2\2\2\\\u01d5\3\2\2\2^\u01de\3\2\2\2`\u01e7\3\2\2\2b\u01f0\3\2\2\2"+ + "d\u01f6\3\2\2\2f\u0201\3\2\2\2h\u020e\3\2\2\2j\u0215\3\2\2\2l\u021c\3"+ + "\2\2\2n\u0222\3\2\2\2p\u022b\3\2\2\2r\u0235\3\2\2\2t\u023a\3\2\2\2v\u0240"+ + "\3\2\2\2x\u0246\3\2\2\2z\u024f\3\2\2\2|\u0256\3\2\2\2~\u025f\3\2\2\2\u0080"+ + "\u026d\3\2\2\2\u0082\u0277\3\2\2\2\u0084\u0293\3\2\2\2\u0086\u0295\3\2"+ + "\2\2\u0088\u0298\3\2\2\2\u008a\u029d\3\2\2\2\u008c\u02a3\3\2\2\2\u008e"+ + "\u02a6\3\2\2\2\u0090\u02aa\3\2\2\2\u0092\u02b1\3\2\2\2\u0094\u02b8\3\2"+ + "\2\2\u0096\u02be\3\2\2\2\u0098\u02c7\3\2\2\2\u009a\u02cd\3\2\2\2\u009c"+ + "\u02d5\3\2\2\2\u009e\u02da\3\2\2\2\u00a0\u02e1\3\2\2\2\u00a2\u02e6\3\2"+ + "\2\2\u00a4\u02ed\3\2\2\2\u00a6\u02f4\3\2\2\2\u00a8\u02fc\3\2\2\2\u00aa"+ + "\u0305\3\2\2\2\u00ac\u030a\3\2\2\2\u00ae\u0313\3\2\2\2\u00b0\u0319\3\2"+ + "\2\2\u00b2\u0320\3\2\2\2\u00b4\u0330\3\2\2\2\u00b6\u0357\3\2\2\2\u00b8"+ + "\u0362\3\2\2\2\u00ba\u0364\3\2\2\2\u00bc\u0370\3\2\2\2\u00be\u0388\3\2"+ + "\2\2\u00c0\u0392\3\2\2\2\u00c2\u0397\3\2\2\2\u00c4\u039e\3\2\2\2\u00c6"+ + "\u03af\3\2\2\2\u00c8\u03bd\3\2\2\2\u00ca\u03ce\3\2\2\2\u00cc\u03e2\3\2"+ + "\2\2\u00ce\u03e5\3\2\2\2\u00d0\u03ee\3\2\2\2\u00d2\u03f5\3\2\2\2\u00d4"+ + "\u03f7\3\2\2\2\u00d6\u03f9\3\2\2\2\u00d8\u03fb\3\2\2\2\u00da\u0404\3\2"+ + "\2\2\u00dc\u0406\3\2\2\2\u00de\u0409\3\2\2\2\u00e0\u040f\3\2\2\2\u00e2"+ + "\u041a\3\2\2\2\u00e4\u0428\3\2\2\2\u00e6\u050c\3\2\2\2\u00e8\u050e\3\2"+ + "\2\2\u00ea\u0510\3\2\2\2\u00ec\u0512\3\2\2\2\u00ee\u0514\3\2\2\2\u00f0"+ + "\u0516\3\2\2\2\u00f2\u0518\3\2\2\2\u00f4\u051a\3\2\2\2\u00f6\u051c\3\2"+ + "\2\2\u00f8\u051e\3\2\2\2\u00fa\u0521\3\2\2\2\u00fc\u0524\3\2\2\2\u00fe"+ + "\u0526\3\2\2\2\u0100\u0528\3\2\2\2\u0102\u052a\3\2\2\2\u0104\u052c\3\2"+ + "\2\2\u0106\u052e\3\2\2\2\u0108\u0530\3\2\2\2\u010a\u0533\3\2\2\2\u010c"+ + "\u0538\3\2\2\2\u010e\u053d\3\2\2\2\u0110\u053f\3\2\2\2\u0112\u054f\3\2"+ + "\2\2\u0114\u0558\3\2\2\2\u0116\u0568\3\2\2\2\u0118\u056a\3\2\2\2\u011a"+ + "\u0571\3\2\2\2\u011c\u0575\3\2\2\2\u011e\u057b\3\2\2\2\u0120\u057d\3\2"+ + "\2\2\u0122\u057f\3\2\2\2\u0124\u0581\3\2\2\2\u0126\u0589\3\2\2\2\u0128"+ + "\u058f\3\2\2\2\u012a\u0596\3\2\2\2\u012c\u059d\3\2\2\2\u012e\u059f\3\2"+ + "\2\2\u0130\u05a2\3\2\2\2\u0132\u05a8\3\2\2\2\u0134\u05b3\3\2\2\2\u0136"+ + "\u0137\7}\2\2\u0137\u0138\b\2\2\2\u0138\5\3\2\2\2\u0139\u013a\7\177\2"+ + "\2\u013a\7\3\2\2\2\u013b\u013c\7]\2\2\u013c\t\3\2\2\2\u013d\u013e\7_\2"+ + "\2\u013e\13\3\2\2\2\u013f\u0140\7*\2\2\u0140\r\3\2\2\2\u0141\u0142\7+"+ + "\2\2\u0142\17\3\2\2\2\u0143\u0144\7=\2\2\u0144\21\3\2\2\2\u0145\u0146"+ + "\7<\2\2\u0146\23\3\2\2\2\u0147\u0148\7.\2\2\u0148\25\3\2\2\2\u0149\u014a"+ + "\7\60\2\2\u014a\u014b\7\60\2\2\u014b\27\3\2\2\2\u014c\u014d\7A\2\2\u014d"+ + "\31\3\2\2\2\u014e\u014f\7\60\2\2\u014f\33\3\2\2\2\u0150\u0151\7/\2\2\u0151"+ + "\u0152\7@\2\2\u0152\35\3\2\2\2\u0153\u0154\7-\2\2\u0154\37\3\2\2\2\u0155"+ + "\u0156\7/\2\2\u0156!\3\2\2\2\u0157\u0158\7,\2\2\u0158#\3\2\2\2\u0159\u015a"+ + "\7\61\2\2\u015a%\3\2\2\2\u015b\u015c\7\'\2\2\u015c\'\3\2\2\2\u015d\u015e"+ + "\7-\2\2\u015e\u015f\7-\2\2\u015f)\3\2\2\2\u0160\u0161\7/\2\2\u0161\u0162"+ + "\7/\2\2\u0162+\3\2\2\2\u0163\u0164\7(\2\2\u0164-\3\2\2\2\u0165\u0166\7"+ + "\u0080\2\2\u0166/\3\2\2\2\u0167\u0168\7`\2\2\u0168\61\3\2\2\2\u0169\u016a"+ + "\7~\2\2\u016a\63\3\2\2\2\u016b\u016c\7>\2\2\u016c\u016d\7>\2\2\u016d\65"+ + "\3\2\2\2\u016e\u016f\7@\2\2\u016f\u0170\7@\2\2\u0170\67\3\2\2\2\u0171"+ + "\u0172\7?\2\2\u0172\u0173\7?\2\2\u01739\3\2\2\2\u0174\u0175\7#\2\2\u0175"+ + "\u0176\7?\2\2\u0176;\3\2\2\2\u0177\u0178\7>\2\2\u0178=\3\2\2\2\u0179\u017a"+ + "\7>\2\2\u017a\u017b\7?\2\2\u017b?\3\2\2\2\u017c\u017d\7@\2\2\u017d\u017e"+ + "\7?\2\2\u017eA\3\2\2\2\u017f\u0180\7@\2\2\u0180C\3\2\2\2\u0181\u0182\7"+ + "(\2\2\u0182\u0183\7(\2\2\u0183E\3\2\2\2\u0184\u0185\7~\2\2\u0185\u0186"+ + "\7~\2\2\u0186G\3\2\2\2\u0187\u0188\7?\2\2\u0188I\3\2\2\2\u0189\u018a\7"+ + "-\2\2\u018a\u01a0\7?\2\2\u018b\u018c\7/\2\2\u018c\u01a0\7?\2\2\u018d\u018e"+ + "\7,\2\2\u018e\u01a0\7?\2\2\u018f\u0190\7\61\2\2\u0190\u01a0\7?\2\2\u0191"+ + "\u0192\7\'\2\2\u0192\u01a0\7?\2\2\u0193\u0194\7>\2\2\u0194\u0195\7>\2"+ + "\2\u0195\u01a0\7?\2\2\u0196\u0197\7@\2\2\u0197\u0198\7@\2\2\u0198\u01a0"+ + "\7?\2\2\u0199\u019a\7(\2\2\u019a\u01a0\7?\2\2\u019b\u019c\7~\2\2\u019c"+ + "\u01a0\7?\2\2\u019d\u019e\7`\2\2\u019e\u01a0\7?\2\2\u019f\u0189\3\2\2"+ + "\2\u019f\u018b\3\2\2\2\u019f\u018d\3\2\2\2\u019f\u018f\3\2\2\2\u019f\u0191"+ + "\3\2\2\2\u019f\u0193\3\2\2\2\u019f\u0196\3\2\2\2\u019f\u0199\3\2\2\2\u019f"+ + "\u019b\3\2\2\2\u019f\u019d\3\2\2\2\u01a0K\3\2\2\2\u01a1\u01a2\7k\2\2\u01a2"+ + "\u01a3\7o\2\2\u01a3\u01a4\7r\2\2\u01a4\u01a5\7q\2\2\u01a5\u01a6\7t\2\2"+ + "\u01a6\u01a7\7v\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\b&\3\2\u01a9M\3\2"+ + "\2\2\u01aa\u01ab\7v\2\2\u01ab\u01ac\7{\2\2\u01ac\u01ad\7r\2\2\u01ad\u01ae"+ + "\7g\2\2\u01ae\u01af\7f\2\2\u01af\u01b0\7g\2\2\u01b0\u01b1\7h\2\2\u01b1"+ + "O\3\2\2\2\u01b2\u01b3\7%\2\2\u01b3\u01b4\7r\2\2\u01b4\u01b5\7t\2\2\u01b5"+ + "\u01b6\7c\2\2\u01b6\u01b7\7i\2\2\u01b7\u01b8\7o\2\2\u01b8\u01b9\7c\2\2"+ + "\u01b9Q\3\2\2\2\u01ba\u01bb\7t\2\2\u01bb\u01bc\7g\2\2\u01bc\u01bd\7u\2"+ + "\2\u01bd\u01be\7g\2\2\u01be\u01bf\7t\2\2\u01bf\u01c0\7x\2\2\u01c0\u01c1"+ + "\7g\2\2\u01c1S\3\2\2\2\u01c2\u01c3\7r\2\2\u01c3\u01c4\7e\2\2\u01c4U\3"+ + "\2\2\2\u01c5\u01c6\7v\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7t\2\2\u01c8"+ + "\u01c9\7i\2\2\u01c9\u01ca\7g\2\2\u01ca\u01cb\7v\2\2\u01cbW\3\2\2\2\u01cc"+ + "\u01cd\7n\2\2\u01cd\u01ce\7k\2\2\u01ce\u01cf\7p\2\2\u01cf\u01d0\7m\2\2"+ + "\u01d0Y\3\2\2\2\u01d1\u01d2\7e\2\2\u01d2\u01d3\7r\2\2\u01d3\u01d4\7w\2"+ + "\2\u01d4[\3\2\2\2\u01d5\u01d6\7e\2\2\u01d6\u01d7\7q\2\2\u01d7\u01d8\7"+ + "f\2\2\u01d8\u01d9\7g\2\2\u01d9\u01da\7a\2\2\u01da\u01db\7u\2\2\u01db\u01dc"+ + "\7g\2\2\u01dc\u01dd\7i\2\2\u01dd]\3\2\2\2\u01de\u01df\7f\2\2\u01df\u01e0"+ + "\7c\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2\7c\2\2\u01e2\u01e3\7a\2\2\u01e3"+ + "\u01e4\7u\2\2\u01e4\u01e5\7g\2\2\u01e5\u01e6\7i\2\2\u01e6_\3\2\2\2\u01e7"+ + "\u01e8\7g\2\2\u01e8\u01e9\7p\2\2\u01e9\u01ea\7e\2\2\u01ea\u01eb\7q\2\2"+ + "\u01eb\u01ec\7f\2\2\u01ec\u01ed\7k\2\2\u01ed\u01ee\7p\2\2\u01ee\u01ef"+ + "\7i\2\2\u01efa\3\2\2\2\u01f0\u01f1\7e\2\2\u01f1\u01f2\7q\2\2\u01f2\u01f3"+ + "\7p\2\2\u01f3\u01f4\7u\2\2\u01f4\u01f5\7v\2\2\u01f5c\3\2\2\2\u01f6\u01f7"+ + "\7a\2\2\u01f7\u01f8\7a\2\2\u01f8\u01f9\7p\2\2\u01f9\u01fa\7q\2\2\u01fa"+ + "\u01fb\7v\2\2\u01fb\u01fc\7e\2\2\u01fc\u01fd\7q\2\2\u01fd\u01fe\7p\2\2"+ + "\u01fe\u01ff\7u\2\2\u01ff\u0200\7v\2\2\u0200e\3\2\2\2\u0201\u0202\7a\2"+ + "\2\u0202\u0203\7a\2\2\u0203\u0204\7o\2\2\u0204\u0205\7c\2\2\u0205\u0206"+ + "\7{\2\2\u0206\u0207\7d\2\2\u0207\u0208\7g\2\2\u0208\u0209\7e\2\2\u0209"+ + "\u020a\7q\2\2\u020a\u020b\7p\2\2\u020b\u020c\7u\2\2\u020c\u020d\7v\2\2"+ + "\u020dg\3\2\2\2\u020e\u020f\7g\2\2\u020f\u0210\7z\2\2\u0210\u0211\7v\2"+ + "\2\u0211\u0212\7g\2\2\u0212\u0213\7t\2\2\u0213\u0214\7p\2\2\u0214i\3\2"+ + "\2\2\u0215\u0216\7g\2\2\u0216\u0217\7z\2\2\u0217\u0218\7r\2\2\u0218\u0219"+ + "\7q\2\2\u0219\u021a\7t\2\2\u021a\u021b\7v\2\2\u021bk\3\2\2\2\u021c\u021d"+ + "\7c\2\2\u021d\u021e\7n\2\2\u021e\u021f\7k\2\2\u021f\u0220\7i\2\2\u0220"+ + "\u0221\7p\2\2\u0221m\3\2\2\2\u0222\u0223\7t\2\2\u0223\u0224\7g\2\2\u0224"+ + "\u0225\7i\2\2\u0225\u0226\7k\2\2\u0226\u0227\7u\2\2\u0227\u0228\7v\2\2"+ + "\u0228\u0229\7g\2\2\u0229\u022a\7t\2\2\u022ao\3\2\2\2\u022b\u022c\7a\2"+ + "\2\u022c\u022d\7a\2\2\u022d\u022e\7c\2\2\u022e\u022f\7f\2\2\u022f\u0230"+ + "\7f\2\2\u0230\u0231\7t\2\2\u0231\u0232\7g\2\2\u0232\u0233\7u\2\2\u0233"+ + "\u0234\7u\2\2\u0234q\3\2\2\2\u0235\u0236\7a\2\2\u0236\u0237\7a\2\2\u0237"+ + "\u0238\7|\2\2\u0238\u0239\7r\2\2\u0239s\3\2\2\2\u023a\u023b\7a\2\2\u023b"+ + "\u023c\7a\2\2\u023c\u023d\7o\2\2\u023d\u023e\7g\2\2\u023e\u023f\7o\2\2"+ + "\u023fu\3\2\2\2\u0240\u0241\7a\2\2\u0241\u0242\7a\2\2\u0242\u0243\7u\2"+ + "\2\u0243\u0244\7u\2\2\u0244\u0245\7c\2\2\u0245w\3\2\2\2\u0246\u0247\7"+ + "a\2\2\u0247\u0248\7a\2\2\u0248\u0249\7p\2\2\u0249\u024a\7q\2\2\u024a\u024b"+ + "\7v\2\2\u024b\u024c\7u\2\2\u024c\u024d\7u\2\2\u024d\u024e\7c\2\2\u024e"+ + "y\3\2\2\2\u024f\u0250\7k\2\2\u0250\u0251\7p\2\2\u0251\u0252\7n\2\2\u0252"+ + "\u0253\7k\2\2\u0253\u0254\7p\2\2\u0254\u0255\7g\2\2\u0255{\3\2\2\2\u0256"+ + "\u0257\7x\2\2\u0257\u0258\7q\2\2\u0258\u0259\7n\2\2\u0259\u025a\7c\2\2"+ + "\u025a\u025b\7v\2\2\u025b\u025c\7k\2\2\u025c\u025d\7n\2\2\u025d\u025e"+ + "\7g\2\2\u025e}\3\2\2\2\u025f\u0260\7a\2\2\u0260\u0261\7a\2\2\u0261\u0262"+ + "\7p\2\2\u0262\u0263\7q\2\2\u0263\u0264\7v\2\2\u0264\u0265\7x\2\2\u0265"+ + "\u0266\7q\2\2\u0266\u0267\7n\2\2\u0267\u0268\7c\2\2\u0268\u0269\7v\2\2"+ + "\u0269\u026a\7k\2\2\u026a\u026b\7n\2\2\u026b\u026c\7g\2\2\u026c\177\3"+ + "\2\2\2\u026d\u026e\7k\2\2\u026e\u026f\7p\2\2\u026f\u0270\7v\2\2\u0270"+ + "\u0271\7g\2\2\u0271\u0272\7t\2\2\u0272\u0273\7t\2\2\u0273\u0274\7w\2\2"+ + "\u0274\u0275\7r\2\2\u0275\u0276\7v\2\2\u0276\u0081\3\2\2\2\u0277\u0278"+ + "\7e\2\2\u0278\u0279\7c\2\2\u0279\u027a\7n\2\2\u027a\u027b\7n\2\2\u027b"+ + "\u027c\7k\2\2\u027c\u027d\7p\2\2\u027d\u027e\7i\2\2\u027e\u0083\3\2\2"+ + "\2\u027f\u0280\7a\2\2\u0280\u0281\7a\2\2\u0281\u0282\7u\2\2\u0282\u0283"+ + "\7v\2\2\u0283\u0284\7c\2\2\u0284\u0285\7e\2\2\u0285\u0286\7m\2\2\u0286"+ + "\u0287\7e\2\2\u0287\u0288\7c\2\2\u0288\u0289\7n\2\2\u0289\u0294\7n\2\2"+ + "\u028a\u028b\7a\2\2\u028b\u028c\7a\2\2\u028c\u028d\7r\2\2\u028d\u028e"+ + "\7j\2\2\u028e\u028f\7k\2\2\u028f\u0290\7e\2\2\u0290\u0291\7c\2\2\u0291"+ + "\u0292\7n\2\2\u0292\u0294\7n\2\2\u0293\u027f\3\2\2\2\u0293\u028a\3\2\2"+ + "\2\u0294\u0085\3\2\2\2\u0295\u0296\7k\2\2\u0296\u0297\7h\2\2\u0297\u0087"+ + "\3\2\2\2\u0298\u0299\7g\2\2\u0299\u029a\7n\2\2\u029a\u029b\7u\2\2\u029b"+ + "\u029c\7g\2\2\u029c\u0089\3\2\2\2\u029d\u029e\7y\2\2\u029e\u029f\7j\2"+ + "\2\u029f\u02a0\7k\2\2\u02a0\u02a1\7n\2\2\u02a1\u02a2\7g\2\2\u02a2\u008b"+ + "\3\2\2\2\u02a3\u02a4\7f\2\2\u02a4\u02a5\7q\2\2\u02a5\u008d\3\2\2\2\u02a6"+ + "\u02a7\7h\2\2\u02a7\u02a8\7q\2\2\u02a8\u02a9\7t\2\2\u02a9\u008f\3\2\2"+ + "\2\u02aa\u02ab\7u\2\2\u02ab\u02ac\7y\2\2\u02ac\u02ad\7k\2\2\u02ad\u02ae"+ + "\7v\2\2\u02ae\u02af\7e\2\2\u02af\u02b0\7j\2\2\u02b0\u0091\3\2\2\2\u02b1"+ + "\u02b2\7t\2\2\u02b2\u02b3\7g\2\2\u02b3\u02b4\7v\2\2\u02b4\u02b5\7w\2\2"+ + "\u02b5\u02b6\7t\2\2\u02b6\u02b7\7p\2\2\u02b7\u0093\3\2\2\2\u02b8\u02b9"+ + "\7d\2\2\u02b9\u02ba\7t\2\2\u02ba\u02bb\7g\2\2\u02bb\u02bc\7c\2\2\u02bc"+ + "\u02bd\7m\2\2\u02bd\u0095\3\2\2\2\u02be\u02bf\7e\2\2\u02bf\u02c0\7q\2"+ + "\2\u02c0\u02c1\7p\2\2\u02c1\u02c2\7v\2\2\u02c2\u02c3\7k\2\2\u02c3\u02c4"+ + "\7p\2\2\u02c4\u02c5\7w\2\2\u02c5\u02c6\7g\2\2\u02c6\u0097\3\2\2\2\u02c7"+ + "\u02c8\7c\2\2\u02c8\u02c9\7u\2\2\u02c9\u02ca\7o\2\2\u02ca\u02cb\3\2\2"+ + "\2\u02cb\u02cc\bL\4\2\u02cc\u0099\3\2\2\2\u02cd\u02ce\7f\2\2\u02ce\u02cf"+ + "\7g\2\2\u02cf\u02d0\7h\2\2\u02d0\u02d1\7c\2\2\u02d1\u02d2\7w\2\2\u02d2"+ + "\u02d3\7n\2\2\u02d3\u02d4\7v\2\2\u02d4\u009b\3\2\2\2\u02d5\u02d6\7e\2"+ + "\2\u02d6\u02d7\7c\2\2\u02d7\u02d8\7u\2\2\u02d8\u02d9\7g\2\2\u02d9\u009d"+ + "\3\2\2\2\u02da\u02db\7u\2\2\u02db\u02dc\7v\2\2\u02dc\u02dd\7t\2\2\u02dd"+ + "\u02de\7w\2\2\u02de\u02df\7e\2\2\u02df\u02e0\7v\2\2\u02e0\u009f\3\2\2"+ + "\2\u02e1\u02e2\7g\2\2\u02e2\u02e3\7p\2\2\u02e3\u02e4\7w\2\2\u02e4\u02e5"+ + "\7o\2\2\u02e5\u00a1\3\2\2\2\u02e6\u02e7\7u\2\2\u02e7\u02e8\7k\2\2\u02e8"+ + "\u02e9\7|\2\2\u02e9\u02ea\7g\2\2\u02ea\u02eb\7q\2\2\u02eb\u02ec\7h\2\2"+ + "\u02ec\u00a3\3\2\2\2\u02ed\u02ee\7v\2\2\u02ee\u02ef\7{\2\2\u02ef\u02f0"+ + "\7r\2\2\u02f0\u02f1\7g\2\2\u02f1\u02f2\7k\2\2\u02f2\u02f3\7f\2\2\u02f3"+ + "\u00a5\3\2\2\2\u02f4\u02f5\7m\2\2\u02f5\u02f6\7k\2\2\u02f6\u02f7\7e\2"+ + "\2\u02f7\u02f8\7m\2\2\u02f8\u02f9\7c\2\2\u02f9\u02fa\7u\2\2\u02fa\u02fb"+ + "\7o\2\2\u02fb\u00a7\3\2\2\2\u02fc\u02fd\7t\2\2\u02fd\u02fe\7g\2\2\u02fe"+ + "\u02ff\7u\2\2\u02ff\u0300\7q\2\2\u0300\u0301\7w\2\2\u0301\u0302\7t\2\2"+ + "\u0302\u0303\7e\2\2\u0303\u0304\7g\2\2\u0304\u00a9\3\2\2\2\u0305\u0306"+ + "\7w\2\2\u0306\u0307\7u\2\2\u0307\u0308\7g\2\2\u0308\u0309\7u\2\2\u0309"+ + "\u00ab\3\2\2\2\u030a\u030b\7e\2\2\u030b\u030c\7n\2\2\u030c\u030d\7q\2"+ + "\2\u030d\u030e\7d\2\2\u030e\u030f\7d\2\2\u030f\u0310\7g\2\2\u0310\u0311"+ + "\7t\2\2\u0311\u0312\7u\2\2\u0312\u00ad\3\2\2\2\u0313\u0314\7d\2\2\u0314"+ + "\u0315\7{\2\2\u0315\u0316\7v\2\2\u0316\u0317\7g\2\2\u0317\u0318\7u\2\2"+ + "\u0318\u00af\3\2\2\2\u0319\u031a\7e\2\2\u031a\u031b\7{\2\2\u031b\u031c"+ + "\7e\2\2\u031c\u031d\7n\2\2\u031d\u031e\7g\2\2\u031e\u031f\7u\2\2\u031f"+ + "\u00b1\3\2\2\2\u0320\u0321\7#\2\2\u0321\u00b3\3\2\2\2\u0322\u0323\7u\2"+ + "\2\u0323\u0324\7k\2\2\u0324\u0325\7i\2\2\u0325\u0326\7p\2\2\u0326\u0327"+ + "\7g\2\2\u0327\u0331\7f\2\2\u0328\u0329\7w\2\2\u0329\u032a\7p\2\2\u032a"+ + "\u032b\7u\2\2\u032b\u032c\7k\2\2\u032c\u032d\7i\2\2\u032d\u032e\7p\2\2"+ + "\u032e\u032f\7g\2\2\u032f\u0331\7f\2\2\u0330\u0322\3\2\2\2\u0330\u0328"+ + "\3\2\2\2\u0331\u00b5\3\2\2\2\u0332\u0333\7d\2\2\u0333\u0334\7{\2\2\u0334"+ + "\u0335\7v\2\2\u0335\u0358\7g\2\2\u0336\u0337\7y\2\2\u0337\u0338\7q\2\2"+ + "\u0338\u0339\7t\2\2\u0339\u0358\7f\2\2\u033a\u033b\7f\2\2\u033b\u033c"+ + "\7y\2\2\u033c\u033d\7q\2\2\u033d\u033e\7t\2\2\u033e\u0358\7f\2\2\u033f"+ + "\u0340\7d\2\2\u0340\u0341\7q\2\2\u0341\u0342\7q\2\2\u0342\u0358\7n\2\2"+ + "\u0343\u0344\7e\2\2\u0344\u0345\7j\2\2\u0345\u0346\7c\2\2\u0346\u0358"+ + "\7t\2\2\u0347\u0348\7u\2\2\u0348\u0349\7j\2\2\u0349\u034a\7q\2\2\u034a"+ + "\u034b\7t\2\2\u034b\u0358\7v\2\2\u034c\u034d\7k\2\2\u034d\u034e\7p\2\2"+ + "\u034e\u0358\7v\2\2\u034f\u0350\7n\2\2\u0350\u0351\7q\2\2\u0351\u0352"+ + "\7p\2\2\u0352\u0358\7i\2\2\u0353\u0354\7x\2\2\u0354\u0355\7q\2\2\u0355"+ + "\u0356\7k\2\2\u0356\u0358\7f\2\2\u0357\u0332\3\2\2\2\u0357\u0336\3\2\2"+ + "\2\u0357\u033a\3\2\2\2\u0357\u033f\3\2\2\2\u0357\u0343\3\2\2\2\u0357\u0347"+ + "\3\2\2\2\u0357\u034c\3\2\2\2\u0357\u034f\3\2\2\2\u0357\u0353\3\2\2\2\u0358"+ + "\u00b7\3\2\2\2\u0359\u035a\7v\2\2\u035a\u035b\7t\2\2\u035b\u035c\7w\2"+ + "\2\u035c\u0363\7g\2\2\u035d\u035e\7h\2\2\u035e\u035f\7c\2\2\u035f\u0360"+ + "\7n\2\2\u0360\u0361\7u\2\2\u0361\u0363\7g\2\2\u0362\u0359\3\2\2\2\u0362"+ + "\u035d\3\2\2\2\u0363\u00b9\3\2\2\2\u0364\u0365\7}\2\2\u0365\u0366\7}\2"+ + "\2\u0366\u036a\3\2\2\2\u0367\u0369\13\2\2\2\u0368\u0367\3\2\2\2\u0369"+ + "\u036c\3\2\2\2\u036a\u036b\3\2\2\2\u036a\u0368\3\2\2\2\u036b\u036d\3\2"+ + "\2\2\u036c\u036a\3\2\2\2\u036d\u036e\7\177\2\2\u036e\u036f\7\177\2\2\u036f"+ + "\u00bb\3\2\2\2\u0370\u0376\7$\2\2\u0371\u0372\7^\2\2\u0372\u0375\7$\2"+ + "\2\u0373\u0375\n\2\2\2\u0374\u0371\3\2\2\2\u0374\u0373\3\2\2\2\u0375\u0378"+ + "\3\2\2\2\u0376\u0374\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0379\3\2\2\2\u0378"+ + "\u0376\3\2\2\2\u0379\u037b\7$\2\2\u037a\u037c\t\3\2\2\u037b\u037a\3\2"+ + "\2\2\u037b\u037c\3\2\2\2\u037c\u0381\3\2\2\2\u037d\u037f\t\4\2\2\u037e"+ + "\u0380\t\5\2\2\u037f\u037e\3\2\2\2\u037f\u0380\3\2\2\2\u0380\u0382\3\2"+ + "\2\2\u0381\u037d\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u0384\3\2\2\2\u0383"+ + "\u0385\t\3\2\2\u0384\u0383\3\2\2\2\u0384\u0385\3\2\2\2\u0385\u0386\3\2"+ + "\2\2\u0386\u0387\b^\5\2\u0387\u00bd\3\2\2\2\u0388\u038c\7)\2\2\u0389\u038a"+ + "\7^\2\2\u038a\u038d\t\6\2\2\u038b\u038d\n\7\2\2\u038c\u0389\3\2\2\2\u038c"+ + "\u038b\3\2\2\2\u038d\u038e\3\2\2\2\u038e\u038f\7)\2\2\u038f\u00bf\3\2"+ + "\2\2\u0390\u0393\5\u00c2a\2\u0391\u0393\5\u00cae\2\u0392\u0390\3\2\2\2"+ + "\u0392\u0391\3\2\2\2\u0393\u00c1\3\2\2\2\u0394\u0398\5\u00c4b\2\u0395"+ + "\u0398\5\u00c6c\2\u0396\u0398\5\u00c8d\2\u0397\u0394\3\2\2\2\u0397\u0395"+ + "\3\2\2\2\u0397\u0396\3\2\2\2\u0398\u00c3\3\2\2\2\u0399\u039f\7\'\2\2\u039a"+ + "\u039b\7\62\2\2\u039b\u039f\7d\2\2\u039c\u039d\7\62\2\2\u039d\u039f\7"+ + "D\2\2\u039e\u0399\3\2\2\2\u039e\u039a\3\2\2\2\u039e\u039c\3\2\2\2\u039f"+ + "\u03a3\3\2\2\2\u03a0\u03a2\5\u00d2i\2\u03a1\u03a0\3\2\2\2\u03a2\u03a5"+ "\3\2\2\2\u03a3\u03a1\3\2\2\2\u03a3\u03a4\3\2\2\2\u03a4\u03a6\3\2\2\2\u03a5"+ "\u03a3\3\2\2\2\u03a6\u03a8\7\60\2\2\u03a7\u03a9\5\u00d2i\2\u03a8\u03a7"+ "\3\2\2\2\u03a9\u03aa\3\2\2\2\u03aa\u03a8\3\2\2\2\u03aa\u03ab\3\2\2\2\u03ab"+ - "\u00c5\3\2\2\2\u03ac\u03b2\7&\2\2\u03ad\u03ae\7\62\2\2\u03ae\u03b2\7z"+ - "\2\2\u03af\u03b0\7\62\2\2\u03b0\u03b2\7Z\2\2\u03b1\u03ac\3\2\2\2\u03b1"+ - "\u03ad\3\2\2\2\u03b1\u03af\3\2\2\2\u03b2\u03b6\3\2\2\2\u03b3\u03b5\5\u00d4"+ - "j\2\u03b4\u03b3\3\2\2\2\u03b5\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6"+ - "\u03b7\3\2\2\2\u03b7\u03b9\3\2\2\2\u03b8\u03b6\3\2\2\2\u03b9\u03bb\7\60"+ - "\2\2\u03ba\u03bc\5\u00d4j\2\u03bb\u03ba\3\2\2\2\u03bc\u03bd\3\2\2\2\u03bd"+ - "\u03bb\3\2\2\2\u03bd\u03be\3\2\2\2\u03be\u00c7\3\2\2\2\u03bf\u03c3\5\u00cc"+ - "f\2\u03c0\u03c3\5\u00ceg\2\u03c1\u03c3\5\u00cae\2\u03c2\u03bf\3\2\2\2"+ - "\u03c2\u03c0\3\2\2\2\u03c2\u03c1\3\2\2\2\u03c3\u03c7\3\2\2\2\u03c4\u03c5"+ - "\t\b\2\2\u03c5\u03c8\t\t\2\2\u03c6\u03c8\7n\2\2\u03c7\u03c4\3\2\2\2\u03c7"+ - "\u03c6\3\2\2\2\u03c7\u03c8\3\2\2\2\u03c8\u00c9\3\2\2\2\u03c9\u03ca\7\62"+ - "\2\2\u03ca\u03cc\t\n\2\2\u03cb\u03cd\5\u00d0h\2\u03cc\u03cb\3\2\2\2\u03cd"+ - "\u03ce\3\2\2\2\u03ce\u03cc\3\2\2\2\u03ce\u03cf\3\2\2\2\u03cf\u03d7\3\2"+ - "\2\2\u03d0\u03d2\7\'\2\2\u03d1\u03d3\5\u00d0h\2\u03d2\u03d1\3\2\2\2\u03d3"+ - "\u03d4\3\2\2\2\u03d4\u03d2\3\2\2\2\u03d4\u03d5\3\2\2\2\u03d5\u03d7\3\2"+ - "\2\2\u03d6\u03c9\3\2\2\2\u03d6\u03d0\3\2\2\2\u03d7\u00cb\3\2\2\2\u03d8"+ - "\u03da\5\u00d2i\2\u03d9\u03d8\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u03d9"+ - "\3\2\2\2\u03db\u03dc\3\2\2\2\u03dc\u00cd\3\2\2\2\u03dd\u03e3\7&\2\2\u03de"+ - "\u03df\7\62\2\2\u03df\u03e3\7z\2\2\u03e0\u03e1\7\62\2\2\u03e1\u03e3\7"+ - "Z\2\2\u03e2\u03dd\3\2\2\2\u03e2\u03de\3\2\2\2\u03e2\u03e0\3\2\2\2\u03e3"+ - "\u03e5\3\2\2\2\u03e4\u03e6\5\u00d4j\2\u03e5\u03e4\3\2\2\2\u03e6\u03e7"+ - "\3\2\2\2\u03e7\u03e5\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8\u00cf\3\2\2\2\u03e9"+ - "\u03ea\t\13\2\2\u03ea\u00d1\3\2\2\2\u03eb\u03ec\t\f\2\2\u03ec\u00d3\3"+ - "\2\2\2\u03ed\u03ee\t\r\2\2\u03ee\u00d5\3\2\2\2\u03ef\u03f3\5\u00d8l\2"+ - "\u03f0\u03f2\5\u00dam\2\u03f1\u03f0\3\2\2\2\u03f2\u03f5\3\2\2\2\u03f3"+ - "\u03f1\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u03f6\3\2\2\2\u03f5\u03f3\3\2"+ - "\2\2\u03f6\u03f7\bk\6\2\u03f7\u00d7\3\2\2\2\u03f8\u03f9\t\16\2\2\u03f9"+ - "\u00d9\3\2\2\2\u03fa\u03fb\t\17\2\2\u03fb\u00db\3\2\2\2\u03fc\u03fe\t"+ - "\20\2\2\u03fd\u03fc\3\2\2\2\u03fe\u03ff\3\2\2\2\u03ff\u03fd\3\2\2\2\u03ff"+ - "\u0400\3\2\2\2\u0400\u0401\3\2\2\2\u0401\u0402\bn\7\2\u0402\u00dd\3\2"+ - "\2\2\u0403\u0404\7\61\2\2\u0404\u0405\7\61\2\2\u0405\u0409\3\2\2\2\u0406"+ - "\u0408\n\21\2\2\u0407\u0406\3\2\2\2\u0408\u040b\3\2\2\2\u0409\u0407\3"+ - "\2\2\2\u0409\u040a\3\2\2\2\u040a\u040c\3\2\2\2\u040b\u0409\3\2\2\2\u040c"+ - "\u040d\bo\b\2\u040d\u00df\3\2\2\2\u040e\u040f\7\61\2\2\u040f\u0410\7,"+ - "\2\2\u0410\u0414\3\2\2\2\u0411\u0413\13\2\2\2\u0412\u0411\3\2\2\2\u0413"+ - "\u0416\3\2\2\2\u0414\u0415\3\2\2\2\u0414\u0412\3\2\2\2\u0415\u0417\3\2"+ - "\2\2\u0416\u0414\3\2\2\2\u0417\u0418\7,\2\2\u0418\u0419\7\61\2\2\u0419"+ - "\u041a\3\2\2\2\u041a\u041b\bp\b\2\u041b\u00e1\3\2\2\2\u041c\u041d\7\60"+ - "\2\2\u041d\u041e\7d\2\2\u041e\u041f\7{\2\2\u041f\u0420\7v\2\2\u0420\u0421"+ - "\7g\2\2\u0421\u00e3\3\2\2\2\u0422\u0423\7d\2\2\u0423\u0424\7t\2\2\u0424"+ - "\u0501\7m\2\2\u0425\u0426\7q\2\2\u0426\u0427\7t\2\2\u0427\u0501\7c\2\2"+ - "\u0428\u0429\7m\2\2\u0429\u042a\7k\2\2\u042a\u0501\7n\2\2\u042b\u042c"+ - "\7u\2\2\u042c\u042d\7n\2\2\u042d\u0501\7q\2\2\u042e\u042f\7p\2\2\u042f"+ - "\u0430\7q\2\2\u0430\u0501\7r\2\2\u0431\u0432\7c\2\2\u0432\u0433\7u\2\2"+ - "\u0433\u0501\7n\2\2\u0434\u0435\7r\2\2\u0435\u0436\7j\2\2\u0436\u0501"+ - "\7r\2\2\u0437\u0438\7c\2\2\u0438\u0439\7p\2\2\u0439\u0501\7e\2\2\u043a"+ - "\u043b\7d\2\2\u043b\u043c\7r\2\2\u043c\u0501\7n\2\2\u043d\u043e\7e\2\2"+ - "\u043e\u043f\7n\2\2\u043f\u0501\7e\2\2\u0440\u0441\7l\2\2\u0441\u0442"+ - "\7u\2\2\u0442\u0501\7t\2\2\u0443\u0444\7c\2\2\u0444\u0445\7p\2\2\u0445"+ - "\u0501\7f\2\2\u0446\u0447\7t\2\2\u0447\u0448\7n\2\2\u0448\u0501\7c\2\2"+ - "\u0449\u044a\7d\2\2\u044a\u044b\7k\2\2\u044b\u0501\7v\2\2\u044c\u044d"+ - "\7t\2\2\u044d\u044e\7q\2\2\u044e\u0501\7n\2\2\u044f\u0450\7r\2\2\u0450"+ - "\u0451\7n\2\2\u0451\u0501\7c\2\2\u0452\u0453\7r\2\2\u0453\u0454\7n\2\2"+ - "\u0454\u0501\7r\2\2\u0455\u0456\7d\2\2\u0456\u0457\7o\2\2\u0457\u0501"+ - "\7k\2\2\u0458\u0459\7u\2\2\u0459\u045a\7g\2\2\u045a\u0501\7e\2\2\u045b"+ - "\u045c\7t\2\2\u045c\u045d\7v\2\2\u045d\u0501\7k\2\2\u045e\u045f\7g\2\2"+ - "\u045f\u0460\7q\2\2\u0460\u0501\7t\2\2\u0461\u0462\7u\2\2\u0462\u0463"+ - "\7t\2\2\u0463\u0501\7g\2\2\u0464\u0465\7n\2\2\u0465\u0466\7u\2\2\u0466"+ - "\u0501\7t\2\2\u0467\u0468\7r\2\2\u0468\u0469\7j\2\2\u0469\u0501\7c\2\2"+ - "\u046a\u046b\7c\2\2\u046b\u046c\7n\2\2\u046c\u0501\7t\2\2\u046d\u046e"+ - "\7l\2\2\u046e\u046f\7o\2\2\u046f\u0501\7r\2\2\u0470\u0471\7d\2\2\u0471"+ - "\u0472\7x\2\2\u0472\u0501\7e\2\2\u0473\u0474\7e\2\2\u0474\u0475\7n\2\2"+ - "\u0475\u0501\7k\2\2\u0476\u0477\7t\2\2\u0477\u0478\7v\2\2\u0478\u0501"+ - "\7u\2\2\u0479\u047a\7c\2\2\u047a\u047b\7f\2\2\u047b\u0501\7e\2\2\u047c"+ - "\u047d\7t\2\2\u047d\u047e\7t\2\2\u047e\u0501\7c\2\2\u047f\u0480\7d\2\2"+ - "\u0480\u0481\7x\2\2\u0481\u0501\7u\2\2\u0482\u0483\7u\2\2\u0483\u0484"+ - "\7g\2\2\u0484\u0501\7k\2\2\u0485\u0486\7u\2\2\u0486\u0487\7c\2\2\u0487"+ - "\u0501\7z\2\2\u0488\u0489\7u\2\2\u0489\u048a\7v\2\2\u048a\u0501\7{\2\2"+ - "\u048b\u048c\7u\2\2\u048c\u048d\7v\2\2\u048d\u0501\7c\2\2\u048e\u048f"+ - "\7u\2\2\u048f\u0490\7v\2\2\u0490\u0501\7z\2\2\u0491\u0492\7f\2\2\u0492"+ - "\u0493\7g\2\2\u0493\u0501\7{\2\2\u0494\u0495\7v\2\2\u0495\u0496\7z\2\2"+ - "\u0496\u0501\7c\2\2\u0497\u0498\7z\2\2\u0498\u0499\7c\2\2\u0499\u0501"+ - "\7c\2\2\u049a\u049b\7d\2\2\u049b\u049c\7e\2\2\u049c\u0501\7e\2\2\u049d"+ - "\u049e\7c\2\2\u049e\u049f\7j\2\2\u049f\u0501\7z\2\2\u04a0\u04a1\7v\2\2"+ - "\u04a1\u04a2\7{\2\2\u04a2\u0501\7c\2\2\u04a3\u04a4\7v\2\2\u04a4\u04a5"+ - "\7z\2\2\u04a5\u0501\7u\2\2\u04a6\u04a7\7v\2\2\u04a7\u04a8\7c\2\2\u04a8"+ - "\u0501\7u\2\2\u04a9\u04aa\7u\2\2\u04aa\u04ab\7j\2\2\u04ab\u0501\7{\2\2"+ - "\u04ac\u04ad\7u\2\2\u04ad\u04ae\7j\2\2\u04ae\u0501\7z\2\2\u04af\u04b0"+ - "\7n\2\2\u04b0\u04b1\7f\2\2\u04b1\u0501\7{\2\2\u04b2\u04b3\7n\2\2\u04b3"+ - "\u04b4\7f\2\2\u04b4\u0501\7c\2\2\u04b5\u04b6\7n\2\2\u04b6\u04b7\7f\2\2"+ - "\u04b7\u0501\7z\2\2\u04b8\u04b9\7n\2\2\u04b9\u04ba\7c\2\2\u04ba\u0501"+ - "\7z\2\2\u04bb\u04bc\7v\2\2\u04bc\u04bd\7c\2\2\u04bd\u0501\7{\2\2\u04be"+ - "\u04bf\7v\2\2\u04bf\u04c0\7c\2\2\u04c0\u0501\7z\2\2\u04c1\u04c2\7d\2\2"+ - "\u04c2\u04c3\7e\2\2\u04c3\u0501\7u\2\2\u04c4\u04c5\7e\2\2\u04c5\u04c6"+ - "\7n\2\2\u04c6\u0501\7x\2\2\u04c7\u04c8\7v\2\2\u04c8\u04c9\7u\2\2\u04c9"+ - "\u0501\7z\2\2\u04ca\u04cb\7n\2\2\u04cb\u04cc\7c\2\2\u04cc\u0501\7u\2\2"+ - "\u04cd\u04ce\7e\2\2\u04ce\u04cf\7r\2\2\u04cf\u0501\7{\2\2\u04d0\u04d1"+ - "\7e\2\2\u04d1\u04d2\7o\2\2\u04d2\u0501\7r\2\2\u04d3\u04d4\7e\2\2\u04d4"+ - "\u04d5\7r\2\2\u04d5\u0501\7z\2\2\u04d6\u04d7\7f\2\2\u04d7\u04d8\7e\2\2"+ - "\u04d8\u0501\7r\2\2\u04d9\u04da\7f\2\2\u04da\u04db\7g\2\2\u04db\u0501"+ - "\7e\2\2\u04dc\u04dd\7k\2\2\u04dd\u04de\7p\2\2\u04de\u0501\7e\2\2\u04df"+ - "\u04e0\7c\2\2\u04e0\u04e1\7z\2\2\u04e1\u0501\7u\2\2\u04e2\u04e3\7d\2\2"+ - "\u04e3\u04e4\7p\2\2\u04e4\u0501\7g\2\2\u04e5\u04e6\7e\2\2\u04e6\u04e7"+ - "\7n\2\2\u04e7\u0501\7f\2\2\u04e8\u04e9\7u\2\2\u04e9\u04ea\7d\2\2\u04ea"+ - "\u0501\7e\2\2\u04eb\u04ec\7k\2\2\u04ec\u04ed\7u\2\2\u04ed\u0501\7e\2\2"+ - "\u04ee\u04ef\7k\2\2\u04ef\u04f0\7p\2\2\u04f0\u0501\7z\2\2\u04f1\u04f2"+ - "\7d\2\2\u04f2\u04f3\7g\2\2\u04f3\u0501\7s\2\2\u04f4\u04f5\7u\2\2\u04f5"+ - "\u04f6\7g\2\2\u04f6\u0501\7f\2\2\u04f7\u04f8\7f\2\2\u04f8\u04f9\7g\2\2"+ - "\u04f9\u0501\7z\2\2\u04fa\u04fb\7k\2\2\u04fb\u04fc\7p\2\2\u04fc\u0501"+ - "\7{\2\2\u04fd\u04fe\7t\2\2\u04fe\u04ff\7q\2\2\u04ff\u0501\7t\2\2\u0500"+ - "\u0422\3\2\2\2\u0500\u0425\3\2\2\2\u0500\u0428\3\2\2\2\u0500\u042b\3\2"+ - "\2\2\u0500\u042e\3\2\2\2\u0500\u0431\3\2\2\2\u0500\u0434\3\2\2\2\u0500"+ - "\u0437\3\2\2\2\u0500\u043a\3\2\2\2\u0500\u043d\3\2\2\2\u0500\u0440\3\2"+ - "\2\2\u0500\u0443\3\2\2\2\u0500\u0446\3\2\2\2\u0500\u0449\3\2\2\2\u0500"+ - "\u044c\3\2\2\2\u0500\u044f\3\2\2\2\u0500\u0452\3\2\2\2\u0500\u0455\3\2"+ - "\2\2\u0500\u0458\3\2\2\2\u0500\u045b\3\2\2\2\u0500\u045e\3\2\2\2\u0500"+ - "\u0461\3\2\2\2\u0500\u0464\3\2\2\2\u0500\u0467\3\2\2\2\u0500\u046a\3\2"+ - "\2\2\u0500\u046d\3\2\2\2\u0500\u0470\3\2\2\2\u0500\u0473\3\2\2\2\u0500"+ - "\u0476\3\2\2\2\u0500\u0479\3\2\2\2\u0500\u047c\3\2\2\2\u0500\u047f\3\2"+ - "\2\2\u0500\u0482\3\2\2\2\u0500\u0485\3\2\2\2\u0500\u0488\3\2\2\2\u0500"+ - "\u048b\3\2\2\2\u0500\u048e\3\2\2\2\u0500\u0491\3\2\2\2\u0500\u0494\3\2"+ - "\2\2\u0500\u0497\3\2\2\2\u0500\u049a\3\2\2\2\u0500\u049d\3\2\2\2\u0500"+ - "\u04a0\3\2\2\2\u0500\u04a3\3\2\2\2\u0500\u04a6\3\2\2\2\u0500\u04a9\3\2"+ - "\2\2\u0500\u04ac\3\2\2\2\u0500\u04af\3\2\2\2\u0500\u04b2\3\2\2\2\u0500"+ - "\u04b5\3\2\2\2\u0500\u04b8\3\2\2\2\u0500\u04bb\3\2\2\2\u0500\u04be\3\2"+ - "\2\2\u0500\u04c1\3\2\2\2\u0500\u04c4\3\2\2\2\u0500\u04c7\3\2\2\2\u0500"+ - "\u04ca\3\2\2\2\u0500\u04cd\3\2\2\2\u0500\u04d0\3\2\2\2\u0500\u04d3\3\2"+ - "\2\2\u0500\u04d6\3\2\2\2\u0500\u04d9\3\2\2\2\u0500\u04dc\3\2\2\2\u0500"+ - "\u04df\3\2\2\2\u0500\u04e2\3\2\2\2\u0500\u04e5\3\2\2\2\u0500\u04e8\3\2"+ - "\2\2\u0500\u04eb\3\2\2\2\u0500\u04ee\3\2\2\2\u0500\u04f1\3\2\2\2\u0500"+ - "\u04f4\3\2\2\2\u0500\u04f7\3\2\2\2\u0500\u04fa\3\2\2\2\u0500\u04fd\3\2"+ - "\2\2\u0501\u00e5\3\2\2\2\u0502\u0503\7%\2\2\u0503\u00e7\3\2\2\2\u0504"+ - "\u0505\7<\2\2\u0505\u00e9\3\2\2\2\u0506\u0507\7.\2\2\u0507\u00eb\3\2\2"+ - "\2\u0508\u0509\7*\2\2\u0509\u00ed\3\2\2\2\u050a\u050b\7+\2\2\u050b\u00ef"+ - "\3\2\2\2\u050c\u050d\7]\2\2\u050d\u00f1\3\2\2\2\u050e\u050f\7_\2\2\u050f"+ - "\u00f3\3\2\2\2\u0510\u0511\7\60\2\2\u0511\u00f5\3\2\2\2\u0512\u0513\7"+ - ">\2\2\u0513\u0514\7>\2\2\u0514\u00f7\3\2\2\2\u0515\u0516\7@\2\2\u0516"+ - "\u0517\7@\2\2\u0517\u00f9\3\2\2\2\u0518\u0519\7-\2\2\u0519\u00fb\3\2\2"+ - "\2\u051a\u051b\7/\2\2\u051b\u00fd\3\2\2\2\u051c\u051d\7>\2\2\u051d\u00ff"+ - "\3\2\2\2\u051e\u051f\7@\2\2\u051f\u0101\3\2\2\2\u0520\u0521\7,\2\2\u0521"+ - "\u0103\3\2\2\2\u0522\u0523\7\61\2\2\u0523\u0105\3\2\2\2\u0524\u0525\7"+ - "}\2\2\u0525\u0526\b\u0083\t\2\u0526\u0107\3\2\2\2\u0527\u0528\7\177\2"+ - "\2\u0528\u0529\b\u0084\n\2\u0529\u0109\3\2\2\2\u052a\u052d\5\u010c\u0086"+ - "\2\u052b\u052d\5\u0114\u008a\2\u052c\u052a\3\2\2\2\u052c\u052b\3\2\2\2"+ - "\u052d\u010b\3\2\2\2\u052e\u0532\5\u010e\u0087\2\u052f\u0532\5\u0110\u0088"+ - "\2\u0530\u0532\5\u0112\u0089\2\u0531\u052e\3\2\2\2\u0531\u052f\3\2\2\2"+ - "\u0531\u0530\3\2\2\2\u0532\u010d\3\2\2\2\u0533\u0537\7\'\2\2\u0534\u0536"+ - "\5\u011c\u008e\2\u0535\u0534\3\2\2\2\u0536\u0539\3\2\2\2\u0537\u0535\3"+ - "\2\2\2\u0537\u0538\3\2\2\2\u0538\u053a\3\2\2\2\u0539\u0537\3\2\2\2\u053a"+ - "\u053c\7\60\2\2\u053b\u053d\5\u011c\u008e\2\u053c\u053b\3\2\2\2\u053d"+ - "\u053e\3\2\2\2\u053e\u053c\3\2\2\2\u053e\u053f\3\2\2\2\u053f\u010f\3\2"+ - "\2\2\u0540\u0542\5\u011e\u008f\2\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2"+ - "\2\u0543\u0541\3\2\2\2\u0543\u0544\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543"+ - "\3\2\2\2\u0546\u0548\7\60\2\2\u0547\u0549\5\u011e\u008f\2\u0548\u0547"+ - "\3\2\2\2\u0549\u054a\3\2\2\2\u054a\u0548\3\2\2\2\u054a\u054b\3\2\2\2\u054b"+ - "\u0111\3\2\2\2\u054c\u0550\7&\2\2\u054d\u054f\5\u0120\u0090\2\u054e\u054d"+ - "\3\2\2\2\u054f\u0552\3\2\2\2\u0550\u054e\3\2\2\2\u0550\u0551\3\2\2\2\u0551"+ - "\u0553\3\2\2\2\u0552\u0550\3\2\2\2\u0553\u0555\7\60\2\2\u0554\u0556\5"+ - "\u0120\u0090\2\u0555\u0554\3\2\2\2\u0556\u0557\3\2\2\2\u0557\u0555\3\2"+ - "\2\2\u0557\u0558\3\2\2\2\u0558\u0113\3\2\2\2\u0559\u055d\5\u0118\u008c"+ - "\2\u055a\u055d\5\u011a\u008d\2\u055b\u055d\5\u0116\u008b\2\u055c\u0559"+ - "\3\2\2\2\u055c\u055a\3\2\2\2\u055c\u055b\3\2\2\2\u055d\u0115\3\2\2\2\u055e"+ - "\u0560\7\'\2\2\u055f\u0561\5\u011c\u008e\2\u0560\u055f\3\2\2\2\u0561\u0562"+ - "\3\2\2\2\u0562\u0560\3\2\2\2\u0562\u0563\3\2\2\2\u0563\u0117\3\2\2\2\u0564"+ - "\u0566\5\u011e\u008f\2\u0565\u0564\3\2\2\2\u0566\u0567\3\2\2\2\u0567\u0565"+ - "\3\2\2\2\u0567\u0568\3\2\2\2\u0568\u0119\3\2\2\2\u0569\u056b\7&\2\2\u056a"+ - "\u056c\5\u0120\u0090\2\u056b\u056a\3\2\2\2\u056c\u056d\3\2\2\2\u056d\u056b"+ - "\3\2\2\2\u056d\u056e\3\2\2\2\u056e\u011b\3\2\2\2\u056f\u0570\t\13\2\2"+ - "\u0570\u011d\3\2\2\2\u0571\u0572\t\f\2\2\u0572\u011f\3\2\2\2\u0573\u0574"+ - "\t\r\2\2\u0574\u0121\3\2\2\2\u0575\u0579\7)\2\2\u0576\u0577\7^\2\2\u0577"+ - "\u057a\t\6\2\2\u0578\u057a\n\7\2\2\u0579\u0576\3\2\2\2\u0579\u0578\3\2"+ - "\2\2\u057a\u057b\3\2\2\2\u057b\u057c\7)\2\2\u057c\u0123\3\2\2\2\u057d"+ - "\u057f\5\u0126\u0093\2\u057e\u0580\t\22\2\2\u057f\u057e\3\2\2\2\u0580"+ - "\u0581\3\2\2\2\u0581\u057f\3\2\2\2\u0581\u0582\3\2\2\2\u0582\u0125\3\2"+ - "\2\2\u0583\u0587\7#\2\2\u0584\u0586\5\u012c\u0096\2\u0585\u0584\3\2\2"+ - "\2\u0586\u0589\3\2\2\2\u0587\u0585\3\2\2\2\u0587\u0588\3\2\2\2\u0588\u0127"+ - "\3\2\2\2\u0589\u0587\3\2\2\2\u058a\u058e\5\u012a\u0095\2\u058b\u058d\5"+ - "\u012c\u0096\2\u058c\u058b\3\2\2\2\u058d\u0590\3\2\2\2\u058e\u058c\3\2"+ - "\2\2\u058e\u058f\3\2\2\2\u058f\u0129\3\2\2\2\u0590\u058e\3\2\2\2\u0591"+ - "\u0592\t\16\2\2\u0592\u012b\3\2\2\2\u0593\u0594\t\17\2\2\u0594\u012d\3"+ - "\2\2\2\u0595\u0597\t\20\2\2\u0596\u0595\3\2\2\2\u0597\u0598\3\2\2\2\u0598"+ - "\u0596\3\2\2\2\u0598\u0599\3\2\2\2\u0599\u059a\3\2\2\2\u059a\u059b\b\u0097"+ - "\7\2\u059b\u012f\3\2\2\2\u059c\u059d\7\61\2\2\u059d\u059e\7\61\2\2\u059e"+ - "\u05a2\3\2\2\2\u059f\u05a1\n\21\2\2\u05a0\u059f\3\2\2\2\u05a1\u05a4\3"+ - "\2\2\2\u05a2\u05a0\3\2\2\2\u05a2\u05a3\3\2\2\2\u05a3\u05a5\3\2\2\2\u05a4"+ - "\u05a2\3\2\2\2\u05a5\u05a6\b\u0098\b\2\u05a6\u0131\3\2\2\2\u05a7\u05a8"+ - "\7\61\2\2\u05a8\u05a9\7,\2\2\u05a9\u05ad\3\2\2\2\u05aa\u05ac\13\2\2\2"+ - "\u05ab\u05aa\3\2\2\2\u05ac\u05af\3\2\2\2\u05ad\u05ae\3\2\2\2\u05ad\u05ab"+ - "\3\2\2\2\u05ae\u05b0\3\2\2\2\u05af\u05ad\3\2\2\2\u05b0\u05b1\7,\2\2\u05b1"+ - "\u05b2\7\61\2\2\u05b2\u05b3\3\2\2\2\u05b3\u05b4\b\u0099\b\2\u05b4\u0133"+ - "\3\2\2\2;\2\3\u019d\u0287\u0324\u034b\u0356\u035e\u0368\u036a\u036f\u0373"+ - "\u0375\u0378\u0380\u0386\u038b\u0392\u0397\u039e\u03a3\u03aa\u03b1\u03b6"+ - "\u03bd\u03c2\u03c7\u03ce\u03d4\u03d6\u03db\u03e2\u03e7\u03f3\u03ff\u0409"+ - "\u0414\u0500\u052c\u0531\u0537\u053e\u0543\u054a\u0550\u0557\u055c\u0562"+ - "\u0567\u056d\u0579\u0581\u0587\u058e\u0598\u05a2\u05ad\13\3\2\2\3&\3\3"+ - "K\4\3]\5\3k\6\2\3\2\2\4\2\3\u0083\7\3\u0084\b"; + "\u00c5\3\2\2\2\u03ac\u03ae\5\u00d4j\2\u03ad\u03ac\3\2\2\2\u03ae\u03b1"+ + "\3\2\2\2\u03af\u03ad\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0\u03b2\3\2\2\2\u03b1"+ + "\u03af\3\2\2\2\u03b2\u03b4\7\60\2\2\u03b3\u03b5\5\u00d4j\2\u03b4\u03b3"+ + "\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b6\u03b7\3\2\2\2\u03b7"+ + "\u00c7\3\2\2\2\u03b8\u03be\7&\2\2\u03b9\u03ba\7\62\2\2\u03ba\u03be\7z"+ + "\2\2\u03bb\u03bc\7\62\2\2\u03bc\u03be\7Z\2\2\u03bd\u03b8\3\2\2\2\u03bd"+ + "\u03b9\3\2\2\2\u03bd\u03bb\3\2\2\2\u03be\u03c2\3\2\2\2\u03bf\u03c1\5\u00d6"+ + "k\2\u03c0\u03bf\3\2\2\2\u03c1\u03c4\3\2\2\2\u03c2\u03c0\3\2\2\2\u03c2"+ + "\u03c3\3\2\2\2\u03c3\u03c5\3\2\2\2\u03c4\u03c2\3\2\2\2\u03c5\u03c7\7\60"+ + "\2\2\u03c6\u03c8\5\u00d6k\2\u03c7\u03c6\3\2\2\2\u03c8\u03c9\3\2\2\2\u03c9"+ + "\u03c7\3\2\2\2\u03c9\u03ca\3\2\2\2\u03ca\u00c9\3\2\2\2\u03cb\u03cf\5\u00ce"+ + "g\2\u03cc\u03cf\5\u00d0h\2\u03cd\u03cf\5\u00ccf\2\u03ce\u03cb\3\2\2\2"+ + "\u03ce\u03cc\3\2\2\2\u03ce\u03cd\3\2\2\2\u03cf\u03d3\3\2\2\2\u03d0\u03d1"+ + "\t\b\2\2\u03d1\u03d4\t\t\2\2\u03d2\u03d4\7n\2\2\u03d3\u03d0\3\2\2\2\u03d3"+ + "\u03d2\3\2\2\2\u03d3\u03d4\3\2\2\2\u03d4\u00cb\3\2\2\2\u03d5\u03d6\7\62"+ + "\2\2\u03d6\u03d8\t\n\2\2\u03d7\u03d9\5\u00d2i\2\u03d8\u03d7\3\2\2\2\u03d9"+ + "\u03da\3\2\2\2\u03da\u03d8\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u03e3\3\2"+ + "\2\2\u03dc\u03de\7\'\2\2\u03dd\u03df\5\u00d2i\2\u03de\u03dd\3\2\2\2\u03df"+ + "\u03e0\3\2\2\2\u03e0\u03de\3\2\2\2\u03e0\u03e1\3\2\2\2\u03e1\u03e3\3\2"+ + "\2\2\u03e2\u03d5\3\2\2\2\u03e2\u03dc\3\2\2\2\u03e3\u00cd\3\2\2\2\u03e4"+ + "\u03e6\5\u00d4j\2\u03e5\u03e4\3\2\2\2\u03e6\u03e7\3\2\2\2\u03e7\u03e5"+ + "\3\2\2\2\u03e7\u03e8\3\2\2\2\u03e8\u00cf\3\2\2\2\u03e9\u03ef\7&\2\2\u03ea"+ + "\u03eb\7\62\2\2\u03eb\u03ef\7z\2\2\u03ec\u03ed\7\62\2\2\u03ed\u03ef\7"+ + "Z\2\2\u03ee\u03e9\3\2\2\2\u03ee\u03ea\3\2\2\2\u03ee\u03ec\3\2\2\2\u03ef"+ + "\u03f1\3\2\2\2\u03f0\u03f2\5\u00d6k\2\u03f1\u03f0\3\2\2\2\u03f2\u03f3"+ + "\3\2\2\2\u03f3\u03f1\3\2\2\2\u03f3\u03f4\3\2\2\2\u03f4\u00d1\3\2\2\2\u03f5"+ + "\u03f6\t\13\2\2\u03f6\u00d3\3\2\2\2\u03f7\u03f8\t\f\2\2\u03f8\u00d5\3"+ + "\2\2\2\u03f9\u03fa\t\r\2\2\u03fa\u00d7\3\2\2\2\u03fb\u03ff\5\u00dam\2"+ + "\u03fc\u03fe\5\u00dcn\2\u03fd\u03fc\3\2\2\2\u03fe\u0401\3\2\2\2\u03ff"+ + "\u03fd\3\2\2\2\u03ff\u0400\3\2\2\2\u0400\u0402\3\2\2\2\u0401\u03ff\3\2"+ + "\2\2\u0402\u0403\bl\6\2\u0403\u00d9\3\2\2\2\u0404\u0405\t\16\2\2\u0405"+ + "\u00db\3\2\2\2\u0406\u0407\t\17\2\2\u0407\u00dd\3\2\2\2\u0408\u040a\t"+ + "\20\2\2\u0409\u0408\3\2\2\2\u040a\u040b\3\2\2\2\u040b\u0409\3\2\2\2\u040b"+ + "\u040c\3\2\2\2\u040c\u040d\3\2\2\2\u040d\u040e\bo\7\2\u040e\u00df\3\2"+ + "\2\2\u040f\u0410\7\61\2\2\u0410\u0411\7\61\2\2\u0411\u0415\3\2\2\2\u0412"+ + "\u0414\n\21\2\2\u0413\u0412\3\2\2\2\u0414\u0417\3\2\2\2\u0415\u0413\3"+ + "\2\2\2\u0415\u0416\3\2\2\2\u0416\u0418\3\2\2\2\u0417\u0415\3\2\2\2\u0418"+ + "\u0419\bp\b\2\u0419\u00e1\3\2\2\2\u041a\u041b\7\61\2\2\u041b\u041c\7,"+ + "\2\2\u041c\u0420\3\2\2\2\u041d\u041f\13\2\2\2\u041e\u041d\3\2\2\2\u041f"+ + "\u0422\3\2\2\2\u0420\u0421\3\2\2\2\u0420\u041e\3\2\2\2\u0421\u0423\3\2"+ + "\2\2\u0422\u0420\3\2\2\2\u0423\u0424\7,\2\2\u0424\u0425\7\61\2\2\u0425"+ + "\u0426\3\2\2\2\u0426\u0427\bq\b\2\u0427\u00e3\3\2\2\2\u0428\u0429\7\60"+ + "\2\2\u0429\u042a\7d\2\2\u042a\u042b\7{\2\2\u042b\u042c\7v\2\2\u042c\u042d"+ + "\7g\2\2\u042d\u00e5\3\2\2\2\u042e\u042f\7d\2\2\u042f\u0430\7t\2\2\u0430"+ + "\u050d\7m\2\2\u0431\u0432\7q\2\2\u0432\u0433\7t\2\2\u0433\u050d\7c\2\2"+ + "\u0434\u0435\7m\2\2\u0435\u0436\7k\2\2\u0436\u050d\7n\2\2\u0437\u0438"+ + "\7u\2\2\u0438\u0439\7n\2\2\u0439\u050d\7q\2\2\u043a\u043b\7p\2\2\u043b"+ + "\u043c\7q\2\2\u043c\u050d\7r\2\2\u043d\u043e\7c\2\2\u043e\u043f\7u\2\2"+ + "\u043f\u050d\7n\2\2\u0440\u0441\7r\2\2\u0441\u0442\7j\2\2\u0442\u050d"+ + "\7r\2\2\u0443\u0444\7c\2\2\u0444\u0445\7p\2\2\u0445\u050d\7e\2\2\u0446"+ + "\u0447\7d\2\2\u0447\u0448\7r\2\2\u0448\u050d\7n\2\2\u0449\u044a\7e\2\2"+ + "\u044a\u044b\7n\2\2\u044b\u050d\7e\2\2\u044c\u044d\7l\2\2\u044d\u044e"+ + "\7u\2\2\u044e\u050d\7t\2\2\u044f\u0450\7c\2\2\u0450\u0451\7p\2\2\u0451"+ + "\u050d\7f\2\2\u0452\u0453\7t\2\2\u0453\u0454\7n\2\2\u0454\u050d\7c\2\2"+ + "\u0455\u0456\7d\2\2\u0456\u0457\7k\2\2\u0457\u050d\7v\2\2\u0458\u0459"+ + "\7t\2\2\u0459\u045a\7q\2\2\u045a\u050d\7n\2\2\u045b\u045c\7r\2\2\u045c"+ + "\u045d\7n\2\2\u045d\u050d\7c\2\2\u045e\u045f\7r\2\2\u045f\u0460\7n\2\2"+ + "\u0460\u050d\7r\2\2\u0461\u0462\7d\2\2\u0462\u0463\7o\2\2\u0463\u050d"+ + "\7k\2\2\u0464\u0465\7u\2\2\u0465\u0466\7g\2\2\u0466\u050d\7e\2\2\u0467"+ + "\u0468\7t\2\2\u0468\u0469\7v\2\2\u0469\u050d\7k\2\2\u046a\u046b\7g\2\2"+ + "\u046b\u046c\7q\2\2\u046c\u050d\7t\2\2\u046d\u046e\7u\2\2\u046e\u046f"+ + "\7t\2\2\u046f\u050d\7g\2\2\u0470\u0471\7n\2\2\u0471\u0472\7u\2\2\u0472"+ + "\u050d\7t\2\2\u0473\u0474\7r\2\2\u0474\u0475\7j\2\2\u0475\u050d\7c\2\2"+ + "\u0476\u0477\7c\2\2\u0477\u0478\7n\2\2\u0478\u050d\7t\2\2\u0479\u047a"+ + "\7l\2\2\u047a\u047b\7o\2\2\u047b\u050d\7r\2\2\u047c\u047d\7d\2\2\u047d"+ + "\u047e\7x\2\2\u047e\u050d\7e\2\2\u047f\u0480\7e\2\2\u0480\u0481\7n\2\2"+ + "\u0481\u050d\7k\2\2\u0482\u0483\7t\2\2\u0483\u0484\7v\2\2\u0484\u050d"+ + "\7u\2\2\u0485\u0486\7c\2\2\u0486\u0487\7f\2\2\u0487\u050d\7e\2\2\u0488"+ + "\u0489\7t\2\2\u0489\u048a\7t\2\2\u048a\u050d\7c\2\2\u048b\u048c\7d\2\2"+ + "\u048c\u048d\7x\2\2\u048d\u050d\7u\2\2\u048e\u048f\7u\2\2\u048f\u0490"+ + "\7g\2\2\u0490\u050d\7k\2\2\u0491\u0492\7u\2\2\u0492\u0493\7c\2\2\u0493"+ + "\u050d\7z\2\2\u0494\u0495\7u\2\2\u0495\u0496\7v\2\2\u0496\u050d\7{\2\2"+ + "\u0497\u0498\7u\2\2\u0498\u0499\7v\2\2\u0499\u050d\7c\2\2\u049a\u049b"+ + "\7u\2\2\u049b\u049c\7v\2\2\u049c\u050d\7z\2\2\u049d\u049e\7f\2\2\u049e"+ + "\u049f\7g\2\2\u049f\u050d\7{\2\2\u04a0\u04a1\7v\2\2\u04a1\u04a2\7z\2\2"+ + "\u04a2\u050d\7c\2\2\u04a3\u04a4\7z\2\2\u04a4\u04a5\7c\2\2\u04a5\u050d"+ + "\7c\2\2\u04a6\u04a7\7d\2\2\u04a7\u04a8\7e\2\2\u04a8\u050d\7e\2\2\u04a9"+ + "\u04aa\7c\2\2\u04aa\u04ab\7j\2\2\u04ab\u050d\7z\2\2\u04ac\u04ad\7v\2\2"+ + "\u04ad\u04ae\7{\2\2\u04ae\u050d\7c\2\2\u04af\u04b0\7v\2\2\u04b0\u04b1"+ + "\7z\2\2\u04b1\u050d\7u\2\2\u04b2\u04b3\7v\2\2\u04b3\u04b4\7c\2\2\u04b4"+ + "\u050d\7u\2\2\u04b5\u04b6\7u\2\2\u04b6\u04b7\7j\2\2\u04b7\u050d\7{\2\2"+ + "\u04b8\u04b9\7u\2\2\u04b9\u04ba\7j\2\2\u04ba\u050d\7z\2\2\u04bb\u04bc"+ + "\7n\2\2\u04bc\u04bd\7f\2\2\u04bd\u050d\7{\2\2\u04be\u04bf\7n\2\2\u04bf"+ + "\u04c0\7f\2\2\u04c0\u050d\7c\2\2\u04c1\u04c2\7n\2\2\u04c2\u04c3\7f\2\2"+ + "\u04c3\u050d\7z\2\2\u04c4\u04c5\7n\2\2\u04c5\u04c6\7c\2\2\u04c6\u050d"+ + "\7z\2\2\u04c7\u04c8\7v\2\2\u04c8\u04c9\7c\2\2\u04c9\u050d\7{\2\2\u04ca"+ + "\u04cb\7v\2\2\u04cb\u04cc\7c\2\2\u04cc\u050d\7z\2\2\u04cd\u04ce\7d\2\2"+ + "\u04ce\u04cf\7e\2\2\u04cf\u050d\7u\2\2\u04d0\u04d1\7e\2\2\u04d1\u04d2"+ + "\7n\2\2\u04d2\u050d\7x\2\2\u04d3\u04d4\7v\2\2\u04d4\u04d5\7u\2\2\u04d5"+ + "\u050d\7z\2\2\u04d6\u04d7\7n\2\2\u04d7\u04d8\7c\2\2\u04d8\u050d\7u\2\2"+ + "\u04d9\u04da\7e\2\2\u04da\u04db\7r\2\2\u04db\u050d\7{\2\2\u04dc\u04dd"+ + "\7e\2\2\u04dd\u04de\7o\2\2\u04de\u050d\7r\2\2\u04df\u04e0\7e\2\2\u04e0"+ + "\u04e1\7r\2\2\u04e1\u050d\7z\2\2\u04e2\u04e3\7f\2\2\u04e3\u04e4\7e\2\2"+ + "\u04e4\u050d\7r\2\2\u04e5\u04e6\7f\2\2\u04e6\u04e7\7g\2\2\u04e7\u050d"+ + "\7e\2\2\u04e8\u04e9\7k\2\2\u04e9\u04ea\7p\2\2\u04ea\u050d\7e\2\2\u04eb"+ + "\u04ec\7c\2\2\u04ec\u04ed\7z\2\2\u04ed\u050d\7u\2\2\u04ee\u04ef\7d\2\2"+ + "\u04ef\u04f0\7p\2\2\u04f0\u050d\7g\2\2\u04f1\u04f2\7e\2\2\u04f2\u04f3"+ + "\7n\2\2\u04f3\u050d\7f\2\2\u04f4\u04f5\7u\2\2\u04f5\u04f6\7d\2\2\u04f6"+ + "\u050d\7e\2\2\u04f7\u04f8\7k\2\2\u04f8\u04f9\7u\2\2\u04f9\u050d\7e\2\2"+ + "\u04fa\u04fb\7k\2\2\u04fb\u04fc\7p\2\2\u04fc\u050d\7z\2\2\u04fd\u04fe"+ + "\7d\2\2\u04fe\u04ff\7g\2\2\u04ff\u050d\7s\2\2\u0500\u0501\7u\2\2\u0501"+ + "\u0502\7g\2\2\u0502\u050d\7f\2\2\u0503\u0504\7f\2\2\u0504\u0505\7g\2\2"+ + "\u0505\u050d\7z\2\2\u0506\u0507\7k\2\2\u0507\u0508\7p\2\2\u0508\u050d"+ + "\7{\2\2\u0509\u050a\7t\2\2\u050a\u050b\7q\2\2\u050b\u050d\7t\2\2\u050c"+ + "\u042e\3\2\2\2\u050c\u0431\3\2\2\2\u050c\u0434\3\2\2\2\u050c\u0437\3\2"+ + "\2\2\u050c\u043a\3\2\2\2\u050c\u043d\3\2\2\2\u050c\u0440\3\2\2\2\u050c"+ + "\u0443\3\2\2\2\u050c\u0446\3\2\2\2\u050c\u0449\3\2\2\2\u050c\u044c\3\2"+ + "\2\2\u050c\u044f\3\2\2\2\u050c\u0452\3\2\2\2\u050c\u0455\3\2\2\2\u050c"+ + "\u0458\3\2\2\2\u050c\u045b\3\2\2\2\u050c\u045e\3\2\2\2\u050c\u0461\3\2"+ + "\2\2\u050c\u0464\3\2\2\2\u050c\u0467\3\2\2\2\u050c\u046a\3\2\2\2\u050c"+ + "\u046d\3\2\2\2\u050c\u0470\3\2\2\2\u050c\u0473\3\2\2\2\u050c\u0476\3\2"+ + "\2\2\u050c\u0479\3\2\2\2\u050c\u047c\3\2\2\2\u050c\u047f\3\2\2\2\u050c"+ + "\u0482\3\2\2\2\u050c\u0485\3\2\2\2\u050c\u0488\3\2\2\2\u050c\u048b\3\2"+ + "\2\2\u050c\u048e\3\2\2\2\u050c\u0491\3\2\2\2\u050c\u0494\3\2\2\2\u050c"+ + "\u0497\3\2\2\2\u050c\u049a\3\2\2\2\u050c\u049d\3\2\2\2\u050c\u04a0\3\2"+ + "\2\2\u050c\u04a3\3\2\2\2\u050c\u04a6\3\2\2\2\u050c\u04a9\3\2\2\2\u050c"+ + "\u04ac\3\2\2\2\u050c\u04af\3\2\2\2\u050c\u04b2\3\2\2\2\u050c\u04b5\3\2"+ + "\2\2\u050c\u04b8\3\2\2\2\u050c\u04bb\3\2\2\2\u050c\u04be\3\2\2\2\u050c"+ + "\u04c1\3\2\2\2\u050c\u04c4\3\2\2\2\u050c\u04c7\3\2\2\2\u050c\u04ca\3\2"+ + "\2\2\u050c\u04cd\3\2\2\2\u050c\u04d0\3\2\2\2\u050c\u04d3\3\2\2\2\u050c"+ + "\u04d6\3\2\2\2\u050c\u04d9\3\2\2\2\u050c\u04dc\3\2\2\2\u050c\u04df\3\2"+ + "\2\2\u050c\u04e2\3\2\2\2\u050c\u04e5\3\2\2\2\u050c\u04e8\3\2\2\2\u050c"+ + "\u04eb\3\2\2\2\u050c\u04ee\3\2\2\2\u050c\u04f1\3\2\2\2\u050c\u04f4\3\2"+ + "\2\2\u050c\u04f7\3\2\2\2\u050c\u04fa\3\2\2\2\u050c\u04fd\3\2\2\2\u050c"+ + "\u0500\3\2\2\2\u050c\u0503\3\2\2\2\u050c\u0506\3\2\2\2\u050c\u0509\3\2"+ + "\2\2\u050d\u00e7\3\2\2\2\u050e\u050f\7%\2\2\u050f\u00e9\3\2\2\2\u0510"+ + "\u0511\7<\2\2\u0511\u00eb\3\2\2\2\u0512\u0513\7.\2\2\u0513\u00ed\3\2\2"+ + "\2\u0514\u0515\7*\2\2\u0515\u00ef\3\2\2\2\u0516\u0517\7+\2\2\u0517\u00f1"+ + "\3\2\2\2\u0518\u0519\7]\2\2\u0519\u00f3\3\2\2\2\u051a\u051b\7_\2\2\u051b"+ + "\u00f5\3\2\2\2\u051c\u051d\7\60\2\2\u051d\u00f7\3\2\2\2\u051e\u051f\7"+ + ">\2\2\u051f\u0520\7>\2\2\u0520\u00f9\3\2\2\2\u0521\u0522\7@\2\2\u0522"+ + "\u0523\7@\2\2\u0523\u00fb\3\2\2\2\u0524\u0525\7-\2\2\u0525\u00fd\3\2\2"+ + "\2\u0526\u0527\7/\2\2\u0527\u00ff\3\2\2\2\u0528\u0529\7>\2\2\u0529\u0101"+ + "\3\2\2\2\u052a\u052b\7@\2\2\u052b\u0103\3\2\2\2\u052c\u052d\7,\2\2\u052d"+ + "\u0105\3\2\2\2\u052e\u052f\7\61\2\2\u052f\u0107\3\2\2\2\u0530\u0531\7"+ + "}\2\2\u0531\u0532\b\u0084\t\2\u0532\u0109\3\2\2\2\u0533\u0534\7\177\2"+ + "\2\u0534\u0535\b\u0085\n\2\u0535\u010b\3\2\2\2\u0536\u0539\5\u010e\u0087"+ + "\2\u0537\u0539\5\u0116\u008b\2\u0538\u0536\3\2\2\2\u0538\u0537\3\2\2\2"+ + "\u0539\u010d\3\2\2\2\u053a\u053e\5\u0110\u0088\2\u053b\u053e\5\u0112\u0089"+ + "\2\u053c\u053e\5\u0114\u008a\2\u053d\u053a\3\2\2\2\u053d\u053b\3\2\2\2"+ + "\u053d\u053c\3\2\2\2\u053e\u010f\3\2\2\2\u053f\u0543\7\'\2\2\u0540\u0542"+ + "\5\u011e\u008f\2\u0541\u0540\3\2\2\2\u0542\u0545\3\2\2\2\u0543\u0541\3"+ + "\2\2\2\u0543\u0544\3\2\2\2\u0544\u0546\3\2\2\2\u0545\u0543\3\2\2\2\u0546"+ + "\u0548\7\60\2\2\u0547\u0549\5\u011e\u008f\2\u0548\u0547\3\2\2\2\u0549"+ + "\u054a\3\2\2\2\u054a\u0548\3\2\2\2\u054a\u054b\3\2\2\2\u054b\u0111\3\2"+ + "\2\2\u054c\u054e\5\u0120\u0090\2\u054d\u054c\3\2\2\2\u054e\u0551\3\2\2"+ + "\2\u054f\u054d\3\2\2\2\u054f\u0550\3\2\2\2\u0550\u0552\3\2\2\2\u0551\u054f"+ + "\3\2\2\2\u0552\u0554\7\60\2\2\u0553\u0555\5\u0120\u0090\2\u0554\u0553"+ + "\3\2\2\2\u0555\u0556\3\2\2\2\u0556\u0554\3\2\2\2\u0556\u0557\3\2\2\2\u0557"+ + "\u0113\3\2\2\2\u0558\u055c\7&\2\2\u0559\u055b\5\u0122\u0091\2\u055a\u0559"+ + "\3\2\2\2\u055b\u055e\3\2\2\2\u055c\u055a\3\2\2\2\u055c\u055d\3\2\2\2\u055d"+ + "\u055f\3\2\2\2\u055e\u055c\3\2\2\2\u055f\u0561\7\60\2\2\u0560\u0562\5"+ + "\u0122\u0091\2\u0561\u0560\3\2\2\2\u0562\u0563\3\2\2\2\u0563\u0561\3\2"+ + "\2\2\u0563\u0564\3\2\2\2\u0564\u0115\3\2\2\2\u0565\u0569\5\u011a\u008d"+ + "\2\u0566\u0569\5\u011c\u008e\2\u0567\u0569\5\u0118\u008c\2\u0568\u0565"+ + "\3\2\2\2\u0568\u0566\3\2\2\2\u0568\u0567\3\2\2\2\u0569\u0117\3\2\2\2\u056a"+ + "\u056c\7\'\2\2\u056b\u056d\5\u011e\u008f\2\u056c\u056b\3\2\2\2\u056d\u056e"+ + "\3\2\2\2\u056e\u056c\3\2\2\2\u056e\u056f\3\2\2\2\u056f\u0119\3\2\2\2\u0570"+ + "\u0572\5\u0120\u0090\2\u0571\u0570\3\2\2\2\u0572\u0573\3\2\2\2\u0573\u0571"+ + "\3\2\2\2\u0573\u0574\3\2\2\2\u0574\u011b\3\2\2\2\u0575\u0577\7&\2\2\u0576"+ + "\u0578\5\u0122\u0091\2\u0577\u0576\3\2\2\2\u0578\u0579\3\2\2\2\u0579\u0577"+ + "\3\2\2\2\u0579\u057a\3\2\2\2\u057a\u011d\3\2\2\2\u057b\u057c\t\13\2\2"+ + "\u057c\u011f\3\2\2\2\u057d\u057e\t\f\2\2\u057e\u0121\3\2\2\2\u057f\u0580"+ + "\t\r\2\2\u0580\u0123\3\2\2\2\u0581\u0585\7)\2\2\u0582\u0583\7^\2\2\u0583"+ + "\u0586\t\6\2\2\u0584\u0586\n\7\2\2\u0585\u0582\3\2\2\2\u0585\u0584\3\2"+ + "\2\2\u0586\u0587\3\2\2\2\u0587\u0588\7)\2\2\u0588\u0125\3\2\2\2\u0589"+ + "\u058b\5\u0128\u0094\2\u058a\u058c\t\22\2\2\u058b\u058a\3\2\2\2\u058c"+ + "\u058d\3\2\2\2\u058d\u058b\3\2\2\2\u058d\u058e\3\2\2\2\u058e\u0127\3\2"+ + "\2\2\u058f\u0593\7#\2\2\u0590\u0592\5\u012e\u0097\2\u0591\u0590\3\2\2"+ + "\2\u0592\u0595\3\2\2\2\u0593\u0591\3\2\2\2\u0593\u0594\3\2\2\2\u0594\u0129"+ + "\3\2\2\2\u0595\u0593\3\2\2\2\u0596\u059a\5\u012c\u0096\2\u0597\u0599\5"+ + "\u012e\u0097\2\u0598\u0597\3\2\2\2\u0599\u059c\3\2\2\2\u059a\u0598\3\2"+ + "\2\2\u059a\u059b\3\2\2\2\u059b\u012b\3\2\2\2\u059c\u059a\3\2\2\2\u059d"+ + "\u059e\t\16\2\2\u059e\u012d\3\2\2\2\u059f\u05a0\t\17\2\2\u05a0\u012f\3"+ + "\2\2\2\u05a1\u05a3\t\20\2\2\u05a2\u05a1\3\2\2\2\u05a3\u05a4\3\2\2\2\u05a4"+ + "\u05a2\3\2\2\2\u05a4\u05a5\3\2\2\2\u05a5\u05a6\3\2\2\2\u05a6\u05a7\b\u0098"+ + "\7\2\u05a7\u0131\3\2\2\2\u05a8\u05a9\7\61\2\2\u05a9\u05aa\7\61\2\2\u05aa"+ + "\u05ae\3\2\2\2\u05ab\u05ad\n\21\2\2\u05ac\u05ab\3\2\2\2\u05ad\u05b0\3"+ + "\2\2\2\u05ae\u05ac\3\2\2\2\u05ae\u05af\3\2\2\2\u05af\u05b1\3\2\2\2\u05b0"+ + "\u05ae\3\2\2\2\u05b1\u05b2\b\u0099\b\2\u05b2\u0133\3\2\2\2\u05b3\u05b4"+ + "\7\61\2\2\u05b4\u05b5\7,\2\2\u05b5\u05b9\3\2\2\2\u05b6\u05b8\13\2\2\2"+ + "\u05b7\u05b6\3\2\2\2\u05b8\u05bb\3\2\2\2\u05b9\u05ba\3\2\2\2\u05b9\u05b7"+ + "\3\2\2\2\u05ba\u05bc\3\2\2\2\u05bb\u05b9\3\2\2\2\u05bc\u05bd\7,\2\2\u05bd"+ + "\u05be\7\61\2\2\u05be\u05bf\3\2\2\2\u05bf\u05c0\b\u009a\b\2\u05c0\u0135"+ + "\3\2\2\2;\2\3\u019f\u0293\u0330\u0357\u0362\u036a\u0374\u0376\u037b\u037f"+ + "\u0381\u0384\u038c\u0392\u0397\u039e\u03a3\u03aa\u03af\u03b6\u03bd\u03c2"+ + "\u03c9\u03ce\u03d3\u03da\u03e0\u03e2\u03e7\u03ee\u03f3\u03ff\u040b\u0415"+ + "\u0420\u050c\u0538\u053d\u0543\u054a\u054f\u0556\u055c\u0563\u0568\u056e"+ + "\u0573\u0579\u0585\u058d\u0593\u059a\u05a4\u05ae\u05b9\13\3\2\2\3&\3\3"+ + "L\4\3^\5\3l\6\2\3\2\2\4\2\3\u0084\7\3\u0085\b"; 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 4de687d67..43a0dc65d 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens @@ -47,100 +47,101 @@ CODESEG=46 DATASEG=47 ENCODING=48 CONST=49 -EXTERN=50 -EXPORT=51 -ALIGN=52 -REGISTER=53 -NOTREGISTER=54 -ADDRESS=55 -ADDRESS_ZEROPAGE=56 -ADDRESS_MAINMEM=57 -FORM_SSA=58 -FORM_NOTSSA=59 -INLINE=60 -VOLATILE=61 -NOTVOLATILE=62 -INTERRUPT=63 -CALLING=64 -CALLINGCONVENTION=65 -IF=66 -ELSE=67 -WHILE=68 -DO=69 -FOR=70 -SWITCH=71 -RETURN=72 -BREAK=73 -CONTINUE=74 -ASM=75 -DEFAULT=76 -CASE=77 -STRUCT=78 -ENUM=79 -SIZEOF=80 -TYPEID=81 -KICKASM=82 -RESOURCE=83 -USES=84 -CLOBBERS=85 -BYTES=86 -CYCLES=87 -LOGIC_NOT=88 -SIGNEDNESS=89 -SIMPLETYPE=90 -BOOLEAN=91 -KICKASM_BODY=92 -STRING=93 -CHAR=94 -NUMBER=95 -NUMFLOAT=96 -BINFLOAT=97 -DECFLOAT=98 -HEXFLOAT=99 -NUMINT=100 -BININTEGER=101 -DECINTEGER=102 -HEXINTEGER=103 -NAME=104 -WS=105 -COMMENT_LINE=106 -COMMENT_BLOCK=107 -ASM_BYTE=108 -ASM_MNEMONIC=109 -ASM_IMM=110 -ASM_COLON=111 -ASM_COMMA=112 -ASM_PAR_BEGIN=113 -ASM_PAR_END=114 -ASM_BRACKET_BEGIN=115 -ASM_BRACKET_END=116 -ASM_DOT=117 -ASM_SHIFT_LEFT=118 -ASM_SHIFT_RIGHT=119 -ASM_PLUS=120 -ASM_MINUS=121 -ASM_LESS_THAN=122 -ASM_GREATER_THAN=123 -ASM_MULTIPLY=124 -ASM_DIVIDE=125 -ASM_CURLY_BEGIN=126 -ASM_CURLY_END=127 -ASM_NUMBER=128 -ASM_NUMFLOAT=129 -ASM_BINFLOAT=130 -ASM_DECFLOAT=131 -ASM_HEXFLOAT=132 -ASM_NUMINT=133 -ASM_BININTEGER=134 -ASM_DECINTEGER=135 -ASM_HEXINTEGER=136 -ASM_CHAR=137 -ASM_MULTI_REL=138 -ASM_MULTI_NAME=139 -ASM_NAME=140 -ASM_WS=141 -ASM_COMMENT_LINE=142 -ASM_COMMENT_BLOCK=143 +NOTCONST=50 +MAYBECONST=51 +EXTERN=52 +EXPORT=53 +ALIGN=54 +REGISTER=55 +ADDRESS=56 +ADDRESS_ZEROPAGE=57 +ADDRESS_MAINMEM=58 +FORM_SSA=59 +FORM_NOTSSA=60 +INLINE=61 +VOLATILE=62 +NOTVOLATILE=63 +INTERRUPT=64 +CALLING=65 +CALLINGCONVENTION=66 +IF=67 +ELSE=68 +WHILE=69 +DO=70 +FOR=71 +SWITCH=72 +RETURN=73 +BREAK=74 +CONTINUE=75 +ASM=76 +DEFAULT=77 +CASE=78 +STRUCT=79 +ENUM=80 +SIZEOF=81 +TYPEID=82 +KICKASM=83 +RESOURCE=84 +USES=85 +CLOBBERS=86 +BYTES=87 +CYCLES=88 +LOGIC_NOT=89 +SIGNEDNESS=90 +SIMPLETYPE=91 +BOOLEAN=92 +KICKASM_BODY=93 +STRING=94 +CHAR=95 +NUMBER=96 +NUMFLOAT=97 +BINFLOAT=98 +DECFLOAT=99 +HEXFLOAT=100 +NUMINT=101 +BININTEGER=102 +DECINTEGER=103 +HEXINTEGER=104 +NAME=105 +WS=106 +COMMENT_LINE=107 +COMMENT_BLOCK=108 +ASM_BYTE=109 +ASM_MNEMONIC=110 +ASM_IMM=111 +ASM_COLON=112 +ASM_COMMA=113 +ASM_PAR_BEGIN=114 +ASM_PAR_END=115 +ASM_BRACKET_BEGIN=116 +ASM_BRACKET_END=117 +ASM_DOT=118 +ASM_SHIFT_LEFT=119 +ASM_SHIFT_RIGHT=120 +ASM_PLUS=121 +ASM_MINUS=122 +ASM_LESS_THAN=123 +ASM_GREATER_THAN=124 +ASM_MULTIPLY=125 +ASM_DIVIDE=126 +ASM_CURLY_BEGIN=127 +ASM_CURLY_END=128 +ASM_NUMBER=129 +ASM_NUMFLOAT=130 +ASM_BINFLOAT=131 +ASM_DECFLOAT=132 +ASM_HEXFLOAT=133 +ASM_NUMINT=134 +ASM_BININTEGER=135 +ASM_DECINTEGER=136 +ASM_HEXINTEGER=137 +ASM_CHAR=138 +ASM_MULTI_REL=139 +ASM_MULTI_NAME=140 +ASM_NAME=141 +ASM_WS=142 +ASM_COMMENT_LINE=143 +ASM_COMMENT_BLOCK=144 ';'=8 '..'=11 '?'=12 @@ -171,43 +172,44 @@ ASM_COMMENT_BLOCK=143 'data_seg'=47 'encoding'=48 'const'=49 -'extern'=50 -'export'=51 -'align'=52 -'register'=53 -'__notregister'=54 -'__address'=55 -'__zp'=56 -'__mem'=57 -'__ssa'=58 -'__notssa'=59 -'inline'=60 -'volatile'=61 -'__notvolatile'=62 -'interrupt'=63 -'calling'=64 -'if'=66 -'else'=67 -'while'=68 -'do'=69 -'for'=70 -'switch'=71 -'return'=72 -'break'=73 -'continue'=74 -'asm'=75 -'default'=76 -'case'=77 -'struct'=78 -'enum'=79 -'sizeof'=80 -'typeid'=81 -'kickasm'=82 -'resource'=83 -'uses'=84 -'clobbers'=85 -'bytes'=86 -'cycles'=87 -'!'=88 -'.byte'=108 -'#'=110 +'__notconst'=50 +'__maybeconst'=51 +'extern'=52 +'export'=53 +'align'=54 +'register'=55 +'__address'=56 +'__zp'=57 +'__mem'=58 +'__ssa'=59 +'__notssa'=60 +'inline'=61 +'volatile'=62 +'__notvolatile'=63 +'interrupt'=64 +'calling'=65 +'if'=67 +'else'=68 +'while'=69 +'do'=70 +'for'=71 +'switch'=72 +'return'=73 +'break'=74 +'continue'=75 +'asm'=76 +'default'=77 +'case'=78 +'struct'=79 +'enum'=80 +'sizeof'=81 +'typeid'=82 +'kickasm'=83 +'resource'=84 +'uses'=85 +'clobbers'=86 +'bytes'=87 +'cycles'=88 +'!'=89 +'.byte'=109 +'#'=111 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 b/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 index 366417445..289e7285c 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.g4 @@ -96,11 +96,12 @@ globalDirective directive : CONST #directiveConst + | NOTCONST #directiveNotConst + | MAYBECONST #directiveMaybeConst | EXTERN #directiveExtern | EXPORT #directiveExport | ALIGN PAR_BEGIN NUMBER PAR_END #directiveAlign | REGISTER ( PAR_BEGIN ( NAME ) PAR_END)? #directiveRegister - | NOTREGISTER #directiveNotRegister | ADDRESS_ZEROPAGE #directiveMemoryAreaZp | ADDRESS_MAINMEM #directiveMemoryAreaMain | ADDRESS PAR_BEGIN ( NUMBER ) PAR_END #directiveMemoryAreaAddress diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 4e4e562c3..c09bafb4d 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -27,24 +27,24 @@ public class KickCParser extends Parser { GREATER_THAN_EQUAL=32, GREATER_THAN=33, LOGIC_AND=34, LOGIC_OR=35, ASSIGN=36, ASSIGN_COMPOUND=37, IMPORT=38, TYPEDEF=39, PRAGMA=40, RESERVE=41, PC=42, TARGET=43, LINK=44, CPU=45, CODESEG=46, DATASEG=47, ENCODING=48, CONST=49, - EXTERN=50, EXPORT=51, ALIGN=52, REGISTER=53, NOTREGISTER=54, ADDRESS=55, - ADDRESS_ZEROPAGE=56, ADDRESS_MAINMEM=57, FORM_SSA=58, FORM_NOTSSA=59, - INLINE=60, VOLATILE=61, NOTVOLATILE=62, INTERRUPT=63, CALLING=64, CALLINGCONVENTION=65, - IF=66, ELSE=67, WHILE=68, DO=69, FOR=70, SWITCH=71, RETURN=72, BREAK=73, - CONTINUE=74, ASM=75, DEFAULT=76, CASE=77, STRUCT=78, ENUM=79, SIZEOF=80, - TYPEID=81, KICKASM=82, RESOURCE=83, USES=84, CLOBBERS=85, BYTES=86, CYCLES=87, - LOGIC_NOT=88, SIGNEDNESS=89, SIMPLETYPE=90, BOOLEAN=91, KICKASM_BODY=92, - STRING=93, CHAR=94, NUMBER=95, NUMFLOAT=96, BINFLOAT=97, DECFLOAT=98, - HEXFLOAT=99, NUMINT=100, BININTEGER=101, DECINTEGER=102, HEXINTEGER=103, - NAME=104, WS=105, COMMENT_LINE=106, COMMENT_BLOCK=107, ASM_BYTE=108, ASM_MNEMONIC=109, - ASM_IMM=110, ASM_COLON=111, ASM_COMMA=112, ASM_PAR_BEGIN=113, ASM_PAR_END=114, - ASM_BRACKET_BEGIN=115, ASM_BRACKET_END=116, ASM_DOT=117, ASM_SHIFT_LEFT=118, - ASM_SHIFT_RIGHT=119, ASM_PLUS=120, ASM_MINUS=121, ASM_LESS_THAN=122, ASM_GREATER_THAN=123, - ASM_MULTIPLY=124, ASM_DIVIDE=125, ASM_CURLY_BEGIN=126, ASM_CURLY_END=127, - ASM_NUMBER=128, ASM_NUMFLOAT=129, ASM_BINFLOAT=130, ASM_DECFLOAT=131, - ASM_HEXFLOAT=132, ASM_NUMINT=133, ASM_BININTEGER=134, ASM_DECINTEGER=135, - ASM_HEXINTEGER=136, ASM_CHAR=137, ASM_MULTI_REL=138, ASM_MULTI_NAME=139, - ASM_NAME=140, ASM_WS=141, ASM_COMMENT_LINE=142, ASM_COMMENT_BLOCK=143; + NOTCONST=50, MAYBECONST=51, EXTERN=52, EXPORT=53, ALIGN=54, REGISTER=55, + ADDRESS=56, ADDRESS_ZEROPAGE=57, ADDRESS_MAINMEM=58, FORM_SSA=59, FORM_NOTSSA=60, + INLINE=61, VOLATILE=62, NOTVOLATILE=63, INTERRUPT=64, CALLING=65, CALLINGCONVENTION=66, + IF=67, ELSE=68, WHILE=69, DO=70, FOR=71, SWITCH=72, RETURN=73, BREAK=74, + CONTINUE=75, ASM=76, DEFAULT=77, CASE=78, STRUCT=79, ENUM=80, SIZEOF=81, + TYPEID=82, KICKASM=83, RESOURCE=84, USES=85, CLOBBERS=86, BYTES=87, CYCLES=88, + LOGIC_NOT=89, SIGNEDNESS=90, SIMPLETYPE=91, BOOLEAN=92, KICKASM_BODY=93, + STRING=94, CHAR=95, NUMBER=96, NUMFLOAT=97, BINFLOAT=98, DECFLOAT=99, + HEXFLOAT=100, NUMINT=101, BININTEGER=102, DECINTEGER=103, HEXINTEGER=104, + NAME=105, WS=106, COMMENT_LINE=107, COMMENT_BLOCK=108, ASM_BYTE=109, ASM_MNEMONIC=110, + ASM_IMM=111, ASM_COLON=112, ASM_COMMA=113, ASM_PAR_BEGIN=114, ASM_PAR_END=115, + ASM_BRACKET_BEGIN=116, ASM_BRACKET_END=117, ASM_DOT=118, ASM_SHIFT_LEFT=119, + ASM_SHIFT_RIGHT=120, ASM_PLUS=121, ASM_MINUS=122, ASM_LESS_THAN=123, ASM_GREATER_THAN=124, + ASM_MULTIPLY=125, ASM_DIVIDE=126, ASM_CURLY_BEGIN=127, ASM_CURLY_END=128, + ASM_NUMBER=129, ASM_NUMFLOAT=130, ASM_BINFLOAT=131, ASM_DECFLOAT=132, + ASM_HEXFLOAT=133, ASM_NUMINT=134, ASM_BININTEGER=135, ASM_DECINTEGER=136, + ASM_HEXINTEGER=137, ASM_CHAR=138, ASM_MULTI_REL=139, ASM_MULTI_NAME=140, + ASM_NAME=141, ASM_WS=142, ASM_COMMENT_LINE=143, ASM_COMMENT_BLOCK=144; public static final int RULE_file = 0, RULE_asmFile = 1, RULE_declSeq = 2, RULE_declOrImport = 3, RULE_importDecl = 4, RULE_decl = 5, RULE_typeDef = 6, RULE_declTypes = 7, @@ -75,15 +75,15 @@ public class KickCParser extends Parser { "'~'", "'^'", "'|'", null, null, "'=='", "'!='", null, "'<='", "'>='", null, "'&&'", "'||'", "'='", null, "'import'", "'typedef'", "'#pragma'", "'reserve'", "'pc'", "'target'", "'link'", "'cpu'", "'code_seg'", "'data_seg'", - "'encoding'", "'const'", "'extern'", "'export'", "'align'", "'register'", - "'__notregister'", "'__address'", "'__zp'", "'__mem'", "'__ssa'", "'__notssa'", - "'inline'", "'volatile'", "'__notvolatile'", "'interrupt'", "'calling'", - null, "'if'", "'else'", "'while'", "'do'", "'for'", "'switch'", "'return'", - "'break'", "'continue'", "'asm'", "'default'", "'case'", "'struct'", "'enum'", - "'sizeof'", "'typeid'", "'kickasm'", "'resource'", "'uses'", "'clobbers'", - "'bytes'", "'cycles'", "'!'", null, null, null, null, null, null, null, + "'encoding'", "'const'", "'__notconst'", "'__maybeconst'", "'extern'", + "'export'", "'align'", "'register'", "'__address'", "'__zp'", "'__mem'", + "'__ssa'", "'__notssa'", "'inline'", "'volatile'", "'__notvolatile'", + "'interrupt'", "'calling'", null, "'if'", "'else'", "'while'", "'do'", + "'for'", "'switch'", "'return'", "'break'", "'continue'", "'asm'", "'default'", + "'case'", "'struct'", "'enum'", "'sizeof'", "'typeid'", "'kickasm'", "'resource'", + "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'!'", null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - "'.byte'", null, "'#'" + null, null, null, null, "'.byte'", null, "'#'" }; private static final String[] _SYMBOLIC_NAMES = { null, "TYPEDEFNAME", "CURLY_BEGIN", "CURLY_END", "BRACKET_BEGIN", "BRACKET_END", @@ -93,8 +93,8 @@ public class KickCParser extends Parser { "EQUAL", "NOT_EQUAL", "LESS_THAN", "LESS_THAN_EQUAL", "GREATER_THAN_EQUAL", "GREATER_THAN", "LOGIC_AND", "LOGIC_OR", "ASSIGN", "ASSIGN_COMPOUND", "IMPORT", "TYPEDEF", "PRAGMA", "RESERVE", "PC", "TARGET", "LINK", "CPU", - "CODESEG", "DATASEG", "ENCODING", "CONST", "EXTERN", "EXPORT", "ALIGN", - "REGISTER", "NOTREGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", + "CODESEG", "DATASEG", "ENCODING", "CONST", "NOTCONST", "MAYBECONST", "EXTERN", + "EXPORT", "ALIGN", "REGISTER", "ADDRESS", "ADDRESS_ZEROPAGE", "ADDRESS_MAINMEM", "FORM_SSA", "FORM_NOTSSA", "INLINE", "VOLATILE", "NOTVOLATILE", "INTERRUPT", "CALLING", "CALLINGCONVENTION", "IF", "ELSE", "WHILE", "DO", "FOR", "SWITCH", "RETURN", "BREAK", "CONTINUE", "ASM", "DEFAULT", "CASE", "STRUCT", "ENUM", @@ -299,7 +299,7 @@ public class KickCParser extends Parser { setState(95); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << IMPORT) | (1L << TYPEDEF) | (1L << PRAGMA) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (KICKASM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << IMPORT) | (1L << TYPEDEF) | (1L << PRAGMA) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (KICKASM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { { { setState(92); @@ -362,11 +362,12 @@ public class KickCParser extends Parser { case PRAGMA: case RESERVE: case CONST: + case NOTCONST: + case MAYBECONST: case EXTERN: case EXPORT: case ALIGN: case REGISTER: - case NOTREGISTER: case ADDRESS: case ADDRESS_ZEROPAGE: case ADDRESS_MAINMEM: @@ -664,7 +665,7 @@ public class KickCParser extends Parser { setState(130); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (NOTREGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { + while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (NOTCONST - 41)) | (1L << (MAYBECONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { { { setState(127); @@ -680,7 +681,7 @@ public class KickCParser extends Parser { setState(137); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (NOTREGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { + while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (NOTCONST - 41)) | (1L << (MAYBECONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { { { setState(134); @@ -991,7 +992,7 @@ public class KickCParser extends Parser { setState(168); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { { setState(167); parameterListDecl(); @@ -1005,7 +1006,7 @@ public class KickCParser extends Parser { setState(173); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)))) != 0)) { { setState(172); stmtSeq(); @@ -1617,6 +1618,23 @@ public class KickCParser extends Parser { else return visitor.visitChildren(this); } } + public static class DirectiveNotConstContext extends DirectiveContext { + public TerminalNode NOTCONST() { return getToken(KickCParser.NOTCONST, 0); } + public DirectiveNotConstContext(DirectiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).enterDirectiveNotConst(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).exitDirectiveNotConst(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCParserVisitor ) return ((KickCParserVisitor)visitor).visitDirectiveNotConst(this); + else return visitor.visitChildren(this); + } + } public static class DirectiveMemoryAreaZpContext extends DirectiveContext { public TerminalNode ADDRESS_ZEROPAGE() { return getToken(KickCParser.ADDRESS_ZEROPAGE, 0); } public DirectiveMemoryAreaZpContext(DirectiveContext ctx) { copyFrom(ctx); } @@ -1776,6 +1794,23 @@ public class KickCParser extends Parser { else return visitor.visitChildren(this); } } + public static class DirectiveMaybeConstContext extends DirectiveContext { + public TerminalNode MAYBECONST() { return getToken(KickCParser.MAYBECONST, 0); } + public DirectiveMaybeConstContext(DirectiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).enterDirectiveMaybeConst(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).exitDirectiveMaybeConst(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCParserVisitor ) return ((KickCParserVisitor)visitor).visitDirectiveMaybeConst(this); + else return visitor.visitChildren(this); + } + } public static class DirectiveExportContext extends DirectiveContext { public TerminalNode EXPORT() { return getToken(KickCParser.EXPORT, 0); } public DirectiveExportContext(DirectiveContext ctx) { copyFrom(ctx); } @@ -1827,23 +1862,6 @@ public class KickCParser extends Parser { else return visitor.visitChildren(this); } } - public static class DirectiveNotRegisterContext extends DirectiveContext { - public TerminalNode NOTREGISTER() { return getToken(KickCParser.NOTREGISTER, 0); } - public DirectiveNotRegisterContext(DirectiveContext ctx) { copyFrom(ctx); } - @Override - public void enterRule(ParseTreeListener listener) { - if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).enterDirectiveNotRegister(this); - } - @Override - public void exitRule(ParseTreeListener listener) { - if ( listener instanceof KickCParserListener ) ((KickCParserListener)listener).exitDirectiveNotRegister(this); - } - @Override - public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof KickCParserVisitor ) return ((KickCParserVisitor)visitor).visitDirectiveNotRegister(this); - else return visitor.visitChildren(this); - } - } public static class DirectiveReserveZpContext extends DirectiveContext { public TerminalNode RESERVE() { return getToken(KickCParser.RESERVE, 0); } public TerminalNode PAR_BEGIN() { return getToken(KickCParser.PAR_BEGIN, 0); } @@ -1917,7 +1935,7 @@ public class KickCParser extends Parser { enterRule(_localctx, 30, RULE_directive); int _la; try { - setState(301); + setState(302); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: @@ -1929,212 +1947,220 @@ public class KickCParser extends Parser { } break; case 2: - _localctx = new DirectiveExternContext(_localctx); + _localctx = new DirectiveNotConstContext(_localctx); enterOuterAlt(_localctx, 2); { setState(255); - match(EXTERN); + match(NOTCONST); } break; case 3: - _localctx = new DirectiveExportContext(_localctx); + _localctx = new DirectiveMaybeConstContext(_localctx); enterOuterAlt(_localctx, 3); { setState(256); - match(EXPORT); + match(MAYBECONST); } break; case 4: - _localctx = new DirectiveAlignContext(_localctx); + _localctx = new DirectiveExternContext(_localctx); enterOuterAlt(_localctx, 4); { setState(257); - match(ALIGN); - setState(258); - match(PAR_BEGIN); - setState(259); - match(NUMBER); - setState(260); - match(PAR_END); + match(EXTERN); } break; case 5: - _localctx = new DirectiveRegisterContext(_localctx); + _localctx = new DirectiveExportContext(_localctx); enterOuterAlt(_localctx, 5); { + setState(258); + match(EXPORT); + } + break; + case 6: + _localctx = new DirectiveAlignContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(259); + match(ALIGN); + setState(260); + match(PAR_BEGIN); setState(261); + match(NUMBER); + setState(262); + match(PAR_END); + } + break; + case 7: + _localctx = new DirectiveRegisterContext(_localctx); + enterOuterAlt(_localctx, 7); + { + setState(263); match(REGISTER); - setState(265); + setState(267); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(262); + setState(264); match(PAR_BEGIN); { - setState(263); + setState(265); match(NAME); } - setState(264); + setState(266); match(PAR_END); } break; } } break; - case 6: - _localctx = new DirectiveNotRegisterContext(_localctx); - enterOuterAlt(_localctx, 6); - { - setState(267); - match(NOTREGISTER); - } - break; - case 7: - _localctx = new DirectiveMemoryAreaZpContext(_localctx); - enterOuterAlt(_localctx, 7); - { - setState(268); - match(ADDRESS_ZEROPAGE); - } - break; case 8: - _localctx = new DirectiveMemoryAreaMainContext(_localctx); + _localctx = new DirectiveMemoryAreaZpContext(_localctx); enterOuterAlt(_localctx, 8); { setState(269); - match(ADDRESS_MAINMEM); + match(ADDRESS_ZEROPAGE); } break; case 9: - _localctx = new DirectiveMemoryAreaAddressContext(_localctx); + _localctx = new DirectiveMemoryAreaMainContext(_localctx); enterOuterAlt(_localctx, 9); { setState(270); - match(ADDRESS); - setState(271); - match(PAR_BEGIN); - { - setState(272); - match(NUMBER); - } - setState(273); - match(PAR_END); + match(ADDRESS_MAINMEM); } break; case 10: - _localctx = new DirectiveFormSsaContext(_localctx); + _localctx = new DirectiveMemoryAreaAddressContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(274); - match(FORM_SSA); - } - break; - case 11: - _localctx = new DirectiveFormNotSsaContext(_localctx); - enterOuterAlt(_localctx, 11); - { - setState(275); - match(FORM_NOTSSA); - } - break; - case 12: - _localctx = new DirectiveMemoryAreaAddressContext(_localctx); - enterOuterAlt(_localctx, 12); - { - setState(276); + setState(271); match(ADDRESS); - setState(277); + setState(272); match(PAR_BEGIN); { - setState(278); + setState(273); match(NUMBER); } - setState(279); + setState(274); match(PAR_END); } break; + case 11: + _localctx = new DirectiveFormSsaContext(_localctx); + enterOuterAlt(_localctx, 11); + { + setState(275); + match(FORM_SSA); + } + break; + case 12: + _localctx = new DirectiveFormNotSsaContext(_localctx); + enterOuterAlt(_localctx, 12); + { + setState(276); + match(FORM_NOTSSA); + } + break; case 13: - _localctx = new DirectiveInlineContext(_localctx); + _localctx = new DirectiveMemoryAreaAddressContext(_localctx); enterOuterAlt(_localctx, 13); { + setState(277); + match(ADDRESS); + setState(278); + match(PAR_BEGIN); + { + setState(279); + match(NUMBER); + } setState(280); - match(INLINE); + match(PAR_END); } break; case 14: - _localctx = new DirectiveVolatileContext(_localctx); + _localctx = new DirectiveInlineContext(_localctx); enterOuterAlt(_localctx, 14); { setState(281); - match(VOLATILE); + match(INLINE); } break; case 15: - _localctx = new DirectiveNotVolatileContext(_localctx); + _localctx = new DirectiveVolatileContext(_localctx); enterOuterAlt(_localctx, 15); { setState(282); - match(NOTVOLATILE); + match(VOLATILE); } break; case 16: - _localctx = new DirectiveInterruptContext(_localctx); + _localctx = new DirectiveNotVolatileContext(_localctx); enterOuterAlt(_localctx, 16); { setState(283); + match(NOTVOLATILE); + } + break; + case 17: + _localctx = new DirectiveInterruptContext(_localctx); + enterOuterAlt(_localctx, 17); + { + setState(284); match(INTERRUPT); - setState(287); + setState(288); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(284); - match(PAR_BEGIN); setState(285); - match(NAME); + match(PAR_BEGIN); setState(286); + match(NAME); + setState(287); match(PAR_END); } break; } } break; - case 17: + case 18: _localctx = new DirectiveReserveZpContext(_localctx); - enterOuterAlt(_localctx, 17); + enterOuterAlt(_localctx, 18); { - setState(289); - match(RESERVE); setState(290); - match(PAR_BEGIN); + match(RESERVE); setState(291); + match(PAR_BEGIN); + setState(292); match(NUMBER); - setState(296); + setState(297); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(292); - match(COMMA); setState(293); + match(COMMA); + setState(294); match(NUMBER); } } - setState(298); + setState(299); _errHandler.sync(this); _la = _input.LA(1); } - setState(299); + setState(300); match(PAR_END); } break; - case 18: + case 19: _localctx = new DirectiveCallingConventionContext(_localctx); - enterOuterAlt(_localctx, 18); + enterOuterAlt(_localctx, 19); { - setState(300); + setState(301); match(CALLINGCONVENTION); } break; @@ -2184,20 +2210,20 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(304); + setState(305); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(303); + setState(304); stmt(); } } - setState(306); + setState(307); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)))) != 0) ); } } catch (RecognitionException re) { @@ -2535,16 +2561,16 @@ public class KickCParser extends Parser { enterRule(_localctx, 34, RULE_stmt); int _la; try { - setState(392); + setState(393); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { case 1: _localctx = new StmtDeclVarContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(308); - declVariables(); setState(309); + declVariables(); + setState(310); match(SEMICOLON); } break; @@ -2552,19 +2578,19 @@ public class KickCParser extends Parser { _localctx = new StmtBlockContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(311); + setState(312); match(CURLY_BEGIN); - setState(313); + setState(314); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)))) != 0)) { { - setState(312); + setState(313); stmtSeq(); } } - setState(315); + setState(316); match(CURLY_END); } break; @@ -2572,9 +2598,9 @@ public class KickCParser extends Parser { _localctx = new StmtExprContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(316); - commaExpr(0); setState(317); + commaExpr(0); + setState(318); match(SEMICOLON); } break; @@ -2582,24 +2608,24 @@ public class KickCParser extends Parser { _localctx = new StmtIfElseContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(319); - match(IF); setState(320); - match(PAR_BEGIN); + match(IF); setState(321); - commaExpr(0); + match(PAR_BEGIN); setState(322); - match(PAR_END); + commaExpr(0); setState(323); + match(PAR_END); + setState(324); stmt(); - setState(326); + setState(327); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: { - setState(324); - match(ELSE); setState(325); + match(ELSE); + setState(326); stmt(); } break; @@ -2610,29 +2636,29 @@ public class KickCParser extends Parser { _localctx = new StmtWhileContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(331); + setState(332); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (NOTREGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { + while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (NOTCONST - 41)) | (1L << (MAYBECONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { { { - setState(328); + setState(329); directive(); } } - setState(333); + setState(334); _errHandler.sync(this); _la = _input.LA(1); } - setState(334); - match(WHILE); setState(335); - match(PAR_BEGIN); + match(WHILE); setState(336); - commaExpr(0); + match(PAR_BEGIN); setState(337); - match(PAR_END); + commaExpr(0); setState(338); + match(PAR_END); + setState(339); stmt(); } break; @@ -2640,33 +2666,33 @@ public class KickCParser extends Parser { _localctx = new StmtDoWhileContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(343); + setState(344); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (NOTREGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { + while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (NOTCONST - 41)) | (1L << (MAYBECONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { { { - setState(340); + setState(341); directive(); } } - setState(345); + setState(346); _errHandler.sync(this); _la = _input.LA(1); } - setState(346); - match(DO); setState(347); - stmt(); + match(DO); setState(348); - match(WHILE); + stmt(); setState(349); - match(PAR_BEGIN); + match(WHILE); setState(350); - commaExpr(0); + match(PAR_BEGIN); setState(351); - match(PAR_END); + commaExpr(0); setState(352); + match(PAR_END); + setState(353); match(SEMICOLON); } break; @@ -2674,29 +2700,29 @@ public class KickCParser extends Parser { _localctx = new StmtForContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(357); + setState(358); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (NOTREGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { + while (((((_la - 41)) & ~0x3f) == 0 && ((1L << (_la - 41)) & ((1L << (RESERVE - 41)) | (1L << (CONST - 41)) | (1L << (NOTCONST - 41)) | (1L << (MAYBECONST - 41)) | (1L << (EXTERN - 41)) | (1L << (EXPORT - 41)) | (1L << (ALIGN - 41)) | (1L << (REGISTER - 41)) | (1L << (ADDRESS - 41)) | (1L << (ADDRESS_ZEROPAGE - 41)) | (1L << (ADDRESS_MAINMEM - 41)) | (1L << (FORM_SSA - 41)) | (1L << (FORM_NOTSSA - 41)) | (1L << (INLINE - 41)) | (1L << (VOLATILE - 41)) | (1L << (NOTVOLATILE - 41)) | (1L << (INTERRUPT - 41)) | (1L << (CALLINGCONVENTION - 41)))) != 0)) { { { - setState(354); + setState(355); directive(); } } - setState(359); + setState(360); _errHandler.sync(this); _la = _input.LA(1); } - setState(360); - match(FOR); setState(361); - match(PAR_BEGIN); + match(FOR); setState(362); - forLoop(); + match(PAR_BEGIN); setState(363); - match(PAR_END); + forLoop(); setState(364); + match(PAR_END); + setState(365); stmt(); } break; @@ -2704,19 +2730,19 @@ public class KickCParser extends Parser { _localctx = new StmtSwitchContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(366); - match(SWITCH); setState(367); - match(PAR_BEGIN); + match(SWITCH); setState(368); - commaExpr(0); + match(PAR_BEGIN); setState(369); - match(PAR_END); + commaExpr(0); setState(370); - match(CURLY_BEGIN); + match(PAR_END); setState(371); - switchCases(); + match(CURLY_BEGIN); setState(372); + switchCases(); + setState(373); match(CURLY_END); } break; @@ -2724,19 +2750,19 @@ public class KickCParser extends Parser { _localctx = new StmtReturnContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(374); + setState(375); match(RETURN); - setState(376); + setState(377); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)))) != 0)) { { - setState(375); + setState(376); commaExpr(0); } } - setState(378); + setState(379); match(SEMICOLON); } break; @@ -2744,9 +2770,9 @@ public class KickCParser extends Parser { _localctx = new StmtBreakContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(379); - match(BREAK); setState(380); + match(BREAK); + setState(381); match(SEMICOLON); } break; @@ -2754,9 +2780,9 @@ public class KickCParser extends Parser { _localctx = new StmtContinueContext(_localctx); enterOuterAlt(_localctx, 11); { - setState(381); - match(CONTINUE); setState(382); + match(CONTINUE); + setState(383); match(SEMICOLON); } break; @@ -2764,23 +2790,23 @@ public class KickCParser extends Parser { _localctx = new StmtAsmContext(_localctx); enterOuterAlt(_localctx, 12); { - setState(383); + setState(384); match(ASM); - setState(385); + setState(386); _errHandler.sync(this); _la = _input.LA(1); if (_la==PAR_BEGIN) { { - setState(384); + setState(385); asmDirectives(); } } - setState(387); - match(CURLY_BEGIN); setState(388); - asmLines(); + match(CURLY_BEGIN); setState(389); + asmLines(); + setState(390); match(ASM_CURLY_END); } break; @@ -2788,7 +2814,7 @@ public class KickCParser extends Parser { _localctx = new StmtDeclKasmContext(_localctx); enterOuterAlt(_localctx, 13); { - setState(391); + setState(392); declKasm(); } break; @@ -2843,35 +2869,35 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(395); + setState(396); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(394); + setState(395); switchCase(); } } - setState(397); + setState(398); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==CASE ); - setState(404); + setState(405); _errHandler.sync(this); _la = _input.LA(1); if (_la==DEFAULT) { { - setState(399); - match(DEFAULT); setState(400); + match(DEFAULT); + setState(401); match(COLON); - setState(402); + setState(403); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)))) != 0)) { { - setState(401); + setState(402); stmtSeq(); } } @@ -2927,18 +2953,18 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(406); - match(CASE); setState(407); - expr(0); + match(CASE); setState(408); + expr(0); + setState(409); match(COLON); - setState(410); + setState(411); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (IF - 65)) | (1L << (WHILE - 65)) | (1L << (DO - 65)) | (1L << (FOR - 65)) | (1L << (SWITCH - 65)) | (1L << (RETURN - 65)) | (1L << (BREAK - 65)) | (1L << (CONTINUE - 65)) | (1L << (ASM - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIZEOF - 65)) | (1L << (TYPEID - 65)) | (1L << (KICKASM - 65)) | (1L << (LOGIC_NOT - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)) | (1L << (BOOLEAN - 65)) | (1L << (STRING - 65)) | (1L << (CHAR - 65)) | (1L << (NUMBER - 65)) | (1L << (NAME - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (IF - 64)) | (1L << (WHILE - 64)) | (1L << (DO - 64)) | (1L << (FOR - 64)) | (1L << (SWITCH - 64)) | (1L << (RETURN - 64)) | (1L << (BREAK - 64)) | (1L << (CONTINUE - 64)) | (1L << (ASM - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIZEOF - 64)) | (1L << (TYPEID - 64)) | (1L << (KICKASM - 64)) | (1L << (LOGIC_NOT - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)) | (1L << (BOOLEAN - 64)) | (1L << (STRING - 64)) | (1L << (CHAR - 64)) | (1L << (NUMBER - 64)) | (1L << (NAME - 64)))) != 0)) { { - setState(409); + setState(410); stmtSeq(); } } @@ -3025,27 +3051,27 @@ public class KickCParser extends Parser { enterRule(_localctx, 40, RULE_forLoop); int _la; try { - setState(428); + setState(429); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,33,_ctx) ) { case 1: _localctx = new ForClassicContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(412); - forClassicInit(); setState(413); - match(SEMICOLON); + forClassicInit(); setState(414); - commaExpr(0); - setState(415); match(SEMICOLON); - setState(417); + setState(415); + commaExpr(0); + setState(416); + match(SEMICOLON); + setState(418); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)))) != 0)) { { - setState(416); + setState(417); commaExpr(0); } } @@ -3056,25 +3082,25 @@ public class KickCParser extends Parser { _localctx = new ForRangeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(420); + setState(421); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { { - setState(419); + setState(420); declTypes(); } } - setState(422); - match(NAME); setState(423); - match(COLON); + match(NAME); setState(424); - expr(0); + match(COLON); setState(425); - match(RANGE); + expr(0); setState(426); + match(RANGE); + setState(427); expr(0); } break; @@ -3146,19 +3172,19 @@ public class KickCParser extends Parser { enterRule(_localctx, 42, RULE_forClassicInit); int _la; try { - setState(434); + setState(435); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) { case 1: _localctx = new ForClassicInitDeclContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(431); + setState(432); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0)) { { - setState(430); + setState(431); declVariables(); } } @@ -3169,7 +3195,7 @@ public class KickCParser extends Parser { _localctx = new ForClassicInitExprContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(433); + setState(434); commaExpr(0); } break; @@ -3428,7 +3454,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(451); + setState(452); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: @@ -3437,11 +3463,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(437); - match(PAR_BEGIN); setState(438); - typeDecl(0); + match(PAR_BEGIN); setState(439); + typeDecl(0); + setState(440); match(PAR_END); } break; @@ -3450,7 +3476,7 @@ public class KickCParser extends Parser { _localctx = new TypeSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(441); + setState(442); match(SIMPLETYPE); } break; @@ -3459,14 +3485,14 @@ public class KickCParser extends Parser { _localctx = new TypeSignedSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(442); + setState(443); match(SIGNEDNESS); - setState(444); + setState(445); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { case 1: { - setState(443); + setState(444); match(SIMPLETYPE); } break; @@ -3478,7 +3504,7 @@ public class KickCParser extends Parser { _localctx = new TypeStructDefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(446); + setState(447); structDef(); } break; @@ -3487,7 +3513,7 @@ public class KickCParser extends Parser { _localctx = new TypeStructRefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(447); + setState(448); structRef(); } break; @@ -3496,7 +3522,7 @@ public class KickCParser extends Parser { _localctx = new TypeEnumDefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(448); + setState(449); enumDef(); } break; @@ -3505,7 +3531,7 @@ public class KickCParser extends Parser { _localctx = new TypeEnumRefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(449); + setState(450); enumRef(); } break; @@ -3514,13 +3540,13 @@ public class KickCParser extends Parser { _localctx = new TypeNamedRefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(450); + setState(451); match(TYPEDEFNAME); } break; } _ctx.stop = _input.LT(-1); - setState(466); + setState(467); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -3528,16 +3554,16 @@ public class KickCParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(464); + setState(465); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) { case 1: { _localctx = new TypePtrContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(453); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(454); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(455); match(ASTERISK); } break; @@ -3545,21 +3571,21 @@ public class KickCParser extends Parser { { _localctx = new TypeArrayContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(455); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(456); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(457); match(BRACKET_BEGIN); - setState(458); + setState(459); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)))) != 0)) { { - setState(457); + setState(458); expr(0); } } - setState(460); + setState(461); match(BRACKET_END); } break; @@ -3567,18 +3593,18 @@ public class KickCParser extends Parser { { _localctx = new TypeProcedureContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(461); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); setState(462); - match(PAR_BEGIN); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); setState(463); + match(PAR_BEGIN); + setState(464); match(PAR_END); } break; } } } - setState(468); + setState(469); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } @@ -3623,9 +3649,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(469); - match(STRUCT); setState(470); + match(STRUCT); + setState(471); match(NAME); } } @@ -3677,35 +3703,35 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(472); + setState(473); match(STRUCT); - setState(474); + setState(475); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(473); + setState(474); match(NAME); } } - setState(476); + setState(477); match(CURLY_BEGIN); - setState(478); + setState(479); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(477); + setState(478); structMembers(); } } - setState(480); + setState(481); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << NOTREGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE) | (1L << INTERRUPT))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (CALLINGCONVENTION - 65)) | (1L << (STRUCT - 65)) | (1L << (ENUM - 65)) | (1L << (SIGNEDNESS - 65)) | (1L << (SIMPLETYPE - 65)))) != 0) ); - setState(482); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TYPEDEFNAME) | (1L << PAR_BEGIN) | (1L << RESERVE) | (1L << CONST) | (1L << NOTCONST) | (1L << MAYBECONST) | (1L << EXTERN) | (1L << EXPORT) | (1L << ALIGN) | (1L << REGISTER) | (1L << ADDRESS) | (1L << ADDRESS_ZEROPAGE) | (1L << ADDRESS_MAINMEM) | (1L << FORM_SSA) | (1L << FORM_NOTSSA) | (1L << INLINE) | (1L << VOLATILE) | (1L << NOTVOLATILE))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (INTERRUPT - 64)) | (1L << (CALLINGCONVENTION - 64)) | (1L << (STRUCT - 64)) | (1L << (ENUM - 64)) | (1L << (SIGNEDNESS - 64)) | (1L << (SIMPLETYPE - 64)))) != 0) ); + setState(483); match(CURLY_END); } } @@ -3749,9 +3775,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(484); - declVariables(); setState(485); + declVariables(); + setState(486); match(SEMICOLON); } } @@ -3794,9 +3820,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(487); - match(ENUM); setState(488); + match(ENUM); + setState(489); match(NAME); } } @@ -3845,23 +3871,23 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(490); + setState(491); match(ENUM); - setState(492); + setState(493); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(491); + setState(492); match(NAME); } } - setState(494); - match(CURLY_BEGIN); setState(495); - enumMemberList(0); + match(CURLY_BEGIN); setState(496); + enumMemberList(0); + setState(497); match(CURLY_END); } } @@ -3919,11 +3945,11 @@ public class KickCParser extends Parser { enterOuterAlt(_localctx, 1); { { - setState(499); + setState(500); enumMember(); } _ctx.stop = _input.LT(-1); - setState(506); + setState(507); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -3934,16 +3960,16 @@ public class KickCParser extends Parser { { _localctx = new EnumMemberListContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_enumMemberList); - setState(501); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(502); - match(COMMA); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(503); + match(COMMA); + setState(504); enumMember(); } } } - setState(508); + setState(509); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } @@ -3990,16 +4016,16 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(509); + setState(510); match(NAME); - setState(512); + setState(513); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,45,_ctx) ) { case 1: { - setState(510); - match(ASSIGN); setState(511); + match(ASSIGN); + setState(512); expr(0); } break; @@ -4091,11 +4117,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(515); + setState(516); expr(0); } _ctx.stop = _input.LT(-1); - setState(522); + setState(523); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -4106,16 +4132,16 @@ public class KickCParser extends Parser { { _localctx = new CommaSimpleContext(new CommaExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_commaExpr); - setState(517); - if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(518); - match(COMMA); + if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); setState(519); + match(COMMA); + setState(520); expr(0); } } } - setState(524); + setState(525); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,46,_ctx); } @@ -4640,7 +4666,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(579); + setState(580); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) { case 1: @@ -4649,11 +4675,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(526); - match(PAR_BEGIN); setState(527); - commaExpr(0); + match(PAR_BEGIN); setState(528); + commaExpr(0); + setState(529); match(PAR_END); } break; @@ -4662,27 +4688,27 @@ public class KickCParser extends Parser { _localctx = new ExprSizeOfContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(530); - match(SIZEOF); setState(531); + match(SIZEOF); + setState(532); match(PAR_BEGIN); - setState(534); + setState(535); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,47,_ctx) ) { case 1: { - setState(532); + setState(533); expr(0); } break; case 2: { - setState(533); + setState(534); typeDecl(0); } break; } - setState(536); + setState(537); match(PAR_END); } break; @@ -4691,27 +4717,27 @@ public class KickCParser extends Parser { _localctx = new ExprTypeIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(538); - match(TYPEID); setState(539); + match(TYPEID); + setState(540); match(PAR_BEGIN); - setState(542); + setState(543); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,48,_ctx) ) { case 1: { - setState(540); + setState(541); expr(0); } break; case 2: { - setState(541); + setState(542); typeDecl(0); } break; } - setState(544); + setState(545); match(PAR_END); } break; @@ -4720,13 +4746,13 @@ public class KickCParser extends Parser { _localctx = new ExprCastContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(546); - match(PAR_BEGIN); setState(547); - typeDecl(0); + match(PAR_BEGIN); setState(548); - match(PAR_END); + typeDecl(0); setState(549); + match(PAR_END); + setState(550); expr(24); } break; @@ -4735,7 +4761,7 @@ public class KickCParser extends Parser { _localctx = new ExprPreModContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(551); + setState(552); _la = _input.LA(1); if ( !(_la==INC || _la==DEC) ) { _errHandler.recoverInline(this); @@ -4745,7 +4771,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(552); + setState(553); expr(23); } break; @@ -4754,9 +4780,9 @@ public class KickCParser extends Parser { _localctx = new ExprPtrContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(553); - match(ASTERISK); setState(554); + match(ASTERISK); + setState(555); expr(21); } break; @@ -4765,7 +4791,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(555); + setState(556); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << PLUS) | (1L << MINUS) | (1L << AND) | (1L << BIT_NOT))) != 0) || _la==LOGIC_NOT) ) { _errHandler.recoverInline(this); @@ -4775,7 +4801,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(556); + setState(557); expr(20); } break; @@ -4784,7 +4810,7 @@ public class KickCParser extends Parser { _localctx = new ExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(557); + setState(558); _la = _input.LA(1); if ( !(_la==LESS_THAN || _la==GREATER_THAN) ) { _errHandler.recoverInline(this); @@ -4794,7 +4820,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(558); + setState(559); expr(16); } break; @@ -4803,27 +4829,27 @@ public class KickCParser extends Parser { _localctx = new InitListContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(559); - match(CURLY_BEGIN); setState(560); + match(CURLY_BEGIN); + setState(561); expr(0); - setState(565); + setState(566); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(561); - match(COMMA); setState(562); + match(COMMA); + setState(563); expr(0); } } - setState(567); + setState(568); _errHandler.sync(this); _la = _input.LA(1); } - setState(568); + setState(569); match(CURLY_END); } break; @@ -4832,7 +4858,7 @@ public class KickCParser extends Parser { _localctx = new ExprIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(570); + setState(571); match(NAME); } break; @@ -4841,7 +4867,7 @@ public class KickCParser extends Parser { _localctx = new ExprNumberContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(571); + setState(572); match(NUMBER); } break; @@ -4850,7 +4876,7 @@ public class KickCParser extends Parser { _localctx = new ExprStringContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(573); + setState(574); _errHandler.sync(this); _alt = 1; do { @@ -4858,7 +4884,7 @@ public class KickCParser extends Parser { case 1: { { - setState(572); + setState(573); match(STRING); } } @@ -4866,7 +4892,7 @@ public class KickCParser extends Parser { default: throw new NoViableAltException(this); } - setState(575); + setState(576); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,50,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -4877,7 +4903,7 @@ public class KickCParser extends Parser { _localctx = new ExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(577); + setState(578); match(CHAR); } break; @@ -4886,13 +4912,13 @@ public class KickCParser extends Parser { _localctx = new ExprBoolContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(578); + setState(579); match(BOOLEAN); } break; } _ctx.stop = _input.LT(-1); - setState(641); + setState(642); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -4900,16 +4926,16 @@ public class KickCParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(639); + setState(640); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { case 1: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(581); - if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); setState(582); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + setState(583); _la = _input.LA(1); if ( !(_la==SHIFT_LEFT || _la==SHIFT_RIGHT) ) { _errHandler.recoverInline(this); @@ -4919,7 +4945,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(583); + setState(584); expr(20); } break; @@ -4927,9 +4953,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(584); - if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(585); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + setState(586); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << ASTERISK) | (1L << DIVIDE) | (1L << MODULO))) != 0)) ) { _errHandler.recoverInline(this); @@ -4939,7 +4965,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(586); + setState(587); expr(19); } break; @@ -4947,9 +4973,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(587); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(588); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + setState(589); _la = _input.LA(1); if ( !(_la==PLUS || _la==MINUS) ) { _errHandler.recoverInline(this); @@ -4959,7 +4985,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(589); + setState(590); expr(18); } break; @@ -4967,9 +4993,9 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(590); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(591); + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + setState(592); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << EQUAL) | (1L << NOT_EQUAL) | (1L << LESS_THAN) | (1L << LESS_THAN_EQUAL) | (1L << GREATER_THAN_EQUAL) | (1L << GREATER_THAN))) != 0)) ) { _errHandler.recoverInline(this); @@ -4979,7 +5005,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(592); + setState(593); expr(16); } break; @@ -4987,13 +5013,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(593); + setState(594); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); { - setState(594); + setState(595); match(AND); } - setState(595); + setState(596); expr(15); } break; @@ -5001,13 +5027,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(596); + setState(597); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); { - setState(597); + setState(598); match(BIT_XOR); } - setState(598); + setState(599); expr(14); } break; @@ -5015,13 +5041,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(599); + setState(600); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); { - setState(600); + setState(601); match(BIT_OR); } - setState(601); + setState(602); expr(13); } break; @@ -5029,13 +5055,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(602); + setState(603); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); { - setState(603); + setState(604); match(LOGIC_AND); } - setState(604); + setState(605); expr(12); } break; @@ -5043,13 +5069,13 @@ public class KickCParser extends Parser { { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(605); + setState(606); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(606); + setState(607); match(LOGIC_OR); } - setState(607); + setState(608); expr(11); } break; @@ -5057,15 +5083,15 @@ public class KickCParser extends Parser { { _localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(608); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(609); - match(CONDITION); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(610); - expr(0); + match(CONDITION); setState(611); - match(COLON); + expr(0); setState(612); + match(COLON); + setState(613); expr(10); } break; @@ -5073,11 +5099,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(614); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(615); - match(ASSIGN); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(616); + match(ASSIGN); + setState(617); expr(8); } break; @@ -5085,11 +5111,11 @@ public class KickCParser extends Parser { { _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(617); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(618); - match(ASSIGN_COMPOUND); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(619); + match(ASSIGN_COMPOUND); + setState(620); expr(7); } break; @@ -5097,11 +5123,11 @@ public class KickCParser extends Parser { { _localctx = new ExprDotContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(620); - if (!(precpred(_ctx, 30))) throw new FailedPredicateException(this, "precpred(_ctx, 30)"); setState(621); - match(DOT); + if (!(precpred(_ctx, 30))) throw new FailedPredicateException(this, "precpred(_ctx, 30)"); setState(622); + match(DOT); + setState(623); match(NAME); } break; @@ -5109,11 +5135,11 @@ public class KickCParser extends Parser { { _localctx = new ExprArrowContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(623); - if (!(precpred(_ctx, 29))) throw new FailedPredicateException(this, "precpred(_ctx, 29)"); setState(624); - match(ARROW); + if (!(precpred(_ctx, 29))) throw new FailedPredicateException(this, "precpred(_ctx, 29)"); setState(625); + match(ARROW); + setState(626); match(NAME); } break; @@ -5121,21 +5147,21 @@ public class KickCParser extends Parser { { _localctx = new ExprCallContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(626); - if (!(precpred(_ctx, 28))) throw new FailedPredicateException(this, "precpred(_ctx, 28)"); setState(627); + if (!(precpred(_ctx, 28))) throw new FailedPredicateException(this, "precpred(_ctx, 28)"); + setState(628); match(PAR_BEGIN); - setState(629); + setState(630); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (SIZEOF - 80)) | (1L << (TYPEID - 80)) | (1L << (LOGIC_NOT - 80)) | (1L << (BOOLEAN - 80)) | (1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << CURLY_BEGIN) | (1L << PAR_BEGIN) | (1L << PLUS) | (1L << MINUS) | (1L << ASTERISK) | (1L << INC) | (1L << DEC) | (1L << AND) | (1L << BIT_NOT) | (1L << LESS_THAN) | (1L << GREATER_THAN))) != 0) || ((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (SIZEOF - 81)) | (1L << (TYPEID - 81)) | (1L << (LOGIC_NOT - 81)) | (1L << (BOOLEAN - 81)) | (1L << (STRING - 81)) | (1L << (CHAR - 81)) | (1L << (NUMBER - 81)) | (1L << (NAME - 81)))) != 0)) { { - setState(628); + setState(629); parameterList(); } } - setState(631); + setState(632); match(PAR_END); } break; @@ -5143,13 +5169,13 @@ public class KickCParser extends Parser { { _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(632); - if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); setState(633); - match(BRACKET_BEGIN); + if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); setState(634); - commaExpr(0); + match(BRACKET_BEGIN); setState(635); + commaExpr(0); + setState(636); match(BRACKET_END); } break; @@ -5157,9 +5183,9 @@ public class KickCParser extends Parser { { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(637); - if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); setState(638); + if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); + setState(639); _la = _input.LA(1); if ( !(_la==INC || _la==DEC) ) { _errHandler.recoverInline(this); @@ -5174,7 +5200,7 @@ public class KickCParser extends Parser { } } } - setState(643); + setState(644); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,54,_ctx); } @@ -5228,21 +5254,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(644); + setState(645); expr(0); - setState(649); + setState(650); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(645); - match(COMMA); setState(646); + match(COMMA); + setState(647); expr(0); } } - setState(651); + setState(652); _errHandler.sync(this); _la = _input.LA(1); } @@ -5291,19 +5317,19 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(652); + setState(653); match(KICKASM); - setState(654); + setState(655); _errHandler.sync(this); _la = _input.LA(1); if (_la==PAR_BEGIN) { { - setState(653); + setState(654); asmDirectives(); } } - setState(656); + setState(657); match(KICKASM_BODY); } } @@ -5357,27 +5383,27 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(658); - match(PAR_BEGIN); setState(659); + match(PAR_BEGIN); + setState(660); asmDirective(); - setState(664); + setState(665); _errHandler.sync(this); _la = _input.LA(1); while (_la==COMMA) { { { - setState(660); - match(COMMA); setState(661); + match(COMMA); + setState(662); asmDirective(); } } - setState(666); + setState(667); _errHandler.sync(this); _la = _input.LA(1); } - setState(667); + setState(668); match(PAR_END); } } @@ -5523,16 +5549,16 @@ public class KickCParser extends Parser { AsmDirectiveContext _localctx = new AsmDirectiveContext(_ctx, getState()); enterRule(_localctx, 70, RULE_asmDirective); try { - setState(684); + setState(685); _errHandler.sync(this); switch (_input.LA(1)) { case RESOURCE: _localctx = new AsmDirectiveResourceContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(669); - match(RESOURCE); setState(670); + match(RESOURCE); + setState(671); match(STRING); } break; @@ -5540,9 +5566,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveUsesContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(671); - match(USES); setState(672); + match(USES); + setState(673); match(NAME); } break; @@ -5550,9 +5576,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveClobberContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(673); - match(CLOBBERS); setState(674); + match(CLOBBERS); + setState(675); match(STRING); } break; @@ -5560,9 +5586,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveBytesContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(675); - match(BYTES); setState(676); + match(BYTES); + setState(677); expr(0); } break; @@ -5570,9 +5596,9 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveCyclesContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(677); - match(CYCLES); setState(678); + match(CYCLES); + setState(679); expr(0); } break; @@ -5580,14 +5606,14 @@ public class KickCParser extends Parser { _localctx = new AsmDirectiveAddressContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(679); + setState(680); match(PC); - setState(682); + setState(683); _errHandler.sync(this); switch (_input.LA(1)) { case INLINE: { - setState(680); + setState(681); match(INLINE); } break; @@ -5611,7 +5637,7 @@ public class KickCParser extends Parser { case NUMBER: case NAME: { - setState(681); + setState(682); expr(0); } break; @@ -5668,17 +5694,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(689); + setState(690); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 108)) & ~0x3f) == 0 && ((1L << (_la - 108)) & ((1L << (ASM_BYTE - 108)) | (1L << (ASM_MNEMONIC - 108)) | (1L << (ASM_MULTI_NAME - 108)) | (1L << (ASM_NAME - 108)))) != 0)) { + while (((((_la - 109)) & ~0x3f) == 0 && ((1L << (_la - 109)) & ((1L << (ASM_BYTE - 109)) | (1L << (ASM_MNEMONIC - 109)) | (1L << (ASM_MULTI_NAME - 109)) | (1L << (ASM_NAME - 109)))) != 0)) { { { - setState(686); + setState(687); asmLine(); } } - setState(691); + setState(692); _errHandler.sync(this); _la = _input.LA(1); } @@ -5728,28 +5754,28 @@ public class KickCParser extends Parser { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); enterRule(_localctx, 74, RULE_asmLine); try { - setState(695); + setState(696); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_MULTI_NAME: case ASM_NAME: enterOuterAlt(_localctx, 1); { - setState(692); + setState(693); asmLabel(); } break; case ASM_MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(693); + setState(694); asmInstruction(); } break; case ASM_BYTE: enterOuterAlt(_localctx, 3); { - setState(694); + setState(695); asmBytes(); } break; @@ -5820,16 +5846,16 @@ public class KickCParser extends Parser { AsmLabelContext _localctx = new AsmLabelContext(_ctx, getState()); enterRule(_localctx, 76, RULE_asmLabel); try { - setState(701); + setState(702); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_NAME: _localctx = new AsmLabelNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(697); - match(ASM_NAME); setState(698); + match(ASM_NAME); + setState(699); match(ASM_COLON); } break; @@ -5837,9 +5863,9 @@ public class KickCParser extends Parser { _localctx = new AsmLabelMultiContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(699); - match(ASM_MULTI_NAME); setState(700); + match(ASM_MULTI_NAME); + setState(701); match(ASM_COLON); } break; @@ -5888,14 +5914,14 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(703); + setState(704); match(ASM_MNEMONIC); - setState(705); + setState(706); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,63,_ctx) ) { case 1: { - setState(704); + setState(705); asmParamMode(); } break; @@ -5951,23 +5977,23 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(707); - match(ASM_BYTE); setState(708); + match(ASM_BYTE); + setState(709); asmExpr(0); - setState(713); + setState(714); _errHandler.sync(this); _la = _input.LA(1); while (_la==ASM_COMMA) { { { - setState(709); - match(ASM_COMMA); setState(710); + match(ASM_COMMA); + setState(711); asmExpr(0); } } - setState(715); + setState(716); _errHandler.sync(this); _la = _input.LA(1); } @@ -6127,14 +6153,14 @@ public class KickCParser extends Parser { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); enterRule(_localctx, 82, RULE_asmParamMode); try { - setState(739); + setState(740); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(716); + setState(717); asmExpr(0); } break; @@ -6142,9 +6168,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(717); - match(ASM_IMM); setState(718); + match(ASM_IMM); + setState(719); asmExpr(0); } break; @@ -6152,11 +6178,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(719); - asmExpr(0); setState(720); - match(ASM_COMMA); + asmExpr(0); setState(721); + match(ASM_COMMA); + setState(722); match(ASM_NAME); } break; @@ -6164,15 +6190,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(723); - match(ASM_PAR_BEGIN); setState(724); - asmExpr(0); + match(ASM_PAR_BEGIN); setState(725); - match(ASM_PAR_END); + asmExpr(0); setState(726); - match(ASM_COMMA); + match(ASM_PAR_END); setState(727); + match(ASM_COMMA); + setState(728); match(ASM_NAME); } break; @@ -6180,15 +6206,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIdxIndXYContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(729); - match(ASM_PAR_BEGIN); setState(730); - asmExpr(0); + match(ASM_PAR_BEGIN); setState(731); - match(ASM_COMMA); + asmExpr(0); setState(732); - match(ASM_NAME); + match(ASM_COMMA); setState(733); + match(ASM_NAME); + setState(734); match(ASM_PAR_END); } break; @@ -6196,11 +6222,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(735); - match(ASM_PAR_BEGIN); setState(736); - asmExpr(0); + match(ASM_PAR_BEGIN); setState(737); + asmExpr(0); + setState(738); match(ASM_PAR_END); } break; @@ -6405,7 +6431,7 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(755); + setState(756); _errHandler.sync(this); switch (_input.LA(1)) { case ASM_BRACKET_BEGIN: @@ -6414,11 +6440,11 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(742); - match(ASM_BRACKET_BEGIN); setState(743); - asmExpr(0); + match(ASM_BRACKET_BEGIN); setState(744); + asmExpr(0); + setState(745); match(ASM_BRACKET_END); } break; @@ -6430,9 +6456,9 @@ public class KickCParser extends Parser { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(746); + setState(747); _la = _input.LA(1); - if ( !(((((_la - 120)) & ~0x3f) == 0 && ((1L << (_la - 120)) & ((1L << (ASM_PLUS - 120)) | (1L << (ASM_MINUS - 120)) | (1L << (ASM_LESS_THAN - 120)) | (1L << (ASM_GREATER_THAN - 120)))) != 0)) ) { + if ( !(((((_la - 121)) & ~0x3f) == 0 && ((1L << (_la - 121)) & ((1L << (ASM_PLUS - 121)) | (1L << (ASM_MINUS - 121)) | (1L << (ASM_LESS_THAN - 121)) | (1L << (ASM_GREATER_THAN - 121)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -6440,7 +6466,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(747); + setState(748); asmExpr(8); } break; @@ -6449,7 +6475,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(748); + setState(749); match(ASM_NAME); } break; @@ -6458,7 +6484,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(749); + setState(750); match(ASM_MULTI_REL); } break; @@ -6467,11 +6493,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(750); - match(ASM_CURLY_BEGIN); setState(751); - match(ASM_NAME); + match(ASM_CURLY_BEGIN); setState(752); + match(ASM_NAME); + setState(753); match(ASM_CURLY_END); } break; @@ -6480,7 +6506,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(753); + setState(754); match(ASM_NUMBER); } break; @@ -6489,7 +6515,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(754); + setState(755); match(ASM_CHAR); } break; @@ -6497,7 +6523,7 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(771); + setState(772); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,68,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -6505,20 +6531,20 @@ public class KickCParser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(769); + setState(770); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,67,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(757); + setState(758); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(758); + setState(759); match(ASM_DOT); } - setState(759); + setState(760); asmExpr(11); } break; @@ -6526,9 +6552,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(760); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(761); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(762); _la = _input.LA(1); if ( !(_la==ASM_SHIFT_LEFT || _la==ASM_SHIFT_RIGHT) ) { _errHandler.recoverInline(this); @@ -6538,7 +6564,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(762); + setState(763); asmExpr(10); } break; @@ -6546,9 +6572,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(763); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(764); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(765); _la = _input.LA(1); if ( !(_la==ASM_MULTIPLY || _la==ASM_DIVIDE) ) { _errHandler.recoverInline(this); @@ -6558,7 +6584,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(765); + setState(766); asmExpr(8); } break; @@ -6566,9 +6592,9 @@ public class KickCParser extends Parser { { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(766); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); setState(767); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(768); _la = _input.LA(1); if ( !(_la==ASM_PLUS || _la==ASM_MINUS) ) { _errHandler.recoverInline(this); @@ -6578,14 +6604,14 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(768); + setState(769); asmExpr(7); } break; } } } - setState(773); + setState(774); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,68,_ctx); } @@ -6705,7 +6731,7 @@ public class KickCParser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0091\u0309\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0092\u030a\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"+ @@ -6724,288 +6750,288 @@ public class KickCParser extends Parser { "\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\5\20\u00ff\n\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\3\21\5\21\u010c\n\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\5\21"+ - "\u0122\n\21\3\21\3\21\3\21\3\21\3\21\7\21\u0129\n\21\f\21\16\21\u012c"+ - "\13\21\3\21\3\21\5\21\u0130\n\21\3\22\6\22\u0133\n\22\r\22\16\22\u0134"+ - "\3\23\3\23\3\23\3\23\3\23\5\23\u013c\n\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\5\23\u0149\n\23\3\23\7\23\u014c\n\23\f\23\16"+ - "\23\u014f\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0158\n\23\f\23"+ - "\16\23\u015b\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0166"+ - "\n\23\f\23\16\23\u0169\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ - "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u017b\n\23\3\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\5\23\u0184\n\23\3\23\3\23\3\23\3\23\3\23\5\23\u018b"+ - "\n\23\3\24\6\24\u018e\n\24\r\24\16\24\u018f\3\24\3\24\3\24\5\24\u0195"+ - "\n\24\5\24\u0197\n\24\3\25\3\25\3\25\3\25\5\25\u019d\n\25\3\26\3\26\3"+ - "\26\3\26\3\26\5\26\u01a4\n\26\3\26\5\26\u01a7\n\26\3\26\3\26\3\26\3\26"+ - "\3\26\3\26\5\26\u01af\n\26\3\27\5\27\u01b2\n\27\3\27\5\27\u01b5\n\27\3"+ - "\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u01bf\n\30\3\30\3\30\3\30"+ - "\3\30\3\30\5\30\u01c6\n\30\3\30\3\30\3\30\3\30\3\30\5\30\u01cd\n\30\3"+ - "\30\3\30\3\30\3\30\7\30\u01d3\n\30\f\30\16\30\u01d6\13\30\3\31\3\31\3"+ - "\31\3\32\3\32\5\32\u01dd\n\32\3\32\3\32\6\32\u01e1\n\32\r\32\16\32\u01e2"+ - "\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\5\35\u01ef\n\35\3\35"+ - "\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u01fb\n\36\f\36\16"+ - "\36\u01fe\13\36\3\37\3\37\3\37\5\37\u0203\n\37\3 \3 \3 \3 \3 \3 \7 \u020b"+ - "\n \f \16 \u020e\13 \3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0219\n!\3!\3!\3!\3"+ - "!\3!\3!\5!\u0221\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3"+ - "!\3!\3!\7!\u0236\n!\f!\16!\u0239\13!\3!\3!\3!\3!\3!\6!\u0240\n!\r!\16"+ - "!\u0241\3!\3!\5!\u0246\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3"+ + "\3\21\3\21\3\21\3\21\3\21\3\21\5\21\u010e\n\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\5\21\u0123\n\21\3\21\3\21\3\21\3\21\3\21\7\21\u012a\n\21\f\21\16\21\u012d"+ + "\13\21\3\21\3\21\5\21\u0131\n\21\3\22\6\22\u0134\n\22\r\22\16\22\u0135"+ + "\3\23\3\23\3\23\3\23\3\23\5\23\u013d\n\23\3\23\3\23\3\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\5\23\u014a\n\23\3\23\7\23\u014d\n\23\f\23\16"+ + "\23\u0150\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0159\n\23\f\23"+ + "\16\23\u015c\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0167"+ + "\n\23\f\23\16\23\u016a\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ + "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u017c\n\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\5\23\u0185\n\23\3\23\3\23\3\23\3\23\3\23\5\23\u018c"+ + "\n\23\3\24\6\24\u018f\n\24\r\24\16\24\u0190\3\24\3\24\3\24\5\24\u0196"+ + "\n\24\5\24\u0198\n\24\3\25\3\25\3\25\3\25\5\25\u019e\n\25\3\26\3\26\3"+ + "\26\3\26\3\26\5\26\u01a5\n\26\3\26\5\26\u01a8\n\26\3\26\3\26\3\26\3\26"+ + "\3\26\3\26\5\26\u01b0\n\26\3\27\5\27\u01b3\n\27\3\27\5\27\u01b6\n\27\3"+ + "\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u01c0\n\30\3\30\3\30\3\30"+ + "\3\30\3\30\5\30\u01c7\n\30\3\30\3\30\3\30\3\30\3\30\5\30\u01ce\n\30\3"+ + "\30\3\30\3\30\3\30\7\30\u01d4\n\30\f\30\16\30\u01d7\13\30\3\31\3\31\3"+ + "\31\3\32\3\32\5\32\u01de\n\32\3\32\3\32\6\32\u01e2\n\32\r\32\16\32\u01e3"+ + "\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\5\35\u01f0\n\35\3\35"+ + "\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\7\36\u01fc\n\36\f\36\16"+ + "\36\u01ff\13\36\3\37\3\37\3\37\5\37\u0204\n\37\3 \3 \3 \3 \3 \3 \7 \u020c"+ + "\n \f \16 \u020f\13 \3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u021a\n!\3!\3!\3!\3"+ + "!\3!\3!\5!\u0222\n!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3"+ + "!\3!\3!\7!\u0237\n!\f!\16!\u023a\13!\3!\3!\3!\3!\3!\6!\u0241\n!\r!\16"+ + "!\u0242\3!\3!\5!\u0247\n!\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!\3!\3!\3!\3!\3!\5!\u0278\n!\3!\3!\3!\3!\3!\3!\3!\3!\7"+ - "!\u0282\n!\f!\16!\u0285\13!\3\"\3\"\3\"\7\"\u028a\n\"\f\"\16\"\u028d\13"+ - "\"\3#\3#\5#\u0291\n#\3#\3#\3$\3$\3$\3$\7$\u0299\n$\f$\16$\u029c\13$\3"+ - "$\3$\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02ad\n%\5%\u02af\n%\3"+ - "&\7&\u02b2\n&\f&\16&\u02b5\13&\3\'\3\'\3\'\5\'\u02ba\n\'\3(\3(\3(\3(\5"+ - "(\u02c0\n(\3)\3)\5)\u02c4\n)\3*\3*\3*\3*\7*\u02ca\n*\f*\16*\u02cd\13*"+ + "!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0279\n!\3!\3!\3!\3!\3!\3!\3!\3!\7"+ + "!\u0283\n!\f!\16!\u0286\13!\3\"\3\"\3\"\7\"\u028b\n\"\f\"\16\"\u028e\13"+ + "\"\3#\3#\5#\u0292\n#\3#\3#\3$\3$\3$\3$\7$\u029a\n$\f$\16$\u029d\13$\3"+ + "$\3$\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\3%\5%\u02ae\n%\5%\u02b0\n%\3"+ + "&\7&\u02b3\n&\f&\16&\u02b6\13&\3\'\3\'\3\'\5\'\u02bb\n\'\3(\3(\3(\3(\5"+ + "(\u02c1\n(\3)\3)\5)\u02c5\n)\3*\3*\3*\3*\7*\u02cb\n*\f*\16*\u02ce\13*"+ "\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+\3+"+ - "\5+\u02e6\n+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u02f6\n,\3,"+ - "\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\7,\u0304\n,\f,\16,\u0307\13,\3,\2\b"+ + "\5+\u02e7\n+\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\5,\u02f7\n,\3,"+ + "\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\3,\7,\u0305\n,\f,\16,\u0308\13,\3,\2\b"+ "\24.:>@V-\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\66"+ - "8:<>@BDFHJLNPRTV\2\r\3\2\26\27\5\2\21\22\30\31ZZ\4\2 ##\3\2\34\35\3\2"+ - "\23\25\3\2\21\22\3\2\36#\3\2z}\3\2xy\3\2~\177\3\2z{\2\u037b\2X\3\2\2\2"+ - "\4[\3\2\2\2\6a\3\2\2\2\bf\3\2\2\2\nh\3\2\2\2\fz\3\2\2\2\16|\3\2\2\2\20"+ - "\u0084\3\2\2\2\22\u008e\3\2\2\2\24\u0091\3\2\2\2\26\u00a4\3\2\2\2\30\u00a6"+ - "\3\2\2\2\32\u00b3\3\2\2\2\34\u00bf\3\2\2\2\36\u00fe\3\2\2\2 \u012f\3\2"+ - "\2\2\"\u0132\3\2\2\2$\u018a\3\2\2\2&\u018d\3\2\2\2(\u0198\3\2\2\2*\u01ae"+ - "\3\2\2\2,\u01b4\3\2\2\2.\u01c5\3\2\2\2\60\u01d7\3\2\2\2\62\u01da\3\2\2"+ - "\2\64\u01e6\3\2\2\2\66\u01e9\3\2\2\28\u01ec\3\2\2\2:\u01f4\3\2\2\2<\u01ff"+ - "\3\2\2\2>\u0204\3\2\2\2@\u0245\3\2\2\2B\u0286\3\2\2\2D\u028e\3\2\2\2F"+ - "\u0294\3\2\2\2H\u02ae\3\2\2\2J\u02b3\3\2\2\2L\u02b9\3\2\2\2N\u02bf\3\2"+ - "\2\2P\u02c1\3\2\2\2R\u02c5\3\2\2\2T\u02e5\3\2\2\2V\u02f5\3\2\2\2XY\5\6"+ - "\4\2YZ\7\2\2\3Z\3\3\2\2\2[\\\5J&\2\\]\7\2\2\3]\5\3\2\2\2^`\5\b\5\2_^\3"+ - "\2\2\2`c\3\2\2\2a_\3\2\2\2ab\3\2\2\2b\7\3\2\2\2ca\3\2\2\2dg\5\f\7\2eg"+ - "\5\n\6\2fd\3\2\2\2fe\3\2\2\2g\t\3\2\2\2hi\7(\2\2ij\7_\2\2j\13\3\2\2\2"+ - "kl\5\22\n\2lm\7\n\2\2m{\3\2\2\2no\5\62\32\2op\7\n\2\2p{\3\2\2\2qr\58\35"+ - "\2rs\7\n\2\2s{\3\2\2\2t{\5\30\r\2u{\5D#\2v{\5\36\20\2wx\5\16\b\2xy\7\n"+ - "\2\2y{\3\2\2\2zk\3\2\2\2zn\3\2\2\2zq\3\2\2\2zt\3\2\2\2zu\3\2\2\2zv\3\2"+ - "\2\2zw\3\2\2\2{\r\3\2\2\2|}\7)\2\2}~\5.\30\2~\177\7j\2\2\177\u0080\b\b"+ - "\1\2\u0080\17\3\2\2\2\u0081\u0083\5 \21\2\u0082\u0081\3\2\2\2\u0083\u0086"+ - "\3\2\2\2\u0084\u0082\3\2\2\2\u0084\u0085\3\2\2\2\u0085\u0087\3\2\2\2\u0086"+ - "\u0084\3\2\2\2\u0087\u008b\5.\30\2\u0088\u008a\5 \21\2\u0089\u0088\3\2"+ - "\2\2\u008a\u008d\3\2\2\2\u008b\u0089\3\2\2\2\u008b\u008c\3\2\2\2\u008c"+ - "\21\3\2\2\2\u008d\u008b\3\2\2\2\u008e\u008f\5\20\t\2\u008f\u0090\5\24"+ - "\13\2\u0090\23\3\2\2\2\u0091\u0092\b\13\1\2\u0092\u0093\5\26\f\2\u0093"+ - "\u0099\3\2\2\2\u0094\u0095\f\3\2\2\u0095\u0096\7\f\2\2\u0096\u0098\5\26"+ - "\f\2\u0097\u0094\3\2\2\2\u0098\u009b\3\2\2\2\u0099\u0097\3\2\2\2\u0099"+ - "\u009a\3\2\2\2\u009a\25\3\2\2\2\u009b\u0099\3\2\2\2\u009c\u009f\7j\2\2"+ - "\u009d\u009e\7&\2\2\u009e\u00a0\5@!\2\u009f\u009d\3\2\2\2\u009f\u00a0"+ - "\3\2\2\2\u00a0\u00a5\3\2\2\2\u00a1\u00a2\7j\2\2\u00a2\u00a3\7&\2\2\u00a3"+ - "\u00a5\5D#\2\u00a4\u009c\3\2\2\2\u00a4\u00a1\3\2\2\2\u00a5\27\3\2\2\2"+ - "\u00a6\u00a7\5\20\t\2\u00a7\u00a8\7j\2\2\u00a8\u00aa\7\b\2\2\u00a9\u00ab"+ - "\5\32\16\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab\u00ac\3\2\2\2"+ - "\u00ac\u00ad\7\t\2\2\u00ad\u00af\7\4\2\2\u00ae\u00b0\5\"\22\2\u00af\u00ae"+ - "\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\7\5\2\2\u00b2"+ - "\31\3\2\2\2\u00b3\u00b8\5\34\17\2\u00b4\u00b5\7\f\2\2\u00b5\u00b7\5\34"+ - "\17\2\u00b6\u00b4\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8"+ - "\u00b9\3\2\2\2\u00b9\33\3\2\2\2\u00ba\u00b8\3\2\2\2\u00bb\u00bc\5\20\t"+ - "\2\u00bc\u00bd\7j\2\2\u00bd\u00c0\3\2\2\2\u00be\u00c0\7\\\2\2\u00bf\u00bb"+ - "\3\2\2\2\u00bf\u00be\3\2\2\2\u00c0\35\3\2\2\2\u00c1\u00c2\7*\2\2\u00c2"+ - "\u00c3\7+\2\2\u00c3\u00c4\3\2\2\2\u00c4\u00c5\7\b\2\2\u00c5\u00ca\7a\2"+ - "\2\u00c6\u00c7\7\f\2\2\u00c7\u00c9\7a\2\2\u00c8\u00c6\3\2\2\2\u00c9\u00cc"+ - "\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb\u00cd\3\2\2\2\u00cc"+ - "\u00ca\3\2\2\2\u00cd\u00ff\7\t\2\2\u00ce\u00cf\7*\2\2\u00cf\u00d0\7,\2"+ - "\2\u00d0\u00d1\3\2\2\2\u00d1\u00d2\7\b\2\2\u00d2\u00d3\7a\2\2\u00d3\u00ff"+ - "\7\t\2\2\u00d4\u00d5\7*\2\2\u00d5\u00d6\7-\2\2\u00d6\u00d7\3\2\2\2\u00d7"+ - "\u00d8\7\b\2\2\u00d8\u00d9\7j\2\2\u00d9\u00ff\7\t\2\2\u00da\u00db\7*\2"+ - "\2\u00db\u00dc\7/\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00de\7\b\2\2\u00de\u00df"+ - "\7j\2\2\u00df\u00ff\7\t\2\2\u00e0\u00e1\7*\2\2\u00e1\u00e2\7.\2\2\u00e2"+ - "\u00e3\3\2\2\2\u00e3\u00e4\7\b\2\2\u00e4\u00e5\7_\2\2\u00e5\u00ff\7\t"+ - "\2\2\u00e6\u00e7\7*\2\2\u00e7\u00e8\7\60\2\2\u00e8\u00e9\3\2\2\2\u00e9"+ - "\u00ea\7\b\2\2\u00ea\u00eb\7j\2\2\u00eb\u00ff\7\t\2\2\u00ec\u00ed\7*\2"+ - "\2\u00ed\u00ee\7\61\2\2\u00ee\u00ef\3\2\2\2\u00ef\u00f0\7\b\2\2\u00f0"+ - "\u00f1\7j\2\2\u00f1\u00ff\7\t\2\2\u00f2\u00f3\7*\2\2\u00f3\u00f4\7\62"+ - "\2\2\u00f4\u00f5\3\2\2\2\u00f5\u00f6\7\b\2\2\u00f6\u00f7\7j\2\2\u00f7"+ - "\u00ff\7\t\2\2\u00f8\u00f9\7*\2\2\u00f9\u00fa\7B\2\2\u00fa\u00fb\3\2\2"+ - "\2\u00fb\u00fc\7\b\2\2\u00fc\u00fd\7C\2\2\u00fd\u00ff\7\t\2\2\u00fe\u00c1"+ - "\3\2\2\2\u00fe\u00ce\3\2\2\2\u00fe\u00d4\3\2\2\2\u00fe\u00da\3\2\2\2\u00fe"+ - "\u00e0\3\2\2\2\u00fe\u00e6\3\2\2\2\u00fe\u00ec\3\2\2\2\u00fe\u00f2\3\2"+ - "\2\2\u00fe\u00f8\3\2\2\2\u00ff\37\3\2\2\2\u0100\u0130\7\63\2\2\u0101\u0130"+ - "\7\64\2\2\u0102\u0130\7\65\2\2\u0103\u0104\7\66\2\2\u0104\u0105\7\b\2"+ - "\2\u0105\u0106\7a\2\2\u0106\u0130\7\t\2\2\u0107\u010b\7\67\2\2\u0108\u0109"+ - "\7\b\2\2\u0109\u010a\7j\2\2\u010a\u010c\7\t\2\2\u010b\u0108\3\2\2\2\u010b"+ - "\u010c\3\2\2\2\u010c\u0130\3\2\2\2\u010d\u0130\78\2\2\u010e\u0130\7:\2"+ - "\2\u010f\u0130\7;\2\2\u0110\u0111\79\2\2\u0111\u0112\7\b\2\2\u0112\u0113"+ - "\7a\2\2\u0113\u0130\7\t\2\2\u0114\u0130\7<\2\2\u0115\u0130\7=\2\2\u0116"+ - "\u0117\79\2\2\u0117\u0118\7\b\2\2\u0118\u0119\7a\2\2\u0119\u0130\7\t\2"+ - "\2\u011a\u0130\7>\2\2\u011b\u0130\7?\2\2\u011c\u0130\7@\2\2\u011d\u0121"+ - "\7A\2\2\u011e\u011f\7\b\2\2\u011f\u0120\7j\2\2\u0120\u0122\7\t\2\2\u0121"+ - "\u011e\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u0130\3\2\2\2\u0123\u0124\7+"+ - "\2\2\u0124\u0125\7\b\2\2\u0125\u012a\7a\2\2\u0126\u0127\7\f\2\2\u0127"+ - "\u0129\7a\2\2\u0128\u0126\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u0128\3\2"+ - "\2\2\u012a\u012b\3\2\2\2\u012b\u012d\3\2\2\2\u012c\u012a\3\2\2\2\u012d"+ - "\u0130\7\t\2\2\u012e\u0130\7C\2\2\u012f\u0100\3\2\2\2\u012f\u0101\3\2"+ - "\2\2\u012f\u0102\3\2\2\2\u012f\u0103\3\2\2\2\u012f\u0107\3\2\2\2\u012f"+ - "\u010d\3\2\2\2\u012f\u010e\3\2\2\2\u012f\u010f\3\2\2\2\u012f\u0110\3\2"+ - "\2\2\u012f\u0114\3\2\2\2\u012f\u0115\3\2\2\2\u012f\u0116\3\2\2\2\u012f"+ - "\u011a\3\2\2\2\u012f\u011b\3\2\2\2\u012f\u011c\3\2\2\2\u012f\u011d\3\2"+ - "\2\2\u012f\u0123\3\2\2\2\u012f\u012e\3\2\2\2\u0130!\3\2\2\2\u0131\u0133"+ - "\5$\23\2\u0132\u0131\3\2\2\2\u0133\u0134\3\2\2\2\u0134\u0132\3\2\2\2\u0134"+ - "\u0135\3\2\2\2\u0135#\3\2\2\2\u0136\u0137\5\22\n\2\u0137\u0138\7\n\2\2"+ - "\u0138\u018b\3\2\2\2\u0139\u013b\7\4\2\2\u013a\u013c\5\"\22\2\u013b\u013a"+ - "\3\2\2\2\u013b\u013c\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u018b\7\5\2\2\u013e"+ - "\u013f\5> \2\u013f\u0140\7\n\2\2\u0140\u018b\3\2\2\2\u0141\u0142\7D\2"+ - "\2\u0142\u0143\7\b\2\2\u0143\u0144\5> \2\u0144\u0145\7\t\2\2\u0145\u0148"+ - "\5$\23\2\u0146\u0147\7E\2\2\u0147\u0149\5$\23\2\u0148\u0146\3\2\2\2\u0148"+ - "\u0149\3\2\2\2\u0149\u018b\3\2\2\2\u014a\u014c\5 \21\2\u014b\u014a\3\2"+ - "\2\2\u014c\u014f\3\2\2\2\u014d\u014b\3\2\2\2\u014d\u014e\3\2\2\2\u014e"+ - "\u0150\3\2\2\2\u014f\u014d\3\2\2\2\u0150\u0151\7F\2\2\u0151\u0152\7\b"+ - "\2\2\u0152\u0153\5> \2\u0153\u0154\7\t\2\2\u0154\u0155\5$\23\2\u0155\u018b"+ - "\3\2\2\2\u0156\u0158\5 \21\2\u0157\u0156\3\2\2\2\u0158\u015b\3\2\2\2\u0159"+ - "\u0157\3\2\2\2\u0159\u015a\3\2\2\2\u015a\u015c\3\2\2\2\u015b\u0159\3\2"+ - "\2\2\u015c\u015d\7G\2\2\u015d\u015e\5$\23\2\u015e\u015f\7F\2\2\u015f\u0160"+ - "\7\b\2\2\u0160\u0161\5> \2\u0161\u0162\7\t\2\2\u0162\u0163\7\n\2\2\u0163"+ - "\u018b\3\2\2\2\u0164\u0166\5 \21\2\u0165\u0164\3\2\2\2\u0166\u0169\3\2"+ - "\2\2\u0167\u0165\3\2\2\2\u0167\u0168\3\2\2\2\u0168\u016a\3\2\2\2\u0169"+ - "\u0167\3\2\2\2\u016a\u016b\7H\2\2\u016b\u016c\7\b\2\2\u016c\u016d\5*\26"+ - "\2\u016d\u016e\7\t\2\2\u016e\u016f\5$\23\2\u016f\u018b\3\2\2\2\u0170\u0171"+ - "\7I\2\2\u0171\u0172\7\b\2\2\u0172\u0173\5> \2\u0173\u0174\7\t\2\2\u0174"+ - "\u0175\7\4\2\2\u0175\u0176\5&\24\2\u0176\u0177\7\5\2\2\u0177\u018b\3\2"+ - "\2\2\u0178\u017a\7J\2\2\u0179\u017b\5> \2\u017a\u0179\3\2\2\2\u017a\u017b"+ - "\3\2\2\2\u017b\u017c\3\2\2\2\u017c\u018b\7\n\2\2\u017d\u017e\7K\2\2\u017e"+ - "\u018b\7\n\2\2\u017f\u0180\7L\2\2\u0180\u018b\7\n\2\2\u0181\u0183\7M\2"+ - "\2\u0182\u0184\5F$\2\u0183\u0182\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0185"+ - "\3\2\2\2\u0185\u0186\7\4\2\2\u0186\u0187\5J&\2\u0187\u0188\7\u0081\2\2"+ - "\u0188\u018b\3\2\2\2\u0189\u018b\5D#\2\u018a\u0136\3\2\2\2\u018a\u0139"+ - "\3\2\2\2\u018a\u013e\3\2\2\2\u018a\u0141\3\2\2\2\u018a\u014d\3\2\2\2\u018a"+ - "\u0159\3\2\2\2\u018a\u0167\3\2\2\2\u018a\u0170\3\2\2\2\u018a\u0178\3\2"+ - "\2\2\u018a\u017d\3\2\2\2\u018a\u017f\3\2\2\2\u018a\u0181\3\2\2\2\u018a"+ - "\u0189\3\2\2\2\u018b%\3\2\2\2\u018c\u018e\5(\25\2\u018d\u018c\3\2\2\2"+ - "\u018e\u018f\3\2\2\2\u018f\u018d\3\2\2\2\u018f\u0190\3\2\2\2\u0190\u0196"+ - "\3\2\2\2\u0191\u0192\7N\2\2\u0192\u0194\7\13\2\2\u0193\u0195\5\"\22\2"+ - "\u0194\u0193\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0191"+ - "\3\2\2\2\u0196\u0197\3\2\2\2\u0197\'\3\2\2\2\u0198\u0199\7O\2\2\u0199"+ - "\u019a\5@!\2\u019a\u019c\7\13\2\2\u019b\u019d\5\"\22\2\u019c\u019b\3\2"+ - "\2\2\u019c\u019d\3\2\2\2\u019d)\3\2\2\2\u019e\u019f\5,\27\2\u019f\u01a0"+ - "\7\n\2\2\u01a0\u01a1\5> \2\u01a1\u01a3\7\n\2\2\u01a2\u01a4\5> \2\u01a3"+ - "\u01a2\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01af\3\2\2\2\u01a5\u01a7\5\20"+ - "\t\2\u01a6\u01a5\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8"+ - "\u01a9\7j\2\2\u01a9\u01aa\7\13\2\2\u01aa\u01ab\5@!\2\u01ab\u01ac\7\r\2"+ - "\2\u01ac\u01ad\5@!\2\u01ad\u01af\3\2\2\2\u01ae\u019e\3\2\2\2\u01ae\u01a6"+ - "\3\2\2\2\u01af+\3\2\2\2\u01b0\u01b2\5\22\n\2\u01b1\u01b0\3\2\2\2\u01b1"+ - "\u01b2\3\2\2\2\u01b2\u01b5\3\2\2\2\u01b3\u01b5\5> \2\u01b4\u01b1\3\2\2"+ - "\2\u01b4\u01b3\3\2\2\2\u01b5-\3\2\2\2\u01b6\u01b7\b\30\1\2\u01b7\u01b8"+ - "\7\b\2\2\u01b8\u01b9\5.\30\2\u01b9\u01ba\7\t\2\2\u01ba\u01c6\3\2\2\2\u01bb"+ - "\u01c6\7\\\2\2\u01bc\u01be\7[\2\2\u01bd\u01bf\7\\\2\2\u01be\u01bd\3\2"+ - "\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c6\3\2\2\2\u01c0\u01c6\5\62\32\2\u01c1"+ - "\u01c6\5\60\31\2\u01c2\u01c6\58\35\2\u01c3\u01c6\5\66\34\2\u01c4\u01c6"+ - "\7\3\2\2\u01c5\u01b6\3\2\2\2\u01c5\u01bb\3\2\2\2\u01c5\u01bc\3\2\2\2\u01c5"+ - "\u01c0\3\2\2\2\u01c5\u01c1\3\2\2\2\u01c5\u01c2\3\2\2\2\u01c5\u01c3\3\2"+ - "\2\2\u01c5\u01c4\3\2\2\2\u01c6\u01d4\3\2\2\2\u01c7\u01c8\f\n\2\2\u01c8"+ - "\u01d3\7\23\2\2\u01c9\u01ca\f\t\2\2\u01ca\u01cc\7\6\2\2\u01cb\u01cd\5"+ - "@!\2\u01cc\u01cb\3\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce"+ - "\u01d3\7\7\2\2\u01cf\u01d0\f\b\2\2\u01d0\u01d1\7\b\2\2\u01d1\u01d3\7\t"+ - "\2\2\u01d2\u01c7\3\2\2\2\u01d2\u01c9\3\2\2\2\u01d2\u01cf\3\2\2\2\u01d3"+ - "\u01d6\3\2\2\2\u01d4\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5/\3\2\2\2"+ - "\u01d6\u01d4\3\2\2\2\u01d7\u01d8\7P\2\2\u01d8\u01d9\7j\2\2\u01d9\61\3"+ - "\2\2\2\u01da\u01dc\7P\2\2\u01db\u01dd\7j\2\2\u01dc\u01db\3\2\2\2\u01dc"+ - "\u01dd\3\2\2\2\u01dd\u01de\3\2\2\2\u01de\u01e0\7\4\2\2\u01df\u01e1\5\64"+ - "\33\2\u01e0\u01df\3\2\2\2\u01e1\u01e2\3\2\2\2\u01e2\u01e0\3\2\2\2\u01e2"+ - "\u01e3\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4\u01e5\7\5\2\2\u01e5\63\3\2\2"+ - "\2\u01e6\u01e7\5\22\n\2\u01e7\u01e8\7\n\2\2\u01e8\65\3\2\2\2\u01e9\u01ea"+ - "\7Q\2\2\u01ea\u01eb\7j\2\2\u01eb\67\3\2\2\2\u01ec\u01ee\7Q\2\2\u01ed\u01ef"+ - "\7j\2\2\u01ee\u01ed\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0"+ - "\u01f1\7\4\2\2\u01f1\u01f2\5:\36\2\u01f2\u01f3\7\5\2\2\u01f39\3\2\2\2"+ - "\u01f4\u01f5\b\36\1\2\u01f5\u01f6\5<\37\2\u01f6\u01fc\3\2\2\2\u01f7\u01f8"+ - "\f\3\2\2\u01f8\u01f9\7\f\2\2\u01f9\u01fb\5<\37\2\u01fa\u01f7\3\2\2\2\u01fb"+ - "\u01fe\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fc\u01fd\3\2\2\2\u01fd;\3\2\2\2"+ - "\u01fe\u01fc\3\2\2\2\u01ff\u0202\7j\2\2\u0200\u0201\7&\2\2\u0201\u0203"+ - "\5@!\2\u0202\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203=\3\2\2\2\u0204\u0205"+ - "\b \1\2\u0205\u0206\5@!\2\u0206\u020c\3\2\2\2\u0207\u0208\f\3\2\2\u0208"+ - "\u0209\7\f\2\2\u0209\u020b\5@!\2\u020a\u0207\3\2\2\2\u020b\u020e\3\2\2"+ - "\2\u020c\u020a\3\2\2\2\u020c\u020d\3\2\2\2\u020d?\3\2\2\2\u020e\u020c"+ - "\3\2\2\2\u020f\u0210\b!\1\2\u0210\u0211\7\b\2\2\u0211\u0212\5> \2\u0212"+ - "\u0213\7\t\2\2\u0213\u0246\3\2\2\2\u0214\u0215\7R\2\2\u0215\u0218\7\b"+ - "\2\2\u0216\u0219\5@!\2\u0217\u0219\5.\30\2\u0218\u0216\3\2\2\2\u0218\u0217"+ - "\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u021b\7\t\2\2\u021b\u0246\3\2\2\2\u021c"+ - "\u021d\7S\2\2\u021d\u0220\7\b\2\2\u021e\u0221\5@!\2\u021f\u0221\5.\30"+ - "\2\u0220\u021e\3\2\2\2\u0220\u021f\3\2\2\2\u0221\u0222\3\2\2\2\u0222\u0223"+ - "\7\t\2\2\u0223\u0246\3\2\2\2\u0224\u0225\7\b\2\2\u0225\u0226\5.\30\2\u0226"+ - "\u0227\7\t\2\2\u0227\u0228\5@!\32\u0228\u0246\3\2\2\2\u0229\u022a\t\2"+ - "\2\2\u022a\u0246\5@!\31\u022b\u022c\7\23\2\2\u022c\u0246\5@!\27\u022d"+ - "\u022e\t\3\2\2\u022e\u0246\5@!\26\u022f\u0230\t\4\2\2\u0230\u0246\5@!"+ - "\22\u0231\u0232\7\4\2\2\u0232\u0237\5@!\2\u0233\u0234\7\f\2\2\u0234\u0236"+ - "\5@!\2\u0235\u0233\3\2\2\2\u0236\u0239\3\2\2\2\u0237\u0235\3\2\2\2\u0237"+ - "\u0238\3\2\2\2\u0238\u023a\3\2\2\2\u0239\u0237\3\2\2\2\u023a\u023b\7\5"+ - "\2\2\u023b\u0246\3\2\2\2\u023c\u0246\7j\2\2\u023d\u0246\7a\2\2\u023e\u0240"+ - "\7_\2\2\u023f\u023e\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u023f\3\2\2\2\u0241"+ - "\u0242\3\2\2\2\u0242\u0246\3\2\2\2\u0243\u0246\7`\2\2\u0244\u0246\7]\2"+ - "\2\u0245\u020f\3\2\2\2\u0245\u0214\3\2\2\2\u0245\u021c\3\2\2\2\u0245\u0224"+ - "\3\2\2\2\u0245\u0229\3\2\2\2\u0245\u022b\3\2\2\2\u0245\u022d\3\2\2\2\u0245"+ - "\u022f\3\2\2\2\u0245\u0231\3\2\2\2\u0245\u023c\3\2\2\2\u0245\u023d\3\2"+ - "\2\2\u0245\u023f\3\2\2\2\u0245\u0243\3\2\2\2\u0245\u0244\3\2\2\2\u0246"+ - "\u0283\3\2\2\2\u0247\u0248\f\25\2\2\u0248\u0249\t\5\2\2\u0249\u0282\5"+ - "@!\26\u024a\u024b\f\24\2\2\u024b\u024c\t\6\2\2\u024c\u0282\5@!\25\u024d"+ - "\u024e\f\23\2\2\u024e\u024f\t\7\2\2\u024f\u0282\5@!\24\u0250\u0251\f\21"+ - "\2\2\u0251\u0252\t\b\2\2\u0252\u0282\5@!\22\u0253\u0254\f\20\2\2\u0254"+ - "\u0255\7\30\2\2\u0255\u0282\5@!\21\u0256\u0257\f\17\2\2\u0257\u0258\7"+ - "\32\2\2\u0258\u0282\5@!\20\u0259\u025a\f\16\2\2\u025a\u025b\7\33\2\2\u025b"+ - "\u0282\5@!\17\u025c\u025d\f\r\2\2\u025d\u025e\7$\2\2\u025e\u0282\5@!\16"+ - "\u025f\u0260\f\f\2\2\u0260\u0261\7%\2\2\u0261\u0282\5@!\r\u0262\u0263"+ - "\f\13\2\2\u0263\u0264\7\16\2\2\u0264\u0265\5@!\2\u0265\u0266\7\13\2\2"+ - "\u0266\u0267\5@!\f\u0267\u0282\3\2\2\2\u0268\u0269\f\n\2\2\u0269\u026a"+ - "\7&\2\2\u026a\u0282\5@!\n\u026b\u026c\f\t\2\2\u026c\u026d\7\'\2\2\u026d"+ - "\u0282\5@!\t\u026e\u026f\f \2\2\u026f\u0270\7\17\2\2\u0270\u0282\7j\2"+ - "\2\u0271\u0272\f\37\2\2\u0272\u0273\7\20\2\2\u0273\u0282\7j\2\2\u0274"+ - "\u0275\f\36\2\2\u0275\u0277\7\b\2\2\u0276\u0278\5B\"\2\u0277\u0276\3\2"+ - "\2\2\u0277\u0278\3\2\2\2\u0278\u0279\3\2\2\2\u0279\u0282\7\t\2\2\u027a"+ - "\u027b\f\33\2\2\u027b\u027c\7\6\2\2\u027c\u027d\5> \2\u027d\u027e\7\7"+ - "\2\2\u027e\u0282\3\2\2\2\u027f\u0280\f\30\2\2\u0280\u0282\t\2\2\2\u0281"+ - "\u0247\3\2\2\2\u0281\u024a\3\2\2\2\u0281\u024d\3\2\2\2\u0281\u0250\3\2"+ - "\2\2\u0281\u0253\3\2\2\2\u0281\u0256\3\2\2\2\u0281\u0259\3\2\2\2\u0281"+ - "\u025c\3\2\2\2\u0281\u025f\3\2\2\2\u0281\u0262\3\2\2\2\u0281\u0268\3\2"+ - "\2\2\u0281\u026b\3\2\2\2\u0281\u026e\3\2\2\2\u0281\u0271\3\2\2\2\u0281"+ - "\u0274\3\2\2\2\u0281\u027a\3\2\2\2\u0281\u027f\3\2\2\2\u0282\u0285\3\2"+ - "\2\2\u0283\u0281\3\2\2\2\u0283\u0284\3\2\2\2\u0284A\3\2\2\2\u0285\u0283"+ - "\3\2\2\2\u0286\u028b\5@!\2\u0287\u0288\7\f\2\2\u0288\u028a\5@!\2\u0289"+ - "\u0287\3\2\2\2\u028a\u028d\3\2\2\2\u028b\u0289\3\2\2\2\u028b\u028c\3\2"+ - "\2\2\u028cC\3\2\2\2\u028d\u028b\3\2\2\2\u028e\u0290\7T\2\2\u028f\u0291"+ - "\5F$\2\u0290\u028f\3\2\2\2\u0290\u0291\3\2\2\2\u0291\u0292\3\2\2\2\u0292"+ - "\u0293\7^\2\2\u0293E\3\2\2\2\u0294\u0295\7\b\2\2\u0295\u029a\5H%\2\u0296"+ - "\u0297\7\f\2\2\u0297\u0299\5H%\2\u0298\u0296\3\2\2\2\u0299\u029c\3\2\2"+ - "\2\u029a\u0298\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029d\3\2\2\2\u029c\u029a"+ - "\3\2\2\2\u029d\u029e\7\t\2\2\u029eG\3\2\2\2\u029f\u02a0\7U\2\2\u02a0\u02af"+ - "\7_\2\2\u02a1\u02a2\7V\2\2\u02a2\u02af\7j\2\2\u02a3\u02a4\7W\2\2\u02a4"+ - "\u02af\7_\2\2\u02a5\u02a6\7X\2\2\u02a6\u02af\5@!\2\u02a7\u02a8\7Y\2\2"+ - "\u02a8\u02af\5@!\2\u02a9\u02ac\7,\2\2\u02aa\u02ad\7>\2\2\u02ab\u02ad\5"+ - "@!\2\u02ac\u02aa\3\2\2\2\u02ac\u02ab\3\2\2\2\u02ad\u02af\3\2\2\2\u02ae"+ - "\u029f\3\2\2\2\u02ae\u02a1\3\2\2\2\u02ae\u02a3\3\2\2\2\u02ae\u02a5\3\2"+ - "\2\2\u02ae\u02a7\3\2\2\2\u02ae\u02a9\3\2\2\2\u02afI\3\2\2\2\u02b0\u02b2"+ - "\5L\'\2\u02b1\u02b0\3\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b3"+ - "\u02b4\3\2\2\2\u02b4K\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b6\u02ba\5N(\2\u02b7"+ - "\u02ba\5P)\2\u02b8\u02ba\5R*\2\u02b9\u02b6\3\2\2\2\u02b9\u02b7\3\2\2\2"+ - "\u02b9\u02b8\3\2\2\2\u02baM\3\2\2\2\u02bb\u02bc\7\u008e\2\2\u02bc\u02c0"+ - "\7q\2\2\u02bd\u02be\7\u008d\2\2\u02be\u02c0\7q\2\2\u02bf\u02bb\3\2\2\2"+ - "\u02bf\u02bd\3\2\2\2\u02c0O\3\2\2\2\u02c1\u02c3\7o\2\2\u02c2\u02c4\5T"+ - "+\2\u02c3\u02c2\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4Q\3\2\2\2\u02c5\u02c6"+ - "\7n\2\2\u02c6\u02cb\5V,\2\u02c7\u02c8\7r\2\2\u02c8\u02ca\5V,\2\u02c9\u02c7"+ - "\3\2\2\2\u02ca\u02cd\3\2\2\2\u02cb\u02c9\3\2\2\2\u02cb\u02cc\3\2\2\2\u02cc"+ - "S\3\2\2\2\u02cd\u02cb\3\2\2\2\u02ce\u02e6\5V,\2\u02cf\u02d0\7p\2\2\u02d0"+ - "\u02e6\5V,\2\u02d1\u02d2\5V,\2\u02d2\u02d3\7r\2\2\u02d3\u02d4\7\u008e"+ - "\2\2\u02d4\u02e6\3\2\2\2\u02d5\u02d6\7s\2\2\u02d6\u02d7\5V,\2\u02d7\u02d8"+ - "\7t\2\2\u02d8\u02d9\7r\2\2\u02d9\u02da\7\u008e\2\2\u02da\u02e6\3\2\2\2"+ - "\u02db\u02dc\7s\2\2\u02dc\u02dd\5V,\2\u02dd\u02de\7r\2\2\u02de\u02df\7"+ - "\u008e\2\2\u02df\u02e0\7t\2\2\u02e0\u02e6\3\2\2\2\u02e1\u02e2\7s\2\2\u02e2"+ - "\u02e3\5V,\2\u02e3\u02e4\7t\2\2\u02e4\u02e6\3\2\2\2\u02e5\u02ce\3\2\2"+ - "\2\u02e5\u02cf\3\2\2\2\u02e5\u02d1\3\2\2\2\u02e5\u02d5\3\2\2\2\u02e5\u02db"+ - "\3\2\2\2\u02e5\u02e1\3\2\2\2\u02e6U\3\2\2\2\u02e7\u02e8\b,\1\2\u02e8\u02e9"+ - "\7u\2\2\u02e9\u02ea\5V,\2\u02ea\u02eb\7v\2\2\u02eb\u02f6\3\2\2\2\u02ec"+ - "\u02ed\t\t\2\2\u02ed\u02f6\5V,\n\u02ee\u02f6\7\u008e\2\2\u02ef\u02f6\7"+ - "\u008c\2\2\u02f0\u02f1\7\u0080\2\2\u02f1\u02f2\7\u008e\2\2\u02f2\u02f6"+ - "\7\u0081\2\2\u02f3\u02f6\7\u0082\2\2\u02f4\u02f6\7\u008b\2\2\u02f5\u02e7"+ - "\3\2\2\2\u02f5\u02ec\3\2\2\2\u02f5\u02ee\3\2\2\2\u02f5\u02ef\3\2\2\2\u02f5"+ - "\u02f0\3\2\2\2\u02f5\u02f3\3\2\2\2\u02f5\u02f4\3\2\2\2\u02f6\u0305\3\2"+ - "\2\2\u02f7\u02f8\f\f\2\2\u02f8\u02f9\7w\2\2\u02f9\u0304\5V,\r\u02fa\u02fb"+ - "\f\13\2\2\u02fb\u02fc\t\n\2\2\u02fc\u0304\5V,\f\u02fd\u02fe\f\t\2\2\u02fe"+ - "\u02ff\t\13\2\2\u02ff\u0304\5V,\n\u0300\u0301\f\b\2\2\u0301\u0302\t\f"+ - "\2\2\u0302\u0304\5V,\t\u0303\u02f7\3\2\2\2\u0303\u02fa\3\2\2\2\u0303\u02fd"+ - "\3\2\2\2\u0303\u0300\3\2\2\2\u0304\u0307\3\2\2\2\u0305\u0303\3\2\2\2\u0305"+ - "\u0306\3\2\2\2\u0306W\3\2\2\2\u0307\u0305\3\2\2\2Gafz\u0084\u008b\u0099"+ - "\u009f\u00a4\u00aa\u00af\u00b8\u00bf\u00ca\u00fe\u010b\u0121\u012a\u012f"+ - "\u0134\u013b\u0148\u014d\u0159\u0167\u017a\u0183\u018a\u018f\u0194\u0196"+ - "\u019c\u01a3\u01a6\u01ae\u01b1\u01b4\u01be\u01c5\u01cc\u01d2\u01d4\u01dc"+ - "\u01e2\u01ee\u01fc\u0202\u020c\u0218\u0220\u0237\u0241\u0245\u0277\u0281"+ - "\u0283\u028b\u0290\u029a\u02ac\u02ae\u02b3\u02b9\u02bf\u02c3\u02cb\u02e5"+ - "\u02f5\u0303\u0305"; + "8:<>@BDFHJLNPRTV\2\r\3\2\26\27\5\2\21\22\30\31[[\4\2 ##\3\2\34\35\3\2"+ + "\23\25\3\2\21\22\3\2\36#\3\2{~\3\2yz\3\2\177\u0080\3\2{|\2\u037d\2X\3"+ + "\2\2\2\4[\3\2\2\2\6a\3\2\2\2\bf\3\2\2\2\nh\3\2\2\2\fz\3\2\2\2\16|\3\2"+ + "\2\2\20\u0084\3\2\2\2\22\u008e\3\2\2\2\24\u0091\3\2\2\2\26\u00a4\3\2\2"+ + "\2\30\u00a6\3\2\2\2\32\u00b3\3\2\2\2\34\u00bf\3\2\2\2\36\u00fe\3\2\2\2"+ + " \u0130\3\2\2\2\"\u0133\3\2\2\2$\u018b\3\2\2\2&\u018e\3\2\2\2(\u0199\3"+ + "\2\2\2*\u01af\3\2\2\2,\u01b5\3\2\2\2.\u01c6\3\2\2\2\60\u01d8\3\2\2\2\62"+ + "\u01db\3\2\2\2\64\u01e7\3\2\2\2\66\u01ea\3\2\2\28\u01ed\3\2\2\2:\u01f5"+ + "\3\2\2\2<\u0200\3\2\2\2>\u0205\3\2\2\2@\u0246\3\2\2\2B\u0287\3\2\2\2D"+ + "\u028f\3\2\2\2F\u0295\3\2\2\2H\u02af\3\2\2\2J\u02b4\3\2\2\2L\u02ba\3\2"+ + "\2\2N\u02c0\3\2\2\2P\u02c2\3\2\2\2R\u02c6\3\2\2\2T\u02e6\3\2\2\2V\u02f6"+ + "\3\2\2\2XY\5\6\4\2YZ\7\2\2\3Z\3\3\2\2\2[\\\5J&\2\\]\7\2\2\3]\5\3\2\2\2"+ + "^`\5\b\5\2_^\3\2\2\2`c\3\2\2\2a_\3\2\2\2ab\3\2\2\2b\7\3\2\2\2ca\3\2\2"+ + "\2dg\5\f\7\2eg\5\n\6\2fd\3\2\2\2fe\3\2\2\2g\t\3\2\2\2hi\7(\2\2ij\7`\2"+ + "\2j\13\3\2\2\2kl\5\22\n\2lm\7\n\2\2m{\3\2\2\2no\5\62\32\2op\7\n\2\2p{"+ + "\3\2\2\2qr\58\35\2rs\7\n\2\2s{\3\2\2\2t{\5\30\r\2u{\5D#\2v{\5\36\20\2"+ + "wx\5\16\b\2xy\7\n\2\2y{\3\2\2\2zk\3\2\2\2zn\3\2\2\2zq\3\2\2\2zt\3\2\2"+ + "\2zu\3\2\2\2zv\3\2\2\2zw\3\2\2\2{\r\3\2\2\2|}\7)\2\2}~\5.\30\2~\177\7"+ + "k\2\2\177\u0080\b\b\1\2\u0080\17\3\2\2\2\u0081\u0083\5 \21\2\u0082\u0081"+ + "\3\2\2\2\u0083\u0086\3\2\2\2\u0084\u0082\3\2\2\2\u0084\u0085\3\2\2\2\u0085"+ + "\u0087\3\2\2\2\u0086\u0084\3\2\2\2\u0087\u008b\5.\30\2\u0088\u008a\5 "+ + "\21\2\u0089\u0088\3\2\2\2\u008a\u008d\3\2\2\2\u008b\u0089\3\2\2\2\u008b"+ + "\u008c\3\2\2\2\u008c\21\3\2\2\2\u008d\u008b\3\2\2\2\u008e\u008f\5\20\t"+ + "\2\u008f\u0090\5\24\13\2\u0090\23\3\2\2\2\u0091\u0092\b\13\1\2\u0092\u0093"+ + "\5\26\f\2\u0093\u0099\3\2\2\2\u0094\u0095\f\3\2\2\u0095\u0096\7\f\2\2"+ + "\u0096\u0098\5\26\f\2\u0097\u0094\3\2\2\2\u0098\u009b\3\2\2\2\u0099\u0097"+ + "\3\2\2\2\u0099\u009a\3\2\2\2\u009a\25\3\2\2\2\u009b\u0099\3\2\2\2\u009c"+ + "\u009f\7k\2\2\u009d\u009e\7&\2\2\u009e\u00a0\5@!\2\u009f\u009d\3\2\2\2"+ + "\u009f\u00a0\3\2\2\2\u00a0\u00a5\3\2\2\2\u00a1\u00a2\7k\2\2\u00a2\u00a3"+ + "\7&\2\2\u00a3\u00a5\5D#\2\u00a4\u009c\3\2\2\2\u00a4\u00a1\3\2\2\2\u00a5"+ + "\27\3\2\2\2\u00a6\u00a7\5\20\t\2\u00a7\u00a8\7k\2\2\u00a8\u00aa\7\b\2"+ + "\2\u00a9\u00ab\5\32\16\2\u00aa\u00a9\3\2\2\2\u00aa\u00ab\3\2\2\2\u00ab"+ + "\u00ac\3\2\2\2\u00ac\u00ad\7\t\2\2\u00ad\u00af\7\4\2\2\u00ae\u00b0\5\""+ + "\22\2\u00af\u00ae\3\2\2\2\u00af\u00b0\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1"+ + "\u00b2\7\5\2\2\u00b2\31\3\2\2\2\u00b3\u00b8\5\34\17\2\u00b4\u00b5\7\f"+ + "\2\2\u00b5\u00b7\5\34\17\2\u00b6\u00b4\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8"+ + "\u00b6\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\33\3\2\2\2\u00ba\u00b8\3\2\2"+ + "\2\u00bb\u00bc\5\20\t\2\u00bc\u00bd\7k\2\2\u00bd\u00c0\3\2\2\2\u00be\u00c0"+ + "\7]\2\2\u00bf\u00bb\3\2\2\2\u00bf\u00be\3\2\2\2\u00c0\35\3\2\2\2\u00c1"+ + "\u00c2\7*\2\2\u00c2\u00c3\7+\2\2\u00c3\u00c4\3\2\2\2\u00c4\u00c5\7\b\2"+ + "\2\u00c5\u00ca\7b\2\2\u00c6\u00c7\7\f\2\2\u00c7\u00c9\7b\2\2\u00c8\u00c6"+ + "\3\2\2\2\u00c9\u00cc\3\2\2\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb"+ + "\u00cd\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cd\u00ff\7\t\2\2\u00ce\u00cf\7*"+ + "\2\2\u00cf\u00d0\7,\2\2\u00d0\u00d1\3\2\2\2\u00d1\u00d2\7\b\2\2\u00d2"+ + "\u00d3\7b\2\2\u00d3\u00ff\7\t\2\2\u00d4\u00d5\7*\2\2\u00d5\u00d6\7-\2"+ + "\2\u00d6\u00d7\3\2\2\2\u00d7\u00d8\7\b\2\2\u00d8\u00d9\7k\2\2\u00d9\u00ff"+ + "\7\t\2\2\u00da\u00db\7*\2\2\u00db\u00dc\7/\2\2\u00dc\u00dd\3\2\2\2\u00dd"+ + "\u00de\7\b\2\2\u00de\u00df\7k\2\2\u00df\u00ff\7\t\2\2\u00e0\u00e1\7*\2"+ + "\2\u00e1\u00e2\7.\2\2\u00e2\u00e3\3\2\2\2\u00e3\u00e4\7\b\2\2\u00e4\u00e5"+ + "\7`\2\2\u00e5\u00ff\7\t\2\2\u00e6\u00e7\7*\2\2\u00e7\u00e8\7\60\2\2\u00e8"+ + "\u00e9\3\2\2\2\u00e9\u00ea\7\b\2\2\u00ea\u00eb\7k\2\2\u00eb\u00ff\7\t"+ + "\2\2\u00ec\u00ed\7*\2\2\u00ed\u00ee\7\61\2\2\u00ee\u00ef\3\2\2\2\u00ef"+ + "\u00f0\7\b\2\2\u00f0\u00f1\7k\2\2\u00f1\u00ff\7\t\2\2\u00f2\u00f3\7*\2"+ + "\2\u00f3\u00f4\7\62\2\2\u00f4\u00f5\3\2\2\2\u00f5\u00f6\7\b\2\2\u00f6"+ + "\u00f7\7k\2\2\u00f7\u00ff\7\t\2\2\u00f8\u00f9\7*\2\2\u00f9\u00fa\7C\2"+ + "\2\u00fa\u00fb\3\2\2\2\u00fb\u00fc\7\b\2\2\u00fc\u00fd\7D\2\2\u00fd\u00ff"+ + "\7\t\2\2\u00fe\u00c1\3\2\2\2\u00fe\u00ce\3\2\2\2\u00fe\u00d4\3\2\2\2\u00fe"+ + "\u00da\3\2\2\2\u00fe\u00e0\3\2\2\2\u00fe\u00e6\3\2\2\2\u00fe\u00ec\3\2"+ + "\2\2\u00fe\u00f2\3\2\2\2\u00fe\u00f8\3\2\2\2\u00ff\37\3\2\2\2\u0100\u0131"+ + "\7\63\2\2\u0101\u0131\7\64\2\2\u0102\u0131\7\65\2\2\u0103\u0131\7\66\2"+ + "\2\u0104\u0131\7\67\2\2\u0105\u0106\78\2\2\u0106\u0107\7\b\2\2\u0107\u0108"+ + "\7b\2\2\u0108\u0131\7\t\2\2\u0109\u010d\79\2\2\u010a\u010b\7\b\2\2\u010b"+ + "\u010c\7k\2\2\u010c\u010e\7\t\2\2\u010d\u010a\3\2\2\2\u010d\u010e\3\2"+ + "\2\2\u010e\u0131\3\2\2\2\u010f\u0131\7;\2\2\u0110\u0131\7<\2\2\u0111\u0112"+ + "\7:\2\2\u0112\u0113\7\b\2\2\u0113\u0114\7b\2\2\u0114\u0131\7\t\2\2\u0115"+ + "\u0131\7=\2\2\u0116\u0131\7>\2\2\u0117\u0118\7:\2\2\u0118\u0119\7\b\2"+ + "\2\u0119\u011a\7b\2\2\u011a\u0131\7\t\2\2\u011b\u0131\7?\2\2\u011c\u0131"+ + "\7@\2\2\u011d\u0131\7A\2\2\u011e\u0122\7B\2\2\u011f\u0120\7\b\2\2\u0120"+ + "\u0121\7k\2\2\u0121\u0123\7\t\2\2\u0122\u011f\3\2\2\2\u0122\u0123\3\2"+ + "\2\2\u0123\u0131\3\2\2\2\u0124\u0125\7+\2\2\u0125\u0126\7\b\2\2\u0126"+ + "\u012b\7b\2\2\u0127\u0128\7\f\2\2\u0128\u012a\7b\2\2\u0129\u0127\3\2\2"+ + "\2\u012a\u012d\3\2\2\2\u012b\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u012e"+ + "\3\2\2\2\u012d\u012b\3\2\2\2\u012e\u0131\7\t\2\2\u012f\u0131\7D\2\2\u0130"+ + "\u0100\3\2\2\2\u0130\u0101\3\2\2\2\u0130\u0102\3\2\2\2\u0130\u0103\3\2"+ + "\2\2\u0130\u0104\3\2\2\2\u0130\u0105\3\2\2\2\u0130\u0109\3\2\2\2\u0130"+ + "\u010f\3\2\2\2\u0130\u0110\3\2\2\2\u0130\u0111\3\2\2\2\u0130\u0115\3\2"+ + "\2\2\u0130\u0116\3\2\2\2\u0130\u0117\3\2\2\2\u0130\u011b\3\2\2\2\u0130"+ + "\u011c\3\2\2\2\u0130\u011d\3\2\2\2\u0130\u011e\3\2\2\2\u0130\u0124\3\2"+ + "\2\2\u0130\u012f\3\2\2\2\u0131!\3\2\2\2\u0132\u0134\5$\23\2\u0133\u0132"+ + "\3\2\2\2\u0134\u0135\3\2\2\2\u0135\u0133\3\2\2\2\u0135\u0136\3\2\2\2\u0136"+ + "#\3\2\2\2\u0137\u0138\5\22\n\2\u0138\u0139\7\n\2\2\u0139\u018c\3\2\2\2"+ + "\u013a\u013c\7\4\2\2\u013b\u013d\5\"\22\2\u013c\u013b\3\2\2\2\u013c\u013d"+ + "\3\2\2\2\u013d\u013e\3\2\2\2\u013e\u018c\7\5\2\2\u013f\u0140\5> \2\u0140"+ + "\u0141\7\n\2\2\u0141\u018c\3\2\2\2\u0142\u0143\7E\2\2\u0143\u0144\7\b"+ + "\2\2\u0144\u0145\5> \2\u0145\u0146\7\t\2\2\u0146\u0149\5$\23\2\u0147\u0148"+ + "\7F\2\2\u0148\u014a\5$\23\2\u0149\u0147\3\2\2\2\u0149\u014a\3\2\2\2\u014a"+ + "\u018c\3\2\2\2\u014b\u014d\5 \21\2\u014c\u014b\3\2\2\2\u014d\u0150\3\2"+ + "\2\2\u014e\u014c\3\2\2\2\u014e\u014f\3\2\2\2\u014f\u0151\3\2\2\2\u0150"+ + "\u014e\3\2\2\2\u0151\u0152\7G\2\2\u0152\u0153\7\b\2\2\u0153\u0154\5> "+ + "\2\u0154\u0155\7\t\2\2\u0155\u0156\5$\23\2\u0156\u018c\3\2\2\2\u0157\u0159"+ + "\5 \21\2\u0158\u0157\3\2\2\2\u0159\u015c\3\2\2\2\u015a\u0158\3\2\2\2\u015a"+ + "\u015b\3\2\2\2\u015b\u015d\3\2\2\2\u015c\u015a\3\2\2\2\u015d\u015e\7H"+ + "\2\2\u015e\u015f\5$\23\2\u015f\u0160\7G\2\2\u0160\u0161\7\b\2\2\u0161"+ + "\u0162\5> \2\u0162\u0163\7\t\2\2\u0163\u0164\7\n\2\2\u0164\u018c\3\2\2"+ + "\2\u0165\u0167\5 \21\2\u0166\u0165\3\2\2\2\u0167\u016a\3\2\2\2\u0168\u0166"+ + "\3\2\2\2\u0168\u0169\3\2\2\2\u0169\u016b\3\2\2\2\u016a\u0168\3\2\2\2\u016b"+ + "\u016c\7I\2\2\u016c\u016d\7\b\2\2\u016d\u016e\5*\26\2\u016e\u016f\7\t"+ + "\2\2\u016f\u0170\5$\23\2\u0170\u018c\3\2\2\2\u0171\u0172\7J\2\2\u0172"+ + "\u0173\7\b\2\2\u0173\u0174\5> \2\u0174\u0175\7\t\2\2\u0175\u0176\7\4\2"+ + "\2\u0176\u0177\5&\24\2\u0177\u0178\7\5\2\2\u0178\u018c\3\2\2\2\u0179\u017b"+ + "\7K\2\2\u017a\u017c\5> \2\u017b\u017a\3\2\2\2\u017b\u017c\3\2\2\2\u017c"+ + "\u017d\3\2\2\2\u017d\u018c\7\n\2\2\u017e\u017f\7L\2\2\u017f\u018c\7\n"+ + "\2\2\u0180\u0181\7M\2\2\u0181\u018c\7\n\2\2\u0182\u0184\7N\2\2\u0183\u0185"+ + "\5F$\2\u0184\u0183\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186"+ + "\u0187\7\4\2\2\u0187\u0188\5J&\2\u0188\u0189\7\u0082\2\2\u0189\u018c\3"+ + "\2\2\2\u018a\u018c\5D#\2\u018b\u0137\3\2\2\2\u018b\u013a\3\2\2\2\u018b"+ + "\u013f\3\2\2\2\u018b\u0142\3\2\2\2\u018b\u014e\3\2\2\2\u018b\u015a\3\2"+ + "\2\2\u018b\u0168\3\2\2\2\u018b\u0171\3\2\2\2\u018b\u0179\3\2\2\2\u018b"+ + "\u017e\3\2\2\2\u018b\u0180\3\2\2\2\u018b\u0182\3\2\2\2\u018b\u018a\3\2"+ + "\2\2\u018c%\3\2\2\2\u018d\u018f\5(\25\2\u018e\u018d\3\2\2\2\u018f\u0190"+ + "\3\2\2\2\u0190\u018e\3\2\2\2\u0190\u0191\3\2\2\2\u0191\u0197\3\2\2\2\u0192"+ + "\u0193\7O\2\2\u0193\u0195\7\13\2\2\u0194\u0196\5\"\22\2\u0195\u0194\3"+ + "\2\2\2\u0195\u0196\3\2\2\2\u0196\u0198\3\2\2\2\u0197\u0192\3\2\2\2\u0197"+ + "\u0198\3\2\2\2\u0198\'\3\2\2\2\u0199\u019a\7P\2\2\u019a\u019b\5@!\2\u019b"+ + "\u019d\7\13\2\2\u019c\u019e\5\"\22\2\u019d\u019c\3\2\2\2\u019d\u019e\3"+ + "\2\2\2\u019e)\3\2\2\2\u019f\u01a0\5,\27\2\u01a0\u01a1\7\n\2\2\u01a1\u01a2"+ + "\5> \2\u01a2\u01a4\7\n\2\2\u01a3\u01a5\5> \2\u01a4\u01a3\3\2\2\2\u01a4"+ + "\u01a5\3\2\2\2\u01a5\u01b0\3\2\2\2\u01a6\u01a8\5\20\t\2\u01a7\u01a6\3"+ + "\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01aa\7k\2\2\u01aa"+ + "\u01ab\7\13\2\2\u01ab\u01ac\5@!\2\u01ac\u01ad\7\r\2\2\u01ad\u01ae\5@!"+ + "\2\u01ae\u01b0\3\2\2\2\u01af\u019f\3\2\2\2\u01af\u01a7\3\2\2\2\u01b0+"+ + "\3\2\2\2\u01b1\u01b3\5\22\n\2\u01b2\u01b1\3\2\2\2\u01b2\u01b3\3\2\2\2"+ + "\u01b3\u01b6\3\2\2\2\u01b4\u01b6\5> \2\u01b5\u01b2\3\2\2\2\u01b5\u01b4"+ + "\3\2\2\2\u01b6-\3\2\2\2\u01b7\u01b8\b\30\1\2\u01b8\u01b9\7\b\2\2\u01b9"+ + "\u01ba\5.\30\2\u01ba\u01bb\7\t\2\2\u01bb\u01c7\3\2\2\2\u01bc\u01c7\7]"+ + "\2\2\u01bd\u01bf\7\\\2\2\u01be\u01c0\7]\2\2\u01bf\u01be\3\2\2\2\u01bf"+ + "\u01c0\3\2\2\2\u01c0\u01c7\3\2\2\2\u01c1\u01c7\5\62\32\2\u01c2\u01c7\5"+ + "\60\31\2\u01c3\u01c7\58\35\2\u01c4\u01c7\5\66\34\2\u01c5\u01c7\7\3\2\2"+ + "\u01c6\u01b7\3\2\2\2\u01c6\u01bc\3\2\2\2\u01c6\u01bd\3\2\2\2\u01c6\u01c1"+ + "\3\2\2\2\u01c6\u01c2\3\2\2\2\u01c6\u01c3\3\2\2\2\u01c6\u01c4\3\2\2\2\u01c6"+ + "\u01c5\3\2\2\2\u01c7\u01d5\3\2\2\2\u01c8\u01c9\f\n\2\2\u01c9\u01d4\7\23"+ + "\2\2\u01ca\u01cb\f\t\2\2\u01cb\u01cd\7\6\2\2\u01cc\u01ce\5@!\2\u01cd\u01cc"+ + "\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01cf\3\2\2\2\u01cf\u01d4\7\7\2\2\u01d0"+ + "\u01d1\f\b\2\2\u01d1\u01d2\7\b\2\2\u01d2\u01d4\7\t\2\2\u01d3\u01c8\3\2"+ + "\2\2\u01d3\u01ca\3\2\2\2\u01d3\u01d0\3\2\2\2\u01d4\u01d7\3\2\2\2\u01d5"+ + "\u01d3\3\2\2\2\u01d5\u01d6\3\2\2\2\u01d6/\3\2\2\2\u01d7\u01d5\3\2\2\2"+ + "\u01d8\u01d9\7Q\2\2\u01d9\u01da\7k\2\2\u01da\61\3\2\2\2\u01db\u01dd\7"+ + "Q\2\2\u01dc\u01de\7k\2\2\u01dd\u01dc\3\2\2\2\u01dd\u01de\3\2\2\2\u01de"+ + "\u01df\3\2\2\2\u01df\u01e1\7\4\2\2\u01e0\u01e2\5\64\33\2\u01e1\u01e0\3"+ + "\2\2\2\u01e2\u01e3\3\2\2\2\u01e3\u01e1\3\2\2\2\u01e3\u01e4\3\2\2\2\u01e4"+ + "\u01e5\3\2\2\2\u01e5\u01e6\7\5\2\2\u01e6\63\3\2\2\2\u01e7\u01e8\5\22\n"+ + "\2\u01e8\u01e9\7\n\2\2\u01e9\65\3\2\2\2\u01ea\u01eb\7R\2\2\u01eb\u01ec"+ + "\7k\2\2\u01ec\67\3\2\2\2\u01ed\u01ef\7R\2\2\u01ee\u01f0\7k\2\2\u01ef\u01ee"+ + "\3\2\2\2\u01ef\u01f0\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1\u01f2\7\4\2\2\u01f2"+ + "\u01f3\5:\36\2\u01f3\u01f4\7\5\2\2\u01f49\3\2\2\2\u01f5\u01f6\b\36\1\2"+ + "\u01f6\u01f7\5<\37\2\u01f7\u01fd\3\2\2\2\u01f8\u01f9\f\3\2\2\u01f9\u01fa"+ + "\7\f\2\2\u01fa\u01fc\5<\37\2\u01fb\u01f8\3\2\2\2\u01fc\u01ff\3\2\2\2\u01fd"+ + "\u01fb\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe;\3\2\2\2\u01ff\u01fd\3\2\2\2"+ + "\u0200\u0203\7k\2\2\u0201\u0202\7&\2\2\u0202\u0204\5@!\2\u0203\u0201\3"+ + "\2\2\2\u0203\u0204\3\2\2\2\u0204=\3\2\2\2\u0205\u0206\b \1\2\u0206\u0207"+ + "\5@!\2\u0207\u020d\3\2\2\2\u0208\u0209\f\3\2\2\u0209\u020a\7\f\2\2\u020a"+ + "\u020c\5@!\2\u020b\u0208\3\2\2\2\u020c\u020f\3\2\2\2\u020d\u020b\3\2\2"+ + "\2\u020d\u020e\3\2\2\2\u020e?\3\2\2\2\u020f\u020d\3\2\2\2\u0210\u0211"+ + "\b!\1\2\u0211\u0212\7\b\2\2\u0212\u0213\5> \2\u0213\u0214\7\t\2\2\u0214"+ + "\u0247\3\2\2\2\u0215\u0216\7S\2\2\u0216\u0219\7\b\2\2\u0217\u021a\5@!"+ + "\2\u0218\u021a\5.\30\2\u0219\u0217\3\2\2\2\u0219\u0218\3\2\2\2\u021a\u021b"+ + "\3\2\2\2\u021b\u021c\7\t\2\2\u021c\u0247\3\2\2\2\u021d\u021e\7T\2\2\u021e"+ + "\u0221\7\b\2\2\u021f\u0222\5@!\2\u0220\u0222\5.\30\2\u0221\u021f\3\2\2"+ + "\2\u0221\u0220\3\2\2\2\u0222\u0223\3\2\2\2\u0223\u0224\7\t\2\2\u0224\u0247"+ + "\3\2\2\2\u0225\u0226\7\b\2\2\u0226\u0227\5.\30\2\u0227\u0228\7\t\2\2\u0228"+ + "\u0229\5@!\32\u0229\u0247\3\2\2\2\u022a\u022b\t\2\2\2\u022b\u0247\5@!"+ + "\31\u022c\u022d\7\23\2\2\u022d\u0247\5@!\27\u022e\u022f\t\3\2\2\u022f"+ + "\u0247\5@!\26\u0230\u0231\t\4\2\2\u0231\u0247\5@!\22\u0232\u0233\7\4\2"+ + "\2\u0233\u0238\5@!\2\u0234\u0235\7\f\2\2\u0235\u0237\5@!\2\u0236\u0234"+ + "\3\2\2\2\u0237\u023a\3\2\2\2\u0238\u0236\3\2\2\2\u0238\u0239\3\2\2\2\u0239"+ + "\u023b\3\2\2\2\u023a\u0238\3\2\2\2\u023b\u023c\7\5\2\2\u023c\u0247\3\2"+ + "\2\2\u023d\u0247\7k\2\2\u023e\u0247\7b\2\2\u023f\u0241\7`\2\2\u0240\u023f"+ + "\3\2\2\2\u0241\u0242\3\2\2\2\u0242\u0240\3\2\2\2\u0242\u0243\3\2\2\2\u0243"+ + "\u0247\3\2\2\2\u0244\u0247\7a\2\2\u0245\u0247\7^\2\2\u0246\u0210\3\2\2"+ + "\2\u0246\u0215\3\2\2\2\u0246\u021d\3\2\2\2\u0246\u0225\3\2\2\2\u0246\u022a"+ + "\3\2\2\2\u0246\u022c\3\2\2\2\u0246\u022e\3\2\2\2\u0246\u0230\3\2\2\2\u0246"+ + "\u0232\3\2\2\2\u0246\u023d\3\2\2\2\u0246\u023e\3\2\2\2\u0246\u0240\3\2"+ + "\2\2\u0246\u0244\3\2\2\2\u0246\u0245\3\2\2\2\u0247\u0284\3\2\2\2\u0248"+ + "\u0249\f\25\2\2\u0249\u024a\t\5\2\2\u024a\u0283\5@!\26\u024b\u024c\f\24"+ + "\2\2\u024c\u024d\t\6\2\2\u024d\u0283\5@!\25\u024e\u024f\f\23\2\2\u024f"+ + "\u0250\t\7\2\2\u0250\u0283\5@!\24\u0251\u0252\f\21\2\2\u0252\u0253\t\b"+ + "\2\2\u0253\u0283\5@!\22\u0254\u0255\f\20\2\2\u0255\u0256\7\30\2\2\u0256"+ + "\u0283\5@!\21\u0257\u0258\f\17\2\2\u0258\u0259\7\32\2\2\u0259\u0283\5"+ + "@!\20\u025a\u025b\f\16\2\2\u025b\u025c\7\33\2\2\u025c\u0283\5@!\17\u025d"+ + "\u025e\f\r\2\2\u025e\u025f\7$\2\2\u025f\u0283\5@!\16\u0260\u0261\f\f\2"+ + "\2\u0261\u0262\7%\2\2\u0262\u0283\5@!\r\u0263\u0264\f\13\2\2\u0264\u0265"+ + "\7\16\2\2\u0265\u0266\5@!\2\u0266\u0267\7\13\2\2\u0267\u0268\5@!\f\u0268"+ + "\u0283\3\2\2\2\u0269\u026a\f\n\2\2\u026a\u026b\7&\2\2\u026b\u0283\5@!"+ + "\n\u026c\u026d\f\t\2\2\u026d\u026e\7\'\2\2\u026e\u0283\5@!\t\u026f\u0270"+ + "\f \2\2\u0270\u0271\7\17\2\2\u0271\u0283\7k\2\2\u0272\u0273\f\37\2\2\u0273"+ + "\u0274\7\20\2\2\u0274\u0283\7k\2\2\u0275\u0276\f\36\2\2\u0276\u0278\7"+ + "\b\2\2\u0277\u0279\5B\"\2\u0278\u0277\3\2\2\2\u0278\u0279\3\2\2\2\u0279"+ + "\u027a\3\2\2\2\u027a\u0283\7\t\2\2\u027b\u027c\f\33\2\2\u027c\u027d\7"+ + "\6\2\2\u027d\u027e\5> \2\u027e\u027f\7\7\2\2\u027f\u0283\3\2\2\2\u0280"+ + "\u0281\f\30\2\2\u0281\u0283\t\2\2\2\u0282\u0248\3\2\2\2\u0282\u024b\3"+ + "\2\2\2\u0282\u024e\3\2\2\2\u0282\u0251\3\2\2\2\u0282\u0254\3\2\2\2\u0282"+ + "\u0257\3\2\2\2\u0282\u025a\3\2\2\2\u0282\u025d\3\2\2\2\u0282\u0260\3\2"+ + "\2\2\u0282\u0263\3\2\2\2\u0282\u0269\3\2\2\2\u0282\u026c\3\2\2\2\u0282"+ + "\u026f\3\2\2\2\u0282\u0272\3\2\2\2\u0282\u0275\3\2\2\2\u0282\u027b\3\2"+ + "\2\2\u0282\u0280\3\2\2\2\u0283\u0286\3\2\2\2\u0284\u0282\3\2\2\2\u0284"+ + "\u0285\3\2\2\2\u0285A\3\2\2\2\u0286\u0284\3\2\2\2\u0287\u028c\5@!\2\u0288"+ + "\u0289\7\f\2\2\u0289\u028b\5@!\2\u028a\u0288\3\2\2\2\u028b\u028e\3\2\2"+ + "\2\u028c\u028a\3\2\2\2\u028c\u028d\3\2\2\2\u028dC\3\2\2\2\u028e\u028c"+ + "\3\2\2\2\u028f\u0291\7U\2\2\u0290\u0292\5F$\2\u0291\u0290\3\2\2\2\u0291"+ + "\u0292\3\2\2\2\u0292\u0293\3\2\2\2\u0293\u0294\7_\2\2\u0294E\3\2\2\2\u0295"+ + "\u0296\7\b\2\2\u0296\u029b\5H%\2\u0297\u0298\7\f\2\2\u0298\u029a\5H%\2"+ + "\u0299\u0297\3\2\2\2\u029a\u029d\3\2\2\2\u029b\u0299\3\2\2\2\u029b\u029c"+ + "\3\2\2\2\u029c\u029e\3\2\2\2\u029d\u029b\3\2\2\2\u029e\u029f\7\t\2\2\u029f"+ + "G\3\2\2\2\u02a0\u02a1\7V\2\2\u02a1\u02b0\7`\2\2\u02a2\u02a3\7W\2\2\u02a3"+ + "\u02b0\7k\2\2\u02a4\u02a5\7X\2\2\u02a5\u02b0\7`\2\2\u02a6\u02a7\7Y\2\2"+ + "\u02a7\u02b0\5@!\2\u02a8\u02a9\7Z\2\2\u02a9\u02b0\5@!\2\u02aa\u02ad\7"+ + ",\2\2\u02ab\u02ae\7?\2\2\u02ac\u02ae\5@!\2\u02ad\u02ab\3\2\2\2\u02ad\u02ac"+ + "\3\2\2\2\u02ae\u02b0\3\2\2\2\u02af\u02a0\3\2\2\2\u02af\u02a2\3\2\2\2\u02af"+ + "\u02a4\3\2\2\2\u02af\u02a6\3\2\2\2\u02af\u02a8\3\2\2\2\u02af\u02aa\3\2"+ + "\2\2\u02b0I\3\2\2\2\u02b1\u02b3\5L\'\2\u02b2\u02b1\3\2\2\2\u02b3\u02b6"+ + "\3\2\2\2\u02b4\u02b2\3\2\2\2\u02b4\u02b5\3\2\2\2\u02b5K\3\2\2\2\u02b6"+ + "\u02b4\3\2\2\2\u02b7\u02bb\5N(\2\u02b8\u02bb\5P)\2\u02b9\u02bb\5R*\2\u02ba"+ + "\u02b7\3\2\2\2\u02ba\u02b8\3\2\2\2\u02ba\u02b9\3\2\2\2\u02bbM\3\2\2\2"+ + "\u02bc\u02bd\7\u008f\2\2\u02bd\u02c1\7r\2\2\u02be\u02bf\7\u008e\2\2\u02bf"+ + "\u02c1\7r\2\2\u02c0\u02bc\3\2\2\2\u02c0\u02be\3\2\2\2\u02c1O\3\2\2\2\u02c2"+ + "\u02c4\7p\2\2\u02c3\u02c5\5T+\2\u02c4\u02c3\3\2\2\2\u02c4\u02c5\3\2\2"+ + "\2\u02c5Q\3\2\2\2\u02c6\u02c7\7o\2\2\u02c7\u02cc\5V,\2\u02c8\u02c9\7s"+ + "\2\2\u02c9\u02cb\5V,\2\u02ca\u02c8\3\2\2\2\u02cb\u02ce\3\2\2\2\u02cc\u02ca"+ + "\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cdS\3\2\2\2\u02ce\u02cc\3\2\2\2\u02cf"+ + "\u02e7\5V,\2\u02d0\u02d1\7q\2\2\u02d1\u02e7\5V,\2\u02d2\u02d3\5V,\2\u02d3"+ + "\u02d4\7s\2\2\u02d4\u02d5\7\u008f\2\2\u02d5\u02e7\3\2\2\2\u02d6\u02d7"+ + "\7t\2\2\u02d7\u02d8\5V,\2\u02d8\u02d9\7u\2\2\u02d9\u02da\7s\2\2\u02da"+ + "\u02db\7\u008f\2\2\u02db\u02e7\3\2\2\2\u02dc\u02dd\7t\2\2\u02dd\u02de"+ + "\5V,\2\u02de\u02df\7s\2\2\u02df\u02e0\7\u008f\2\2\u02e0\u02e1\7u\2\2\u02e1"+ + "\u02e7\3\2\2\2\u02e2\u02e3\7t\2\2\u02e3\u02e4\5V,\2\u02e4\u02e5\7u\2\2"+ + "\u02e5\u02e7\3\2\2\2\u02e6\u02cf\3\2\2\2\u02e6\u02d0\3\2\2\2\u02e6\u02d2"+ + "\3\2\2\2\u02e6\u02d6\3\2\2\2\u02e6\u02dc\3\2\2\2\u02e6\u02e2\3\2\2\2\u02e7"+ + "U\3\2\2\2\u02e8\u02e9\b,\1\2\u02e9\u02ea\7v\2\2\u02ea\u02eb\5V,\2\u02eb"+ + "\u02ec\7w\2\2\u02ec\u02f7\3\2\2\2\u02ed\u02ee\t\t\2\2\u02ee\u02f7\5V,"+ + "\n\u02ef\u02f7\7\u008f\2\2\u02f0\u02f7\7\u008d\2\2\u02f1\u02f2\7\u0081"+ + "\2\2\u02f2\u02f3\7\u008f\2\2\u02f3\u02f7\7\u0082\2\2\u02f4\u02f7\7\u0083"+ + "\2\2\u02f5\u02f7\7\u008c\2\2\u02f6\u02e8\3\2\2\2\u02f6\u02ed\3\2\2\2\u02f6"+ + "\u02ef\3\2\2\2\u02f6\u02f0\3\2\2\2\u02f6\u02f1\3\2\2\2\u02f6\u02f4\3\2"+ + "\2\2\u02f6\u02f5\3\2\2\2\u02f7\u0306\3\2\2\2\u02f8\u02f9\f\f\2\2\u02f9"+ + "\u02fa\7x\2\2\u02fa\u0305\5V,\r\u02fb\u02fc\f\13\2\2\u02fc\u02fd\t\n\2"+ + "\2\u02fd\u0305\5V,\f\u02fe\u02ff\f\t\2\2\u02ff\u0300\t\13\2\2\u0300\u0305"+ + "\5V,\n\u0301\u0302\f\b\2\2\u0302\u0303\t\f\2\2\u0303\u0305\5V,\t\u0304"+ + "\u02f8\3\2\2\2\u0304\u02fb\3\2\2\2\u0304\u02fe\3\2\2\2\u0304\u0301\3\2"+ + "\2\2\u0305\u0308\3\2\2\2\u0306\u0304\3\2\2\2\u0306\u0307\3\2\2\2\u0307"+ + "W\3\2\2\2\u0308\u0306\3\2\2\2Gafz\u0084\u008b\u0099\u009f\u00a4\u00aa"+ + "\u00af\u00b8\u00bf\u00ca\u00fe\u010d\u0122\u012b\u0130\u0135\u013c\u0149"+ + "\u014e\u015a\u0168\u017b\u0184\u018b\u0190\u0195\u0197\u019d\u01a4\u01a7"+ + "\u01af\u01b2\u01b5\u01bf\u01c6\u01cd\u01d3\u01d5\u01dd\u01e3\u01ef\u01fd"+ + "\u0203\u020d\u0219\u0221\u0238\u0242\u0246\u0278\u0282\u0284\u028c\u0291"+ + "\u029b\u02ad\u02af\u02b4\u02ba\u02c0\u02c4\u02cc\u02e6\u02f6\u0304\u0306"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.tokens b/src/main/java/dk/camelot64/kickc/parser/KickCParser.tokens index 4de687d67..43a0dc65d 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.tokens @@ -47,100 +47,101 @@ CODESEG=46 DATASEG=47 ENCODING=48 CONST=49 -EXTERN=50 -EXPORT=51 -ALIGN=52 -REGISTER=53 -NOTREGISTER=54 -ADDRESS=55 -ADDRESS_ZEROPAGE=56 -ADDRESS_MAINMEM=57 -FORM_SSA=58 -FORM_NOTSSA=59 -INLINE=60 -VOLATILE=61 -NOTVOLATILE=62 -INTERRUPT=63 -CALLING=64 -CALLINGCONVENTION=65 -IF=66 -ELSE=67 -WHILE=68 -DO=69 -FOR=70 -SWITCH=71 -RETURN=72 -BREAK=73 -CONTINUE=74 -ASM=75 -DEFAULT=76 -CASE=77 -STRUCT=78 -ENUM=79 -SIZEOF=80 -TYPEID=81 -KICKASM=82 -RESOURCE=83 -USES=84 -CLOBBERS=85 -BYTES=86 -CYCLES=87 -LOGIC_NOT=88 -SIGNEDNESS=89 -SIMPLETYPE=90 -BOOLEAN=91 -KICKASM_BODY=92 -STRING=93 -CHAR=94 -NUMBER=95 -NUMFLOAT=96 -BINFLOAT=97 -DECFLOAT=98 -HEXFLOAT=99 -NUMINT=100 -BININTEGER=101 -DECINTEGER=102 -HEXINTEGER=103 -NAME=104 -WS=105 -COMMENT_LINE=106 -COMMENT_BLOCK=107 -ASM_BYTE=108 -ASM_MNEMONIC=109 -ASM_IMM=110 -ASM_COLON=111 -ASM_COMMA=112 -ASM_PAR_BEGIN=113 -ASM_PAR_END=114 -ASM_BRACKET_BEGIN=115 -ASM_BRACKET_END=116 -ASM_DOT=117 -ASM_SHIFT_LEFT=118 -ASM_SHIFT_RIGHT=119 -ASM_PLUS=120 -ASM_MINUS=121 -ASM_LESS_THAN=122 -ASM_GREATER_THAN=123 -ASM_MULTIPLY=124 -ASM_DIVIDE=125 -ASM_CURLY_BEGIN=126 -ASM_CURLY_END=127 -ASM_NUMBER=128 -ASM_NUMFLOAT=129 -ASM_BINFLOAT=130 -ASM_DECFLOAT=131 -ASM_HEXFLOAT=132 -ASM_NUMINT=133 -ASM_BININTEGER=134 -ASM_DECINTEGER=135 -ASM_HEXINTEGER=136 -ASM_CHAR=137 -ASM_MULTI_REL=138 -ASM_MULTI_NAME=139 -ASM_NAME=140 -ASM_WS=141 -ASM_COMMENT_LINE=142 -ASM_COMMENT_BLOCK=143 +NOTCONST=50 +MAYBECONST=51 +EXTERN=52 +EXPORT=53 +ALIGN=54 +REGISTER=55 +ADDRESS=56 +ADDRESS_ZEROPAGE=57 +ADDRESS_MAINMEM=58 +FORM_SSA=59 +FORM_NOTSSA=60 +INLINE=61 +VOLATILE=62 +NOTVOLATILE=63 +INTERRUPT=64 +CALLING=65 +CALLINGCONVENTION=66 +IF=67 +ELSE=68 +WHILE=69 +DO=70 +FOR=71 +SWITCH=72 +RETURN=73 +BREAK=74 +CONTINUE=75 +ASM=76 +DEFAULT=77 +CASE=78 +STRUCT=79 +ENUM=80 +SIZEOF=81 +TYPEID=82 +KICKASM=83 +RESOURCE=84 +USES=85 +CLOBBERS=86 +BYTES=87 +CYCLES=88 +LOGIC_NOT=89 +SIGNEDNESS=90 +SIMPLETYPE=91 +BOOLEAN=92 +KICKASM_BODY=93 +STRING=94 +CHAR=95 +NUMBER=96 +NUMFLOAT=97 +BINFLOAT=98 +DECFLOAT=99 +HEXFLOAT=100 +NUMINT=101 +BININTEGER=102 +DECINTEGER=103 +HEXINTEGER=104 +NAME=105 +WS=106 +COMMENT_LINE=107 +COMMENT_BLOCK=108 +ASM_BYTE=109 +ASM_MNEMONIC=110 +ASM_IMM=111 +ASM_COLON=112 +ASM_COMMA=113 +ASM_PAR_BEGIN=114 +ASM_PAR_END=115 +ASM_BRACKET_BEGIN=116 +ASM_BRACKET_END=117 +ASM_DOT=118 +ASM_SHIFT_LEFT=119 +ASM_SHIFT_RIGHT=120 +ASM_PLUS=121 +ASM_MINUS=122 +ASM_LESS_THAN=123 +ASM_GREATER_THAN=124 +ASM_MULTIPLY=125 +ASM_DIVIDE=126 +ASM_CURLY_BEGIN=127 +ASM_CURLY_END=128 +ASM_NUMBER=129 +ASM_NUMFLOAT=130 +ASM_BINFLOAT=131 +ASM_DECFLOAT=132 +ASM_HEXFLOAT=133 +ASM_NUMINT=134 +ASM_BININTEGER=135 +ASM_DECINTEGER=136 +ASM_HEXINTEGER=137 +ASM_CHAR=138 +ASM_MULTI_REL=139 +ASM_MULTI_NAME=140 +ASM_NAME=141 +ASM_WS=142 +ASM_COMMENT_LINE=143 +ASM_COMMENT_BLOCK=144 ';'=8 '..'=11 '?'=12 @@ -171,43 +172,44 @@ ASM_COMMENT_BLOCK=143 'data_seg'=47 'encoding'=48 'const'=49 -'extern'=50 -'export'=51 -'align'=52 -'register'=53 -'__notregister'=54 -'__address'=55 -'__zp'=56 -'__mem'=57 -'__ssa'=58 -'__notssa'=59 -'inline'=60 -'volatile'=61 -'__notvolatile'=62 -'interrupt'=63 -'calling'=64 -'if'=66 -'else'=67 -'while'=68 -'do'=69 -'for'=70 -'switch'=71 -'return'=72 -'break'=73 -'continue'=74 -'asm'=75 -'default'=76 -'case'=77 -'struct'=78 -'enum'=79 -'sizeof'=80 -'typeid'=81 -'kickasm'=82 -'resource'=83 -'uses'=84 -'clobbers'=85 -'bytes'=86 -'cycles'=87 -'!'=88 -'.byte'=108 -'#'=110 +'__notconst'=50 +'__maybeconst'=51 +'extern'=52 +'export'=53 +'align'=54 +'register'=55 +'__address'=56 +'__zp'=57 +'__mem'=58 +'__ssa'=59 +'__notssa'=60 +'inline'=61 +'volatile'=62 +'__notvolatile'=63 +'interrupt'=64 +'calling'=65 +'if'=67 +'else'=68 +'while'=69 +'do'=70 +'for'=71 +'switch'=72 +'return'=73 +'break'=74 +'continue'=75 +'asm'=76 +'default'=77 +'case'=78 +'struct'=79 +'enum'=80 +'sizeof'=81 +'typeid'=82 +'kickasm'=83 +'resource'=84 +'uses'=85 +'clobbers'=86 +'bytes'=87 +'cycles'=88 +'!'=89 +'.byte'=109 +'#'=111 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseListener.java index 71839235a..e2e754e36 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseListener.java @@ -325,6 +325,30 @@ public class KickCParserBaseListener implements KickCParserListener { *

The default implementation does nothing.

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

The default implementation does nothing.

+ */ + @Override public void enterDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx) { } /** * {@inheritDoc} * @@ -373,18 +397,6 @@ public class KickCParserBaseListener implements KickCParserListener { *

The default implementation does nothing.

*/ @Override public void exitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void enterDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx) { } - /** - * {@inheritDoc} - * - *

The default implementation does nothing.

- */ - @Override public void exitDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseVisitor.java index 37c9588d5..21b9c3303 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParserBaseVisitor.java @@ -195,6 +195,20 @@ public class KickCParserBaseVisitor extends AbstractParseTreeVisitor imple * {@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 visitDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

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

+ */ + @Override public T visitDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * @@ -223,13 +237,6 @@ public class KickCParserBaseVisitor extends AbstractParseTreeVisitor imple * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx) { return visitChildren(ctx); } - /** - * {@inheritDoc} - * - *

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

- */ - @Override public T visitDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParserListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCParserListener.java index de96aecbc..59e5713fc 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParserListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParserListener.java @@ -297,6 +297,30 @@ public interface KickCParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitDirectiveConst(KickCParser.DirectiveConstContext ctx); + /** + * Enter a parse tree produced by the {@code directiveNotConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void enterDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx); + /** + * Exit a parse tree produced by the {@code directiveNotConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void exitDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx); + /** + * Enter a parse tree produced by the {@code directiveMaybeConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void enterDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx); + /** + * Exit a parse tree produced by the {@code directiveMaybeConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + */ + void exitDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx); /** * Enter a parse tree produced by the {@code directiveExtern} * labeled alternative in {@link KickCParser#directive}. @@ -345,18 +369,6 @@ public interface KickCParserListener extends ParseTreeListener { * @param ctx the parse tree */ void exitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx); - /** - * Enter a parse tree produced by the {@code directiveNotRegister} - * labeled alternative in {@link KickCParser#directive}. - * @param ctx the parse tree - */ - void enterDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx); - /** - * Exit a parse tree produced by the {@code directiveNotRegister} - * labeled alternative in {@link KickCParser#directive}. - * @param ctx the parse tree - */ - void exitDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx); /** * Enter a parse tree produced by the {@code directiveMemoryAreaZp} * labeled alternative in {@link KickCParser#directive}. diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParserVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCParserVisitor.java index d476ce717..c9de1f2bd 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParserVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParserVisitor.java @@ -182,6 +182,20 @@ public interface KickCParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitDirectiveConst(KickCParser.DirectiveConstContext ctx); + /** + * Visit a parse tree produced by the {@code directiveNotConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDirectiveNotConst(KickCParser.DirectiveNotConstContext ctx); + /** + * Visit a parse tree produced by the {@code directiveMaybeConst} + * labeled alternative in {@link KickCParser#directive}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDirectiveMaybeConst(KickCParser.DirectiveMaybeConstContext ctx); /** * Visit a parse tree produced by the {@code directiveExtern} * labeled alternative in {@link KickCParser#directive}. @@ -210,13 +224,6 @@ public interface KickCParserVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitDirectiveRegister(KickCParser.DirectiveRegisterContext ctx); - /** - * Visit a parse tree produced by the {@code directiveNotRegister} - * labeled alternative in {@link KickCParser#directive}. - * @param ctx the parse tree - * @return the visitor result - */ - T visitDirectiveNotRegister(KickCParser.DirectiveNotRegisterContext ctx); /** * Visit a parse tree produced by the {@code directiveMemoryAreaZp} * labeled alternative in {@link KickCParser#directive}. diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java index 73d889ca3..67673cb3c 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -626,7 +626,7 @@ public class Pass0GenerateStatementSequence extends KickCParserBaseVisitor assignments = getAssignments(variable); if(assignments.size() == 1) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1ProcedureInline.java b/src/main/java/dk/camelot64/kickc/passes/Pass1ProcedureInline.java index de928bd03..eaf59d483 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1ProcedureInline.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1ProcedureInline.java @@ -303,7 +303,7 @@ public class Pass1ProcedureInline extends Pass1Base { Variable inlineVar = callScope.addVariablePhiMaster(inlineVarName, procSymbol.getType(), procVar.getMemoryArea(), procVar.getDataSegment()); inlineVar.setInferredType(procVar.isInferredType()); inlineVar.setDeclaredAlignment(procVar.getDeclaredAlignment()); - inlineVar.setDeclaredConstant(procVar.isDeclaredConstant()); + inlineVar.setConstantDeclaration(procVar.getConstantDeclaration()); inlineVar.setDeclaredAsRegister(procVar.isDeclaredAsRegister()); inlineVar.setDeclaredNotRegister(procVar.isDeclaredAsNotRegister()); inlineVar.setDeclaredRegister(procVar.getDeclaredRegister()); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindBlockScopes.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindBlockScopes.java index 196c2654d..aea80f81a 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindBlockScopes.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindBlockScopes.java @@ -78,7 +78,7 @@ public class Pass1UnwindBlockScopes extends Pass1Base { Variable var = (Variable) symbol; Variable unwound = procedure.addVariablePhiMaster(name, symbol.getType(), var.getMemoryArea(), var.getDataSegment()); unwound.setDeclaredAlignment(var.getDeclaredAlignment()); - unwound.setDeclaredConstant(var.isDeclaredConstant()); + unwound.setConstantDeclaration(var.getConstantDeclaration()); unwound.setDeclaredVolatile(var.isDeclaredVolatile()); unwound.setInferedVolatile(var.isInferedVolatile()); unwound.setDeclaredRegister((var.getDeclaredRegister())); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index ca5895841..09a12a6c1 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -223,7 +223,7 @@ public class Pass1UnwindStructValues extends Pass1Base { } memberVariable.setDeclaredVolatile(variable.isDeclaredVolatile()); memberVariable.setInferedVolatile(variable.isInferedVolatile()); - memberVariable.setDeclaredConstant(variable.isDeclaredConstant()); + memberVariable.setConstantDeclaration(variable.getConstantDeclaration()); memberVariable.setDeclaredExport(variable.isDeclaredExport()); memberVariable.setStorageStrategy(variable.getStorageStrategy()); if(memberVariable.getType() instanceof SymbolTypePointer) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2AliasElimination.java b/src/main/java/dk/camelot64/kickc/passes/Pass2AliasElimination.java index 6ec456312..071da25d9 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2AliasElimination.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2AliasElimination.java @@ -93,7 +93,7 @@ public class Pass2AliasElimination extends Pass2SsaOptimization { String unversionedFullName = null; for(VariableRef variableRef : aliasSet.getVars()) { Variable variable = programScope.getVariable(variableRef); - if(variable.isVolatile()) { + if(variable.isVolatile() || variable.isStorageLoadStore()) { anyVolatile = true; } if(unversionedFullName == null) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java index 3c17d1a31..9f92f6522 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2ConstantIdentification.java @@ -10,17 +10,18 @@ import dk.camelot64.kickc.model.operators.OperatorUnary; import dk.camelot64.kickc.model.operators.Operators; import dk.camelot64.kickc.model.statements.Statement; import dk.camelot64.kickc.model.statements.StatementAssignment; +import dk.camelot64.kickc.model.statements.StatementLValue; import dk.camelot64.kickc.model.statements.StatementPhiBlock; -import dk.camelot64.kickc.model.symbols.*; +import dk.camelot64.kickc.model.symbols.ConstantVar; +import dk.camelot64.kickc.model.symbols.ProgramScope; +import dk.camelot64.kickc.model.symbols.Scope; +import dk.camelot64.kickc.model.symbols.Variable; import dk.camelot64.kickc.model.types.SymbolType; import dk.camelot64.kickc.model.types.SymbolTypeConversion; import dk.camelot64.kickc.model.types.SymbolTypeInference; import dk.camelot64.kickc.model.values.*; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * Compiler Pass propagating constants in expressions eliminating constant variables @@ -155,11 +156,11 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization { if(lValue instanceof VariableRef) { VariableRef varRef = (VariableRef) lValue; Variable var = getScope().getVariable(varRef); - if(var.isVolatile() || var.isStorageLoadStore()) + if(var.isVolatile() || var.isDeclaredNotConstant() || var.isStorageLoadStore()) // Do not examine volatiles and non-versioned variables continue; ConstantValue constant = getConstant(assignment.getrValue2()); - if(assignment.getrValue1() == null && assignment.getOperator() == null && constant !=null) { + if(assignment.getrValue1() == null && assignment.getOperator() == null && constant != null) { constants.put(varRef, new ConstantVariableValue(varRef, constant, assignment)); } } @@ -171,7 +172,7 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization { if(getConstant(phiRValue.getrValue()) != null) { VariableRef varRef = phiVariable.getVariable(); Variable var = getScope().getVariable(varRef); - if(var.isVolatile() || var.isStorageLoadStore()) + if(var.isVolatile() || var.isDeclaredNotConstant() || var.isStorageLoadStore()) // Do not examine volatiles and non-versioned variables continue; ConstantValue constant = getConstant(phiRValue.getrValue()); @@ -184,6 +185,29 @@ public class Pass2ConstantIdentification extends Pass2SsaOptimization { } // Look for constants among non-versioned variables + for(Variable variable : getScope().getAllVariables(true)) { + if(variable.isVolatile() || variable.isDeclaredNotConstant() || !variable.isStorageLoadStore()) + // Do not examine volatiles, non-constants or versioned variables + continue; + List assignments = getGraph().getAssignments(variable.getRef()); + if(assignments.size() == 1) { + StatementLValue statementLValue = assignments.get(0); + if(!(statementLValue instanceof StatementAssignment)) + // Only look at assignments + continue; + StatementAssignment assignment = (StatementAssignment) statementLValue; + LValue lValue = assignment.getlValue(); + if(lValue instanceof VariableRef) { + VariableRef varRef = (VariableRef) lValue; + ConstantValue constant = getConstant(assignment.getrValue2()); + if(assignment.getrValue1() == null && assignment.getOperator() == null && constant != null) { + constants.put(varRef, new ConstantVariableValue(varRef, constant, assignment)); + throw new CompileError("Encountered constant variable! " + variable.toString(), statementLValue); + } + } + } + } + return constants; } diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNTypeInference.java b/src/main/java/dk/camelot64/kickc/passes/PassNTypeInference.java index 7a3aa8338..571b0e2fe 100644 --- a/src/main/java/dk/camelot64/kickc/passes/PassNTypeInference.java +++ b/src/main/java/dk/camelot64/kickc/passes/PassNTypeInference.java @@ -135,11 +135,11 @@ public class PassNTypeInference extends Pass2SsaOptimization { setInferedType(program, assignment, symbol, type); // If the type is an array or a string the symbol is constant if(symbol.getType() instanceof SymbolTypeArray) { - symbol.setDeclaredConstant(true); + symbol.setConstantDeclaration(SymbolVariable.ConstantDeclaration.CONST); symbol.setStorageStrategy(SymbolVariable.StorageStrategy.CONSTANT); symbol.setMemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY); } else if(SymbolType.STRING.equals(symbol.getType())) { - symbol.setDeclaredConstant(true); + symbol.setConstantDeclaration(SymbolVariable.ConstantDeclaration.CONST); symbol.setStorageStrategy(SymbolVariable.StorageStrategy.CONSTANT); symbol.setMemoryArea(SymbolVariable.MemoryArea.MAIN_MEMORY); } diff --git a/src/test/kc/declared-memory-var-0.kc b/src/test/kc/declared-memory-var-0.kc index 34431c632..89106ecae 100644 --- a/src/test/kc/declared-memory-var-0.kc +++ b/src/test/kc/declared-memory-var-0.kc @@ -1,6 +1,6 @@ -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) +// Test declaring a variable as "__mem __notssa", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -__notregister __mem char idx; +__mem __notssa char idx; const char* SCREEN = 0x0400; diff --git a/src/test/kc/declared-memory-var-1.kc b/src/test/kc/declared-memory-var-1.kc index d20912302..fe6a11254 100644 --- a/src/test/kc/declared-memory-var-1.kc +++ b/src/test/kc/declared-memory-var-1.kc @@ -1,7 +1,7 @@ // Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) // Test a pointer to a memory variable -__notregister __mem char idx; +__mem __notssa char idx; char* idx_p = &idx; const char* SCREEN = 0x0400; diff --git a/src/test/kc/declared-memory-var-2.kc b/src/test/kc/declared-memory-var-2.kc index 980ae1d70..c1f919331 100644 --- a/src/test/kc/declared-memory-var-2.kc +++ b/src/test/kc/declared-memory-var-2.kc @@ -3,7 +3,7 @@ const char* SCREEN = 0x0400; -__notregister __mem char* cursor = SCREEN; +__mem __notssa char* cursor = SCREEN; void main() { for( char i: 0..24 ) { diff --git a/src/test/kc/declared-memory-var-3.kc b/src/test/kc/declared-memory-var-3.kc index 041b5e46d..e178dd949 100644 --- a/src/test/kc/declared-memory-var-3.kc +++ b/src/test/kc/declared-memory-var-3.kc @@ -6,7 +6,7 @@ struct foo { char thing2; }; -__notregister __mem struct foo bar = { 'a', 'b' }; +__mem __notssa struct foo bar = { 'a', 'b' }; void main(void) { struct foo* barp = &bar; diff --git a/src/test/kc/declared-memory-var-4.kc b/src/test/kc/declared-memory-var-4.kc index a6a83febd..65f3d2d3f 100644 --- a/src/test/kc/declared-memory-var-4.kc +++ b/src/test/kc/declared-memory-var-4.kc @@ -7,7 +7,7 @@ struct foo { char[12] thing3; }; -__notregister __mem struct foo bar = { 'a', 'b', "qwe" }; +__mem __notssa struct foo bar = { 'a', 'b', "qwe" }; void main(void) { struct foo* barp = &bar; diff --git a/src/test/kc/declared-memory-var-5.kc b/src/test/kc/declared-memory-var-5.kc index 0d5ce426c..89eb0eece 100644 --- a/src/test/kc/declared-memory-var-5.kc +++ b/src/test/kc/declared-memory-var-5.kc @@ -6,7 +6,7 @@ struct foo { char thing2; }; -__notregister __mem struct foo bar = { 'a', 'b' }; +__mem __notssa __notconst struct foo bar = { 'a', 'b' }; void main(void) { const char* SCREEN = 0x0400; diff --git a/src/test/kc/declared-memory-var-6.kc b/src/test/kc/declared-memory-var-6.kc index 569bb7bf3..1daa7dcaa 100644 --- a/src/test/kc/declared-memory-var-6.kc +++ b/src/test/kc/declared-memory-var-6.kc @@ -5,19 +5,19 @@ char i=0; void main(void) { - char register __zp reg_zp_flex = '.'; - char register __address(0x10) reg_zp_abs = '.'; - char register __mem reg_mem_flex = '.'; - char register __address(0x1000) reg_mem_abs = '.'; - char __notregister __zp notreg_zp_flex = '.'; - char __notregister __address(0x10) notreg_zp_abs = '.'; - char __notregister __mem notreg_mem_flex = '.'; - char __notregister __address(0x1000) notreg_mem_abs = '.'; + char __ssa __zp reg_zp_flex = '.'; + char __ssa __address(0x10) reg_zp_abs = '.'; + char __ssa __mem reg_mem_flex = '.'; + char __ssa __address(0x1000) reg_mem_abs = '.'; + char __notssa __notconst __zp notreg_zp_flex = '.'; + char __notssa __notconst __address(0x10) notreg_zp_abs = '.'; + char __notssa __notconst __mem notreg_mem_flex = '.'; + char __notssa __notconst __address(0x1000) notreg_mem_abs = '.'; char default_default = '.'; - char register reg_default = '.'; - char __notregister notreg_default = '.'; - char __zp default_zp_flex = '.'; + char reg_default = '.'; + char __notssa __notconst notreg_default = '.'; + char __ssa __zp default_zp_flex = '.'; char __address(0x10) default_zp_abs = '.'; char __mem default_mem_flex = '.'; char __address(0x1000) default_mem_abs = '.'; diff --git a/src/test/kc/declared-memory-var-7.kc b/src/test/kc/declared-memory-var-7.kc index fbfc503c8..86b78ed4e 100644 --- a/src/test/kc/declared-memory-var-7.kc +++ b/src/test/kc/declared-memory-var-7.kc @@ -1,7 +1,7 @@ // Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) // Test a zeropage notregister variable -__notregister char idx; +__notssa char idx; const char* SCREEN = 0x0400; diff --git a/src/test/kc/declared-memory-var-8.kc b/src/test/kc/declared-memory-var-8.kc index 4ba802ffc..c825c98b4 100644 --- a/src/test/kc/declared-memory-var-8.kc +++ b/src/test/kc/declared-memory-var-8.kc @@ -1,7 +1,7 @@ -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -// Test a fixed main memory address notregister variable +// Test declaring a variable as "memory", meaning it will be stored in main memory +// Test a fixed main memory address __notssa variable -__notregister __address(0x1000) char idx; +__notssa __address(0x1000) char idx; const char* SCREEN = 0x0400; diff --git a/src/test/ref/declared-memory-var-0.asm b/src/test/ref/declared-memory-var-0.asm index 3a402786b..656544e0d 100644 --- a/src/test/ref/declared-memory-var-0.asm +++ b/src/test/ref/declared-memory-var-0.asm @@ -1,4 +1,4 @@ -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) +// Test declaring a variable as "__mem __notssa", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) .pc = $801 "Basic" :BasicUpstart(__bbegin) .pc = $80d "Program" diff --git a/src/test/ref/declared-memory-var-0.log b/src/test/ref/declared-memory-var-0.log index f811c30a3..71b75ea11 100644 --- a/src/test/ref/declared-memory-var-0.log +++ b/src/test/ref/declared-memory-var-0.log @@ -127,7 +127,7 @@ Allocated mem[1] [ idx ] INITIAL ASM Target platform is c64basic / MOS6502X // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) +// Test declaring a variable as "__mem __notssa", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin) @@ -214,7 +214,7 @@ Uplifting [] best 409 combination mem[1] [ idx ] ASSEMBLER BEFORE OPTIMIZATION // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) +// Test declaring a variable as "__mem __notssa", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin) @@ -318,7 +318,7 @@ FINAL ASSEMBLER Score: 319 // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) +// Test declaring a variable as "__mem __notssa", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin) diff --git a/src/test/ref/declared-memory-var-8.asm b/src/test/ref/declared-memory-var-8.asm index 5d83fe21a..aae35878d 100644 --- a/src/test/ref/declared-memory-var-8.asm +++ b/src/test/ref/declared-memory-var-8.asm @@ -1,5 +1,5 @@ -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -// Test a fixed main memory address notregister variable +// Test declaring a variable as "memory", meaning it will be stored in main memory +// Test a fixed main memory address __notssa variable .pc = $801 "Basic" :BasicUpstart(__bbegin) .pc = $80d "Program" diff --git a/src/test/ref/declared-memory-var-8.log b/src/test/ref/declared-memory-var-8.log index 7ecab5304..12603f8c8 100644 --- a/src/test/ref/declared-memory-var-8.log +++ b/src/test/ref/declared-memory-var-8.log @@ -126,8 +126,8 @@ Allocated zp[1]:2 [ main::i#2 main::i#1 ] INITIAL ASM Target platform is c64basic / MOS6502X // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -// Test a fixed main memory address notregister variable +// Test declaring a variable as "memory", meaning it will be stored in main memory +// Test a fixed main memory address __notssa variable // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin) @@ -214,8 +214,8 @@ Uplifting [] best 409 combination mem[1]:4096 [ idx ] ASSEMBLER BEFORE OPTIMIZATION // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -// Test a fixed main memory address notregister variable +// Test declaring a variable as "memory", meaning it will be stored in main memory +// Test a fixed main memory address __notssa variable // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin) @@ -319,8 +319,8 @@ FINAL ASSEMBLER Score: 319 // File Comments -// Test declaring a variable as "memory", meaning it will be stored in memory and accessed through an implicit pointer (using load/store) -// Test a fixed main memory address notregister variable +// Test declaring a variable as "memory", meaning it will be stored in main memory +// Test a fixed main memory address __notssa variable // Upstart .pc = $801 "Basic" :BasicUpstart(__bbegin)