diff --git a/src/main/java/dk/camelot64/kickc/model/Program.java b/src/main/java/dk/camelot64/kickc/model/Program.java index 5fc0e0d0c..cab27de13 100644 --- a/src/main/java/dk/camelot64/kickc/model/Program.java +++ b/src/main/java/dk/camelot64/kickc/model/Program.java @@ -68,6 +68,9 @@ public class Program { /** Reserved ZP addresses that the compiler cannot use. */ private List reservedZps; + /** Absolute start address of the code. Null to start ad 0x080d. */ + private Number programPc; + public Program() { this.scope = new ProgramScope(); this.log = new CompileLog(); @@ -297,4 +300,16 @@ public class Program { public List getReservedZps() { return reservedZps; } + + /** + * Set the absolute position of the program code + * @param programPc The address + */ + public void setProgramPc(Number programPc) { + this.programPc = programPc; + } + + public Number getProgramPc() { + return programPc; + } } diff --git a/src/main/java/dk/camelot64/kickc/model/values/AssignmentRValue.java b/src/main/java/dk/camelot64/kickc/model/values/AssignmentRValue.java index 36cb5d6ea..b283f461d 100644 --- a/src/main/java/dk/camelot64/kickc/model/values/AssignmentRValue.java +++ b/src/main/java/dk/camelot64/kickc/model/values/AssignmentRValue.java @@ -25,4 +25,8 @@ public class AssignmentRValue implements RValue { ; } + @Override + public String toString() { + return toString(null); + } } diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 index a604ccb24..07307899e 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4 @@ -59,7 +59,8 @@ parameterDecl ; globalDirective - : directiveReserve ';' + : '#' directiveReserve #globalDirectiveReserve + | '#' 'pc' '(' NUMBER ')' #globalDirectivePc ; directive diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens index 42dfa728a..598bfd2b1 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens @@ -104,73 +104,73 @@ COMMENT_BLOCK=98 ')'=6 '{'=7 '}'=8 -'const'=9 -'extern'=10 -'align'=11 -'register'=12 -'inline'=13 -'volatile'=14 -'interrupt'=15 -'reserve'=16 -'if'=17 -'else'=18 -'while'=19 -'do'=20 -'for'=21 -'return'=22 -'break'=23 -'continue'=24 -'asm'=25 -':'=26 -'..'=27 -'signed'=28 -'unsigned'=29 -'*'=30 -'['=31 -']'=32 -'struct'=33 -'.'=34 -'->'=35 -'sizeof'=36 -'typeid'=37 -'--'=38 -'++'=39 -'+'=40 -'-'=41 -'!'=42 -'&'=43 -'~'=44 -'>>'=45 -'<<'=46 -'/'=47 -'%'=48 -'<'=49 -'>'=50 -'=='=51 -'!='=52 -'<='=53 -'>='=54 -'^'=55 -'|'=56 -'&&'=57 -'||'=58 -'?'=59 -'+='=60 -'-='=61 -'*='=62 -'/='=63 -'%='=64 -'<<='=65 -'>>='=66 -'&='=67 -'|='=68 -'^='=69 -'kickasm'=70 -'resource'=71 -'uses'=72 -'clobbers'=73 -'bytes'=74 -'cycles'=75 -'pc'=76 -'.byte'=77 -'#'=78 +'#'=9 +'pc'=10 +'const'=11 +'extern'=12 +'align'=13 +'register'=14 +'inline'=15 +'volatile'=16 +'interrupt'=17 +'reserve'=18 +'if'=19 +'else'=20 +'while'=21 +'do'=22 +'for'=23 +'return'=24 +'break'=25 +'continue'=26 +'asm'=27 +':'=28 +'..'=29 +'signed'=30 +'unsigned'=31 +'*'=32 +'['=33 +']'=34 +'struct'=35 +'.'=36 +'->'=37 +'sizeof'=38 +'typeid'=39 +'--'=40 +'++'=41 +'+'=42 +'-'=43 +'!'=44 +'&'=45 +'~'=46 +'>>'=47 +'<<'=48 +'/'=49 +'%'=50 +'<'=51 +'>'=52 +'=='=53 +'!='=54 +'<='=55 +'>='=56 +'^'=57 +'|'=58 +'&&'=59 +'||'=60 +'?'=61 +'+='=62 +'-='=63 +'*='=64 +'/='=65 +'%='=66 +'<<='=67 +'>>='=68 +'&='=69 +'|='=70 +'^='=71 +'kickasm'=72 +'resource'=73 +'uses'=74 +'clobbers'=75 +'bytes'=76 +'cycles'=77 +'.byte'=78 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java index ba4d3501e..6f183e6d5 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.ParserRuleContext; @@ -184,13 +184,25 @@ public class KickCBaseListener implements KickCListener { * *

The default implementation does nothing.

*/ - @Override public void enterGlobalDirective(KickCParser.GlobalDirectiveContext ctx) { } + @Override public void enterGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx) { } /** * {@inheritDoc} * *

The default implementation does nothing.

*/ - @Override public void exitGlobalDirective(KickCParser.GlobalDirectiveContext ctx) { } + @Override public void exitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void enterGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx) { } + /** + * {@inheritDoc} + * + *

The default implementation does nothing.

+ */ + @Override public void exitGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx) { } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java index 111fc9a36..ec722ec0e 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; @@ -115,7 +115,14 @@ public class KickCBaseVisitor extends AbstractParseTreeVisitor implements *

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

*/ - @Override public T visitGlobalDirective(KickCParser.GlobalDirectiveContext ctx) { return visitChildren(ctx); } + @Override public T visitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

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

+ */ + @Override public T visitGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java index c8c2c2b66..0f1fc617c 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.CharStream; @@ -57,16 +57,16 @@ public class KickCLexer extends Lexer { }; private static final String[] _LITERAL_NAMES = { - null, "'import'", "';'", "','", "'='", "'('", "')'", "'{'", "'}'", "'const'", - "'extern'", "'align'", "'register'", "'inline'", "'volatile'", "'interrupt'", - "'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", - "'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", "'unsigned'", - "'*'", "'['", "']'", "'struct'", "'.'", "'->'", "'sizeof'", "'typeid'", - "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", - "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", - "'||'", "'?'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", - "'&='", "'|='", "'^='", "'kickasm'", "'resource'", "'uses'", "'clobbers'", - "'bytes'", "'cycles'", "'pc'", "'.byte'", "'#'" + null, "'import'", "';'", "','", "'='", "'('", "')'", "'{'", "'}'", "'#'", + "'pc'", "'const'", "'extern'", "'align'", "'register'", "'inline'", "'volatile'", + "'interrupt'", "'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", + "'return'", "'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", + "'unsigned'", "'*'", "'['", "']'", "'struct'", "'.'", "'->'", "'sizeof'", + "'typeid'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", + "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", + "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='", "'*='", "'/='", "'%='", + "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'", "'resource'", "'uses'", + "'clobbers'", "'bytes'", "'cycles'", "'.byte'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -151,36 +151,36 @@ public class KickCLexer extends Lexer { "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\4_\t_\4"+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\4g\tg\4h\th\3\2\3\2\3\2\3\2\3"+ "\2\3\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n"+ - "\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3"+ - "\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16"+ - "\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+ - "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ - "\3\21\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27"+ - "\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+ - "\3\31\3\31\3\32\3\32\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35"+ - "\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37"+ - "\3\37\3 \3 \3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3$\3$\3$\3%\3%\3%"+ - "\3%\3%\3%\3%\3&\3&\3&\3&\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3*\3*\3+"+ - "\3+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3"+ - "\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66\3\67\3\67\3\67\38\38"+ - "\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3@\3@\3@\3A"+ - "\3A\3A\3B\3B\3B\3B\3C\3C\3C\3C\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3G"+ - "\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3H\3H\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\3M\3M\3M\3N\3N\3N"+ - "\3N\3N\3N\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P"+ - "\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5P\u02f4"+ - "\nP\3Q\3Q\3Q\3Q\7Q\u02fa\nQ\fQ\16Q\u02fd\13Q\3Q\3Q\3Q\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\5R\u0327\nR\3S\3S\3S\3S\7S\u032d\nS\fS\16S\u0330"+ + "\3\n\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3"+ + "\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3"+ + "\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3\22\3"+ + "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\25\3\25\3\25\3"+ + "\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\30\3\30\3\30\3"+ + "\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\3"+ + "\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\34\3\34\3\34\3\34\3\35\3"+ + "\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3"+ + " \3 \3 \3 \3!\3!\3\"\3\"\3#\3#\3$\3$\3$\3$\3$\3$\3$\3%\3%\3&\3&\3&\3\'"+ + "\3\'\3\'\3\'\3\'\3\'\3\'\3(\3(\3(\3(\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+"+ + "\3,\3,\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\63"+ + "\3\63\3\64\3\64\3\65\3\65\3\66\3\66\3\66\3\67\3\67\3\67\38\38\38\39\3"+ + "9\39\3:\3:\3;\3;\3<\3<\3<\3=\3=\3=\3>\3>\3?\3?\3?\3@\3@\3@\3A\3A\3A\3"+ + "B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3E\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3H\3"+ + "I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3"+ + "L\3L\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3O\3O\3"+ + "O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+ + "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5P\u02f4\nP\3"+ + "Q\3Q\3Q\3Q\7Q\u02fa\nQ\fQ\16Q\u02fd\13Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3R"+ + "\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R"+ + "\3R\3R\3R\3R\3R\3R\3R\5R\u0327\nR\3S\3S\3S\3S\7S\u032d\nS\fS\16S\u0330"+ "\13S\3S\3S\5S\u0334\nS\3T\3T\3T\3T\5T\u033a\nT\3T\3T\3U\3U\3U\3U\3U\3"+ "U\3U\3U\3U\5U\u0347\nU\3V\3V\5V\u034b\nV\3W\3W\3W\5W\u0350\nW\3X\3X\3"+ "X\3X\3X\5X\u0357\nX\3X\7X\u035a\nX\fX\16X\u035d\13X\3X\3X\6X\u0361\nX"+ @@ -223,23 +223,23 @@ public class KickCLexer extends Lexer { "\3\2\2\2\2\u00c3\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2"+ "\2\2\u00cf\3\2\2\2\3\u00d1\3\2\2\2\5\u00d8\3\2\2\2\7\u00da\3\2\2\2\t\u00dc"+ "\3\2\2\2\13\u00de\3\2\2\2\r\u00e0\3\2\2\2\17\u00e2\3\2\2\2\21\u00e4\3"+ - "\2\2\2\23\u00e6\3\2\2\2\25\u00ec\3\2\2\2\27\u00f3\3\2\2\2\31\u00f9\3\2"+ - "\2\2\33\u0102\3\2\2\2\35\u0109\3\2\2\2\37\u0112\3\2\2\2!\u011c\3\2\2\2"+ - "#\u0124\3\2\2\2%\u0127\3\2\2\2\'\u012c\3\2\2\2)\u0132\3\2\2\2+\u0135\3"+ - "\2\2\2-\u0139\3\2\2\2/\u0140\3\2\2\2\61\u0146\3\2\2\2\63\u014f\3\2\2\2"+ - "\65\u0153\3\2\2\2\67\u0155\3\2\2\29\u0158\3\2\2\2;\u015f\3\2\2\2=\u0168"+ - "\3\2\2\2?\u016a\3\2\2\2A\u016c\3\2\2\2C\u016e\3\2\2\2E\u0175\3\2\2\2G"+ - "\u0177\3\2\2\2I\u017a\3\2\2\2K\u0181\3\2\2\2M\u0188\3\2\2\2O\u018b\3\2"+ - "\2\2Q\u018e\3\2\2\2S\u0190\3\2\2\2U\u0192\3\2\2\2W\u0194\3\2\2\2Y\u0196"+ - "\3\2\2\2[\u0198\3\2\2\2]\u019b\3\2\2\2_\u019e\3\2\2\2a\u01a0\3\2\2\2c"+ - "\u01a2\3\2\2\2e\u01a4\3\2\2\2g\u01a6\3\2\2\2i\u01a9\3\2\2\2k\u01ac\3\2"+ - "\2\2m\u01af\3\2\2\2o\u01b2\3\2\2\2q\u01b4\3\2\2\2s\u01b6\3\2\2\2u\u01b9"+ - "\3\2\2\2w\u01bc\3\2\2\2y\u01be\3\2\2\2{\u01c1\3\2\2\2}\u01c4\3\2\2\2\177"+ - "\u01c7\3\2\2\2\u0081\u01ca\3\2\2\2\u0083\u01cd\3\2\2\2\u0085\u01d1\3\2"+ - "\2\2\u0087\u01d5\3\2\2\2\u0089\u01d8\3\2\2\2\u008b\u01db\3\2\2\2\u008d"+ - "\u01de\3\2\2\2\u008f\u01e6\3\2\2\2\u0091\u01ef\3\2\2\2\u0093\u01f4\3\2"+ - "\2\2\u0095\u01fd\3\2\2\2\u0097\u0203\3\2\2\2\u0099\u020a\3\2\2\2\u009b"+ - "\u020d\3\2\2\2\u009d\u0213\3\2\2\2\u009f\u02f3\3\2\2\2\u00a1\u02f5\3\2"+ + "\2\2\2\23\u00e6\3\2\2\2\25\u00e8\3\2\2\2\27\u00eb\3\2\2\2\31\u00f1\3\2"+ + "\2\2\33\u00f8\3\2\2\2\35\u00fe\3\2\2\2\37\u0107\3\2\2\2!\u010e\3\2\2\2"+ + "#\u0117\3\2\2\2%\u0121\3\2\2\2\'\u0129\3\2\2\2)\u012c\3\2\2\2+\u0131\3"+ + "\2\2\2-\u0137\3\2\2\2/\u013a\3\2\2\2\61\u013e\3\2\2\2\63\u0145\3\2\2\2"+ + "\65\u014b\3\2\2\2\67\u0154\3\2\2\29\u0158\3\2\2\2;\u015a\3\2\2\2=\u015d"+ + "\3\2\2\2?\u0164\3\2\2\2A\u016d\3\2\2\2C\u016f\3\2\2\2E\u0171\3\2\2\2G"+ + "\u0173\3\2\2\2I\u017a\3\2\2\2K\u017c\3\2\2\2M\u017f\3\2\2\2O\u0186\3\2"+ + "\2\2Q\u018d\3\2\2\2S\u0190\3\2\2\2U\u0193\3\2\2\2W\u0195\3\2\2\2Y\u0197"+ + "\3\2\2\2[\u0199\3\2\2\2]\u019b\3\2\2\2_\u019d\3\2\2\2a\u01a0\3\2\2\2c"+ + "\u01a3\3\2\2\2e\u01a5\3\2\2\2g\u01a7\3\2\2\2i\u01a9\3\2\2\2k\u01ab\3\2"+ + "\2\2m\u01ae\3\2\2\2o\u01b1\3\2\2\2q\u01b4\3\2\2\2s\u01b7\3\2\2\2u\u01b9"+ + "\3\2\2\2w\u01bb\3\2\2\2y\u01be\3\2\2\2{\u01c1\3\2\2\2}\u01c3\3\2\2\2\177"+ + "\u01c6\3\2\2\2\u0081\u01c9\3\2\2\2\u0083\u01cc\3\2\2\2\u0085\u01cf\3\2"+ + "\2\2\u0087\u01d2\3\2\2\2\u0089\u01d6\3\2\2\2\u008b\u01da\3\2\2\2\u008d"+ + "\u01dd\3\2\2\2\u008f\u01e0\3\2\2\2\u0091\u01e3\3\2\2\2\u0093\u01eb\3\2"+ + "\2\2\u0095\u01f4\3\2\2\2\u0097\u01f9\3\2\2\2\u0099\u0202\3\2\2\2\u009b"+ + "\u0208\3\2\2\2\u009d\u020f\3\2\2\2\u009f\u02f3\3\2\2\2\u00a1\u02f5\3\2"+ "\2\2\u00a3\u0326\3\2\2\2\u00a5\u0328\3\2\2\2\u00a7\u0335\3\2\2\2\u00a9"+ "\u0346\3\2\2\2\u00ab\u034a\3\2\2\2\u00ad\u034f\3\2\2\2\u00af\u0356\3\2"+ "\2\2\u00b1\u0367\3\2\2\2\u00b3\u0375\3\2\2\2\u00b5\u0386\3\2\2\2\u00b7"+ @@ -252,252 +252,252 @@ public class KickCLexer extends Lexer { "\u00da\u00db\7.\2\2\u00db\b\3\2\2\2\u00dc\u00dd\7?\2\2\u00dd\n\3\2\2\2"+ "\u00de\u00df\7*\2\2\u00df\f\3\2\2\2\u00e0\u00e1\7+\2\2\u00e1\16\3\2\2"+ "\2\u00e2\u00e3\7}\2\2\u00e3\20\3\2\2\2\u00e4\u00e5\7\177\2\2\u00e5\22"+ - "\3\2\2\2\u00e6\u00e7\7e\2\2\u00e7\u00e8\7q\2\2\u00e8\u00e9\7p\2\2\u00e9"+ - "\u00ea\7u\2\2\u00ea\u00eb\7v\2\2\u00eb\24\3\2\2\2\u00ec\u00ed\7g\2\2\u00ed"+ - "\u00ee\7z\2\2\u00ee\u00ef\7v\2\2\u00ef\u00f0\7g\2\2\u00f0\u00f1\7t\2\2"+ - "\u00f1\u00f2\7p\2\2\u00f2\26\3\2\2\2\u00f3\u00f4\7c\2\2\u00f4\u00f5\7"+ - "n\2\2\u00f5\u00f6\7k\2\2\u00f6\u00f7\7i\2\2\u00f7\u00f8\7p\2\2\u00f8\30"+ - "\3\2\2\2\u00f9\u00fa\7t\2\2\u00fa\u00fb\7g\2\2\u00fb\u00fc\7i\2\2\u00fc"+ - "\u00fd\7k\2\2\u00fd\u00fe\7u\2\2\u00fe\u00ff\7v\2\2\u00ff\u0100\7g\2\2"+ - "\u0100\u0101\7t\2\2\u0101\32\3\2\2\2\u0102\u0103\7k\2\2\u0103\u0104\7"+ - "p\2\2\u0104\u0105\7n\2\2\u0105\u0106\7k\2\2\u0106\u0107\7p\2\2\u0107\u0108"+ - "\7g\2\2\u0108\34\3\2\2\2\u0109\u010a\7x\2\2\u010a\u010b\7q\2\2\u010b\u010c"+ - "\7n\2\2\u010c\u010d\7c\2\2\u010d\u010e\7v\2\2\u010e\u010f\7k\2\2\u010f"+ - "\u0110\7n\2\2\u0110\u0111\7g\2\2\u0111\36\3\2\2\2\u0112\u0113\7k\2\2\u0113"+ - "\u0114\7p\2\2\u0114\u0115\7v\2\2\u0115\u0116\7g\2\2\u0116\u0117\7t\2\2"+ - "\u0117\u0118\7t\2\2\u0118\u0119\7w\2\2\u0119\u011a\7r\2\2\u011a\u011b"+ - "\7v\2\2\u011b \3\2\2\2\u011c\u011d\7t\2\2\u011d\u011e\7g\2\2\u011e\u011f"+ - "\7u\2\2\u011f\u0120\7g\2\2\u0120\u0121\7t\2\2\u0121\u0122\7x\2\2\u0122"+ - "\u0123\7g\2\2\u0123\"\3\2\2\2\u0124\u0125\7k\2\2\u0125\u0126\7h\2\2\u0126"+ - "$\3\2\2\2\u0127\u0128\7g\2\2\u0128\u0129\7n\2\2\u0129\u012a\7u\2\2\u012a"+ - "\u012b\7g\2\2\u012b&\3\2\2\2\u012c\u012d\7y\2\2\u012d\u012e\7j\2\2\u012e"+ - "\u012f\7k\2\2\u012f\u0130\7n\2\2\u0130\u0131\7g\2\2\u0131(\3\2\2\2\u0132"+ - "\u0133\7f\2\2\u0133\u0134\7q\2\2\u0134*\3\2\2\2\u0135\u0136\7h\2\2\u0136"+ - "\u0137\7q\2\2\u0137\u0138\7t\2\2\u0138,\3\2\2\2\u0139\u013a\7t\2\2\u013a"+ - "\u013b\7g\2\2\u013b\u013c\7v\2\2\u013c\u013d\7w\2\2\u013d\u013e\7t\2\2"+ - "\u013e\u013f\7p\2\2\u013f.\3\2\2\2\u0140\u0141\7d\2\2\u0141\u0142\7t\2"+ - "\2\u0142\u0143\7g\2\2\u0143\u0144\7c\2\2\u0144\u0145\7m\2\2\u0145\60\3"+ - "\2\2\2\u0146\u0147\7e\2\2\u0147\u0148\7q\2\2\u0148\u0149\7p\2\2\u0149"+ - "\u014a\7v\2\2\u014a\u014b\7k\2\2\u014b\u014c\7p\2\2\u014c\u014d\7w\2\2"+ - "\u014d\u014e\7g\2\2\u014e\62\3\2\2\2\u014f\u0150\7c\2\2\u0150\u0151\7"+ - "u\2\2\u0151\u0152\7o\2\2\u0152\64\3\2\2\2\u0153\u0154\7<\2\2\u0154\66"+ - "\3\2\2\2\u0155\u0156\7\60\2\2\u0156\u0157\7\60\2\2\u01578\3\2\2\2\u0158"+ - "\u0159\7u\2\2\u0159\u015a\7k\2\2\u015a\u015b\7i\2\2\u015b\u015c\7p\2\2"+ - "\u015c\u015d\7g\2\2\u015d\u015e\7f\2\2\u015e:\3\2\2\2\u015f\u0160\7w\2"+ - "\2\u0160\u0161\7p\2\2\u0161\u0162\7u\2\2\u0162\u0163\7k\2\2\u0163\u0164"+ - "\7i\2\2\u0164\u0165\7p\2\2\u0165\u0166\7g\2\2\u0166\u0167\7f\2\2\u0167"+ - "<\3\2\2\2\u0168\u0169\7,\2\2\u0169>\3\2\2\2\u016a\u016b\7]\2\2\u016b@"+ - "\3\2\2\2\u016c\u016d\7_\2\2\u016dB\3\2\2\2\u016e\u016f\7u\2\2\u016f\u0170"+ - "\7v\2\2\u0170\u0171\7t\2\2\u0171\u0172\7w\2\2\u0172\u0173\7e\2\2\u0173"+ - "\u0174\7v\2\2\u0174D\3\2\2\2\u0175\u0176\7\60\2\2\u0176F\3\2\2\2\u0177"+ - "\u0178\7/\2\2\u0178\u0179\7@\2\2\u0179H\3\2\2\2\u017a\u017b\7u\2\2\u017b"+ - "\u017c\7k\2\2\u017c\u017d\7|\2\2\u017d\u017e\7g\2\2\u017e\u017f\7q\2\2"+ - "\u017f\u0180\7h\2\2\u0180J\3\2\2\2\u0181\u0182\7v\2\2\u0182\u0183\7{\2"+ - "\2\u0183\u0184\7r\2\2\u0184\u0185\7g\2\2\u0185\u0186\7k\2\2\u0186\u0187"+ - "\7f\2\2\u0187L\3\2\2\2\u0188\u0189\7/\2\2\u0189\u018a\7/\2\2\u018aN\3"+ - "\2\2\2\u018b\u018c\7-\2\2\u018c\u018d\7-\2\2\u018dP\3\2\2\2\u018e\u018f"+ - "\7-\2\2\u018fR\3\2\2\2\u0190\u0191\7/\2\2\u0191T\3\2\2\2\u0192\u0193\7"+ - "#\2\2\u0193V\3\2\2\2\u0194\u0195\7(\2\2\u0195X\3\2\2\2\u0196\u0197\7\u0080"+ - "\2\2\u0197Z\3\2\2\2\u0198\u0199\7@\2\2\u0199\u019a\7@\2\2\u019a\\\3\2"+ - "\2\2\u019b\u019c\7>\2\2\u019c\u019d\7>\2\2\u019d^\3\2\2\2\u019e\u019f"+ - "\7\61\2\2\u019f`\3\2\2\2\u01a0\u01a1\7\'\2\2\u01a1b\3\2\2\2\u01a2\u01a3"+ - "\7>\2\2\u01a3d\3\2\2\2\u01a4\u01a5\7@\2\2\u01a5f\3\2\2\2\u01a6\u01a7\7"+ - "?\2\2\u01a7\u01a8\7?\2\2\u01a8h\3\2\2\2\u01a9\u01aa\7#\2\2\u01aa\u01ab"+ - "\7?\2\2\u01abj\3\2\2\2\u01ac\u01ad\7>\2\2\u01ad\u01ae\7?\2\2\u01ael\3"+ - "\2\2\2\u01af\u01b0\7@\2\2\u01b0\u01b1\7?\2\2\u01b1n\3\2\2\2\u01b2\u01b3"+ - "\7`\2\2\u01b3p\3\2\2\2\u01b4\u01b5\7~\2\2\u01b5r\3\2\2\2\u01b6\u01b7\7"+ - "(\2\2\u01b7\u01b8\7(\2\2\u01b8t\3\2\2\2\u01b9\u01ba\7~\2\2\u01ba\u01bb"+ - "\7~\2\2\u01bbv\3\2\2\2\u01bc\u01bd\7A\2\2\u01bdx\3\2\2\2\u01be\u01bf\7"+ - "-\2\2\u01bf\u01c0\7?\2\2\u01c0z\3\2\2\2\u01c1\u01c2\7/\2\2\u01c2\u01c3"+ - "\7?\2\2\u01c3|\3\2\2\2\u01c4\u01c5\7,\2\2\u01c5\u01c6\7?\2\2\u01c6~\3"+ - "\2\2\2\u01c7\u01c8\7\61\2\2\u01c8\u01c9\7?\2\2\u01c9\u0080\3\2\2\2\u01ca"+ - "\u01cb\7\'\2\2\u01cb\u01cc\7?\2\2\u01cc\u0082\3\2\2\2\u01cd\u01ce\7>\2"+ - "\2\u01ce\u01cf\7>\2\2\u01cf\u01d0\7?\2\2\u01d0\u0084\3\2\2\2\u01d1\u01d2"+ - "\7@\2\2\u01d2\u01d3\7@\2\2\u01d3\u01d4\7?\2\2\u01d4\u0086\3\2\2\2\u01d5"+ - "\u01d6\7(\2\2\u01d6\u01d7\7?\2\2\u01d7\u0088\3\2\2\2\u01d8\u01d9\7~\2"+ - "\2\u01d9\u01da\7?\2\2\u01da\u008a\3\2\2\2\u01db\u01dc\7`\2\2\u01dc\u01dd"+ - "\7?\2\2\u01dd\u008c\3\2\2\2\u01de\u01df\7m\2\2\u01df\u01e0\7k\2\2\u01e0"+ - "\u01e1\7e\2\2\u01e1\u01e2\7m\2\2\u01e2\u01e3\7c\2\2\u01e3\u01e4\7u\2\2"+ - "\u01e4\u01e5\7o\2\2\u01e5\u008e\3\2\2\2\u01e6\u01e7\7t\2\2\u01e7\u01e8"+ - "\7g\2\2\u01e8\u01e9\7u\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb\7w\2\2\u01eb"+ - "\u01ec\7t\2\2\u01ec\u01ed\7e\2\2\u01ed\u01ee\7g\2\2\u01ee\u0090\3\2\2"+ - "\2\u01ef\u01f0\7w\2\2\u01f0\u01f1\7u\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3"+ - "\7u\2\2\u01f3\u0092\3\2\2\2\u01f4\u01f5\7e\2\2\u01f5\u01f6\7n\2\2\u01f6"+ - "\u01f7\7q\2\2\u01f7\u01f8\7d\2\2\u01f8\u01f9\7d\2\2\u01f9\u01fa\7g\2\2"+ - "\u01fa\u01fb\7t\2\2\u01fb\u01fc\7u\2\2\u01fc\u0094\3\2\2\2\u01fd\u01fe"+ - "\7d\2\2\u01fe\u01ff\7{\2\2\u01ff\u0200\7v\2\2\u0200\u0201\7g\2\2\u0201"+ - "\u0202\7u\2\2\u0202\u0096\3\2\2\2\u0203\u0204\7e\2\2\u0204\u0205\7{\2"+ - "\2\u0205\u0206\7e\2\2\u0206\u0207\7n\2\2\u0207\u0208\7g\2\2\u0208\u0209"+ - "\7u\2\2\u0209\u0098\3\2\2\2\u020a\u020b\7r\2\2\u020b\u020c\7e\2\2\u020c"+ - "\u009a\3\2\2\2\u020d\u020e\7\60\2\2\u020e\u020f\7d\2\2\u020f\u0210\7{"+ - "\2\2\u0210\u0211\7v\2\2\u0211\u0212\7g\2\2\u0212\u009c\3\2\2\2\u0213\u0214"+ - "\7%\2\2\u0214\u009e\3\2\2\2\u0215\u0216\7d\2\2\u0216\u0217\7t\2\2\u0217"+ - "\u02f4\7m\2\2\u0218\u0219\7q\2\2\u0219\u021a\7t\2\2\u021a\u02f4\7c\2\2"+ - "\u021b\u021c\7m\2\2\u021c\u021d\7k\2\2\u021d\u02f4\7n\2\2\u021e\u021f"+ - "\7u\2\2\u021f\u0220\7n\2\2\u0220\u02f4\7q\2\2\u0221\u0222\7p\2\2\u0222"+ - "\u0223\7q\2\2\u0223\u02f4\7r\2\2\u0224\u0225\7c\2\2\u0225\u0226\7u\2\2"+ - "\u0226\u02f4\7n\2\2\u0227\u0228\7r\2\2\u0228\u0229\7j\2\2\u0229\u02f4"+ - "\7r\2\2\u022a\u022b\7c\2\2\u022b\u022c\7p\2\2\u022c\u02f4\7e\2\2\u022d"+ - "\u022e\7d\2\2\u022e\u022f\7r\2\2\u022f\u02f4\7n\2\2\u0230\u0231\7e\2\2"+ - "\u0231\u0232\7n\2\2\u0232\u02f4\7e\2\2\u0233\u0234\7l\2\2\u0234\u0235"+ - "\7u\2\2\u0235\u02f4\7t\2\2\u0236\u0237\7c\2\2\u0237\u0238\7p\2\2\u0238"+ - "\u02f4\7f\2\2\u0239\u023a\7t\2\2\u023a\u023b\7n\2\2\u023b\u02f4\7c\2\2"+ - "\u023c\u023d\7d\2\2\u023d\u023e\7k\2\2\u023e\u02f4\7v\2\2\u023f\u0240"+ - "\7t\2\2\u0240\u0241\7q\2\2\u0241\u02f4\7n\2\2\u0242\u0243\7r\2\2\u0243"+ - "\u0244\7n\2\2\u0244\u02f4\7c\2\2\u0245\u0246\7r\2\2\u0246\u0247\7n\2\2"+ - "\u0247\u02f4\7r\2\2\u0248\u0249\7d\2\2\u0249\u024a\7o\2\2\u024a\u02f4"+ - "\7k\2\2\u024b\u024c\7u\2\2\u024c\u024d\7g\2\2\u024d\u02f4\7e\2\2\u024e"+ - "\u024f\7t\2\2\u024f\u0250\7v\2\2\u0250\u02f4\7k\2\2\u0251\u0252\7g\2\2"+ - "\u0252\u0253\7q\2\2\u0253\u02f4\7t\2\2\u0254\u0255\7u\2\2\u0255\u0256"+ - "\7t\2\2\u0256\u02f4\7g\2\2\u0257\u0258\7n\2\2\u0258\u0259\7u\2\2\u0259"+ - "\u02f4\7t\2\2\u025a\u025b\7r\2\2\u025b\u025c\7j\2\2\u025c\u02f4\7c\2\2"+ - "\u025d\u025e\7c\2\2\u025e\u025f\7n\2\2\u025f\u02f4\7t\2\2\u0260\u0261"+ - "\7l\2\2\u0261\u0262\7o\2\2\u0262\u02f4\7r\2\2\u0263\u0264\7d\2\2\u0264"+ - "\u0265\7x\2\2\u0265\u02f4\7e\2\2\u0266\u0267\7e\2\2\u0267\u0268\7n\2\2"+ - "\u0268\u02f4\7k\2\2\u0269\u026a\7t\2\2\u026a\u026b\7v\2\2\u026b\u02f4"+ - "\7u\2\2\u026c\u026d\7c\2\2\u026d\u026e\7f\2\2\u026e\u02f4\7e\2\2\u026f"+ - "\u0270\7t\2\2\u0270\u0271\7t\2\2\u0271\u02f4\7c\2\2\u0272\u0273\7d\2\2"+ - "\u0273\u0274\7x\2\2\u0274\u02f4\7u\2\2\u0275\u0276\7u\2\2\u0276\u0277"+ - "\7g\2\2\u0277\u02f4\7k\2\2\u0278\u0279\7u\2\2\u0279\u027a\7c\2\2\u027a"+ - "\u02f4\7z\2\2\u027b\u027c\7u\2\2\u027c\u027d\7v\2\2\u027d\u02f4\7{\2\2"+ - "\u027e\u027f\7u\2\2\u027f\u0280\7v\2\2\u0280\u02f4\7c\2\2\u0281\u0282"+ - "\7u\2\2\u0282\u0283\7v\2\2\u0283\u02f4\7z\2\2\u0284\u0285\7f\2\2\u0285"+ - "\u0286\7g\2\2\u0286\u02f4\7{\2\2\u0287\u0288\7v\2\2\u0288\u0289\7z\2\2"+ - "\u0289\u02f4\7c\2\2\u028a\u028b\7z\2\2\u028b\u028c\7c\2\2\u028c\u02f4"+ - "\7c\2\2\u028d\u028e\7d\2\2\u028e\u028f\7e\2\2\u028f\u02f4\7e\2\2\u0290"+ - "\u0291\7c\2\2\u0291\u0292\7j\2\2\u0292\u02f4\7z\2\2\u0293\u0294\7v\2\2"+ - "\u0294\u0295\7{\2\2\u0295\u02f4\7c\2\2\u0296\u0297\7v\2\2\u0297\u0298"+ - "\7z\2\2\u0298\u02f4\7u\2\2\u0299\u029a\7v\2\2\u029a\u029b\7c\2\2\u029b"+ - "\u02f4\7u\2\2\u029c\u029d\7u\2\2\u029d\u029e\7j\2\2\u029e\u02f4\7{\2\2"+ - "\u029f\u02a0\7u\2\2\u02a0\u02a1\7j\2\2\u02a1\u02f4\7z\2\2\u02a2\u02a3"+ - "\7n\2\2\u02a3\u02a4\7f\2\2\u02a4\u02f4\7{\2\2\u02a5\u02a6\7n\2\2\u02a6"+ - "\u02a7\7f\2\2\u02a7\u02f4\7c\2\2\u02a8\u02a9\7n\2\2\u02a9\u02aa\7f\2\2"+ - "\u02aa\u02f4\7z\2\2\u02ab\u02ac\7n\2\2\u02ac\u02ad\7c\2\2\u02ad\u02f4"+ - "\7z\2\2\u02ae\u02af\7v\2\2\u02af\u02b0\7c\2\2\u02b0\u02f4\7{\2\2\u02b1"+ - "\u02b2\7v\2\2\u02b2\u02b3\7c\2\2\u02b3\u02f4\7z\2\2\u02b4\u02b5\7d\2\2"+ - "\u02b5\u02b6\7e\2\2\u02b6\u02f4\7u\2\2\u02b7\u02b8\7e\2\2\u02b8\u02b9"+ - "\7n\2\2\u02b9\u02f4\7x\2\2\u02ba\u02bb\7v\2\2\u02bb\u02bc\7u\2\2\u02bc"+ - "\u02f4\7z\2\2\u02bd\u02be\7n\2\2\u02be\u02bf\7c\2\2\u02bf\u02f4\7u\2\2"+ - "\u02c0\u02c1\7e\2\2\u02c1\u02c2\7r\2\2\u02c2\u02f4\7{\2\2\u02c3\u02c4"+ - "\7e\2\2\u02c4\u02c5\7o\2\2\u02c5\u02f4\7r\2\2\u02c6\u02c7\7e\2\2\u02c7"+ - "\u02c8\7r\2\2\u02c8\u02f4\7z\2\2\u02c9\u02ca\7f\2\2\u02ca\u02cb\7e\2\2"+ - "\u02cb\u02f4\7r\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce\7g\2\2\u02ce\u02f4"+ - "\7e\2\2\u02cf\u02d0\7k\2\2\u02d0\u02d1\7p\2\2\u02d1\u02f4\7e\2\2\u02d2"+ - "\u02d3\7c\2\2\u02d3\u02d4\7z\2\2\u02d4\u02f4\7u\2\2\u02d5\u02d6\7d\2\2"+ - "\u02d6\u02d7\7p\2\2\u02d7\u02f4\7g\2\2\u02d8\u02d9\7e\2\2\u02d9\u02da"+ - "\7n\2\2\u02da\u02f4\7f\2\2\u02db\u02dc\7u\2\2\u02dc\u02dd\7d\2\2\u02dd"+ - "\u02f4\7e\2\2\u02de\u02df\7k\2\2\u02df\u02e0\7u\2\2\u02e0\u02f4\7e\2\2"+ - "\u02e1\u02e2\7k\2\2\u02e2\u02e3\7p\2\2\u02e3\u02f4\7z\2\2\u02e4\u02e5"+ - "\7d\2\2\u02e5\u02e6\7g\2\2\u02e6\u02f4\7s\2\2\u02e7\u02e8\7u\2\2\u02e8"+ - "\u02e9\7g\2\2\u02e9\u02f4\7f\2\2\u02ea\u02eb\7f\2\2\u02eb\u02ec\7g\2\2"+ - "\u02ec\u02f4\7z\2\2\u02ed\u02ee\7k\2\2\u02ee\u02ef\7p\2\2\u02ef\u02f4"+ - "\7{\2\2\u02f0\u02f1\7t\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f4\7t\2\2\u02f3"+ - "\u0215\3\2\2\2\u02f3\u0218\3\2\2\2\u02f3\u021b\3\2\2\2\u02f3\u021e\3\2"+ - "\2\2\u02f3\u0221\3\2\2\2\u02f3\u0224\3\2\2\2\u02f3\u0227\3\2\2\2\u02f3"+ - "\u022a\3\2\2\2\u02f3\u022d\3\2\2\2\u02f3\u0230\3\2\2\2\u02f3\u0233\3\2"+ - "\2\2\u02f3\u0236\3\2\2\2\u02f3\u0239\3\2\2\2\u02f3\u023c\3\2\2\2\u02f3"+ - "\u023f\3\2\2\2\u02f3\u0242\3\2\2\2\u02f3\u0245\3\2\2\2\u02f3\u0248\3\2"+ - "\2\2\u02f3\u024b\3\2\2\2\u02f3\u024e\3\2\2\2\u02f3\u0251\3\2\2\2\u02f3"+ - "\u0254\3\2\2\2\u02f3\u0257\3\2\2\2\u02f3\u025a\3\2\2\2\u02f3\u025d\3\2"+ - "\2\2\u02f3\u0260\3\2\2\2\u02f3\u0263\3\2\2\2\u02f3\u0266\3\2\2\2\u02f3"+ - "\u0269\3\2\2\2\u02f3\u026c\3\2\2\2\u02f3\u026f\3\2\2\2\u02f3\u0272\3\2"+ - "\2\2\u02f3\u0275\3\2\2\2\u02f3\u0278\3\2\2\2\u02f3\u027b\3\2\2\2\u02f3"+ - "\u027e\3\2\2\2\u02f3\u0281\3\2\2\2\u02f3\u0284\3\2\2\2\u02f3\u0287\3\2"+ - "\2\2\u02f3\u028a\3\2\2\2\u02f3\u028d\3\2\2\2\u02f3\u0290\3\2\2\2\u02f3"+ - "\u0293\3\2\2\2\u02f3\u0296\3\2\2\2\u02f3\u0299\3\2\2\2\u02f3\u029c\3\2"+ - "\2\2\u02f3\u029f\3\2\2\2\u02f3\u02a2\3\2\2\2\u02f3\u02a5\3\2\2\2\u02f3"+ - "\u02a8\3\2\2\2\u02f3\u02ab\3\2\2\2\u02f3\u02ae\3\2\2\2\u02f3\u02b1\3\2"+ - "\2\2\u02f3\u02b4\3\2\2\2\u02f3\u02b7\3\2\2\2\u02f3\u02ba\3\2\2\2\u02f3"+ - "\u02bd\3\2\2\2\u02f3\u02c0\3\2\2\2\u02f3\u02c3\3\2\2\2\u02f3\u02c6\3\2"+ - "\2\2\u02f3\u02c9\3\2\2\2\u02f3\u02cc\3\2\2\2\u02f3\u02cf\3\2\2\2\u02f3"+ - "\u02d2\3\2\2\2\u02f3\u02d5\3\2\2\2\u02f3\u02d8\3\2\2\2\u02f3\u02db\3\2"+ - "\2\2\u02f3\u02de\3\2\2\2\u02f3\u02e1\3\2\2\2\u02f3\u02e4\3\2\2\2\u02f3"+ - "\u02e7\3\2\2\2\u02f3\u02ea\3\2\2\2\u02f3\u02ed\3\2\2\2\u02f3\u02f0\3\2"+ - "\2\2\u02f4\u00a0\3\2\2\2\u02f5\u02f6\7}\2\2\u02f6\u02f7\7}\2\2\u02f7\u02fb"+ - "\3\2\2\2\u02f8\u02fa\13\2\2\2\u02f9\u02f8\3\2\2\2\u02fa\u02fd\3\2\2\2"+ - "\u02fb\u02fc\3\2\2\2\u02fb\u02f9\3\2\2\2\u02fc\u02fe\3\2\2\2\u02fd\u02fb"+ - "\3\2\2\2\u02fe\u02ff\7\177\2\2\u02ff\u0300\7\177\2\2\u0300\u00a2\3\2\2"+ - "\2\u0301\u0302\7d\2\2\u0302\u0303\7{\2\2\u0303\u0304\7v\2\2\u0304\u0327"+ - "\7g\2\2\u0305\u0306\7y\2\2\u0306\u0307\7q\2\2\u0307\u0308\7t\2\2\u0308"+ - "\u0327\7f\2\2\u0309\u030a\7f\2\2\u030a\u030b\7y\2\2\u030b\u030c\7q\2\2"+ - "\u030c\u030d\7t\2\2\u030d\u0327\7f\2\2\u030e\u030f\7d\2\2\u030f\u0310"+ - "\7q\2\2\u0310\u0311\7q\2\2\u0311\u0327\7n\2\2\u0312\u0313\7e\2\2\u0313"+ - "\u0314\7j\2\2\u0314\u0315\7c\2\2\u0315\u0327\7t\2\2\u0316\u0317\7u\2\2"+ - "\u0317\u0318\7j\2\2\u0318\u0319\7q\2\2\u0319\u031a\7t\2\2\u031a\u0327"+ - "\7v\2\2\u031b\u031c\7k\2\2\u031c\u031d\7p\2\2\u031d\u0327\7v\2\2\u031e"+ - "\u031f\7n\2\2\u031f\u0320\7q\2\2\u0320\u0321\7p\2\2\u0321\u0327\7i\2\2"+ - "\u0322\u0323\7x\2\2\u0323\u0324\7q\2\2\u0324\u0325\7k\2\2\u0325\u0327"+ - "\7f\2\2\u0326\u0301\3\2\2\2\u0326\u0305\3\2\2\2\u0326\u0309\3\2\2\2\u0326"+ - "\u030e\3\2\2\2\u0326\u0312\3\2\2\2\u0326\u0316\3\2\2\2\u0326\u031b\3\2"+ - "\2\2\u0326\u031e\3\2\2\2\u0326\u0322\3\2\2\2\u0327\u00a4\3\2\2\2\u0328"+ - "\u032e\7$\2\2\u0329\u032a\7^\2\2\u032a\u032d\7$\2\2\u032b\u032d\n\2\2"+ - "\2\u032c\u0329\3\2\2\2\u032c\u032b\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032c"+ - "\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u0331\3\2\2\2\u0330\u032e\3\2\2\2\u0331"+ - "\u0333\7$\2\2\u0332\u0334\7|\2\2\u0333\u0332\3\2\2\2\u0333\u0334\3\2\2"+ - "\2\u0334\u00a6\3\2\2\2\u0335\u0339\7)\2\2\u0336\u0337\7^\2\2\u0337\u033a"+ - "\7)\2\2\u0338\u033a\n\3\2\2\u0339\u0336\3\2\2\2\u0339\u0338\3\2\2\2\u033a"+ - "\u033b\3\2\2\2\u033b\u033c\7)\2\2\u033c\u00a8\3\2\2\2\u033d\u033e\7v\2"+ - "\2\u033e\u033f\7t\2\2\u033f\u0340\7w\2\2\u0340\u0347\7g\2\2\u0341\u0342"+ - "\7h\2\2\u0342\u0343\7c\2\2\u0343\u0344\7n\2\2\u0344\u0345\7u\2\2\u0345"+ - "\u0347\7g\2\2\u0346\u033d\3\2\2\2\u0346\u0341\3\2\2\2\u0347\u00aa\3\2"+ - "\2\2\u0348\u034b\5\u00adW\2\u0349\u034b\5\u00b5[\2\u034a\u0348\3\2\2\2"+ - "\u034a\u0349\3\2\2\2\u034b\u00ac\3\2\2\2\u034c\u0350\5\u00afX\2\u034d"+ - "\u0350\5\u00b1Y\2\u034e\u0350\5\u00b3Z\2\u034f\u034c\3\2\2\2\u034f\u034d"+ - "\3\2\2\2\u034f\u034e\3\2\2\2\u0350\u00ae\3\2\2\2\u0351\u0357\7\'\2\2\u0352"+ - "\u0353\7\62\2\2\u0353\u0357\7d\2\2\u0354\u0355\7\62\2\2\u0355\u0357\7"+ - "D\2\2\u0356\u0351\3\2\2\2\u0356\u0352\3\2\2\2\u0356\u0354\3\2\2\2\u0357"+ - "\u035b\3\2\2\2\u0358\u035a\5\u00bd_\2\u0359\u0358\3\2\2\2\u035a\u035d"+ - "\3\2\2\2\u035b\u0359\3\2\2\2\u035b\u035c\3\2\2\2\u035c\u035e\3\2\2\2\u035d"+ - "\u035b\3\2\2\2\u035e\u0360\7\60\2\2\u035f\u0361\5\u00bd_\2\u0360\u035f"+ - "\3\2\2\2\u0361\u0362\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2\u0363"+ - "\u00b0\3\2\2\2\u0364\u0366\5\u00bf`\2\u0365\u0364\3\2\2\2\u0366\u0369"+ - "\3\2\2\2\u0367\u0365\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036a\3\2\2\2\u0369"+ - "\u0367\3\2\2\2\u036a\u036c\7\60\2\2\u036b\u036d\5\u00bf`\2\u036c\u036b"+ - "\3\2\2\2\u036d\u036e\3\2\2\2\u036e\u036c\3\2\2\2\u036e\u036f\3\2\2\2\u036f"+ - "\u00b2\3\2\2\2\u0370\u0376\7&\2\2\u0371\u0372\7\62\2\2\u0372\u0376\7z"+ - "\2\2\u0373\u0374\7\62\2\2\u0374\u0376\7Z\2\2\u0375\u0370\3\2\2\2\u0375"+ - "\u0371\3\2\2\2\u0375\u0373\3\2\2\2\u0376\u037a\3\2\2\2\u0377\u0379\5\u00c1"+ - "a\2\u0378\u0377\3\2\2\2\u0379\u037c\3\2\2\2\u037a\u0378\3\2\2\2\u037a"+ - "\u037b\3\2\2\2\u037b\u037d\3\2\2\2\u037c\u037a\3\2\2\2\u037d\u037f\7\60"+ - "\2\2\u037e\u0380\5\u00c1a\2\u037f\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381"+ - "\u037f\3\2\2\2\u0381\u0382\3\2\2\2\u0382\u00b4\3\2\2\2\u0383\u0387\5\u00b9"+ - "]\2\u0384\u0387\5\u00bb^\2\u0385\u0387\5\u00b7\\\2\u0386\u0383\3\2\2\2"+ - "\u0386\u0384\3\2\2\2\u0386\u0385\3\2\2\2\u0387\u038b\3\2\2\2\u0388\u0389"+ - "\t\4\2\2\u0389\u038c\t\5\2\2\u038a\u038c\7n\2\2\u038b\u0388\3\2\2\2\u038b"+ - "\u038a\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u00b6\3\2\2\2\u038d\u038e\7\62"+ - "\2\2\u038e\u0390\t\6\2\2\u038f\u0391\5\u00bd_\2\u0390\u038f\3\2\2\2\u0391"+ - "\u0392\3\2\2\2\u0392\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u039b\3\2"+ - "\2\2\u0394\u0396\7\'\2\2\u0395\u0397\5\u00bd_\2\u0396\u0395\3\2\2\2\u0397"+ - "\u0398\3\2\2\2\u0398\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399\u039b\3\2"+ - "\2\2\u039a\u038d\3\2\2\2\u039a\u0394\3\2\2\2\u039b\u00b8\3\2\2\2\u039c"+ - "\u039e\5\u00bf`\2\u039d\u039c\3\2\2\2\u039e\u039f\3\2\2\2\u039f\u039d"+ - "\3\2\2\2\u039f\u03a0\3\2\2\2\u03a0\u00ba\3\2\2\2\u03a1\u03a7\7&\2\2\u03a2"+ - "\u03a3\7\62\2\2\u03a3\u03a7\7z\2\2\u03a4\u03a5\7\62\2\2\u03a5\u03a7\7"+ - "Z\2\2\u03a6\u03a1\3\2\2\2\u03a6\u03a2\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a7"+ - "\u03a9\3\2\2\2\u03a8\u03aa\5\u00c1a\2\u03a9\u03a8\3\2\2\2\u03aa\u03ab"+ - "\3\2\2\2\u03ab\u03a9\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac\u00bc\3\2\2\2\u03ad"+ - "\u03ae\t\7\2\2\u03ae\u00be\3\2\2\2\u03af\u03b0\t\b\2\2\u03b0\u00c0\3\2"+ - "\2\2\u03b1\u03b2\t\t\2\2\u03b2\u00c2\3\2\2\2\u03b3\u03b7\5\u00c5c\2\u03b4"+ - "\u03b6\5\u00c7d\2\u03b5\u03b4\3\2\2\2\u03b6\u03b9\3\2\2\2\u03b7\u03b5"+ - "\3\2\2\2\u03b7\u03b8\3\2\2\2\u03b8\u00c4\3\2\2\2\u03b9\u03b7\3\2\2\2\u03ba"+ - "\u03bb\t\n\2\2\u03bb\u00c6\3\2\2\2\u03bc\u03bd\t\13\2\2\u03bd\u00c8\3"+ - "\2\2\2\u03be\u03c2\7#\2\2\u03bf\u03c1\5\u00c7d\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\u03c6\3\2"+ - "\2\2\u03c4\u03c2\3\2\2\2\u03c5\u03c7\t\f\2\2\u03c6\u03c5\3\2\2\2\u03c7"+ - "\u03c8\3\2\2\2\u03c8\u03c6\3\2\2\2\u03c8\u03c9\3\2\2\2\u03c9\u00ca\3\2"+ - "\2\2\u03ca\u03cc\t\r\2\2\u03cb\u03ca\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd"+ - "\u03cb\3\2\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cf\3\2\2\2\u03cf\u03d0\bf"+ - "\2\2\u03d0\u00cc\3\2\2\2\u03d1\u03d2\7\61\2\2\u03d2\u03d3\7\61\2\2\u03d3"+ - "\u03d7\3\2\2\2\u03d4\u03d6\n\16\2\2\u03d5\u03d4\3\2\2\2\u03d6\u03d9\3"+ - "\2\2\2\u03d7\u03d5\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03da\3\2\2\2\u03d9"+ - "\u03d7\3\2\2\2\u03da\u03db\bg\3\2\u03db\u00ce\3\2\2\2\u03dc\u03dd\7\61"+ - "\2\2\u03dd\u03de\7,\2\2\u03de\u03e2\3\2\2\2\u03df\u03e1\13\2\2\2\u03e0"+ - "\u03df\3\2\2\2\u03e1\u03e4\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e2\u03e0\3\2"+ - "\2\2\u03e3\u03e5\3\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03e6\7,\2\2\u03e6"+ - "\u03e7\7\61\2\2\u03e7\u03e8\3\2\2\2\u03e8\u03e9\bh\3\2\u03e9\u00d0\3\2"+ - "\2\2#\2\u02f3\u02fb\u0326\u032c\u032e\u0333\u0339\u0346\u034a\u034f\u0356"+ - "\u035b\u0362\u0367\u036e\u0375\u037a\u0381\u0386\u038b\u0392\u0398\u039a"+ - "\u039f\u03a6\u03ab\u03b7\u03c2\u03c8\u03cd\u03d7\u03e2\4\2\3\2\2\4\2"; + "\3\2\2\2\u00e6\u00e7\7%\2\2\u00e7\24\3\2\2\2\u00e8\u00e9\7r\2\2\u00e9"+ + "\u00ea\7e\2\2\u00ea\26\3\2\2\2\u00eb\u00ec\7e\2\2\u00ec\u00ed\7q\2\2\u00ed"+ + "\u00ee\7p\2\2\u00ee\u00ef\7u\2\2\u00ef\u00f0\7v\2\2\u00f0\30\3\2\2\2\u00f1"+ + "\u00f2\7g\2\2\u00f2\u00f3\7z\2\2\u00f3\u00f4\7v\2\2\u00f4\u00f5\7g\2\2"+ + "\u00f5\u00f6\7t\2\2\u00f6\u00f7\7p\2\2\u00f7\32\3\2\2\2\u00f8\u00f9\7"+ + "c\2\2\u00f9\u00fa\7n\2\2\u00fa\u00fb\7k\2\2\u00fb\u00fc\7i\2\2\u00fc\u00fd"+ + "\7p\2\2\u00fd\34\3\2\2\2\u00fe\u00ff\7t\2\2\u00ff\u0100\7g\2\2\u0100\u0101"+ + "\7i\2\2\u0101\u0102\7k\2\2\u0102\u0103\7u\2\2\u0103\u0104\7v\2\2\u0104"+ + "\u0105\7g\2\2\u0105\u0106\7t\2\2\u0106\36\3\2\2\2\u0107\u0108\7k\2\2\u0108"+ + "\u0109\7p\2\2\u0109\u010a\7n\2\2\u010a\u010b\7k\2\2\u010b\u010c\7p\2\2"+ + "\u010c\u010d\7g\2\2\u010d \3\2\2\2\u010e\u010f\7x\2\2\u010f\u0110\7q\2"+ + "\2\u0110\u0111\7n\2\2\u0111\u0112\7c\2\2\u0112\u0113\7v\2\2\u0113\u0114"+ + "\7k\2\2\u0114\u0115\7n\2\2\u0115\u0116\7g\2\2\u0116\"\3\2\2\2\u0117\u0118"+ + "\7k\2\2\u0118\u0119\7p\2\2\u0119\u011a\7v\2\2\u011a\u011b\7g\2\2\u011b"+ + "\u011c\7t\2\2\u011c\u011d\7t\2\2\u011d\u011e\7w\2\2\u011e\u011f\7r\2\2"+ + "\u011f\u0120\7v\2\2\u0120$\3\2\2\2\u0121\u0122\7t\2\2\u0122\u0123\7g\2"+ + "\2\u0123\u0124\7u\2\2\u0124\u0125\7g\2\2\u0125\u0126\7t\2\2\u0126\u0127"+ + "\7x\2\2\u0127\u0128\7g\2\2\u0128&\3\2\2\2\u0129\u012a\7k\2\2\u012a\u012b"+ + "\7h\2\2\u012b(\3\2\2\2\u012c\u012d\7g\2\2\u012d\u012e\7n\2\2\u012e\u012f"+ + "\7u\2\2\u012f\u0130\7g\2\2\u0130*\3\2\2\2\u0131\u0132\7y\2\2\u0132\u0133"+ + "\7j\2\2\u0133\u0134\7k\2\2\u0134\u0135\7n\2\2\u0135\u0136\7g\2\2\u0136"+ + ",\3\2\2\2\u0137\u0138\7f\2\2\u0138\u0139\7q\2\2\u0139.\3\2\2\2\u013a\u013b"+ + "\7h\2\2\u013b\u013c\7q\2\2\u013c\u013d\7t\2\2\u013d\60\3\2\2\2\u013e\u013f"+ + "\7t\2\2\u013f\u0140\7g\2\2\u0140\u0141\7v\2\2\u0141\u0142\7w\2\2\u0142"+ + "\u0143\7t\2\2\u0143\u0144\7p\2\2\u0144\62\3\2\2\2\u0145\u0146\7d\2\2\u0146"+ + "\u0147\7t\2\2\u0147\u0148\7g\2\2\u0148\u0149\7c\2\2\u0149\u014a\7m\2\2"+ + "\u014a\64\3\2\2\2\u014b\u014c\7e\2\2\u014c\u014d\7q\2\2\u014d\u014e\7"+ + "p\2\2\u014e\u014f\7v\2\2\u014f\u0150\7k\2\2\u0150\u0151\7p\2\2\u0151\u0152"+ + "\7w\2\2\u0152\u0153\7g\2\2\u0153\66\3\2\2\2\u0154\u0155\7c\2\2\u0155\u0156"+ + "\7u\2\2\u0156\u0157\7o\2\2\u01578\3\2\2\2\u0158\u0159\7<\2\2\u0159:\3"+ + "\2\2\2\u015a\u015b\7\60\2\2\u015b\u015c\7\60\2\2\u015c<\3\2\2\2\u015d"+ + "\u015e\7u\2\2\u015e\u015f\7k\2\2\u015f\u0160\7i\2\2\u0160\u0161\7p\2\2"+ + "\u0161\u0162\7g\2\2\u0162\u0163\7f\2\2\u0163>\3\2\2\2\u0164\u0165\7w\2"+ + "\2\u0165\u0166\7p\2\2\u0166\u0167\7u\2\2\u0167\u0168\7k\2\2\u0168\u0169"+ + "\7i\2\2\u0169\u016a\7p\2\2\u016a\u016b\7g\2\2\u016b\u016c\7f\2\2\u016c"+ + "@\3\2\2\2\u016d\u016e\7,\2\2\u016eB\3\2\2\2\u016f\u0170\7]\2\2\u0170D"+ + "\3\2\2\2\u0171\u0172\7_\2\2\u0172F\3\2\2\2\u0173\u0174\7u\2\2\u0174\u0175"+ + "\7v\2\2\u0175\u0176\7t\2\2\u0176\u0177\7w\2\2\u0177\u0178\7e\2\2\u0178"+ + "\u0179\7v\2\2\u0179H\3\2\2\2\u017a\u017b\7\60\2\2\u017bJ\3\2\2\2\u017c"+ + "\u017d\7/\2\2\u017d\u017e\7@\2\2\u017eL\3\2\2\2\u017f\u0180\7u\2\2\u0180"+ + "\u0181\7k\2\2\u0181\u0182\7|\2\2\u0182\u0183\7g\2\2\u0183\u0184\7q\2\2"+ + "\u0184\u0185\7h\2\2\u0185N\3\2\2\2\u0186\u0187\7v\2\2\u0187\u0188\7{\2"+ + "\2\u0188\u0189\7r\2\2\u0189\u018a\7g\2\2\u018a\u018b\7k\2\2\u018b\u018c"+ + "\7f\2\2\u018cP\3\2\2\2\u018d\u018e\7/\2\2\u018e\u018f\7/\2\2\u018fR\3"+ + "\2\2\2\u0190\u0191\7-\2\2\u0191\u0192\7-\2\2\u0192T\3\2\2\2\u0193\u0194"+ + "\7-\2\2\u0194V\3\2\2\2\u0195\u0196\7/\2\2\u0196X\3\2\2\2\u0197\u0198\7"+ + "#\2\2\u0198Z\3\2\2\2\u0199\u019a\7(\2\2\u019a\\\3\2\2\2\u019b\u019c\7"+ + "\u0080\2\2\u019c^\3\2\2\2\u019d\u019e\7@\2\2\u019e\u019f\7@\2\2\u019f"+ + "`\3\2\2\2\u01a0\u01a1\7>\2\2\u01a1\u01a2\7>\2\2\u01a2b\3\2\2\2\u01a3\u01a4"+ + "\7\61\2\2\u01a4d\3\2\2\2\u01a5\u01a6\7\'\2\2\u01a6f\3\2\2\2\u01a7\u01a8"+ + "\7>\2\2\u01a8h\3\2\2\2\u01a9\u01aa\7@\2\2\u01aaj\3\2\2\2\u01ab\u01ac\7"+ + "?\2\2\u01ac\u01ad\7?\2\2\u01adl\3\2\2\2\u01ae\u01af\7#\2\2\u01af\u01b0"+ + "\7?\2\2\u01b0n\3\2\2\2\u01b1\u01b2\7>\2\2\u01b2\u01b3\7?\2\2\u01b3p\3"+ + "\2\2\2\u01b4\u01b5\7@\2\2\u01b5\u01b6\7?\2\2\u01b6r\3\2\2\2\u01b7\u01b8"+ + "\7`\2\2\u01b8t\3\2\2\2\u01b9\u01ba\7~\2\2\u01bav\3\2\2\2\u01bb\u01bc\7"+ + "(\2\2\u01bc\u01bd\7(\2\2\u01bdx\3\2\2\2\u01be\u01bf\7~\2\2\u01bf\u01c0"+ + "\7~\2\2\u01c0z\3\2\2\2\u01c1\u01c2\7A\2\2\u01c2|\3\2\2\2\u01c3\u01c4\7"+ + "-\2\2\u01c4\u01c5\7?\2\2\u01c5~\3\2\2\2\u01c6\u01c7\7/\2\2\u01c7\u01c8"+ + "\7?\2\2\u01c8\u0080\3\2\2\2\u01c9\u01ca\7,\2\2\u01ca\u01cb\7?\2\2\u01cb"+ + "\u0082\3\2\2\2\u01cc\u01cd\7\61\2\2\u01cd\u01ce\7?\2\2\u01ce\u0084\3\2"+ + "\2\2\u01cf\u01d0\7\'\2\2\u01d0\u01d1\7?\2\2\u01d1\u0086\3\2\2\2\u01d2"+ + "\u01d3\7>\2\2\u01d3\u01d4\7>\2\2\u01d4\u01d5\7?\2\2\u01d5\u0088\3\2\2"+ + "\2\u01d6\u01d7\7@\2\2\u01d7\u01d8\7@\2\2\u01d8\u01d9\7?\2\2\u01d9\u008a"+ + "\3\2\2\2\u01da\u01db\7(\2\2\u01db\u01dc\7?\2\2\u01dc\u008c\3\2\2\2\u01dd"+ + "\u01de\7~\2\2\u01de\u01df\7?\2\2\u01df\u008e\3\2\2\2\u01e0\u01e1\7`\2"+ + "\2\u01e1\u01e2\7?\2\2\u01e2\u0090\3\2\2\2\u01e3\u01e4\7m\2\2\u01e4\u01e5"+ + "\7k\2\2\u01e5\u01e6\7e\2\2\u01e6\u01e7\7m\2\2\u01e7\u01e8\7c\2\2\u01e8"+ + "\u01e9\7u\2\2\u01e9\u01ea\7o\2\2\u01ea\u0092\3\2\2\2\u01eb\u01ec\7t\2"+ + "\2\u01ec\u01ed\7g\2\2\u01ed\u01ee\7u\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0"+ + "\7w\2\2\u01f0\u01f1\7t\2\2\u01f1\u01f2\7e\2\2\u01f2\u01f3\7g\2\2\u01f3"+ + "\u0094\3\2\2\2\u01f4\u01f5\7w\2\2\u01f5\u01f6\7u\2\2\u01f6\u01f7\7g\2"+ + "\2\u01f7\u01f8\7u\2\2\u01f8\u0096\3\2\2\2\u01f9\u01fa\7e\2\2\u01fa\u01fb"+ + "\7n\2\2\u01fb\u01fc\7q\2\2\u01fc\u01fd\7d\2\2\u01fd\u01fe\7d\2\2\u01fe"+ + "\u01ff\7g\2\2\u01ff\u0200\7t\2\2\u0200\u0201\7u\2\2\u0201\u0098\3\2\2"+ + "\2\u0202\u0203\7d\2\2\u0203\u0204\7{\2\2\u0204\u0205\7v\2\2\u0205\u0206"+ + "\7g\2\2\u0206\u0207\7u\2\2\u0207\u009a\3\2\2\2\u0208\u0209\7e\2\2\u0209"+ + "\u020a\7{\2\2\u020a\u020b\7e\2\2\u020b\u020c\7n\2\2\u020c\u020d\7g\2\2"+ + "\u020d\u020e\7u\2\2\u020e\u009c\3\2\2\2\u020f\u0210\7\60\2\2\u0210\u0211"+ + "\7d\2\2\u0211\u0212\7{\2\2\u0212\u0213\7v\2\2\u0213\u0214\7g\2\2\u0214"+ + "\u009e\3\2\2\2\u0215\u0216\7d\2\2\u0216\u0217\7t\2\2\u0217\u02f4\7m\2"+ + "\2\u0218\u0219\7q\2\2\u0219\u021a\7t\2\2\u021a\u02f4\7c\2\2\u021b\u021c"+ + "\7m\2\2\u021c\u021d\7k\2\2\u021d\u02f4\7n\2\2\u021e\u021f\7u\2\2\u021f"+ + "\u0220\7n\2\2\u0220\u02f4\7q\2\2\u0221\u0222\7p\2\2\u0222\u0223\7q\2\2"+ + "\u0223\u02f4\7r\2\2\u0224\u0225\7c\2\2\u0225\u0226\7u\2\2\u0226\u02f4"+ + "\7n\2\2\u0227\u0228\7r\2\2\u0228\u0229\7j\2\2\u0229\u02f4\7r\2\2\u022a"+ + "\u022b\7c\2\2\u022b\u022c\7p\2\2\u022c\u02f4\7e\2\2\u022d\u022e\7d\2\2"+ + "\u022e\u022f\7r\2\2\u022f\u02f4\7n\2\2\u0230\u0231\7e\2\2\u0231\u0232"+ + "\7n\2\2\u0232\u02f4\7e\2\2\u0233\u0234\7l\2\2\u0234\u0235\7u\2\2\u0235"+ + "\u02f4\7t\2\2\u0236\u0237\7c\2\2\u0237\u0238\7p\2\2\u0238\u02f4\7f\2\2"+ + "\u0239\u023a\7t\2\2\u023a\u023b\7n\2\2\u023b\u02f4\7c\2\2\u023c\u023d"+ + "\7d\2\2\u023d\u023e\7k\2\2\u023e\u02f4\7v\2\2\u023f\u0240\7t\2\2\u0240"+ + "\u0241\7q\2\2\u0241\u02f4\7n\2\2\u0242\u0243\7r\2\2\u0243\u0244\7n\2\2"+ + "\u0244\u02f4\7c\2\2\u0245\u0246\7r\2\2\u0246\u0247\7n\2\2\u0247\u02f4"+ + "\7r\2\2\u0248\u0249\7d\2\2\u0249\u024a\7o\2\2\u024a\u02f4\7k\2\2\u024b"+ + "\u024c\7u\2\2\u024c\u024d\7g\2\2\u024d\u02f4\7e\2\2\u024e\u024f\7t\2\2"+ + "\u024f\u0250\7v\2\2\u0250\u02f4\7k\2\2\u0251\u0252\7g\2\2\u0252\u0253"+ + "\7q\2\2\u0253\u02f4\7t\2\2\u0254\u0255\7u\2\2\u0255\u0256\7t\2\2\u0256"+ + "\u02f4\7g\2\2\u0257\u0258\7n\2\2\u0258\u0259\7u\2\2\u0259\u02f4\7t\2\2"+ + "\u025a\u025b\7r\2\2\u025b\u025c\7j\2\2\u025c\u02f4\7c\2\2\u025d\u025e"+ + "\7c\2\2\u025e\u025f\7n\2\2\u025f\u02f4\7t\2\2\u0260\u0261\7l\2\2\u0261"+ + "\u0262\7o\2\2\u0262\u02f4\7r\2\2\u0263\u0264\7d\2\2\u0264\u0265\7x\2\2"+ + "\u0265\u02f4\7e\2\2\u0266\u0267\7e\2\2\u0267\u0268\7n\2\2\u0268\u02f4"+ + "\7k\2\2\u0269\u026a\7t\2\2\u026a\u026b\7v\2\2\u026b\u02f4\7u\2\2\u026c"+ + "\u026d\7c\2\2\u026d\u026e\7f\2\2\u026e\u02f4\7e\2\2\u026f\u0270\7t\2\2"+ + "\u0270\u0271\7t\2\2\u0271\u02f4\7c\2\2\u0272\u0273\7d\2\2\u0273\u0274"+ + "\7x\2\2\u0274\u02f4\7u\2\2\u0275\u0276\7u\2\2\u0276\u0277\7g\2\2\u0277"+ + "\u02f4\7k\2\2\u0278\u0279\7u\2\2\u0279\u027a\7c\2\2\u027a\u02f4\7z\2\2"+ + "\u027b\u027c\7u\2\2\u027c\u027d\7v\2\2\u027d\u02f4\7{\2\2\u027e\u027f"+ + "\7u\2\2\u027f\u0280\7v\2\2\u0280\u02f4\7c\2\2\u0281\u0282\7u\2\2\u0282"+ + "\u0283\7v\2\2\u0283\u02f4\7z\2\2\u0284\u0285\7f\2\2\u0285\u0286\7g\2\2"+ + "\u0286\u02f4\7{\2\2\u0287\u0288\7v\2\2\u0288\u0289\7z\2\2\u0289\u02f4"+ + "\7c\2\2\u028a\u028b\7z\2\2\u028b\u028c\7c\2\2\u028c\u02f4\7c\2\2\u028d"+ + "\u028e\7d\2\2\u028e\u028f\7e\2\2\u028f\u02f4\7e\2\2\u0290\u0291\7c\2\2"+ + "\u0291\u0292\7j\2\2\u0292\u02f4\7z\2\2\u0293\u0294\7v\2\2\u0294\u0295"+ + "\7{\2\2\u0295\u02f4\7c\2\2\u0296\u0297\7v\2\2\u0297\u0298\7z\2\2\u0298"+ + "\u02f4\7u\2\2\u0299\u029a\7v\2\2\u029a\u029b\7c\2\2\u029b\u02f4\7u\2\2"+ + "\u029c\u029d\7u\2\2\u029d\u029e\7j\2\2\u029e\u02f4\7{\2\2\u029f\u02a0"+ + "\7u\2\2\u02a0\u02a1\7j\2\2\u02a1\u02f4\7z\2\2\u02a2\u02a3\7n\2\2\u02a3"+ + "\u02a4\7f\2\2\u02a4\u02f4\7{\2\2\u02a5\u02a6\7n\2\2\u02a6\u02a7\7f\2\2"+ + "\u02a7\u02f4\7c\2\2\u02a8\u02a9\7n\2\2\u02a9\u02aa\7f\2\2\u02aa\u02f4"+ + "\7z\2\2\u02ab\u02ac\7n\2\2\u02ac\u02ad\7c\2\2\u02ad\u02f4\7z\2\2\u02ae"+ + "\u02af\7v\2\2\u02af\u02b0\7c\2\2\u02b0\u02f4\7{\2\2\u02b1\u02b2\7v\2\2"+ + "\u02b2\u02b3\7c\2\2\u02b3\u02f4\7z\2\2\u02b4\u02b5\7d\2\2\u02b5\u02b6"+ + "\7e\2\2\u02b6\u02f4\7u\2\2\u02b7\u02b8\7e\2\2\u02b8\u02b9\7n\2\2\u02b9"+ + "\u02f4\7x\2\2\u02ba\u02bb\7v\2\2\u02bb\u02bc\7u\2\2\u02bc\u02f4\7z\2\2"+ + "\u02bd\u02be\7n\2\2\u02be\u02bf\7c\2\2\u02bf\u02f4\7u\2\2\u02c0\u02c1"+ + "\7e\2\2\u02c1\u02c2\7r\2\2\u02c2\u02f4\7{\2\2\u02c3\u02c4\7e\2\2\u02c4"+ + "\u02c5\7o\2\2\u02c5\u02f4\7r\2\2\u02c6\u02c7\7e\2\2\u02c7\u02c8\7r\2\2"+ + "\u02c8\u02f4\7z\2\2\u02c9\u02ca\7f\2\2\u02ca\u02cb\7e\2\2\u02cb\u02f4"+ + "\7r\2\2\u02cc\u02cd\7f\2\2\u02cd\u02ce\7g\2\2\u02ce\u02f4\7e\2\2\u02cf"+ + "\u02d0\7k\2\2\u02d0\u02d1\7p\2\2\u02d1\u02f4\7e\2\2\u02d2\u02d3\7c\2\2"+ + "\u02d3\u02d4\7z\2\2\u02d4\u02f4\7u\2\2\u02d5\u02d6\7d\2\2\u02d6\u02d7"+ + "\7p\2\2\u02d7\u02f4\7g\2\2\u02d8\u02d9\7e\2\2\u02d9\u02da\7n\2\2\u02da"+ + "\u02f4\7f\2\2\u02db\u02dc\7u\2\2\u02dc\u02dd\7d\2\2\u02dd\u02f4\7e\2\2"+ + "\u02de\u02df\7k\2\2\u02df\u02e0\7u\2\2\u02e0\u02f4\7e\2\2\u02e1\u02e2"+ + "\7k\2\2\u02e2\u02e3\7p\2\2\u02e3\u02f4\7z\2\2\u02e4\u02e5\7d\2\2\u02e5"+ + "\u02e6\7g\2\2\u02e6\u02f4\7s\2\2\u02e7\u02e8\7u\2\2\u02e8\u02e9\7g\2\2"+ + "\u02e9\u02f4\7f\2\2\u02ea\u02eb\7f\2\2\u02eb\u02ec\7g\2\2\u02ec\u02f4"+ + "\7z\2\2\u02ed\u02ee\7k\2\2\u02ee\u02ef\7p\2\2\u02ef\u02f4\7{\2\2\u02f0"+ + "\u02f1\7t\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f4\7t\2\2\u02f3\u0215\3\2\2"+ + "\2\u02f3\u0218\3\2\2\2\u02f3\u021b\3\2\2\2\u02f3\u021e\3\2\2\2\u02f3\u0221"+ + "\3\2\2\2\u02f3\u0224\3\2\2\2\u02f3\u0227\3\2\2\2\u02f3\u022a\3\2\2\2\u02f3"+ + "\u022d\3\2\2\2\u02f3\u0230\3\2\2\2\u02f3\u0233\3\2\2\2\u02f3\u0236\3\2"+ + "\2\2\u02f3\u0239\3\2\2\2\u02f3\u023c\3\2\2\2\u02f3\u023f\3\2\2\2\u02f3"+ + "\u0242\3\2\2\2\u02f3\u0245\3\2\2\2\u02f3\u0248\3\2\2\2\u02f3\u024b\3\2"+ + "\2\2\u02f3\u024e\3\2\2\2\u02f3\u0251\3\2\2\2\u02f3\u0254\3\2\2\2\u02f3"+ + "\u0257\3\2\2\2\u02f3\u025a\3\2\2\2\u02f3\u025d\3\2\2\2\u02f3\u0260\3\2"+ + "\2\2\u02f3\u0263\3\2\2\2\u02f3\u0266\3\2\2\2\u02f3\u0269\3\2\2\2\u02f3"+ + "\u026c\3\2\2\2\u02f3\u026f\3\2\2\2\u02f3\u0272\3\2\2\2\u02f3\u0275\3\2"+ + "\2\2\u02f3\u0278\3\2\2\2\u02f3\u027b\3\2\2\2\u02f3\u027e\3\2\2\2\u02f3"+ + "\u0281\3\2\2\2\u02f3\u0284\3\2\2\2\u02f3\u0287\3\2\2\2\u02f3\u028a\3\2"+ + "\2\2\u02f3\u028d\3\2\2\2\u02f3\u0290\3\2\2\2\u02f3\u0293\3\2\2\2\u02f3"+ + "\u0296\3\2\2\2\u02f3\u0299\3\2\2\2\u02f3\u029c\3\2\2\2\u02f3\u029f\3\2"+ + "\2\2\u02f3\u02a2\3\2\2\2\u02f3\u02a5\3\2\2\2\u02f3\u02a8\3\2\2\2\u02f3"+ + "\u02ab\3\2\2\2\u02f3\u02ae\3\2\2\2\u02f3\u02b1\3\2\2\2\u02f3\u02b4\3\2"+ + "\2\2\u02f3\u02b7\3\2\2\2\u02f3\u02ba\3\2\2\2\u02f3\u02bd\3\2\2\2\u02f3"+ + "\u02c0\3\2\2\2\u02f3\u02c3\3\2\2\2\u02f3\u02c6\3\2\2\2\u02f3\u02c9\3\2"+ + "\2\2\u02f3\u02cc\3\2\2\2\u02f3\u02cf\3\2\2\2\u02f3\u02d2\3\2\2\2\u02f3"+ + "\u02d5\3\2\2\2\u02f3\u02d8\3\2\2\2\u02f3\u02db\3\2\2\2\u02f3\u02de\3\2"+ + "\2\2\u02f3\u02e1\3\2\2\2\u02f3\u02e4\3\2\2\2\u02f3\u02e7\3\2\2\2\u02f3"+ + "\u02ea\3\2\2\2\u02f3\u02ed\3\2\2\2\u02f3\u02f0\3\2\2\2\u02f4\u00a0\3\2"+ + "\2\2\u02f5\u02f6\7}\2\2\u02f6\u02f7\7}\2\2\u02f7\u02fb\3\2\2\2\u02f8\u02fa"+ + "\13\2\2\2\u02f9\u02f8\3\2\2\2\u02fa\u02fd\3\2\2\2\u02fb\u02fc\3\2\2\2"+ + "\u02fb\u02f9\3\2\2\2\u02fc\u02fe\3\2\2\2\u02fd\u02fb\3\2\2\2\u02fe\u02ff"+ + "\7\177\2\2\u02ff\u0300\7\177\2\2\u0300\u00a2\3\2\2\2\u0301\u0302\7d\2"+ + "\2\u0302\u0303\7{\2\2\u0303\u0304\7v\2\2\u0304\u0327\7g\2\2\u0305\u0306"+ + "\7y\2\2\u0306\u0307\7q\2\2\u0307\u0308\7t\2\2\u0308\u0327\7f\2\2\u0309"+ + "\u030a\7f\2\2\u030a\u030b\7y\2\2\u030b\u030c\7q\2\2\u030c\u030d\7t\2\2"+ + "\u030d\u0327\7f\2\2\u030e\u030f\7d\2\2\u030f\u0310\7q\2\2\u0310\u0311"+ + "\7q\2\2\u0311\u0327\7n\2\2\u0312\u0313\7e\2\2\u0313\u0314\7j\2\2\u0314"+ + "\u0315\7c\2\2\u0315\u0327\7t\2\2\u0316\u0317\7u\2\2\u0317\u0318\7j\2\2"+ + "\u0318\u0319\7q\2\2\u0319\u031a\7t\2\2\u031a\u0327\7v\2\2\u031b\u031c"+ + "\7k\2\2\u031c\u031d\7p\2\2\u031d\u0327\7v\2\2\u031e\u031f\7n\2\2\u031f"+ + "\u0320\7q\2\2\u0320\u0321\7p\2\2\u0321\u0327\7i\2\2\u0322\u0323\7x\2\2"+ + "\u0323\u0324\7q\2\2\u0324\u0325\7k\2\2\u0325\u0327\7f\2\2\u0326\u0301"+ + "\3\2\2\2\u0326\u0305\3\2\2\2\u0326\u0309\3\2\2\2\u0326\u030e\3\2\2\2\u0326"+ + "\u0312\3\2\2\2\u0326\u0316\3\2\2\2\u0326\u031b\3\2\2\2\u0326\u031e\3\2"+ + "\2\2\u0326\u0322\3\2\2\2\u0327\u00a4\3\2\2\2\u0328\u032e\7$\2\2\u0329"+ + "\u032a\7^\2\2\u032a\u032d\7$\2\2\u032b\u032d\n\2\2\2\u032c\u0329\3\2\2"+ + "\2\u032c\u032b\3\2\2\2\u032d\u0330\3\2\2\2\u032e\u032c\3\2\2\2\u032e\u032f"+ + "\3\2\2\2\u032f\u0331\3\2\2\2\u0330\u032e\3\2\2\2\u0331\u0333\7$\2\2\u0332"+ + "\u0334\7|\2\2\u0333\u0332\3\2\2\2\u0333\u0334\3\2\2\2\u0334\u00a6\3\2"+ + "\2\2\u0335\u0339\7)\2\2\u0336\u0337\7^\2\2\u0337\u033a\7)\2\2\u0338\u033a"+ + "\n\3\2\2\u0339\u0336\3\2\2\2\u0339\u0338\3\2\2\2\u033a\u033b\3\2\2\2\u033b"+ + "\u033c\7)\2\2\u033c\u00a8\3\2\2\2\u033d\u033e\7v\2\2\u033e\u033f\7t\2"+ + "\2\u033f\u0340\7w\2\2\u0340\u0347\7g\2\2\u0341\u0342\7h\2\2\u0342\u0343"+ + "\7c\2\2\u0343\u0344\7n\2\2\u0344\u0345\7u\2\2\u0345\u0347\7g\2\2\u0346"+ + "\u033d\3\2\2\2\u0346\u0341\3\2\2\2\u0347\u00aa\3\2\2\2\u0348\u034b\5\u00ad"+ + "W\2\u0349\u034b\5\u00b5[\2\u034a\u0348\3\2\2\2\u034a\u0349\3\2\2\2\u034b"+ + "\u00ac\3\2\2\2\u034c\u0350\5\u00afX\2\u034d\u0350\5\u00b1Y\2\u034e\u0350"+ + "\5\u00b3Z\2\u034f\u034c\3\2\2\2\u034f\u034d\3\2\2\2\u034f\u034e\3\2\2"+ + "\2\u0350\u00ae\3\2\2\2\u0351\u0357\7\'\2\2\u0352\u0353\7\62\2\2\u0353"+ + "\u0357\7d\2\2\u0354\u0355\7\62\2\2\u0355\u0357\7D\2\2\u0356\u0351\3\2"+ + "\2\2\u0356\u0352\3\2\2\2\u0356\u0354\3\2\2\2\u0357\u035b\3\2\2\2\u0358"+ + "\u035a\5\u00bd_\2\u0359\u0358\3\2\2\2\u035a\u035d\3\2\2\2\u035b\u0359"+ + "\3\2\2\2\u035b\u035c\3\2\2\2\u035c\u035e\3\2\2\2\u035d\u035b\3\2\2\2\u035e"+ + "\u0360\7\60\2\2\u035f\u0361\5\u00bd_\2\u0360\u035f\3\2\2\2\u0361\u0362"+ + "\3\2\2\2\u0362\u0360\3\2\2\2\u0362\u0363\3\2\2\2\u0363\u00b0\3\2\2\2\u0364"+ + "\u0366\5\u00bf`\2\u0365\u0364\3\2\2\2\u0366\u0369\3\2\2\2\u0367\u0365"+ + "\3\2\2\2\u0367\u0368\3\2\2\2\u0368\u036a\3\2\2\2\u0369\u0367\3\2\2\2\u036a"+ + "\u036c\7\60\2\2\u036b\u036d\5\u00bf`\2\u036c\u036b\3\2\2\2\u036d\u036e"+ + "\3\2\2\2\u036e\u036c\3\2\2\2\u036e\u036f\3\2\2\2\u036f\u00b2\3\2\2\2\u0370"+ + "\u0376\7&\2\2\u0371\u0372\7\62\2\2\u0372\u0376\7z\2\2\u0373\u0374\7\62"+ + "\2\2\u0374\u0376\7Z\2\2\u0375\u0370\3\2\2\2\u0375\u0371\3\2\2\2\u0375"+ + "\u0373\3\2\2\2\u0376\u037a\3\2\2\2\u0377\u0379\5\u00c1a\2\u0378\u0377"+ + "\3\2\2\2\u0379\u037c\3\2\2\2\u037a\u0378\3\2\2\2\u037a\u037b\3\2\2\2\u037b"+ + "\u037d\3\2\2\2\u037c\u037a\3\2\2\2\u037d\u037f\7\60\2\2\u037e\u0380\5"+ + "\u00c1a\2\u037f\u037e\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u037f\3\2\2\2"+ + "\u0381\u0382\3\2\2\2\u0382\u00b4\3\2\2\2\u0383\u0387\5\u00b9]\2\u0384"+ + "\u0387\5\u00bb^\2\u0385\u0387\5\u00b7\\\2\u0386\u0383\3\2\2\2\u0386\u0384"+ + "\3\2\2\2\u0386\u0385\3\2\2\2\u0387\u038b\3\2\2\2\u0388\u0389\t\4\2\2\u0389"+ + "\u038c\t\5\2\2\u038a\u038c\7n\2\2\u038b\u0388\3\2\2\2\u038b\u038a\3\2"+ + "\2\2\u038b\u038c\3\2\2\2\u038c\u00b6\3\2\2\2\u038d\u038e\7\62\2\2\u038e"+ + "\u0390\t\6\2\2\u038f\u0391\5\u00bd_\2\u0390\u038f\3\2\2\2\u0391\u0392"+ + "\3\2\2\2\u0392\u0390\3\2\2\2\u0392\u0393\3\2\2\2\u0393\u039b\3\2\2\2\u0394"+ + "\u0396\7\'\2\2\u0395\u0397\5\u00bd_\2\u0396\u0395\3\2\2\2\u0397\u0398"+ + "\3\2\2\2\u0398\u0396\3\2\2\2\u0398\u0399\3\2\2\2\u0399\u039b\3\2\2\2\u039a"+ + "\u038d\3\2\2\2\u039a\u0394\3\2\2\2\u039b\u00b8\3\2\2\2\u039c\u039e\5\u00bf"+ + "`\2\u039d\u039c\3\2\2\2\u039e\u039f\3\2\2\2\u039f\u039d\3\2\2\2\u039f"+ + "\u03a0\3\2\2\2\u03a0\u00ba\3\2\2\2\u03a1\u03a7\7&\2\2\u03a2\u03a3\7\62"+ + "\2\2\u03a3\u03a7\7z\2\2\u03a4\u03a5\7\62\2\2\u03a5\u03a7\7Z\2\2\u03a6"+ + "\u03a1\3\2\2\2\u03a6\u03a2\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a7\u03a9\3\2"+ + "\2\2\u03a8\u03aa\5\u00c1a\2\u03a9\u03a8\3\2\2\2\u03aa\u03ab\3\2\2\2\u03ab"+ + "\u03a9\3\2\2\2\u03ab\u03ac\3\2\2\2\u03ac\u00bc\3\2\2\2\u03ad\u03ae\t\7"+ + "\2\2\u03ae\u00be\3\2\2\2\u03af\u03b0\t\b\2\2\u03b0\u00c0\3\2\2\2\u03b1"+ + "\u03b2\t\t\2\2\u03b2\u00c2\3\2\2\2\u03b3\u03b7\5\u00c5c\2\u03b4\u03b6"+ + "\5\u00c7d\2\u03b5\u03b4\3\2\2\2\u03b6\u03b9\3\2\2\2\u03b7\u03b5\3\2\2"+ + "\2\u03b7\u03b8\3\2\2\2\u03b8\u00c4\3\2\2\2\u03b9\u03b7\3\2\2\2\u03ba\u03bb"+ + "\t\n\2\2\u03bb\u00c6\3\2\2\2\u03bc\u03bd\t\13\2\2\u03bd\u00c8\3\2\2\2"+ + "\u03be\u03c2\7#\2\2\u03bf\u03c1\5\u00c7d\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\u03c6\3\2\2\2\u03c4"+ + "\u03c2\3\2\2\2\u03c5\u03c7\t\f\2\2\u03c6\u03c5\3\2\2\2\u03c7\u03c8\3\2"+ + "\2\2\u03c8\u03c6\3\2\2\2\u03c8\u03c9\3\2\2\2\u03c9\u00ca\3\2\2\2\u03ca"+ + "\u03cc\t\r\2\2\u03cb\u03ca\3\2\2\2\u03cc\u03cd\3\2\2\2\u03cd\u03cb\3\2"+ + "\2\2\u03cd\u03ce\3\2\2\2\u03ce\u03cf\3\2\2\2\u03cf\u03d0\bf\2\2\u03d0"+ + "\u00cc\3\2\2\2\u03d1\u03d2\7\61\2\2\u03d2\u03d3\7\61\2\2\u03d3\u03d7\3"+ + "\2\2\2\u03d4\u03d6\n\16\2\2\u03d5\u03d4\3\2\2\2\u03d6\u03d9\3\2\2\2\u03d7"+ + "\u03d5\3\2\2\2\u03d7\u03d8\3\2\2\2\u03d8\u03da\3\2\2\2\u03d9\u03d7\3\2"+ + "\2\2\u03da\u03db\bg\3\2\u03db\u00ce\3\2\2\2\u03dc\u03dd\7\61\2\2\u03dd"+ + "\u03de\7,\2\2\u03de\u03e2\3\2\2\2\u03df\u03e1\13\2\2\2\u03e0\u03df\3\2"+ + "\2\2\u03e1\u03e4\3\2\2\2\u03e2\u03e3\3\2\2\2\u03e2\u03e0\3\2\2\2\u03e3"+ + "\u03e5\3\2\2\2\u03e4\u03e2\3\2\2\2\u03e5\u03e6\7,\2\2\u03e6\u03e7\7\61"+ + "\2\2\u03e7\u03e8\3\2\2\2\u03e8\u03e9\bh\3\2\u03e9\u00d0\3\2\2\2#\2\u02f3"+ + "\u02fb\u0326\u032c\u032e\u0333\u0339\u0346\u034a\u034f\u0356\u035b\u0362"+ + "\u0367\u036e\u0375\u037a\u0381\u0386\u038b\u0392\u0398\u039a\u039f\u03a6"+ + "\u03ab\u03b7\u03c2\u03c8\u03cd\u03d7\u03e2\4\2\3\2\2\4\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens index 42dfa728a..598bfd2b1 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens +++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens @@ -104,73 +104,73 @@ COMMENT_BLOCK=98 ')'=6 '{'=7 '}'=8 -'const'=9 -'extern'=10 -'align'=11 -'register'=12 -'inline'=13 -'volatile'=14 -'interrupt'=15 -'reserve'=16 -'if'=17 -'else'=18 -'while'=19 -'do'=20 -'for'=21 -'return'=22 -'break'=23 -'continue'=24 -'asm'=25 -':'=26 -'..'=27 -'signed'=28 -'unsigned'=29 -'*'=30 -'['=31 -']'=32 -'struct'=33 -'.'=34 -'->'=35 -'sizeof'=36 -'typeid'=37 -'--'=38 -'++'=39 -'+'=40 -'-'=41 -'!'=42 -'&'=43 -'~'=44 -'>>'=45 -'<<'=46 -'/'=47 -'%'=48 -'<'=49 -'>'=50 -'=='=51 -'!='=52 -'<='=53 -'>='=54 -'^'=55 -'|'=56 -'&&'=57 -'||'=58 -'?'=59 -'+='=60 -'-='=61 -'*='=62 -'/='=63 -'%='=64 -'<<='=65 -'>>='=66 -'&='=67 -'|='=68 -'^='=69 -'kickasm'=70 -'resource'=71 -'uses'=72 -'clobbers'=73 -'bytes'=74 -'cycles'=75 -'pc'=76 -'.byte'=77 -'#'=78 +'#'=9 +'pc'=10 +'const'=11 +'extern'=12 +'align'=13 +'register'=14 +'inline'=15 +'volatile'=16 +'interrupt'=17 +'reserve'=18 +'if'=19 +'else'=20 +'while'=21 +'do'=22 +'for'=23 +'return'=24 +'break'=25 +'continue'=26 +'asm'=27 +':'=28 +'..'=29 +'signed'=30 +'unsigned'=31 +'*'=32 +'['=33 +']'=34 +'struct'=35 +'.'=36 +'->'=37 +'sizeof'=38 +'typeid'=39 +'--'=40 +'++'=41 +'+'=42 +'-'=43 +'!'=44 +'&'=45 +'~'=46 +'>>'=47 +'<<'=48 +'/'=49 +'%'=50 +'<'=51 +'>'=52 +'=='=53 +'!='=54 +'<='=55 +'>='=56 +'^'=57 +'|'=58 +'&&'=59 +'||'=60 +'?'=61 +'+='=62 +'-='=63 +'*='=64 +'/='=65 +'%='=66 +'<<='=67 +'>>='=68 +'&='=69 +'|='=70 +'^='=71 +'kickasm'=72 +'resource'=73 +'uses'=74 +'clobbers'=75 +'bytes'=76 +'cycles'=77 +'.byte'=78 diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java index 24069cabb..480e4c5cd 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.ParseTreeListener; @@ -152,15 +152,29 @@ public interface KickCListener extends ParseTreeListener { */ void exitParameterDeclVoid(KickCParser.ParameterDeclVoidContext ctx); /** - * Enter a parse tree produced by {@link KickCParser#globalDirective}. + * Enter a parse tree produced by the {@code globalDirectiveReserve} + * labeled alternative in {@link KickCParser#globalDirective}. * @param ctx the parse tree */ - void enterGlobalDirective(KickCParser.GlobalDirectiveContext ctx); + void enterGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx); /** - * Exit a parse tree produced by {@link KickCParser#globalDirective}. + * Exit a parse tree produced by the {@code globalDirectiveReserve} + * labeled alternative in {@link KickCParser#globalDirective}. * @param ctx the parse tree */ - void exitGlobalDirective(KickCParser.GlobalDirectiveContext ctx); + void exitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx); + /** + * Enter a parse tree produced by the {@code globalDirectivePc} + * labeled alternative in {@link KickCParser#globalDirective}. + * @param ctx the parse tree + */ + void enterGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx); + /** + * Exit a parse tree produced by the {@code globalDirectivePc} + * labeled alternative in {@link KickCParser#globalDirective}. + * @param ctx the parse tree + */ + void exitGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx); /** * Enter a parse tree produced by the {@code directiveConst} * labeled alternative in {@link KickCParser#directive}. diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java index 57be1778b..09ab32a6e 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; @@ -54,16 +54,16 @@ public class KickCParser extends Parser { }; private static final String[] _LITERAL_NAMES = { - null, "'import'", "';'", "','", "'='", "'('", "')'", "'{'", "'}'", "'const'", - "'extern'", "'align'", "'register'", "'inline'", "'volatile'", "'interrupt'", - "'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'", - "'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", "'unsigned'", - "'*'", "'['", "']'", "'struct'", "'.'", "'->'", "'sizeof'", "'typeid'", - "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", - "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", - "'||'", "'?'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<<='", "'>>='", - "'&='", "'|='", "'^='", "'kickasm'", "'resource'", "'uses'", "'clobbers'", - "'bytes'", "'cycles'", "'pc'", "'.byte'", "'#'" + null, "'import'", "';'", "','", "'='", "'('", "')'", "'{'", "'}'", "'#'", + "'pc'", "'const'", "'extern'", "'align'", "'register'", "'inline'", "'volatile'", + "'interrupt'", "'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", + "'return'", "'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", + "'unsigned'", "'*'", "'['", "']'", "'struct'", "'.'", "'->'", "'sizeof'", + "'typeid'", "'--'", "'++'", "'+'", "'-'", "'!'", "'&'", "'~'", "'>>'", + "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='", "'<='", "'>='", "'^'", + "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='", "'*='", "'/='", "'%='", + "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'", "'resource'", "'uses'", + "'clobbers'", "'bytes'", "'cycles'", "'.byte'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -375,7 +375,7 @@ public class KickCParser extends Parser { setState(93); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28) | (1L << T__32))) != 0) || _la==T__69 || _la==SIMPLETYPE ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__29) | (1L << T__30) | (1L << T__34))) != 0) || _la==T__71 || _la==SIMPLETYPE ); } } catch (RecognitionException re) { @@ -522,7 +522,7 @@ public class KickCParser extends Parser { setState(109); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { setState(106); @@ -538,7 +538,7 @@ public class KickCParser extends Parser { setState(116); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { setState(113); @@ -797,7 +797,7 @@ public class KickCParser extends Parser { setState(142); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28) | (1L << T__32))) != 0) || _la==SIMPLETYPE) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__29) | (1L << T__30) | (1L << T__34))) != 0) || _la==SIMPLETYPE) { { setState(141); parameterListDecl(); @@ -811,7 +811,7 @@ public class KickCParser extends Parser { setState(147); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (SIMPLETYPE - 70)) | (1L << (STRING - 70)) | (1L << (CHAR - 70)) | (1L << (BOOLEAN - 70)) | (1L << (NUMBER - 70)) | (1L << (NAME - 70)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__34) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (T__71 - 72)) | (1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) { { setState(146); stmtSeq(); @@ -985,24 +985,49 @@ public class KickCParser extends Parser { } public static class GlobalDirectiveContext extends ParserRuleContext { - public DirectiveReserveContext directiveReserve() { - return getRuleContext(DirectiveReserveContext.class,0); - } public GlobalDirectiveContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @Override public int getRuleIndex() { return RULE_globalDirective; } + + public GlobalDirectiveContext() { } + public void copyFrom(GlobalDirectiveContext ctx) { + super.copyFrom(ctx); + } + } + public static class GlobalDirectiveReserveContext extends GlobalDirectiveContext { + public DirectiveReserveContext directiveReserve() { + return getRuleContext(DirectiveReserveContext.class,0); + } + public GlobalDirectiveReserveContext(GlobalDirectiveContext ctx) { copyFrom(ctx); } @Override public void enterRule(ParseTreeListener listener) { - if ( listener instanceof KickCListener ) ((KickCListener)listener).enterGlobalDirective(this); + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterGlobalDirectiveReserve(this); } @Override public void exitRule(ParseTreeListener listener) { - if ( listener instanceof KickCListener ) ((KickCListener)listener).exitGlobalDirective(this); + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitGlobalDirectiveReserve(this); } @Override public T accept(ParseTreeVisitor visitor) { - if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitGlobalDirective(this); + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitGlobalDirectiveReserve(this); + else return visitor.visitChildren(this); + } + } + public static class GlobalDirectivePcContext extends GlobalDirectiveContext { + public TerminalNode NUMBER() { return getToken(KickCParser.NUMBER, 0); } + public GlobalDirectivePcContext(GlobalDirectiveContext ctx) { copyFrom(ctx); } + @Override + public void enterRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).enterGlobalDirectivePc(this); + } + @Override + public void exitRule(ParseTreeListener listener) { + if ( listener instanceof KickCListener ) ((KickCListener)listener).exitGlobalDirectivePc(this); + } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof KickCVisitor ) return ((KickCVisitor)visitor).visitGlobalDirectivePc(this); else return visitor.visitChildren(this); } } @@ -1011,12 +1036,35 @@ public class KickCParser extends Parser { GlobalDirectiveContext _localctx = new GlobalDirectiveContext(_ctx, getState()); enterRule(_localctx, 26, RULE_globalDirective); try { - enterOuterAlt(_localctx, 1); - { - setState(165); - directiveReserve(); - setState(166); - match(T__1); + setState(172); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + _localctx = new GlobalDirectiveReserveContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(165); + match(T__8); + setState(166); + directiveReserve(); + } + break; + case 2: + _localctx = new GlobalDirectivePcContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(167); + match(T__8); + setState(168); + match(T__9); + setState(169); + match(T__4); + setState(170); + match(NUMBER); + setState(171); + match(T__5); + } + break; } } catch (RecognitionException re) { @@ -1180,96 +1228,96 @@ public class KickCParser extends Parser { DirectiveContext _localctx = new DirectiveContext(_ctx, getState()); enterRule(_localctx, 28, RULE_directive); try { - setState(187); + setState(193); _errHandler.sync(this); switch (_input.LA(1)) { - case T__8: + case T__10: _localctx = new DirectiveConstContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(168); - match(T__8); - } - break; - case T__9: - _localctx = new DirectiveExternContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(169); - match(T__9); - } - break; - case T__10: - _localctx = new DirectiveAlignContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(170); + setState(174); match(T__10); - setState(171); - match(T__4); - setState(172); - match(NUMBER); - setState(173); - match(T__5); } break; case T__11: - _localctx = new DirectiveRegisterContext(_localctx); - enterOuterAlt(_localctx, 4); + _localctx = new DirectiveExternContext(_localctx); + enterOuterAlt(_localctx, 2); { - setState(174); - match(T__11); setState(175); - match(T__4); - setState(176); - match(NAME); - setState(177); - match(T__5); + match(T__11); } break; case T__12: - _localctx = new DirectiveInlineContext(_localctx); - enterOuterAlt(_localctx, 5); + _localctx = new DirectiveAlignContext(_localctx); + enterOuterAlt(_localctx, 3); { - setState(178); + setState(176); match(T__12); + setState(177); + match(T__4); + setState(178); + match(NUMBER); + setState(179); + match(T__5); } break; case T__13: - _localctx = new DirectiveVolatileContext(_localctx); - enterOuterAlt(_localctx, 6); + _localctx = new DirectiveRegisterContext(_localctx); + enterOuterAlt(_localctx, 4); { - setState(179); + setState(180); match(T__13); + setState(181); + match(T__4); + setState(182); + match(NAME); + setState(183); + match(T__5); } break; case T__14: + _localctx = new DirectiveInlineContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(184); + match(T__14); + } + break; + case T__15: + _localctx = new DirectiveVolatileContext(_localctx); + enterOuterAlt(_localctx, 6); + { + setState(185); + match(T__15); + } + break; + case T__16: _localctx = new DirectiveInterruptContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(180); - match(T__14); - setState(184); + setState(186); + match(T__16); + setState(190); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,12,_ctx) ) { case 1: { - setState(181); + setState(187); match(T__4); - setState(182); + setState(188); match(NAME); - setState(183); + setState(189); match(T__5); } break; } } break; - case T__15: + case T__17: _localctx = new DirectiveReserveZpContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(186); + setState(192); directiveReserve(); } break; @@ -1319,29 +1367,29 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(189); - match(T__15); - setState(190); - match(T__4); - setState(191); - match(NUMBER); + setState(195); + match(T__17); setState(196); + match(T__4); + setState(197); + match(NUMBER); + setState(202); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(192); + setState(198); match(T__2); - setState(193); + setState(199); match(NUMBER); } } - setState(198); + setState(204); _errHandler.sync(this); _la = _input.LA(1); } - setState(199); + setState(205); match(T__5); } } @@ -1389,20 +1437,20 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(202); + setState(208); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(201); + setState(207); stmt(); } } - setState(204); + setState(210); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (SIMPLETYPE - 70)) | (1L << (STRING - 70)) | (1L << (CHAR - 70)) | (1L << (BOOLEAN - 70)) | (1L << (NUMBER - 70)) | (1L << (NAME - 70)))) != 0) ); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__34) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (T__71 - 72)) | (1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0) ); } } catch (RecognitionException re) { @@ -1691,16 +1739,16 @@ public class KickCParser extends Parser { enterRule(_localctx, 34, RULE_stmt); int _la; try { - setState(282); + setState(288); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { case 1: _localctx = new StmtDeclVarContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(206); + setState(212); declVariables(); - setState(207); + setState(213); match(T__1); } break; @@ -1708,19 +1756,19 @@ public class KickCParser extends Parser { _localctx = new StmtBlockContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(209); + setState(215); match(T__6); - setState(211); + setState(217); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (SIMPLETYPE - 70)) | (1L << (STRING - 70)) | (1L << (CHAR - 70)) | (1L << (BOOLEAN - 70)) | (1L << (NUMBER - 70)) | (1L << (NAME - 70)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__25) | (1L << T__26) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__34) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (T__71 - 72)) | (1L << (SIMPLETYPE - 72)) | (1L << (STRING - 72)) | (1L << (CHAR - 72)) | (1L << (BOOLEAN - 72)) | (1L << (NUMBER - 72)) | (1L << (NAME - 72)))) != 0)) { { - setState(210); + setState(216); stmtSeq(); } } - setState(213); + setState(219); match(T__7); } break; @@ -1728,9 +1776,9 @@ public class KickCParser extends Parser { _localctx = new StmtExprContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(214); + setState(220); commaExpr(0); - setState(215); + setState(221); match(T__1); } break; @@ -1738,24 +1786,24 @@ public class KickCParser extends Parser { _localctx = new StmtIfElseContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(217); - match(T__16); - setState(218); - match(T__4); - setState(219); - commaExpr(0); - setState(220); - match(T__5); - setState(221); - stmt(); + setState(223); + match(T__18); setState(224); + match(T__4); + setState(225); + commaExpr(0); + setState(226); + match(T__5); + setState(227); + stmt(); + setState(230); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,17,_ctx) ) { case 1: { - setState(222); - match(T__17); - setState(223); + setState(228); + match(T__19); + setState(229); stmt(); } break; @@ -1766,29 +1814,29 @@ public class KickCParser extends Parser { _localctx = new StmtWhileContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(229); + setState(235); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { - setState(226); + setState(232); directive(); } } - setState(231); + setState(237); _errHandler.sync(this); _la = _input.LA(1); } - setState(232); - match(T__18); - setState(233); + setState(238); + match(T__20); + setState(239); match(T__4); - setState(234); + setState(240); commaExpr(0); - setState(235); + setState(241); match(T__5); - setState(236); + setState(242); stmt(); } break; @@ -1796,33 +1844,33 @@ public class KickCParser extends Parser { _localctx = new StmtDoWhileContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(241); + setState(247); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { - setState(238); + setState(244); directive(); } } - setState(243); + setState(249); _errHandler.sync(this); _la = _input.LA(1); } - setState(244); - match(T__19); - setState(245); - stmt(); - setState(246); - match(T__18); - setState(247); - match(T__4); - setState(248); - commaExpr(0); - setState(249); - match(T__5); setState(250); + match(T__21); + setState(251); + stmt(); + setState(252); + match(T__20); + setState(253); + match(T__4); + setState(254); + commaExpr(0); + setState(255); + match(T__5); + setState(256); match(T__1); } break; @@ -1830,29 +1878,29 @@ public class KickCParser extends Parser { _localctx = new StmtForContext(_localctx); enterOuterAlt(_localctx, 7); { - setState(255); + setState(261); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { - setState(252); + setState(258); directive(); } } - setState(257); + setState(263); _errHandler.sync(this); _la = _input.LA(1); } - setState(258); - match(T__20); - setState(259); + setState(264); + match(T__22); + setState(265); match(T__4); - setState(260); + setState(266); forLoop(); - setState(261); + setState(267); match(T__5); - setState(262); + setState(268); stmt(); } break; @@ -1860,19 +1908,19 @@ public class KickCParser extends Parser { _localctx = new StmtReturnContext(_localctx); enterOuterAlt(_localctx, 8); { - setState(264); - match(T__21); - setState(266); + setState(270); + match(T__23); + setState(272); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__31) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { { - setState(265); + setState(271); commaExpr(0); } } - setState(268); + setState(274); match(T__1); } break; @@ -1880,9 +1928,9 @@ public class KickCParser extends Parser { _localctx = new StmtBreakContext(_localctx); enterOuterAlt(_localctx, 9); { - setState(269); - match(T__22); - setState(270); + setState(275); + match(T__24); + setState(276); match(T__1); } break; @@ -1890,9 +1938,9 @@ public class KickCParser extends Parser { _localctx = new StmtContinueContext(_localctx); enterOuterAlt(_localctx, 10); { - setState(271); - match(T__23); - setState(272); + setState(277); + match(T__25); + setState(278); match(T__1); } break; @@ -1900,23 +1948,23 @@ public class KickCParser extends Parser { _localctx = new StmtAsmContext(_localctx); enterOuterAlt(_localctx, 11); { - setState(273); - match(T__24); - setState(275); + setState(279); + match(T__26); + setState(281); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(274); + setState(280); asmDirectives(); } } - setState(277); + setState(283); match(T__6); - setState(278); + setState(284); asmLines(); - setState(279); + setState(285); match(T__7); } break; @@ -1924,7 +1972,7 @@ public class KickCParser extends Parser { _localctx = new StmtDeclKasmContext(_localctx); enterOuterAlt(_localctx, 12); { - setState(281); + setState(287); declKasm(); } break; @@ -2009,27 +2057,27 @@ public class KickCParser extends Parser { enterRule(_localctx, 36, RULE_forLoop); int _la; try { - setState(300); + setState(306); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { case 1: _localctx = new ForClassicContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(284); + setState(290); forClassicInit(); - setState(285); + setState(291); match(T__1); - setState(286); + setState(292); commaExpr(0); - setState(287); + setState(293); match(T__1); - setState(289); + setState(295); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__31) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { { - setState(288); + setState(294); commaExpr(0); } } @@ -2040,27 +2088,27 @@ public class KickCParser extends Parser { _localctx = new ForRangeContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(292); + setState(298); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28) | (1L << T__32))) != 0) || _la==SIMPLETYPE) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__29) | (1L << T__30) | (1L << T__34))) != 0) || _la==SIMPLETYPE) { { - setState(291); + setState(297); declTypes(); } } - setState(294); + setState(300); match(NAME); - setState(295); - match(T__25); - setState(296); + setState(301); + match(T__27); + setState(302); expr(0); { - setState(297); - match(T__26); + setState(303); + match(T__28); } - setState(298); + setState(304); expr(0); } break; @@ -2132,19 +2180,19 @@ public class KickCParser extends Parser { enterRule(_localctx, 38, RULE_forClassicInit); int _la; try { - setState(306); + setState(312); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,27,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { case 1: _localctx = new ForClassicInitDeclContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(303); + setState(309); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28) | (1L << T__32))) != 0) || _la==SIMPLETYPE) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__29) | (1L << T__30) | (1L << T__34))) != 0) || _la==SIMPLETYPE) { { - setState(302); + setState(308); declVariables(); } } @@ -2155,7 +2203,7 @@ public class KickCParser extends Parser { _localctx = new ForClassicInitExprContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(305); + setState(311); commaExpr(0); } break; @@ -2351,20 +2399,20 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(320); + setState(326); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: { _localctx = new TypeParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(309); + setState(315); match(T__4); - setState(310); + setState(316); typeDecl(0); - setState(311); + setState(317); match(T__5); } break; @@ -2373,7 +2421,7 @@ public class KickCParser extends Parser { _localctx = new TypeSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(313); + setState(319); match(SIMPLETYPE); } break; @@ -2382,9 +2430,9 @@ public class KickCParser extends Parser { _localctx = new TypeSignedSimpleContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(314); + setState(320); _la = _input.LA(1); - if ( !(_la==T__27 || _la==T__28) ) { + if ( !(_la==T__29 || _la==T__30) ) { _errHandler.recoverInline(this); } else { @@ -2392,12 +2440,12 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(316); + setState(322); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,28,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,29,_ctx) ) { case 1: { - setState(315); + setState(321); match(SIMPLETYPE); } break; @@ -2409,7 +2457,7 @@ public class KickCParser extends Parser { _localctx = new TypeStructDefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(318); + setState(324); structDef(); } break; @@ -2418,73 +2466,73 @@ public class KickCParser extends Parser { _localctx = new TypeStructRefContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(319); + setState(325); structRef(); } break; } _ctx.stop = _input.LT(-1); - setState(335); + setState(341); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(333); + setState(339); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,31,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,32,_ctx) ) { case 1: { _localctx = new TypePtrContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(322); + setState(328); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(323); - match(T__29); + setState(329); + match(T__31); } break; case 2: { _localctx = new TypeArrayContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(324); + setState(330); if (!(precpred(_ctx, 4))) throw new FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(325); - match(T__30); - setState(327); + setState(331); + match(T__32); + setState(333); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__31) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { { - setState(326); + setState(332); expr(0); } } - setState(329); - match(T__31); + setState(335); + match(T__33); } break; case 3: { _localctx = new TypeProcedureContext(new TypeDeclContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_typeDecl); - setState(330); + setState(336); if (!(precpred(_ctx, 3))) throw new FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(331); + setState(337); match(T__4); - setState(332); + setState(338); match(T__5); } break; } } } - setState(337); + setState(343); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,32,_ctx); + _alt = getInterpreter().adaptivePredict(_input,33,_ctx); } } } @@ -2526,9 +2574,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(338); - match(T__32); - setState(339); + setState(344); + match(T__34); + setState(345); match(NAME); } } @@ -2577,35 +2625,35 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(341); - match(T__32); - setState(343); + setState(347); + match(T__34); + setState(349); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(342); + setState(348); match(NAME); } } - setState(345); + setState(351); match(T__6); - setState(347); + setState(353); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(346); + setState(352); structMembers(); } } - setState(349); + setState(355); _errHandler.sync(this); _la = _input.LA(1); - } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28) | (1L << T__32))) != 0) || _la==SIMPLETYPE ); - setState(351); + } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__29) | (1L << T__30) | (1L << T__34))) != 0) || _la==SIMPLETYPE ); + setState(357); match(T__7); } } @@ -2649,9 +2697,9 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(353); + setState(359); declVariables(); - setState(354); + setState(360); match(T__1); } } @@ -2739,13 +2787,13 @@ public class KickCParser extends Parser { _ctx = _localctx; _prevctx = _localctx; - setState(357); + setState(363); expr(0); } _ctx.stop = _input.LT(-1); - setState(364); + setState(370); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,36,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); @@ -2754,18 +2802,18 @@ public class KickCParser extends Parser { { _localctx = new CommaSimpleContext(new CommaExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_commaExpr); - setState(359); + setState(365); if (!(precpred(_ctx, 1))) throw new FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(360); + setState(366); match(T__2); - setState(361); + setState(367); expr(0); } } } - setState(366); + setState(372); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,35,_ctx); + _alt = getInterpreter().adaptivePredict(_input,36,_ctx); } } } @@ -3251,20 +3299,20 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(421); + setState(427); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,40,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,41,_ctx) ) { case 1: { _localctx = new ExprParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(368); + setState(374); match(T__4); - setState(369); + setState(375); commaExpr(0); - setState(370); + setState(376); match(T__5); } break; @@ -3273,27 +3321,27 @@ public class KickCParser extends Parser { _localctx = new ExprSizeOfContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(372); - match(T__35); - setState(373); + setState(378); + match(T__37); + setState(379); match(T__4); - setState(376); + setState(382); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(374); + setState(380); typeDecl(0); } break; case 2: { - setState(375); + setState(381); expr(0); } break; } - setState(378); + setState(384); match(T__5); } break; @@ -3302,27 +3350,27 @@ public class KickCParser extends Parser { _localctx = new ExprTypeIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(380); - match(T__36); - setState(381); + setState(386); + match(T__38); + setState(387); match(T__4); - setState(384); + setState(390); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) { case 1: { - setState(382); + setState(388); typeDecl(0); } break; case 2: { - setState(383); + setState(389); expr(0); } break; } - setState(386); + setState(392); match(T__5); } break; @@ -3331,13 +3379,13 @@ public class KickCParser extends Parser { _localctx = new ExprCastContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(388); + setState(394); match(T__4); - setState(389); + setState(395); typeDecl(0); - setState(390); + setState(396); match(T__5); - setState(391); + setState(397); expr(24); } break; @@ -3346,58 +3394,9 @@ public class KickCParser extends Parser { _localctx = new ExprPreModContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(393); - _la = _input.LA(1); - if ( !(_la==T__37 || _la==T__38) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(394); - expr(23); - } - break; - case 6: - { - _localctx = new ExprPtrContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(395); - match(T__29); - setState(396); - expr(21); - } - break; - case 7: - { - _localctx = new ExprUnaryContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; - setState(397); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43))) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(398); - expr(20); - } - break; - case 8: - { - _localctx = new ExprUnaryContext(_localctx); - _ctx = _localctx; - _prevctx = _localctx; setState(399); _la = _input.LA(1); - if ( !(_la==T__48 || _la==T__49) ) { + if ( !(_la==T__39 || _la==T__40) ) { _errHandler.recoverInline(this); } else { @@ -3406,6 +3405,55 @@ public class KickCParser extends Parser { consume(); } setState(400); + expr(23); + } + break; + case 6: + { + _localctx = new ExprPtrContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(401); + match(T__31); + setState(402); + expr(21); + } + break; + case 7: + { + _localctx = new ExprUnaryContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(403); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(404); + expr(20); + } + break; + case 8: + { + _localctx = new ExprUnaryContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(405); + _la = _input.LA(1); + if ( !(_la==T__50 || _la==T__51) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(406); expr(16); } break; @@ -3414,27 +3462,27 @@ public class KickCParser extends Parser { _localctx = new InitListContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(401); - match(T__6); - setState(402); - expr(0); setState(407); + match(T__6); + setState(408); + expr(0); + setState(413); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(403); + setState(409); match(T__2); - setState(404); + setState(410); expr(0); } } - setState(409); + setState(415); _errHandler.sync(this); _la = _input.LA(1); } - setState(410); + setState(416); match(T__7); } break; @@ -3443,7 +3491,7 @@ public class KickCParser extends Parser { _localctx = new ExprIdContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(412); + setState(418); match(NAME); } break; @@ -3452,7 +3500,7 @@ public class KickCParser extends Parser { _localctx = new ExprNumberContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(413); + setState(419); match(NUMBER); } break; @@ -3461,7 +3509,7 @@ public class KickCParser extends Parser { _localctx = new ExprStringContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(415); + setState(421); _errHandler.sync(this); _alt = 1; do { @@ -3469,7 +3517,7 @@ public class KickCParser extends Parser { case 1: { { - setState(414); + setState(420); match(STRING); } } @@ -3477,9 +3525,9 @@ public class KickCParser extends Parser { default: throw new NoViableAltException(this); } - setState(417); + setState(423); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,39,_ctx); + _alt = getInterpreter().adaptivePredict(_input,40,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); } break; @@ -3488,7 +3536,7 @@ public class KickCParser extends Parser { _localctx = new ExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(419); + setState(425); match(CHAR); } break; @@ -3497,72 +3545,32 @@ public class KickCParser extends Parser { _localctx = new ExprBoolContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(420); + setState(426); match(BOOLEAN); } break; } _ctx.stop = _input.LT(-1); - setState(483); + setState(489); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(481); + setState(487); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,42,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(423); - if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); - setState(424); - _la = _input.LA(1); - if ( !(_la==T__44 || _la==T__45) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(425); - expr(20); - } - break; - case 2: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(426); - if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); - setState(427); - _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__29) | (1L << T__46) | (1L << T__47))) != 0)) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(428); - expr(19); - } - break; - case 3: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(429); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); setState(430); _la = _input.LA(1); - if ( !(_la==T__39 || _la==T__40) ) { + if ( !(_la==T__46 || _la==T__47) ) { _errHandler.recoverInline(this); } else { @@ -3571,18 +3579,18 @@ public class KickCParser extends Parser { consume(); } setState(431); - expr(18); + expr(20); } break; - case 4: + case 2: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(432); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(433); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__31) | (1L << T__48) | (1L << T__49))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3591,116 +3599,18 @@ public class KickCParser extends Parser { consume(); } setState(434); - expr(16); + expr(19); } break; - case 5: + case 3: { _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); setState(435); - if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); - { + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(436); - match(T__42); - } - setState(437); - expr(15); - } - break; - case 6: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(438); - if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - { - setState(439); - match(T__54); - } - setState(440); - expr(14); - } - break; - case 7: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(441); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - { - setState(442); - match(T__55); - } - setState(443); - expr(13); - } - break; - case 8: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(444); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - { - setState(445); - match(T__56); - } - setState(446); - expr(12); - } - break; - case 9: - { - _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(447); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - { - setState(448); - match(T__57); - } - setState(449); - expr(11); - } - break; - case 10: - { - _localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(450); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(451); - match(T__58); - setState(452); - expr(0); - setState(453); - match(T__25); - setState(454); - expr(10); - } - break; - case 11: - { - _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(456); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(457); - match(T__3); - setState(458); - expr(8); - } - break; - case 12: - { - _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(459); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(460); _la = _input.LA(1); - if ( !(((((_la - 60)) & ~0x3f) == 0 && ((1L << (_la - 60)) & ((1L << (T__59 - 60)) | (1L << (T__60 - 60)) | (1L << (T__61 - 60)) | (1L << (T__62 - 60)) | (1L << (T__63 - 60)) | (1L << (T__64 - 60)) | (1L << (T__65 - 60)) | (1L << (T__66 - 60)) | (1L << (T__67 - 60)) | (1L << (T__68 - 60)))) != 0)) ) { + if ( !(_la==T__41 || _la==T__42) ) { _errHandler.recoverInline(this); } else { @@ -3708,7 +3618,145 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(461); + setState(437); + expr(18); + } + break; + case 4: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(438); + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + setState(439); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(440); + expr(16); + } + break; + case 5: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(441); + if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); + { + setState(442); + match(T__44); + } + setState(443); + expr(15); + } + break; + case 6: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(444); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + { + setState(445); + match(T__56); + } + setState(446); + expr(14); + } + break; + case 7: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(447); + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + { + setState(448); + match(T__57); + } + setState(449); + expr(13); + } + break; + case 8: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(450); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + { + setState(451); + match(T__58); + } + setState(452); + expr(12); + } + break; + case 9: + { + _localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(453); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + { + setState(454); + match(T__59); + } + setState(455); + expr(11); + } + break; + case 10: + { + _localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(456); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(457); + match(T__60); + setState(458); + expr(0); + setState(459); + match(T__27); + setState(460); + expr(10); + } + break; + case 11: + { + _localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(462); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(463); + match(T__3); + setState(464); + expr(8); + } + break; + case 12: + { + _localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_expr); + setState(465); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(466); + _la = _input.LA(1); + if ( !(((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & ((1L << (T__61 - 62)) | (1L << (T__62 - 62)) | (1L << (T__63 - 62)) | (1L << (T__64 - 62)) | (1L << (T__65 - 62)) | (1L << (T__66 - 62)) | (1L << (T__67 - 62)) | (1L << (T__68 - 62)) | (1L << (T__69 - 62)) | (1L << (T__70 - 62)))) != 0)) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(467); expr(7); } break; @@ -3716,11 +3764,11 @@ public class KickCParser extends Parser { { _localctx = new ExprDotContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(462); + setState(468); if (!(precpred(_ctx, 30))) throw new FailedPredicateException(this, "precpred(_ctx, 30)"); - setState(463); - match(T__33); - setState(464); + setState(469); + match(T__35); + setState(470); match(NAME); } break; @@ -3728,11 +3776,11 @@ public class KickCParser extends Parser { { _localctx = new ExprArrowContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(465); + setState(471); if (!(precpred(_ctx, 29))) throw new FailedPredicateException(this, "precpred(_ctx, 29)"); - setState(466); - match(T__34); - setState(467); + setState(472); + match(T__36); + setState(473); match(NAME); } break; @@ -3740,21 +3788,21 @@ public class KickCParser extends Parser { { _localctx = new ExprCallContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(468); + setState(474); if (!(precpred(_ctx, 28))) throw new FailedPredicateException(this, "precpred(_ctx, 28)"); - setState(469); + setState(475); match(T__4); - setState(471); + setState(477); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__48) | (1L << T__49))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__31) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45) | (1L << T__50) | (1L << T__51))) != 0) || ((((_la - 82)) & ~0x3f) == 0 && ((1L << (_la - 82)) & ((1L << (STRING - 82)) | (1L << (CHAR - 82)) | (1L << (BOOLEAN - 82)) | (1L << (NUMBER - 82)) | (1L << (NAME - 82)))) != 0)) { { - setState(470); + setState(476); parameterList(); } } - setState(473); + setState(479); match(T__5); } break; @@ -3762,25 +3810,25 @@ public class KickCParser extends Parser { { _localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(474); + setState(480); if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)"); - setState(475); - match(T__30); - setState(476); + setState(481); + match(T__32); + setState(482); commaExpr(0); - setState(477); - match(T__31); + setState(483); + match(T__33); } break; case 17: { _localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_expr); - setState(479); + setState(485); if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)"); - setState(480); + setState(486); _la = _input.LA(1); - if ( !(_la==T__37 || _la==T__38) ) { + if ( !(_la==T__39 || _la==T__40) ) { _errHandler.recoverInline(this); } else { @@ -3793,9 +3841,9 @@ public class KickCParser extends Parser { } } } - setState(485); + setState(491); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,43,_ctx); + _alt = getInterpreter().adaptivePredict(_input,44,_ctx); } } } @@ -3843,21 +3891,21 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(486); + setState(492); expr(0); - setState(491); + setState(497); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(487); + setState(493); match(T__2); - setState(488); + setState(494); expr(0); } } - setState(493); + setState(499); _errHandler.sync(this); _la = _input.LA(1); } @@ -3905,19 +3953,19 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(494); - match(T__69); - setState(496); + setState(500); + match(T__71); + setState(502); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__4) { { - setState(495); + setState(501); asmDirectives(); } } - setState(498); + setState(504); match(KICKASM); } } @@ -3965,27 +4013,27 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(500); - match(T__4); - setState(501); - asmDirective(); setState(506); + match(T__4); + setState(507); + asmDirective(); + setState(512); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(502); + setState(508); match(T__2); - setState(503); + setState(509); asmDirective(); } } - setState(508); + setState(514); _errHandler.sync(this); _la = _input.LA(1); } - setState(509); + setState(515); match(T__5); } } @@ -4124,79 +4172,77 @@ public class KickCParser extends Parser { AsmDirectiveContext _localctx = new AsmDirectiveContext(_ctx, getState()); enterRule(_localctx, 58, RULE_asmDirective); try { - setState(526); + setState(532); _errHandler.sync(this); switch (_input.LA(1)) { - case T__70: + case T__72: _localctx = new AsmDirectiveResourceContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(511); - match(T__70); - setState(512); - match(STRING); - } - break; - case T__71: - _localctx = new AsmDirectiveUsesContext(_localctx); - enterOuterAlt(_localctx, 2); - { - setState(513); - match(T__71); - setState(514); - match(NAME); - } - break; - case T__72: - _localctx = new AsmDirectiveClobberContext(_localctx); - enterOuterAlt(_localctx, 3); - { - setState(515); + setState(517); match(T__72); - setState(516); + setState(518); match(STRING); } break; case T__73: - _localctx = new AsmDirectiveBytesContext(_localctx); - enterOuterAlt(_localctx, 4); + _localctx = new AsmDirectiveUsesContext(_localctx); + enterOuterAlt(_localctx, 2); { - setState(517); + setState(519); match(T__73); - setState(518); - expr(0); + setState(520); + match(NAME); } break; case T__74: - _localctx = new AsmDirectiveCyclesContext(_localctx); - enterOuterAlt(_localctx, 5); + _localctx = new AsmDirectiveClobberContext(_localctx); + enterOuterAlt(_localctx, 3); { - setState(519); + setState(521); match(T__74); - setState(520); - expr(0); + setState(522); + match(STRING); } break; case T__75: + _localctx = new AsmDirectiveBytesContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(523); + match(T__75); + setState(524); + expr(0); + } + break; + case T__76: + _localctx = new AsmDirectiveCyclesContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(525); + match(T__76); + setState(526); + expr(0); + } + break; + case T__9: _localctx = new AsmDirectiveAddressContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(521); - match(T__75); - setState(524); + setState(527); + match(T__9); + setState(530); _errHandler.sync(this); switch (_input.LA(1)) { - case T__12: + case T__14: { - setState(522); - match(T__12); + setState(528); + match(T__14); } break; case T__4: case T__6: - case T__29: - case T__35: - case T__36: + case T__31: case T__37: case T__38: case T__39: @@ -4204,15 +4250,17 @@ public class KickCParser extends Parser { case T__41: case T__42: case T__43: - case T__48: - case T__49: + case T__44: + case T__45: + case T__50: + case T__51: case STRING: case CHAR: case BOOLEAN: case NUMBER: case NAME: { - setState(523); + setState(529); expr(0); } break; @@ -4269,17 +4317,17 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(531); + setState(537); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 42)) & ~0x3f) == 0 && ((1L << (_la - 42)) & ((1L << (T__41 - 42)) | (1L << (T__76 - 42)) | (1L << (MNEMONIC - 42)) | (1L << (NAME - 42)))) != 0)) { + while (((((_la - 44)) & ~0x3f) == 0 && ((1L << (_la - 44)) & ((1L << (T__43 - 44)) | (1L << (T__77 - 44)) | (1L << (MNEMONIC - 44)) | (1L << (NAME - 44)))) != 0)) { { { - setState(528); + setState(534); asmLine(); } } - setState(533); + setState(539); _errHandler.sync(this); _la = _input.LA(1); } @@ -4329,28 +4377,28 @@ public class KickCParser extends Parser { AsmLineContext _localctx = new AsmLineContext(_ctx, getState()); enterRule(_localctx, 62, RULE_asmLine); try { - setState(537); + setState(543); _errHandler.sync(this); switch (_input.LA(1)) { - case T__41: + case T__43: case NAME: enterOuterAlt(_localctx, 1); { - setState(534); + setState(540); asmLabel(); } break; case MNEMONIC: enterOuterAlt(_localctx, 2); { - setState(535); + setState(541); asmInstruction(); } break; - case T__76: + case T__77: enterOuterAlt(_localctx, 3); { - setState(536); + setState(542); asmBytes(); } break; @@ -4420,37 +4468,37 @@ public class KickCParser extends Parser { enterRule(_localctx, 64, RULE_asmLabel); int _la; try { - setState(546); + setState(552); _errHandler.sync(this); switch (_input.LA(1)) { case NAME: _localctx = new AsmLabelNameContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(539); + setState(545); match(NAME); - setState(540); - match(T__25); + setState(546); + match(T__27); } break; - case T__41: + case T__43: _localctx = new AsmLabelMultiContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(541); - match(T__41); - setState(543); + setState(547); + match(T__43); + setState(549); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(542); + setState(548); match(NAME); } } - setState(545); - match(T__25); + setState(551); + match(T__27); } break; default: @@ -4498,14 +4546,14 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(548); + setState(554); match(MNEMONIC); - setState(550); + setState(556); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) { case 1: { - setState(549); + setState(555); asmParamMode(); } break; @@ -4556,23 +4604,23 @@ public class KickCParser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(552); - match(T__76); - setState(553); - asmExpr(0); setState(558); + match(T__77); + setState(559); + asmExpr(0); + setState(564); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__2) { { { - setState(554); + setState(560); match(T__2); - setState(555); + setState(561); asmExpr(0); } } - setState(560); + setState(566); _errHandler.sync(this); _la = _input.LA(1); } @@ -4722,14 +4770,14 @@ public class KickCParser extends Parser { AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState()); enterRule(_localctx, 70, RULE_asmParamMode); try { - setState(584); + setState(590); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,55,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,56,_ctx) ) { case 1: _localctx = new AsmModeAbsContext(_localctx); enterOuterAlt(_localctx, 1); { - setState(561); + setState(567); asmExpr(0); } break; @@ -4737,9 +4785,9 @@ public class KickCParser extends Parser { _localctx = new AsmModeImmContext(_localctx); enterOuterAlt(_localctx, 2); { - setState(562); - match(T__77); - setState(563); + setState(568); + match(T__8); + setState(569); asmExpr(0); } break; @@ -4747,11 +4795,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeAbsXYContext(_localctx); enterOuterAlt(_localctx, 3); { - setState(564); + setState(570); asmExpr(0); - setState(565); + setState(571); match(T__2); - setState(566); + setState(572); match(NAME); } break; @@ -4759,15 +4807,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndIdxXYContext(_localctx); enterOuterAlt(_localctx, 4); { - setState(568); + setState(574); match(T__4); - setState(569); + setState(575); asmExpr(0); - setState(570); + setState(576); match(T__5); - setState(571); + setState(577); match(T__2); - setState(572); + setState(578); match(NAME); } break; @@ -4775,15 +4823,15 @@ public class KickCParser extends Parser { _localctx = new AsmModeIdxIndXYContext(_localctx); enterOuterAlt(_localctx, 5); { - setState(574); + setState(580); match(T__4); - setState(575); + setState(581); asmExpr(0); - setState(576); + setState(582); match(T__2); - setState(577); + setState(583); match(NAME); - setState(578); + setState(584); match(T__5); } break; @@ -4791,11 +4839,11 @@ public class KickCParser extends Parser { _localctx = new AsmModeIndContext(_localctx); enterOuterAlt(_localctx, 6); { - setState(580); + setState(586); match(T__4); - setState(581); + setState(587); asmExpr(0); - setState(582); + setState(588); match(T__5); } break; @@ -4985,34 +5033,34 @@ public class KickCParser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(600); + setState(606); _errHandler.sync(this); switch (_input.LA(1)) { - case T__30: + case T__32: { _localctx = new AsmExprParContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(587); - match(T__30); - setState(588); + setState(593); + match(T__32); + setState(594); asmExpr(0); - setState(589); - match(T__31); + setState(595); + match(T__33); } break; - case T__39: - case T__40: - case T__48: - case T__49: + case T__41: + case T__42: + case T__50: + case T__51: { _localctx = new AsmExprUnaryContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(591); + setState(597); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__39) | (1L << T__40) | (1L << T__48) | (1L << T__49))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__50) | (1L << T__51))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -5020,7 +5068,7 @@ public class KickCParser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(592); + setState(598); asmExpr(8); } break; @@ -5029,7 +5077,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(593); + setState(599); match(NAME); } break; @@ -5038,7 +5086,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprLabelRelContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(594); + setState(600); match(ASMREL); } break; @@ -5047,11 +5095,11 @@ public class KickCParser extends Parser { _localctx = new AsmExprReplaceContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(595); + setState(601); match(T__6); - setState(596); + setState(602); match(NAME); - setState(597); + setState(603); match(T__7); } break; @@ -5060,7 +5108,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprIntContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(598); + setState(604); match(NUMBER); } break; @@ -5069,7 +5117,7 @@ public class KickCParser extends Parser { _localctx = new AsmExprCharContext(_localctx); _ctx = _localctx; _prevctx = _localctx; - setState(599); + setState(605); match(CHAR); } break; @@ -5077,80 +5125,40 @@ public class KickCParser extends Parser { throw new NoViableAltException(this); } _ctx.stop = _input.LT(-1); - setState(616); + setState(622); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,58,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(614); + setState(620); _errHandler.sync(this); - switch ( getInterpreter().adaptivePredict(_input,57,_ctx) ) { + switch ( getInterpreter().adaptivePredict(_input,58,_ctx) ) { case 1: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(602); + setState(608); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); { - setState(603); - match(T__33); + setState(609); + match(T__35); } - setState(604); + setState(610); asmExpr(11); } break; case 2: - { - _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(605); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(606); - _la = _input.LA(1); - if ( !(_la==T__44 || _la==T__45) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(607); - asmExpr(10); - } - break; - case 3: - { - _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); - pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); - setState(608); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(609); - _la = _input.LA(1); - if ( !(_la==T__29 || _la==T__46) ) { - _errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } - setState(610); - asmExpr(8); - } - break; - case 4: { _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); setState(611); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(612); _la = _input.LA(1); - if ( !(_la==T__39 || _la==T__40) ) { + if ( !(_la==T__46 || _la==T__47) ) { _errHandler.recoverInline(this); } else { @@ -5159,15 +5167,55 @@ public class KickCParser extends Parser { consume(); } setState(613); + asmExpr(10); + } + break; + case 3: + { + _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); + setState(614); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(615); + _la = _input.LA(1); + if ( !(_la==T__31 || _la==T__48) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(616); + asmExpr(8); + } + break; + case 4: + { + _localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState)); + pushNewRecursionContext(_localctx, _startState, RULE_asmExpr); + setState(617); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(618); + _la = _input.LA(1); + if ( !(_la==T__41 || _la==T__42) ) { + _errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(619); asmExpr(7); } break; } } } - setState(618); + setState(624); _errHandler.sync(this); - _alt = getInterpreter().adaptivePredict(_input,58,_ctx); + _alt = getInterpreter().adaptivePredict(_input,59,_ctx); } } } @@ -5276,7 +5324,7 @@ public class KickCParser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3d\u026e\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3d\u0274\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"+ @@ -5288,237 +5336,240 @@ public class KickCParser extends Parser { "\n\n\f\n\16\n\u0086\13\n\3\13\3\13\3\13\5\13\u008b\n\13\3\f\3\f\3\f\3"+ "\f\5\f\u0091\n\f\3\f\3\f\3\f\5\f\u0096\n\f\3\f\3\f\3\r\3\r\3\r\7\r\u009d"+ "\n\r\f\r\16\r\u00a0\13\r\3\16\3\16\3\16\3\16\5\16\u00a6\n\16\3\17\3\17"+ - "\3\17\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\u00bb\n\20\3\20\5\20\u00be\n\20\3\21\3\21\3\21\3"+ - "\21\3\21\7\21\u00c5\n\21\f\21\16\21\u00c8\13\21\3\21\3\21\3\22\6\22\u00cd"+ - "\n\22\r\22\16\22\u00ce\3\23\3\23\3\23\3\23\3\23\5\23\u00d6\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\u00e3\n\23\3\23"+ - "\7\23\u00e6\n\23\f\23\16\23\u00e9\13\23\3\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\7\23\u00f2\n\23\f\23\16\23\u00f5\13\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\7\23\u0100\n\23\f\23\16\23\u0103\13\23\3\23\3\23"+ - "\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u010d\n\23\3\23\3\23\3\23\3\23\3\23"+ - "\3\23\3\23\5\23\u0116\n\23\3\23\3\23\3\23\3\23\3\23\5\23\u011d\n\23\3"+ - "\24\3\24\3\24\3\24\3\24\5\24\u0124\n\24\3\24\5\24\u0127\n\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\5\24\u012f\n\24\3\25\5\25\u0132\n\25\3\25\5\25\u0135"+ - "\n\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\26\5\26\u013f\n\26\3\26\3\26"+ - "\5\26\u0143\n\26\3\26\3\26\3\26\3\26\3\26\5\26\u014a\n\26\3\26\3\26\3"+ - "\26\3\26\7\26\u0150\n\26\f\26\16\26\u0153\13\26\3\27\3\27\3\27\3\30\3"+ - "\30\5\30\u015a\n\30\3\30\3\30\6\30\u015e\n\30\r\30\16\30\u015f\3\30\3"+ - "\30\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u016d\n\32\f\32"+ - "\16\32\u0170\13\32\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u017b"+ - "\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u0183\n\33\3\33\3\33\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ - "\3\33\7\33\u0198\n\33\f\33\16\33\u019b\13\33\3\33\3\33\3\33\3\33\3\33"+ - "\6\33\u01a2\n\33\r\33\16\33\u01a3\3\33\3\33\5\33\u01a8\n\33\3\33\3\33"+ + "\3\17\3\17\3\17\3\17\3\17\5\17\u00af\n\17\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\u00c1\n\20\3\20"+ + "\5\20\u00c4\n\20\3\21\3\21\3\21\3\21\3\21\7\21\u00cb\n\21\f\21\16\21\u00ce"+ + "\13\21\3\21\3\21\3\22\6\22\u00d3\n\22\r\22\16\22\u00d4\3\23\3\23\3\23"+ + "\3\23\3\23\5\23\u00dc\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\u00e9\n\23\3\23\7\23\u00ec\n\23\f\23\16\23\u00ef\13\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u00f8\n\23\f\23\16\23\u00fb\13"+ + "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\7\23\u0106\n\23\f\23"+ + "\16\23\u0109\13\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u0113"+ + "\n\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u011c\n\23\3\23\3\23\3\23"+ + "\3\23\3\23\5\23\u0123\n\23\3\24\3\24\3\24\3\24\3\24\5\24\u012a\n\24\3"+ + "\24\5\24\u012d\n\24\3\24\3\24\3\24\3\24\3\24\3\24\5\24\u0135\n\24\3\25"+ + "\5\25\u0138\n\25\3\25\5\25\u013b\n\25\3\26\3\26\3\26\3\26\3\26\3\26\3"+ + "\26\3\26\5\26\u0145\n\26\3\26\3\26\5\26\u0149\n\26\3\26\3\26\3\26\3\26"+ + "\3\26\5\26\u0150\n\26\3\26\3\26\3\26\3\26\7\26\u0156\n\26\f\26\16\26\u0159"+ + "\13\26\3\27\3\27\3\27\3\30\3\30\5\30\u0160\n\30\3\30\3\30\6\30\u0164\n"+ + "\30\r\30\16\30\u0165\3\30\3\30\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32"+ + "\3\32\7\32\u0173\n\32\f\32\16\32\u0176\13\32\3\33\3\33\3\33\3\33\3\33"+ + "\3\33\3\33\3\33\3\33\5\33\u0181\n\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33"+ + "\u0189\n\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ + "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\7\33\u019e\n\33\f\33\16\33\u01a1\13"+ + "\33\3\33\3\33\3\33\3\33\3\33\6\33\u01a8\n\33\r\33\16\33\u01a9\3\33\3\33"+ + "\5\33\u01ae\n\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ - "\3\33\3\33\3\33\3\33\5\33\u01da\n\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33"+ - "\3\33\7\33\u01e4\n\33\f\33\16\33\u01e7\13\33\3\34\3\34\3\34\7\34\u01ec"+ - "\n\34\f\34\16\34\u01ef\13\34\3\35\3\35\5\35\u01f3\n\35\3\35\3\35\3\36"+ - "\3\36\3\36\3\36\7\36\u01fb\n\36\f\36\16\36\u01fe\13\36\3\36\3\36\3\37"+ - "\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\5\37\u020f"+ - "\n\37\5\37\u0211\n\37\3 \7 \u0214\n \f \16 \u0217\13 \3!\3!\3!\5!\u021c"+ - "\n!\3\"\3\"\3\"\3\"\5\"\u0222\n\"\3\"\5\"\u0225\n\"\3#\3#\5#\u0229\n#"+ - "\3$\3$\3$\3$\7$\u022f\n$\f$\16$\u0232\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%\u024b\n%\3&\3&\3&\3&\3&\3"+ - "&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u025b\n&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3"+ - "&\3&\7&\u0269\n&\f&\16&\u026c\13&\3&\2\7\22*\62\64J\'\2\4\6\b\n\f\16\20"+ - "\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJ\2\r\3\2\36\37\3\2"+ - "()\3\2*.\3\2\63\64\3\2/\60\4\2 \61\62\3\2*+\3\2\638\3\2>G\4\2*+\63\64"+ - "\4\2 \61\61\2\u02c5\2L\3\2\2\2\4P\3\2\2\2\6V\3\2\2\2\bY\3\2\2\2\n]\3"+ - "\2\2\2\fj\3\2\2\2\16o\3\2\2\2\20y\3\2\2\2\22|\3\2\2\2\24\u0087\3\2\2\2"+ - "\26\u008c\3\2\2\2\30\u0099\3\2\2\2\32\u00a5\3\2\2\2\34\u00a7\3\2\2\2\36"+ - "\u00bd\3\2\2\2 \u00bf\3\2\2\2\"\u00cc\3\2\2\2$\u011c\3\2\2\2&\u012e\3"+ - "\2\2\2(\u0134\3\2\2\2*\u0142\3\2\2\2,\u0154\3\2\2\2.\u0157\3\2\2\2\60"+ - "\u0163\3\2\2\2\62\u0166\3\2\2\2\64\u01a7\3\2\2\2\66\u01e8\3\2\2\28\u01f0"+ - "\3\2\2\2:\u01f6\3\2\2\2<\u0210\3\2\2\2>\u0215\3\2\2\2@\u021b\3\2\2\2B"+ - "\u0224\3\2\2\2D\u0226\3\2\2\2F\u022a\3\2\2\2H\u024a\3\2\2\2J\u025a\3\2"+ - "\2\2LM\5\6\4\2MN\5\n\6\2NO\7\2\2\3O\3\3\2\2\2PQ\5> \2QR\7\2\2\3R\5\3\2"+ - "\2\2SU\5\b\5\2TS\3\2\2\2UX\3\2\2\2VT\3\2\2\2VW\3\2\2\2W\7\3\2\2\2XV\3"+ - "\2\2\2YZ\7\3\2\2Z[\7T\2\2[\t\3\2\2\2\\^\5\f\7\2]\\\3\2\2\2^_\3\2\2\2_"+ - "]\3\2\2\2_`\3\2\2\2`\13\3\2\2\2ab\5\20\t\2bc\7\4\2\2ck\3\2\2\2de\5.\30"+ - "\2ef\7\4\2\2fk\3\2\2\2gk\5\26\f\2hk\58\35\2ik\5\34\17\2ja\3\2\2\2jd\3"+ - "\2\2\2jg\3\2\2\2jh\3\2\2\2ji\3\2\2\2k\r\3\2\2\2ln\5\36\20\2ml\3\2\2\2"+ - "nq\3\2\2\2om\3\2\2\2op\3\2\2\2pr\3\2\2\2qo\3\2\2\2rv\5*\26\2su\5\36\20"+ - "\2ts\3\2\2\2ux\3\2\2\2vt\3\2\2\2vw\3\2\2\2w\17\3\2\2\2xv\3\2\2\2yz\5\16"+ - "\b\2z{\5\22\n\2{\21\3\2\2\2|}\b\n\1\2}~\5\24\13\2~\u0084\3\2\2\2\177\u0080"+ - "\f\3\2\2\u0080\u0081\7\5\2\2\u0081\u0083\5\24\13\2\u0082\177\3\2\2\2\u0083"+ - "\u0086\3\2\2\2\u0084\u0082\3\2\2\2\u0084\u0085\3\2\2\2\u0085\23\3\2\2"+ - "\2\u0086\u0084\3\2\2\2\u0087\u008a\7`\2\2\u0088\u0089\7\6\2\2\u0089\u008b"+ - "\5\64\33\2\u008a\u0088\3\2\2\2\u008a\u008b\3\2\2\2\u008b\25\3\2\2\2\u008c"+ - "\u008d\5\16\b\2\u008d\u008e\7`\2\2\u008e\u0090\7\7\2\2\u008f\u0091\5\30"+ - "\r\2\u0090\u008f\3\2\2\2\u0090\u0091\3\2\2\2\u0091\u0092\3\2\2\2\u0092"+ - "\u0093\7\b\2\2\u0093\u0095\7\t\2\2\u0094\u0096\5\"\22\2\u0095\u0094\3"+ - "\2\2\2\u0095\u0096\3\2\2\2\u0096\u0097\3\2\2\2\u0097\u0098\7\n\2\2\u0098"+ - "\27\3\2\2\2\u0099\u009e\5\32\16\2\u009a\u009b\7\5\2\2\u009b\u009d\5\32"+ - "\16\2\u009c\u009a\3\2\2\2\u009d\u00a0\3\2\2\2\u009e\u009c\3\2\2\2\u009e"+ - "\u009f\3\2\2\2\u009f\31\3\2\2\2\u00a0\u009e\3\2\2\2\u00a1\u00a2\5\16\b"+ - "\2\u00a2\u00a3\7`\2\2\u00a3\u00a6\3\2\2\2\u00a4\u00a6\7S\2\2\u00a5\u00a1"+ - "\3\2\2\2\u00a5\u00a4\3\2\2\2\u00a6\33\3\2\2\2\u00a7\u00a8\5 \21\2\u00a8"+ - "\u00a9\7\4\2\2\u00a9\35\3\2\2\2\u00aa\u00be\7\13\2\2\u00ab\u00be\7\f\2"+ - "\2\u00ac\u00ad\7\r\2\2\u00ad\u00ae\7\7\2\2\u00ae\u00af\7W\2\2\u00af\u00be"+ - "\7\b\2\2\u00b0\u00b1\7\16\2\2\u00b1\u00b2\7\7\2\2\u00b2\u00b3\7`\2\2\u00b3"+ - "\u00be\7\b\2\2\u00b4\u00be\7\17\2\2\u00b5\u00be\7\20\2\2\u00b6\u00ba\7"+ - "\21\2\2\u00b7\u00b8\7\7\2\2\u00b8\u00b9\7`\2\2\u00b9\u00bb\7\b\2\2\u00ba"+ - "\u00b7\3\2\2\2\u00ba\u00bb\3\2\2\2\u00bb\u00be\3\2\2\2\u00bc\u00be\5 "+ - "\21\2\u00bd\u00aa\3\2\2\2\u00bd\u00ab\3\2\2\2\u00bd\u00ac\3\2\2\2\u00bd"+ - "\u00b0\3\2\2\2\u00bd\u00b4\3\2\2\2\u00bd\u00b5\3\2\2\2\u00bd\u00b6\3\2"+ - "\2\2\u00bd\u00bc\3\2\2\2\u00be\37\3\2\2\2\u00bf\u00c0\7\22\2\2\u00c0\u00c1"+ - "\7\7\2\2\u00c1\u00c6\7W\2\2\u00c2\u00c3\7\5\2\2\u00c3\u00c5\7W\2\2\u00c4"+ - "\u00c2\3\2\2\2\u00c5\u00c8\3\2\2\2\u00c6\u00c4\3\2\2\2\u00c6\u00c7\3\2"+ - "\2\2\u00c7\u00c9\3\2\2\2\u00c8\u00c6\3\2\2\2\u00c9\u00ca\7\b\2\2\u00ca"+ - "!\3\2\2\2\u00cb\u00cd\5$\23\2\u00cc\u00cb\3\2\2\2\u00cd\u00ce\3\2\2\2"+ - "\u00ce\u00cc\3\2\2\2\u00ce\u00cf\3\2\2\2\u00cf#\3\2\2\2\u00d0\u00d1\5"+ - "\20\t\2\u00d1\u00d2\7\4\2\2\u00d2\u011d\3\2\2\2\u00d3\u00d5\7\t\2\2\u00d4"+ - "\u00d6\5\"\22\2\u00d5\u00d4\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6\u00d7\3"+ - "\2\2\2\u00d7\u011d\7\n\2\2\u00d8\u00d9\5\62\32\2\u00d9\u00da\7\4\2\2\u00da"+ - "\u011d\3\2\2\2\u00db\u00dc\7\23\2\2\u00dc\u00dd\7\7\2\2\u00dd\u00de\5"+ - "\62\32\2\u00de\u00df\7\b\2\2\u00df\u00e2\5$\23\2\u00e0\u00e1\7\24\2\2"+ - "\u00e1\u00e3\5$\23\2\u00e2\u00e0\3\2\2\2\u00e2\u00e3\3\2\2\2\u00e3\u011d"+ - "\3\2\2\2\u00e4\u00e6\5\36\20\2\u00e5\u00e4\3\2\2\2\u00e6\u00e9\3\2\2\2"+ - "\u00e7\u00e5\3\2\2\2\u00e7\u00e8\3\2\2\2\u00e8\u00ea\3\2\2\2\u00e9\u00e7"+ - "\3\2\2\2\u00ea\u00eb\7\25\2\2\u00eb\u00ec\7\7\2\2\u00ec\u00ed\5\62\32"+ - "\2\u00ed\u00ee\7\b\2\2\u00ee\u00ef\5$\23\2\u00ef\u011d\3\2\2\2\u00f0\u00f2"+ - "\5\36\20\2\u00f1\u00f0\3\2\2\2\u00f2\u00f5\3\2\2\2\u00f3\u00f1\3\2\2\2"+ - "\u00f3\u00f4\3\2\2\2\u00f4\u00f6\3\2\2\2\u00f5\u00f3\3\2\2\2\u00f6\u00f7"+ - "\7\26\2\2\u00f7\u00f8\5$\23\2\u00f8\u00f9\7\25\2\2\u00f9\u00fa\7\7\2\2"+ - "\u00fa\u00fb\5\62\32\2\u00fb\u00fc\7\b\2\2\u00fc\u00fd\7\4\2\2\u00fd\u011d"+ - "\3\2\2\2\u00fe\u0100\5\36\20\2\u00ff\u00fe\3\2\2\2\u0100\u0103\3\2\2\2"+ - "\u0101\u00ff\3\2\2\2\u0101\u0102\3\2\2\2\u0102\u0104\3\2\2\2\u0103\u0101"+ - "\3\2\2\2\u0104\u0105\7\27\2\2\u0105\u0106\7\7\2\2\u0106\u0107\5&\24\2"+ - "\u0107\u0108\7\b\2\2\u0108\u0109\5$\23\2\u0109\u011d\3\2\2\2\u010a\u010c"+ - "\7\30\2\2\u010b\u010d\5\62\32\2\u010c\u010b\3\2\2\2\u010c\u010d\3\2\2"+ - "\2\u010d\u010e\3\2\2\2\u010e\u011d\7\4\2\2\u010f\u0110\7\31\2\2\u0110"+ - "\u011d\7\4\2\2\u0111\u0112\7\32\2\2\u0112\u011d\7\4\2\2\u0113\u0115\7"+ - "\33\2\2\u0114\u0116\5:\36\2\u0115\u0114\3\2\2\2\u0115\u0116\3\2\2\2\u0116"+ - "\u0117\3\2\2\2\u0117\u0118\7\t\2\2\u0118\u0119\5> \2\u0119\u011a\7\n\2"+ - "\2\u011a\u011d\3\2\2\2\u011b\u011d\58\35\2\u011c\u00d0\3\2\2\2\u011c\u00d3"+ - "\3\2\2\2\u011c\u00d8\3\2\2\2\u011c\u00db\3\2\2\2\u011c\u00e7\3\2\2\2\u011c"+ - "\u00f3\3\2\2\2\u011c\u0101\3\2\2\2\u011c\u010a\3\2\2\2\u011c\u010f\3\2"+ - "\2\2\u011c\u0111\3\2\2\2\u011c\u0113\3\2\2\2\u011c\u011b\3\2\2\2\u011d"+ - "%\3\2\2\2\u011e\u011f\5(\25\2\u011f\u0120\7\4\2\2\u0120\u0121\5\62\32"+ - "\2\u0121\u0123\7\4\2\2\u0122\u0124\5\62\32\2\u0123\u0122\3\2\2\2\u0123"+ - "\u0124\3\2\2\2\u0124\u012f\3\2\2\2\u0125\u0127\5\16\b\2\u0126\u0125\3"+ - "\2\2\2\u0126\u0127\3\2\2\2\u0127\u0128\3\2\2\2\u0128\u0129\7`\2\2\u0129"+ - "\u012a\7\34\2\2\u012a\u012b\5\64\33\2\u012b\u012c\7\35\2\2\u012c\u012d"+ - "\5\64\33\2\u012d\u012f\3\2\2\2\u012e\u011e\3\2\2\2\u012e\u0126\3\2\2\2"+ - "\u012f\'\3\2\2\2\u0130\u0132\5\20\t\2\u0131\u0130\3\2\2\2\u0131\u0132"+ - "\3\2\2\2\u0132\u0135\3\2\2\2\u0133\u0135\5\62\32\2\u0134\u0131\3\2\2\2"+ - "\u0134\u0133\3\2\2\2\u0135)\3\2\2\2\u0136\u0137\b\26\1\2\u0137\u0138\7"+ - "\7\2\2\u0138\u0139\5*\26\2\u0139\u013a\7\b\2\2\u013a\u0143\3\2\2\2\u013b"+ - "\u0143\7S\2\2\u013c\u013e\t\2\2\2\u013d\u013f\7S\2\2\u013e\u013d\3\2\2"+ - "\2\u013e\u013f\3\2\2\2\u013f\u0143\3\2\2\2\u0140\u0143\5.\30\2\u0141\u0143"+ - "\5,\27\2\u0142\u0136\3\2\2\2\u0142\u013b\3\2\2\2\u0142\u013c\3\2\2\2\u0142"+ - "\u0140\3\2\2\2\u0142\u0141\3\2\2\2\u0143\u0151\3\2\2\2\u0144\u0145\f\7"+ - "\2\2\u0145\u0150\7 \2\2\u0146\u0147\f\6\2\2\u0147\u0149\7!\2\2\u0148\u014a"+ - "\5\64\33\2\u0149\u0148\3\2\2\2\u0149\u014a\3\2\2\2\u014a\u014b\3\2\2\2"+ - "\u014b\u0150\7\"\2\2\u014c\u014d\f\5\2\2\u014d\u014e\7\7\2\2\u014e\u0150"+ - "\7\b\2\2\u014f\u0144\3\2\2\2\u014f\u0146\3\2\2\2\u014f\u014c\3\2\2\2\u0150"+ - "\u0153\3\2\2\2\u0151\u014f\3\2\2\2\u0151\u0152\3\2\2\2\u0152+\3\2\2\2"+ - "\u0153\u0151\3\2\2\2\u0154\u0155\7#\2\2\u0155\u0156\7`\2\2\u0156-\3\2"+ - "\2\2\u0157\u0159\7#\2\2\u0158\u015a\7`\2\2\u0159\u0158\3\2\2\2\u0159\u015a"+ - "\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u015d\7\t\2\2\u015c\u015e\5\60\31\2"+ - "\u015d\u015c\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u015d\3\2\2\2\u015f\u0160"+ - "\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0162\7\n\2\2\u0162/\3\2\2\2\u0163"+ - "\u0164\5\20\t\2\u0164\u0165\7\4\2\2\u0165\61\3\2\2\2\u0166\u0167\b\32"+ - "\1\2\u0167\u0168\5\64\33\2\u0168\u016e\3\2\2\2\u0169\u016a\f\3\2\2\u016a"+ - "\u016b\7\5\2\2\u016b\u016d\5\64\33\2\u016c\u0169\3\2\2\2\u016d\u0170\3"+ - "\2\2\2\u016e\u016c\3\2\2\2\u016e\u016f\3\2\2\2\u016f\63\3\2\2\2\u0170"+ - "\u016e\3\2\2\2\u0171\u0172\b\33\1\2\u0172\u0173\7\7\2\2\u0173\u0174\5"+ - "\62\32\2\u0174\u0175\7\b\2\2\u0175\u01a8\3\2\2\2\u0176\u0177\7&\2\2\u0177"+ - "\u017a\7\7\2\2\u0178\u017b\5*\26\2\u0179\u017b\5\64\33\2\u017a\u0178\3"+ - "\2\2\2\u017a\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c\u017d\7\b\2\2\u017d"+ - "\u01a8\3\2\2\2\u017e\u017f\7\'\2\2\u017f\u0182\7\7\2\2\u0180\u0183\5*"+ - "\26\2\u0181\u0183\5\64\33\2\u0182\u0180\3\2\2\2\u0182\u0181\3\2\2\2\u0183"+ - "\u0184\3\2\2\2\u0184\u0185\7\b\2\2\u0185\u01a8\3\2\2\2\u0186\u0187\7\7"+ - "\2\2\u0187\u0188\5*\26\2\u0188\u0189\7\b\2\2\u0189\u018a\5\64\33\32\u018a"+ - "\u01a8\3\2\2\2\u018b\u018c\t\3\2\2\u018c\u01a8\5\64\33\31\u018d\u018e"+ - "\7 \2\2\u018e\u01a8\5\64\33\27\u018f\u0190\t\4\2\2\u0190\u01a8\5\64\33"+ - "\26\u0191\u0192\t\5\2\2\u0192\u01a8\5\64\33\22\u0193\u0194\7\t\2\2\u0194"+ - "\u0199\5\64\33\2\u0195\u0196\7\5\2\2\u0196\u0198\5\64\33\2\u0197\u0195"+ - "\3\2\2\2\u0198\u019b\3\2\2\2\u0199\u0197\3\2\2\2\u0199\u019a\3\2\2\2\u019a"+ - "\u019c\3\2\2\2\u019b\u0199\3\2\2\2\u019c\u019d\7\n\2\2\u019d\u01a8\3\2"+ - "\2\2\u019e\u01a8\7`\2\2\u019f\u01a8\7W\2\2\u01a0\u01a2\7T\2\2\u01a1\u01a0"+ - "\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u01a1\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4"+ - "\u01a8\3\2\2\2\u01a5\u01a8\7U\2\2\u01a6\u01a8\7V\2\2\u01a7\u0171\3\2\2"+ - "\2\u01a7\u0176\3\2\2\2\u01a7\u017e\3\2\2\2\u01a7\u0186\3\2\2\2\u01a7\u018b"+ - "\3\2\2\2\u01a7\u018d\3\2\2\2\u01a7\u018f\3\2\2\2\u01a7\u0191\3\2\2\2\u01a7"+ - "\u0193\3\2\2\2\u01a7\u019e\3\2\2\2\u01a7\u019f\3\2\2\2\u01a7\u01a1\3\2"+ - "\2\2\u01a7\u01a5\3\2\2\2\u01a7\u01a6\3\2\2\2\u01a8\u01e5\3\2\2\2\u01a9"+ - "\u01aa\f\25\2\2\u01aa\u01ab\t\6\2\2\u01ab\u01e4\5\64\33\26\u01ac\u01ad"+ - "\f\24\2\2\u01ad\u01ae\t\7\2\2\u01ae\u01e4\5\64\33\25\u01af\u01b0\f\23"+ - "\2\2\u01b0\u01b1\t\b\2\2\u01b1\u01e4\5\64\33\24\u01b2\u01b3\f\21\2\2\u01b3"+ - "\u01b4\t\t\2\2\u01b4\u01e4\5\64\33\22\u01b5\u01b6\f\20\2\2\u01b6\u01b7"+ - "\7-\2\2\u01b7\u01e4\5\64\33\21\u01b8\u01b9\f\17\2\2\u01b9\u01ba\79\2\2"+ - "\u01ba\u01e4\5\64\33\20\u01bb\u01bc\f\16\2\2\u01bc\u01bd\7:\2\2\u01bd"+ - "\u01e4\5\64\33\17\u01be\u01bf\f\r\2\2\u01bf\u01c0\7;\2\2\u01c0\u01e4\5"+ - "\64\33\16\u01c1\u01c2\f\f\2\2\u01c2\u01c3\7<\2\2\u01c3\u01e4\5\64\33\r"+ - "\u01c4\u01c5\f\13\2\2\u01c5\u01c6\7=\2\2\u01c6\u01c7\5\64\33\2\u01c7\u01c8"+ - "\7\34\2\2\u01c8\u01c9\5\64\33\f\u01c9\u01e4\3\2\2\2\u01ca\u01cb\f\n\2"+ - "\2\u01cb\u01cc\7\6\2\2\u01cc\u01e4\5\64\33\n\u01cd\u01ce\f\t\2\2\u01ce"+ - "\u01cf\t\n\2\2\u01cf\u01e4\5\64\33\t\u01d0\u01d1\f \2\2\u01d1\u01d2\7"+ - "$\2\2\u01d2\u01e4\7`\2\2\u01d3\u01d4\f\37\2\2\u01d4\u01d5\7%\2\2\u01d5"+ - "\u01e4\7`\2\2\u01d6\u01d7\f\36\2\2\u01d7\u01d9\7\7\2\2\u01d8\u01da\5\66"+ - "\34\2\u01d9\u01d8\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\3\2\2\2\u01db"+ - "\u01e4\7\b\2\2\u01dc\u01dd\f\33\2\2\u01dd\u01de\7!\2\2\u01de\u01df\5\62"+ - "\32\2\u01df\u01e0\7\"\2\2\u01e0\u01e4\3\2\2\2\u01e1\u01e2\f\30\2\2\u01e2"+ - "\u01e4\t\3\2\2\u01e3\u01a9\3\2\2\2\u01e3\u01ac\3\2\2\2\u01e3\u01af\3\2"+ - "\2\2\u01e3\u01b2\3\2\2\2\u01e3\u01b5\3\2\2\2\u01e3\u01b8\3\2\2\2\u01e3"+ - "\u01bb\3\2\2\2\u01e3\u01be\3\2\2\2\u01e3\u01c1\3\2\2\2\u01e3\u01c4\3\2"+ - "\2\2\u01e3\u01ca\3\2\2\2\u01e3\u01cd\3\2\2\2\u01e3\u01d0\3\2\2\2\u01e3"+ - "\u01d3\3\2\2\2\u01e3\u01d6\3\2\2\2\u01e3\u01dc\3\2\2\2\u01e3\u01e1\3\2"+ - "\2\2\u01e4\u01e7\3\2\2\2\u01e5\u01e3\3\2\2\2\u01e5\u01e6\3\2\2\2\u01e6"+ - "\65\3\2\2\2\u01e7\u01e5\3\2\2\2\u01e8\u01ed\5\64\33\2\u01e9\u01ea\7\5"+ - "\2\2\u01ea\u01ec\5\64\33\2\u01eb\u01e9\3\2\2\2\u01ec\u01ef\3\2\2\2\u01ed"+ - "\u01eb\3\2\2\2\u01ed\u01ee\3\2\2\2\u01ee\67\3\2\2\2\u01ef\u01ed\3\2\2"+ - "\2\u01f0\u01f2\7H\2\2\u01f1\u01f3\5:\36\2\u01f2\u01f1\3\2\2\2\u01f2\u01f3"+ - "\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f5\7R\2\2\u01f59\3\2\2\2\u01f6\u01f7"+ - "\7\7\2\2\u01f7\u01fc\5<\37\2\u01f8\u01f9\7\5\2\2\u01f9\u01fb\5<\37\2\u01fa"+ - "\u01f8\3\2\2\2\u01fb\u01fe\3\2\2\2\u01fc\u01fa\3\2\2\2\u01fc\u01fd\3\2"+ - "\2\2\u01fd\u01ff\3\2\2\2\u01fe\u01fc\3\2\2\2\u01ff\u0200\7\b\2\2\u0200"+ - ";\3\2\2\2\u0201\u0202\7I\2\2\u0202\u0211\7T\2\2\u0203\u0204\7J\2\2\u0204"+ - "\u0211\7`\2\2\u0205\u0206\7K\2\2\u0206\u0211\7T\2\2\u0207\u0208\7L\2\2"+ - "\u0208\u0211\5\64\33\2\u0209\u020a\7M\2\2\u020a\u0211\5\64\33\2\u020b"+ - "\u020e\7N\2\2\u020c\u020f\7\17\2\2\u020d\u020f\5\64\33\2\u020e\u020c\3"+ - "\2\2\2\u020e\u020d\3\2\2\2\u020f\u0211\3\2\2\2\u0210\u0201\3\2\2\2\u0210"+ - "\u0203\3\2\2\2\u0210\u0205\3\2\2\2\u0210\u0207\3\2\2\2\u0210\u0209\3\2"+ - "\2\2\u0210\u020b\3\2\2\2\u0211=\3\2\2\2\u0212\u0214\5@!\2\u0213\u0212"+ - "\3\2\2\2\u0214\u0217\3\2\2\2\u0215\u0213\3\2\2\2\u0215\u0216\3\2\2\2\u0216"+ - "?\3\2\2\2\u0217\u0215\3\2\2\2\u0218\u021c\5B\"\2\u0219\u021c\5D#\2\u021a"+ - "\u021c\5F$\2\u021b\u0218\3\2\2\2\u021b\u0219\3\2\2\2\u021b\u021a\3\2\2"+ - "\2\u021cA\3\2\2\2\u021d\u021e\7`\2\2\u021e\u0225\7\34\2\2\u021f\u0221"+ - "\7,\2\2\u0220\u0222\7`\2\2\u0221\u0220\3\2\2\2\u0221\u0222\3\2\2\2\u0222"+ - "\u0223\3\2\2\2\u0223\u0225\7\34\2\2\u0224\u021d\3\2\2\2\u0224\u021f\3"+ - "\2\2\2\u0225C\3\2\2\2\u0226\u0228\7Q\2\2\u0227\u0229\5H%\2\u0228\u0227"+ - "\3\2\2\2\u0228\u0229\3\2\2\2\u0229E\3\2\2\2\u022a\u022b\7O\2\2\u022b\u0230"+ - "\5J&\2\u022c\u022d\7\5\2\2\u022d\u022f\5J&\2\u022e\u022c\3\2\2\2\u022f"+ - "\u0232\3\2\2\2\u0230\u022e\3\2\2\2\u0230\u0231\3\2\2\2\u0231G\3\2\2\2"+ - "\u0232\u0230\3\2\2\2\u0233\u024b\5J&\2\u0234\u0235\7P\2\2\u0235\u024b"+ - "\5J&\2\u0236\u0237\5J&\2\u0237\u0238\7\5\2\2\u0238\u0239\7`\2\2\u0239"+ - "\u024b\3\2\2\2\u023a\u023b\7\7\2\2\u023b\u023c\5J&\2\u023c\u023d\7\b\2"+ - "\2\u023d\u023e\7\5\2\2\u023e\u023f\7`\2\2\u023f\u024b\3\2\2\2\u0240\u0241"+ - "\7\7\2\2\u0241\u0242\5J&\2\u0242\u0243\7\5\2\2\u0243\u0244\7`\2\2\u0244"+ - "\u0245\7\b\2\2\u0245\u024b\3\2\2\2\u0246\u0247\7\7\2\2\u0247\u0248\5J"+ - "&\2\u0248\u0249\7\b\2\2\u0249\u024b\3\2\2\2\u024a\u0233\3\2\2\2\u024a"+ - "\u0234\3\2\2\2\u024a\u0236\3\2\2\2\u024a\u023a\3\2\2\2\u024a\u0240\3\2"+ - "\2\2\u024a\u0246\3\2\2\2\u024bI\3\2\2\2\u024c\u024d\b&\1\2\u024d\u024e"+ - "\7!\2\2\u024e\u024f\5J&\2\u024f\u0250\7\"\2\2\u0250\u025b\3\2\2\2\u0251"+ - "\u0252\t\13\2\2\u0252\u025b\5J&\n\u0253\u025b\7`\2\2\u0254\u025b\7a\2"+ - "\2\u0255\u0256\7\t\2\2\u0256\u0257\7`\2\2\u0257\u025b\7\n\2\2\u0258\u025b"+ - "\7W\2\2\u0259\u025b\7U\2\2\u025a\u024c\3\2\2\2\u025a\u0251\3\2\2\2\u025a"+ - "\u0253\3\2\2\2\u025a\u0254\3\2\2\2\u025a\u0255\3\2\2\2\u025a\u0258\3\2"+ - "\2\2\u025a\u0259\3\2\2\2\u025b\u026a\3\2\2\2\u025c\u025d\f\f\2\2\u025d"+ - "\u025e\7$\2\2\u025e\u0269\5J&\r\u025f\u0260\f\13\2\2\u0260\u0261\t\6\2"+ - "\2\u0261\u0269\5J&\f\u0262\u0263\f\t\2\2\u0263\u0264\t\f\2\2\u0264\u0269"+ - "\5J&\n\u0265\u0266\f\b\2\2\u0266\u0267\t\b\2\2\u0267\u0269\5J&\t\u0268"+ - "\u025c\3\2\2\2\u0268\u025f\3\2\2\2\u0268\u0262\3\2\2\2\u0268\u0265\3\2"+ - "\2\2\u0269\u026c\3\2\2\2\u026a\u0268\3\2\2\2\u026a\u026b\3\2\2\2\u026b"+ - "K\3\2\2\2\u026c\u026a\3\2\2\2=V_jov\u0084\u008a\u0090\u0095\u009e\u00a5"+ - "\u00ba\u00bd\u00c6\u00ce\u00d5\u00e2\u00e7\u00f3\u0101\u010c\u0115\u011c"+ - "\u0123\u0126\u012e\u0131\u0134\u013e\u0142\u0149\u014f\u0151\u0159\u015f"+ - "\u016e\u017a\u0182\u0199\u01a3\u01a7\u01d9\u01e3\u01e5\u01ed\u01f2\u01fc"+ - "\u020e\u0210\u0215\u021b\u0221\u0224\u0228\u0230\u024a\u025a\u0268\u026a"; + "\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\3\33\5\33\u01e0\n\33\3\33\3\33"+ + "\3\33\3\33\3\33\3\33\3\33\3\33\7\33\u01ea\n\33\f\33\16\33\u01ed\13\33"+ + "\3\34\3\34\3\34\7\34\u01f2\n\34\f\34\16\34\u01f5\13\34\3\35\3\35\5\35"+ + "\u01f9\n\35\3\35\3\35\3\36\3\36\3\36\3\36\7\36\u0201\n\36\f\36\16\36\u0204"+ + "\13\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37\3\37"+ + "\3\37\3\37\5\37\u0215\n\37\5\37\u0217\n\37\3 \7 \u021a\n \f \16 \u021d"+ + "\13 \3!\3!\3!\5!\u0222\n!\3\"\3\"\3\"\3\"\5\"\u0228\n\"\3\"\5\"\u022b"+ + "\n\"\3#\3#\5#\u022f\n#\3$\3$\3$\3$\7$\u0235\n$\f$\16$\u0238\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%\u0251"+ + "\n%\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\3&\5&\u0261\n&\3&\3&\3&\3&"+ + "\3&\3&\3&\3&\3&\3&\3&\3&\7&\u026f\n&\f&\16&\u0272\13&\3&\2\7\22*\62\64"+ + "J\'\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@B"+ + "DFHJ\2\r\3\2 !\3\2*+\3\2,\60\3\2\65\66\3\2\61\62\4\2\"\"\63\64\3\2,-\3"+ + "\2\65:\3\2@I\4\2,-\65\66\4\2\"\"\63\63\2\u02cc\2L\3\2\2\2\4P\3\2\2\2\6"+ + "V\3\2\2\2\bY\3\2\2\2\n]\3\2\2\2\fj\3\2\2\2\16o\3\2\2\2\20y\3\2\2\2\22"+ + "|\3\2\2\2\24\u0087\3\2\2\2\26\u008c\3\2\2\2\30\u0099\3\2\2\2\32\u00a5"+ + "\3\2\2\2\34\u00ae\3\2\2\2\36\u00c3\3\2\2\2 \u00c5\3\2\2\2\"\u00d2\3\2"+ + "\2\2$\u0122\3\2\2\2&\u0134\3\2\2\2(\u013a\3\2\2\2*\u0148\3\2\2\2,\u015a"+ + "\3\2\2\2.\u015d\3\2\2\2\60\u0169\3\2\2\2\62\u016c\3\2\2\2\64\u01ad\3\2"+ + "\2\2\66\u01ee\3\2\2\28\u01f6\3\2\2\2:\u01fc\3\2\2\2<\u0216\3\2\2\2>\u021b"+ + "\3\2\2\2@\u0221\3\2\2\2B\u022a\3\2\2\2D\u022c\3\2\2\2F\u0230\3\2\2\2H"+ + "\u0250\3\2\2\2J\u0260\3\2\2\2LM\5\6\4\2MN\5\n\6\2NO\7\2\2\3O\3\3\2\2\2"+ + "PQ\5> \2QR\7\2\2\3R\5\3\2\2\2SU\5\b\5\2TS\3\2\2\2UX\3\2\2\2VT\3\2\2\2"+ + "VW\3\2\2\2W\7\3\2\2\2XV\3\2\2\2YZ\7\3\2\2Z[\7T\2\2[\t\3\2\2\2\\^\5\f\7"+ + "\2]\\\3\2\2\2^_\3\2\2\2_]\3\2\2\2_`\3\2\2\2`\13\3\2\2\2ab\5\20\t\2bc\7"+ + "\4\2\2ck\3\2\2\2de\5.\30\2ef\7\4\2\2fk\3\2\2\2gk\5\26\f\2hk\58\35\2ik"+ + "\5\34\17\2ja\3\2\2\2jd\3\2\2\2jg\3\2\2\2jh\3\2\2\2ji\3\2\2\2k\r\3\2\2"+ + "\2ln\5\36\20\2ml\3\2\2\2nq\3\2\2\2om\3\2\2\2op\3\2\2\2pr\3\2\2\2qo\3\2"+ + "\2\2rv\5*\26\2su\5\36\20\2ts\3\2\2\2ux\3\2\2\2vt\3\2\2\2vw\3\2\2\2w\17"+ + "\3\2\2\2xv\3\2\2\2yz\5\16\b\2z{\5\22\n\2{\21\3\2\2\2|}\b\n\1\2}~\5\24"+ + "\13\2~\u0084\3\2\2\2\177\u0080\f\3\2\2\u0080\u0081\7\5\2\2\u0081\u0083"+ + "\5\24\13\2\u0082\177\3\2\2\2\u0083\u0086\3\2\2\2\u0084\u0082\3\2\2\2\u0084"+ + "\u0085\3\2\2\2\u0085\23\3\2\2\2\u0086\u0084\3\2\2\2\u0087\u008a\7`\2\2"+ + "\u0088\u0089\7\6\2\2\u0089\u008b\5\64\33\2\u008a\u0088\3\2\2\2\u008a\u008b"+ + "\3\2\2\2\u008b\25\3\2\2\2\u008c\u008d\5\16\b\2\u008d\u008e\7`\2\2\u008e"+ + "\u0090\7\7\2\2\u008f\u0091\5\30\r\2\u0090\u008f\3\2\2\2\u0090\u0091\3"+ + "\2\2\2\u0091\u0092\3\2\2\2\u0092\u0093\7\b\2\2\u0093\u0095\7\t\2\2\u0094"+ + "\u0096\5\"\22\2\u0095\u0094\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0097\3"+ + "\2\2\2\u0097\u0098\7\n\2\2\u0098\27\3\2\2\2\u0099\u009e\5\32\16\2\u009a"+ + "\u009b\7\5\2\2\u009b\u009d\5\32\16\2\u009c\u009a\3\2\2\2\u009d\u00a0\3"+ + "\2\2\2\u009e\u009c\3\2\2\2\u009e\u009f\3\2\2\2\u009f\31\3\2\2\2\u00a0"+ + "\u009e\3\2\2\2\u00a1\u00a2\5\16\b\2\u00a2\u00a3\7`\2\2\u00a3\u00a6\3\2"+ + "\2\2\u00a4\u00a6\7S\2\2\u00a5\u00a1\3\2\2\2\u00a5\u00a4\3\2\2\2\u00a6"+ + "\33\3\2\2\2\u00a7\u00a8\7\13\2\2\u00a8\u00af\5 \21\2\u00a9\u00aa\7\13"+ + "\2\2\u00aa\u00ab\7\f\2\2\u00ab\u00ac\7\7\2\2\u00ac\u00ad\7W\2\2\u00ad"+ + "\u00af\7\b\2\2\u00ae\u00a7\3\2\2\2\u00ae\u00a9\3\2\2\2\u00af\35\3\2\2"+ + "\2\u00b0\u00c4\7\r\2\2\u00b1\u00c4\7\16\2\2\u00b2\u00b3\7\17\2\2\u00b3"+ + "\u00b4\7\7\2\2\u00b4\u00b5\7W\2\2\u00b5\u00c4\7\b\2\2\u00b6\u00b7\7\20"+ + "\2\2\u00b7\u00b8\7\7\2\2\u00b8\u00b9\7`\2\2\u00b9\u00c4\7\b\2\2\u00ba"+ + "\u00c4\7\21\2\2\u00bb\u00c4\7\22\2\2\u00bc\u00c0\7\23\2\2\u00bd\u00be"+ + "\7\7\2\2\u00be\u00bf\7`\2\2\u00bf\u00c1\7\b\2\2\u00c0\u00bd\3\2\2\2\u00c0"+ + "\u00c1\3\2\2\2\u00c1\u00c4\3\2\2\2\u00c2\u00c4\5 \21\2\u00c3\u00b0\3\2"+ + "\2\2\u00c3\u00b1\3\2\2\2\u00c3\u00b2\3\2\2\2\u00c3\u00b6\3\2\2\2\u00c3"+ + "\u00ba\3\2\2\2\u00c3\u00bb\3\2\2\2\u00c3\u00bc\3\2\2\2\u00c3\u00c2\3\2"+ + "\2\2\u00c4\37\3\2\2\2\u00c5\u00c6\7\24\2\2\u00c6\u00c7\7\7\2\2\u00c7\u00cc"+ + "\7W\2\2\u00c8\u00c9\7\5\2\2\u00c9\u00cb\7W\2\2\u00ca\u00c8\3\2\2\2\u00cb"+ + "\u00ce\3\2\2\2\u00cc\u00ca\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00cf\3\2"+ + "\2\2\u00ce\u00cc\3\2\2\2\u00cf\u00d0\7\b\2\2\u00d0!\3\2\2\2\u00d1\u00d3"+ + "\5$\23\2\u00d2\u00d1\3\2\2\2\u00d3\u00d4\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d4"+ + "\u00d5\3\2\2\2\u00d5#\3\2\2\2\u00d6\u00d7\5\20\t\2\u00d7\u00d8\7\4\2\2"+ + "\u00d8\u0123\3\2\2\2\u00d9\u00db\7\t\2\2\u00da\u00dc\5\"\22\2\u00db\u00da"+ + "\3\2\2\2\u00db\u00dc\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u0123\7\n\2\2\u00de"+ + "\u00df\5\62\32\2\u00df\u00e0\7\4\2\2\u00e0\u0123\3\2\2\2\u00e1\u00e2\7"+ + "\25\2\2\u00e2\u00e3\7\7\2\2\u00e3\u00e4\5\62\32\2\u00e4\u00e5\7\b\2\2"+ + "\u00e5\u00e8\5$\23\2\u00e6\u00e7\7\26\2\2\u00e7\u00e9\5$\23\2\u00e8\u00e6"+ + "\3\2\2\2\u00e8\u00e9\3\2\2\2\u00e9\u0123\3\2\2\2\u00ea\u00ec\5\36\20\2"+ + "\u00eb\u00ea\3\2\2\2\u00ec\u00ef\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ed\u00ee"+ + "\3\2\2\2\u00ee\u00f0\3\2\2\2\u00ef\u00ed\3\2\2\2\u00f0\u00f1\7\27\2\2"+ + "\u00f1\u00f2\7\7\2\2\u00f2\u00f3\5\62\32\2\u00f3\u00f4\7\b\2\2\u00f4\u00f5"+ + "\5$\23\2\u00f5\u0123\3\2\2\2\u00f6\u00f8\5\36\20\2\u00f7\u00f6\3\2\2\2"+ + "\u00f8\u00fb\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fc"+ + "\3\2\2\2\u00fb\u00f9\3\2\2\2\u00fc\u00fd\7\30\2\2\u00fd\u00fe\5$\23\2"+ + "\u00fe\u00ff\7\27\2\2\u00ff\u0100\7\7\2\2\u0100\u0101\5\62\32\2\u0101"+ + "\u0102\7\b\2\2\u0102\u0103\7\4\2\2\u0103\u0123\3\2\2\2\u0104\u0106\5\36"+ + "\20\2\u0105\u0104\3\2\2\2\u0106\u0109\3\2\2\2\u0107\u0105\3\2\2\2\u0107"+ + "\u0108\3\2\2\2\u0108\u010a\3\2\2\2\u0109\u0107\3\2\2\2\u010a\u010b\7\31"+ + "\2\2\u010b\u010c\7\7\2\2\u010c\u010d\5&\24\2\u010d\u010e\7\b\2\2\u010e"+ + "\u010f\5$\23\2\u010f\u0123\3\2\2\2\u0110\u0112\7\32\2\2\u0111\u0113\5"+ + "\62\32\2\u0112\u0111\3\2\2\2\u0112\u0113\3\2\2\2\u0113\u0114\3\2\2\2\u0114"+ + "\u0123\7\4\2\2\u0115\u0116\7\33\2\2\u0116\u0123\7\4\2\2\u0117\u0118\7"+ + "\34\2\2\u0118\u0123\7\4\2\2\u0119\u011b\7\35\2\2\u011a\u011c\5:\36\2\u011b"+ + "\u011a\3\2\2\2\u011b\u011c\3\2\2\2\u011c\u011d\3\2\2\2\u011d\u011e\7\t"+ + "\2\2\u011e\u011f\5> \2\u011f\u0120\7\n\2\2\u0120\u0123\3\2\2\2\u0121\u0123"+ + "\58\35\2\u0122\u00d6\3\2\2\2\u0122\u00d9\3\2\2\2\u0122\u00de\3\2\2\2\u0122"+ + "\u00e1\3\2\2\2\u0122\u00ed\3\2\2\2\u0122\u00f9\3\2\2\2\u0122\u0107\3\2"+ + "\2\2\u0122\u0110\3\2\2\2\u0122\u0115\3\2\2\2\u0122\u0117\3\2\2\2\u0122"+ + "\u0119\3\2\2\2\u0122\u0121\3\2\2\2\u0123%\3\2\2\2\u0124\u0125\5(\25\2"+ + "\u0125\u0126\7\4\2\2\u0126\u0127\5\62\32\2\u0127\u0129\7\4\2\2\u0128\u012a"+ + "\5\62\32\2\u0129\u0128\3\2\2\2\u0129\u012a\3\2\2\2\u012a\u0135\3\2\2\2"+ + "\u012b\u012d\5\16\b\2\u012c\u012b\3\2\2\2\u012c\u012d\3\2\2\2\u012d\u012e"+ + "\3\2\2\2\u012e\u012f\7`\2\2\u012f\u0130\7\36\2\2\u0130\u0131\5\64\33\2"+ + "\u0131\u0132\7\37\2\2\u0132\u0133\5\64\33\2\u0133\u0135\3\2\2\2\u0134"+ + "\u0124\3\2\2\2\u0134\u012c\3\2\2\2\u0135\'\3\2\2\2\u0136\u0138\5\20\t"+ + "\2\u0137\u0136\3\2\2\2\u0137\u0138\3\2\2\2\u0138\u013b\3\2\2\2\u0139\u013b"+ + "\5\62\32\2\u013a\u0137\3\2\2\2\u013a\u0139\3\2\2\2\u013b)\3\2\2\2\u013c"+ + "\u013d\b\26\1\2\u013d\u013e\7\7\2\2\u013e\u013f\5*\26\2\u013f\u0140\7"+ + "\b\2\2\u0140\u0149\3\2\2\2\u0141\u0149\7S\2\2\u0142\u0144\t\2\2\2\u0143"+ + "\u0145\7S\2\2\u0144\u0143\3\2\2\2\u0144\u0145\3\2\2\2\u0145\u0149\3\2"+ + "\2\2\u0146\u0149\5.\30\2\u0147\u0149\5,\27\2\u0148\u013c\3\2\2\2\u0148"+ + "\u0141\3\2\2\2\u0148\u0142\3\2\2\2\u0148\u0146\3\2\2\2\u0148\u0147\3\2"+ + "\2\2\u0149\u0157\3\2\2\2\u014a\u014b\f\7\2\2\u014b\u0156\7\"\2\2\u014c"+ + "\u014d\f\6\2\2\u014d\u014f\7#\2\2\u014e\u0150\5\64\33\2\u014f\u014e\3"+ + "\2\2\2\u014f\u0150\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0156\7$\2\2\u0152"+ + "\u0153\f\5\2\2\u0153\u0154\7\7\2\2\u0154\u0156\7\b\2\2\u0155\u014a\3\2"+ + "\2\2\u0155\u014c\3\2\2\2\u0155\u0152\3\2\2\2\u0156\u0159\3\2\2\2\u0157"+ + "\u0155\3\2\2\2\u0157\u0158\3\2\2\2\u0158+\3\2\2\2\u0159\u0157\3\2\2\2"+ + "\u015a\u015b\7%\2\2\u015b\u015c\7`\2\2\u015c-\3\2\2\2\u015d\u015f\7%\2"+ + "\2\u015e\u0160\7`\2\2\u015f\u015e\3\2\2\2\u015f\u0160\3\2\2\2\u0160\u0161"+ + "\3\2\2\2\u0161\u0163\7\t\2\2\u0162\u0164\5\60\31\2\u0163\u0162\3\2\2\2"+ + "\u0164\u0165\3\2\2\2\u0165\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0167"+ + "\3\2\2\2\u0167\u0168\7\n\2\2\u0168/\3\2\2\2\u0169\u016a\5\20\t\2\u016a"+ + "\u016b\7\4\2\2\u016b\61\3\2\2\2\u016c\u016d\b\32\1\2\u016d\u016e\5\64"+ + "\33\2\u016e\u0174\3\2\2\2\u016f\u0170\f\3\2\2\u0170\u0171\7\5\2\2\u0171"+ + "\u0173\5\64\33\2\u0172\u016f\3\2\2\2\u0173\u0176\3\2\2\2\u0174\u0172\3"+ + "\2\2\2\u0174\u0175\3\2\2\2\u0175\63\3\2\2\2\u0176\u0174\3\2\2\2\u0177"+ + "\u0178\b\33\1\2\u0178\u0179\7\7\2\2\u0179\u017a\5\62\32\2\u017a\u017b"+ + "\7\b\2\2\u017b\u01ae\3\2\2\2\u017c\u017d\7(\2\2\u017d\u0180\7\7\2\2\u017e"+ + "\u0181\5*\26\2\u017f\u0181\5\64\33\2\u0180\u017e\3\2\2\2\u0180\u017f\3"+ + "\2\2\2\u0181\u0182\3\2\2\2\u0182\u0183\7\b\2\2\u0183\u01ae\3\2\2\2\u0184"+ + "\u0185\7)\2\2\u0185\u0188\7\7\2\2\u0186\u0189\5*\26\2\u0187\u0189\5\64"+ + "\33\2\u0188\u0186\3\2\2\2\u0188\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a"+ + "\u018b\7\b\2\2\u018b\u01ae\3\2\2\2\u018c\u018d\7\7\2\2\u018d\u018e\5*"+ + "\26\2\u018e\u018f\7\b\2\2\u018f\u0190\5\64\33\32\u0190\u01ae\3\2\2\2\u0191"+ + "\u0192\t\3\2\2\u0192\u01ae\5\64\33\31\u0193\u0194\7\"\2\2\u0194\u01ae"+ + "\5\64\33\27\u0195\u0196\t\4\2\2\u0196\u01ae\5\64\33\26\u0197\u0198\t\5"+ + "\2\2\u0198\u01ae\5\64\33\22\u0199\u019a\7\t\2\2\u019a\u019f\5\64\33\2"+ + "\u019b\u019c\7\5\2\2\u019c\u019e\5\64\33\2\u019d\u019b\3\2\2\2\u019e\u01a1"+ + "\3\2\2\2\u019f\u019d\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a2\3\2\2\2\u01a1"+ + "\u019f\3\2\2\2\u01a2\u01a3\7\n\2\2\u01a3\u01ae\3\2\2\2\u01a4\u01ae\7`"+ + "\2\2\u01a5\u01ae\7W\2\2\u01a6\u01a8\7T\2\2\u01a7\u01a6\3\2\2\2\u01a8\u01a9"+ + "\3\2\2\2\u01a9\u01a7\3\2\2\2\u01a9\u01aa\3\2\2\2\u01aa\u01ae\3\2\2\2\u01ab"+ + "\u01ae\7U\2\2\u01ac\u01ae\7V\2\2\u01ad\u0177\3\2\2\2\u01ad\u017c\3\2\2"+ + "\2\u01ad\u0184\3\2\2\2\u01ad\u018c\3\2\2\2\u01ad\u0191\3\2\2\2\u01ad\u0193"+ + "\3\2\2\2\u01ad\u0195\3\2\2\2\u01ad\u0197\3\2\2\2\u01ad\u0199\3\2\2\2\u01ad"+ + "\u01a4\3\2\2\2\u01ad\u01a5\3\2\2\2\u01ad\u01a7\3\2\2\2\u01ad\u01ab\3\2"+ + "\2\2\u01ad\u01ac\3\2\2\2\u01ae\u01eb\3\2\2\2\u01af\u01b0\f\25\2\2\u01b0"+ + "\u01b1\t\6\2\2\u01b1\u01ea\5\64\33\26\u01b2\u01b3\f\24\2\2\u01b3\u01b4"+ + "\t\7\2\2\u01b4\u01ea\5\64\33\25\u01b5\u01b6\f\23\2\2\u01b6\u01b7\t\b\2"+ + "\2\u01b7\u01ea\5\64\33\24\u01b8\u01b9\f\21\2\2\u01b9\u01ba\t\t\2\2\u01ba"+ + "\u01ea\5\64\33\22\u01bb\u01bc\f\20\2\2\u01bc\u01bd\7/\2\2\u01bd\u01ea"+ + "\5\64\33\21\u01be\u01bf\f\17\2\2\u01bf\u01c0\7;\2\2\u01c0\u01ea\5\64\33"+ + "\20\u01c1\u01c2\f\16\2\2\u01c2\u01c3\7<\2\2\u01c3\u01ea\5\64\33\17\u01c4"+ + "\u01c5\f\r\2\2\u01c5\u01c6\7=\2\2\u01c6\u01ea\5\64\33\16\u01c7\u01c8\f"+ + "\f\2\2\u01c8\u01c9\7>\2\2\u01c9\u01ea\5\64\33\r\u01ca\u01cb\f\13\2\2\u01cb"+ + "\u01cc\7?\2\2\u01cc\u01cd\5\64\33\2\u01cd\u01ce\7\36\2\2\u01ce\u01cf\5"+ + "\64\33\f\u01cf\u01ea\3\2\2\2\u01d0\u01d1\f\n\2\2\u01d1\u01d2\7\6\2\2\u01d2"+ + "\u01ea\5\64\33\n\u01d3\u01d4\f\t\2\2\u01d4\u01d5\t\n\2\2\u01d5\u01ea\5"+ + "\64\33\t\u01d6\u01d7\f \2\2\u01d7\u01d8\7&\2\2\u01d8\u01ea\7`\2\2\u01d9"+ + "\u01da\f\37\2\2\u01da\u01db\7\'\2\2\u01db\u01ea\7`\2\2\u01dc\u01dd\f\36"+ + "\2\2\u01dd\u01df\7\7\2\2\u01de\u01e0\5\66\34\2\u01df\u01de\3\2\2\2\u01df"+ + "\u01e0\3\2\2\2\u01e0\u01e1\3\2\2\2\u01e1\u01ea\7\b\2\2\u01e2\u01e3\f\33"+ + "\2\2\u01e3\u01e4\7#\2\2\u01e4\u01e5\5\62\32\2\u01e5\u01e6\7$\2\2\u01e6"+ + "\u01ea\3\2\2\2\u01e7\u01e8\f\30\2\2\u01e8\u01ea\t\3\2\2\u01e9\u01af\3"+ + "\2\2\2\u01e9\u01b2\3\2\2\2\u01e9\u01b5\3\2\2\2\u01e9\u01b8\3\2\2\2\u01e9"+ + "\u01bb\3\2\2\2\u01e9\u01be\3\2\2\2\u01e9\u01c1\3\2\2\2\u01e9\u01c4\3\2"+ + "\2\2\u01e9\u01c7\3\2\2\2\u01e9\u01ca\3\2\2\2\u01e9\u01d0\3\2\2\2\u01e9"+ + "\u01d3\3\2\2\2\u01e9\u01d6\3\2\2\2\u01e9\u01d9\3\2\2\2\u01e9\u01dc\3\2"+ + "\2\2\u01e9\u01e2\3\2\2\2\u01e9\u01e7\3\2\2\2\u01ea\u01ed\3\2\2\2\u01eb"+ + "\u01e9\3\2\2\2\u01eb\u01ec\3\2\2\2\u01ec\65\3\2\2\2\u01ed\u01eb\3\2\2"+ + "\2\u01ee\u01f3\5\64\33\2\u01ef\u01f0\7\5\2\2\u01f0\u01f2\5\64\33\2\u01f1"+ + "\u01ef\3\2\2\2\u01f2\u01f5\3\2\2\2\u01f3\u01f1\3\2\2\2\u01f3\u01f4\3\2"+ + "\2\2\u01f4\67\3\2\2\2\u01f5\u01f3\3\2\2\2\u01f6\u01f8\7J\2\2\u01f7\u01f9"+ + "\5:\36\2\u01f8\u01f7\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa"+ + "\u01fb\7R\2\2\u01fb9\3\2\2\2\u01fc\u01fd\7\7\2\2\u01fd\u0202\5<\37\2\u01fe"+ + "\u01ff\7\5\2\2\u01ff\u0201\5<\37\2\u0200\u01fe\3\2\2\2\u0201\u0204\3\2"+ + "\2\2\u0202\u0200\3\2\2\2\u0202\u0203\3\2\2\2\u0203\u0205\3\2\2\2\u0204"+ + "\u0202\3\2\2\2\u0205\u0206\7\b\2\2\u0206;\3\2\2\2\u0207\u0208\7K\2\2\u0208"+ + "\u0217\7T\2\2\u0209\u020a\7L\2\2\u020a\u0217\7`\2\2\u020b\u020c\7M\2\2"+ + "\u020c\u0217\7T\2\2\u020d\u020e\7N\2\2\u020e\u0217\5\64\33\2\u020f\u0210"+ + "\7O\2\2\u0210\u0217\5\64\33\2\u0211\u0214\7\f\2\2\u0212\u0215\7\21\2\2"+ + "\u0213\u0215\5\64\33\2\u0214\u0212\3\2\2\2\u0214\u0213\3\2\2\2\u0215\u0217"+ + "\3\2\2\2\u0216\u0207\3\2\2\2\u0216\u0209\3\2\2\2\u0216\u020b\3\2\2\2\u0216"+ + "\u020d\3\2\2\2\u0216\u020f\3\2\2\2\u0216\u0211\3\2\2\2\u0217=\3\2\2\2"+ + "\u0218\u021a\5@!\2\u0219\u0218\3\2\2\2\u021a\u021d\3\2\2\2\u021b\u0219"+ + "\3\2\2\2\u021b\u021c\3\2\2\2\u021c?\3\2\2\2\u021d\u021b\3\2\2\2\u021e"+ + "\u0222\5B\"\2\u021f\u0222\5D#\2\u0220\u0222\5F$\2\u0221\u021e\3\2\2\2"+ + "\u0221\u021f\3\2\2\2\u0221\u0220\3\2\2\2\u0222A\3\2\2\2\u0223\u0224\7"+ + "`\2\2\u0224\u022b\7\36\2\2\u0225\u0227\7.\2\2\u0226\u0228\7`\2\2\u0227"+ + "\u0226\3\2\2\2\u0227\u0228\3\2\2\2\u0228\u0229\3\2\2\2\u0229\u022b\7\36"+ + "\2\2\u022a\u0223\3\2\2\2\u022a\u0225\3\2\2\2\u022bC\3\2\2\2\u022c\u022e"+ + "\7Q\2\2\u022d\u022f\5H%\2\u022e\u022d\3\2\2\2\u022e\u022f\3\2\2\2\u022f"+ + "E\3\2\2\2\u0230\u0231\7P\2\2\u0231\u0236\5J&\2\u0232\u0233\7\5\2\2\u0233"+ + "\u0235\5J&\2\u0234\u0232\3\2\2\2\u0235\u0238\3\2\2\2\u0236\u0234\3\2\2"+ + "\2\u0236\u0237\3\2\2\2\u0237G\3\2\2\2\u0238\u0236\3\2\2\2\u0239\u0251"+ + "\5J&\2\u023a\u023b\7\13\2\2\u023b\u0251\5J&\2\u023c\u023d\5J&\2\u023d"+ + "\u023e\7\5\2\2\u023e\u023f\7`\2\2\u023f\u0251\3\2\2\2\u0240\u0241\7\7"+ + "\2\2\u0241\u0242\5J&\2\u0242\u0243\7\b\2\2\u0243\u0244\7\5\2\2\u0244\u0245"+ + "\7`\2\2\u0245\u0251\3\2\2\2\u0246\u0247\7\7\2\2\u0247\u0248\5J&\2\u0248"+ + "\u0249\7\5\2\2\u0249\u024a\7`\2\2\u024a\u024b\7\b\2\2\u024b\u0251\3\2"+ + "\2\2\u024c\u024d\7\7\2\2\u024d\u024e\5J&\2\u024e\u024f\7\b\2\2\u024f\u0251"+ + "\3\2\2\2\u0250\u0239\3\2\2\2\u0250\u023a\3\2\2\2\u0250\u023c\3\2\2\2\u0250"+ + "\u0240\3\2\2\2\u0250\u0246\3\2\2\2\u0250\u024c\3\2\2\2\u0251I\3\2\2\2"+ + "\u0252\u0253\b&\1\2\u0253\u0254\7#\2\2\u0254\u0255\5J&\2\u0255\u0256\7"+ + "$\2\2\u0256\u0261\3\2\2\2\u0257\u0258\t\13\2\2\u0258\u0261\5J&\n\u0259"+ + "\u0261\7`\2\2\u025a\u0261\7a\2\2\u025b\u025c\7\t\2\2\u025c\u025d\7`\2"+ + "\2\u025d\u0261\7\n\2\2\u025e\u0261\7W\2\2\u025f\u0261\7U\2\2\u0260\u0252"+ + "\3\2\2\2\u0260\u0257\3\2\2\2\u0260\u0259\3\2\2\2\u0260\u025a\3\2\2\2\u0260"+ + "\u025b\3\2\2\2\u0260\u025e\3\2\2\2\u0260\u025f\3\2\2\2\u0261\u0270\3\2"+ + "\2\2\u0262\u0263\f\f\2\2\u0263\u0264\7&\2\2\u0264\u026f\5J&\r\u0265\u0266"+ + "\f\13\2\2\u0266\u0267\t\6\2\2\u0267\u026f\5J&\f\u0268\u0269\f\t\2\2\u0269"+ + "\u026a\t\f\2\2\u026a\u026f\5J&\n\u026b\u026c\f\b\2\2\u026c\u026d\t\b\2"+ + "\2\u026d\u026f\5J&\t\u026e\u0262\3\2\2\2\u026e\u0265\3\2\2\2\u026e\u0268"+ + "\3\2\2\2\u026e\u026b\3\2\2\2\u026f\u0272\3\2\2\2\u0270\u026e\3\2\2\2\u0270"+ + "\u0271\3\2\2\2\u0271K\3\2\2\2\u0272\u0270\3\2\2\2>V_jov\u0084\u008a\u0090"+ + "\u0095\u009e\u00a5\u00ae\u00c0\u00c3\u00cc\u00d4\u00db\u00e8\u00ed\u00f9"+ + "\u0107\u0112\u011b\u0122\u0129\u012c\u0134\u0137\u013a\u0144\u0148\u014f"+ + "\u0155\u0157\u015f\u0165\u0174\u0180\u0188\u019f\u01a9\u01ad\u01df\u01e9"+ + "\u01eb\u01f3\u01f8\u0202\u0214\u0216\u021b\u0221\u0227\u022a\u022e\u0236"+ + "\u0250\u0260\u026e\u0270"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java index 0731b49ae..6f48fa39d 100644 --- a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java +++ b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java @@ -1,4 +1,4 @@ -// Generated from C:/c64/kickc/src/main/java/dk/camelot64/kickc/parser\KickC.g4 by ANTLR 4.7 +// Generated from /Users/jespergravgaard/c64/kickc/src/main/java/dk/camelot64/kickc/parser/KickC.g4 by ANTLR 4.7 package dk.camelot64.kickc.parser; import org.antlr.v4.runtime.tree.ParseTreeVisitor; @@ -97,11 +97,19 @@ public interface KickCVisitor extends ParseTreeVisitor { */ T visitParameterDeclVoid(KickCParser.ParameterDeclVoidContext ctx); /** - * Visit a parse tree produced by {@link KickCParser#globalDirective}. + * Visit a parse tree produced by the {@code globalDirectiveReserve} + * labeled alternative in {@link KickCParser#globalDirective}. * @param ctx the parse tree * @return the visitor result */ - T visitGlobalDirective(KickCParser.GlobalDirectiveContext ctx); + T visitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx); + /** + * Visit a parse tree produced by the {@code globalDirectivePc} + * labeled alternative in {@link KickCParser#globalDirective}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx); /** * Visit a parse tree produced by the {@code directiveConst} * 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 f25f31473..bde4e38e6 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java @@ -112,14 +112,23 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { } @Override - public Object visitGlobalDirective(KickCParser.GlobalDirectiveContext ctx) { + public Object visitGlobalDirectiveReserve(KickCParser.GlobalDirectiveReserveContext ctx) { DirectiveReserveZp reserveDirective = (DirectiveReserveZp) this.visit(ctx.directiveReserve()); - if(reserveDirective!=null) { + if(reserveDirective != null) { program.addReservedZps(reserveDirective.getReservedZp()); } return null; } + @Override + public Object visitGlobalDirectivePc(KickCParser.GlobalDirectivePcContext ctx) { + Number programPc = NumberParser.parseLiteral(ctx.NUMBER().getText()); + if(programPc != null) { + program.setProgramPc(programPc); + } + return null; + } + @Override public Object visitDeclFunction(KickCParser.DeclFunctionContext ctx) { this.visitDeclTypes(ctx.declTypes()); @@ -171,7 +180,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { // A single void parameter decl - equals zero parameters return new ArrayList<>(); } else { - throw new CompileError("Illegal void parameter." , new StatementSource(ctx)); + throw new CompileError("Illegal void parameter.", new StatementSource(ctx)); } } else if(parameterDecl instanceof Variable) { parameterDecls.add((Variable) parameterDecl); @@ -436,6 +445,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { /** * Visit the type/directive part of a declaration. Setup the local decl-variables + * * @param ctx The declaration type & directives * @return null */ @@ -467,7 +477,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public Object visitDeclVariableList(KickCParser.DeclVariableListContext ctx) { - if(ctx.declVariableList()!=null) { + if(ctx.declVariableList() != null) { this.visit(ctx.declVariableList()); } this.visit(ctx.declVariableInit()); @@ -506,38 +516,38 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { throw new CompileError("Initializers not supported inside structs " + type.getTypeName(), new StatementSource(ctx)); } } else { - if(initializer != null) { - addInitialAssignment(initializer, lValue, comments); - } else { - if(type instanceof SymbolTypeIntegerFixed) { - // Add an zero value initializer - ConstantInteger zero = new ConstantInteger(0L, type); - Statement stmt = new StatementAssignment(lValue.getRef(), zero, new StatementSource(ctx), ensureUnusedComments(comments)); - sequence.addStatement(stmt); - } else if(type instanceof SymbolTypeArray) { - // Add an zero-array initializer - SymbolTypeArray typeArray = (SymbolTypeArray) type; - RValue size = typeArray.getSize(); - if(size == null) { - throw new CompileError("Error! Array has no declared size. " + lValue.toString(program), new StatementSource(ctx)); - } - Statement stmt = new StatementAssignment(lValue.getRef(), new ArrayFilled(typeArray.getElementType(), size), new StatementSource(ctx), ensureUnusedComments(comments)); - sequence.addStatement(stmt); - } else if(type instanceof SymbolTypePointer) { - // Add an zero value initializer - SymbolTypePointer typePointer = (SymbolTypePointer) type; - ConstantValue zero = new ConstantPointer(0L, typePointer.getElementType()); - Statement stmt = new StatementAssignment(lValue.getRef(), zero, new StatementSource(ctx), ensureUnusedComments(comments)); - sequence.addStatement(stmt); - } else if(type instanceof SymbolTypeStruct) { - // Add an zero-struct initializer - SymbolTypeStruct typeStruct = (SymbolTypeStruct) type; - Statement stmt = new StatementAssignment(lValue.getRef(), new StructZero(typeStruct), new StatementSource(ctx), ensureUnusedComments(comments)); - sequence.addStatement(stmt); + if(initializer != null) { + addInitialAssignment(initializer, lValue, comments); } else { - throw new CompileError("Default initializer not implemented for type " + type.getTypeName(), new StatementSource(ctx)); + if(type instanceof SymbolTypeIntegerFixed) { + // Add an zero value initializer + ConstantInteger zero = new ConstantInteger(0L, type); + Statement stmt = new StatementAssignment(lValue.getRef(), zero, new StatementSource(ctx), ensureUnusedComments(comments)); + sequence.addStatement(stmt); + } else if(type instanceof SymbolTypeArray) { + // Add an zero-array initializer + SymbolTypeArray typeArray = (SymbolTypeArray) type; + RValue size = typeArray.getSize(); + if(size == null) { + throw new CompileError("Error! Array has no declared size. " + lValue.toString(program), new StatementSource(ctx)); + } + Statement stmt = new StatementAssignment(lValue.getRef(), new ArrayFilled(typeArray.getElementType(), size), new StatementSource(ctx), ensureUnusedComments(comments)); + sequence.addStatement(stmt); + } else if(type instanceof SymbolTypePointer) { + // Add an zero value initializer + SymbolTypePointer typePointer = (SymbolTypePointer) type; + ConstantValue zero = new ConstantPointer(0L, typePointer.getElementType()); + Statement stmt = new StatementAssignment(lValue.getRef(), zero, new StatementSource(ctx), ensureUnusedComments(comments)); + sequence.addStatement(stmt); + } else if(type instanceof SymbolTypeStruct) { + // Add an zero-struct initializer + SymbolTypeStruct typeStruct = (SymbolTypeStruct) type; + Statement stmt = new StatementAssignment(lValue.getRef(), new StructZero(typeStruct), new StatementSource(ctx), ensureUnusedComments(comments)); + sequence.addStatement(stmt); + } else { + throw new CompileError("Default initializer not implemented for type " + type.getTypeName(), new StatementSource(ctx)); + } } - } } return null; @@ -545,7 +555,8 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { /** * Add declared directives to an lValue (typically a variable). - * @param lValue The lValue + * + * @param lValue The lValue * @param type The type of the lValue * @param directives The directives to add */ @@ -576,6 +587,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { /** * Find the directives in the parse tree + * * @param directivesCtx The directives in the parse tree to examine * @return Objects representing the found directives */ @@ -885,7 +897,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public Object visitForClassicInitDecl(KickCParser.ForClassicInitDeclContext ctx) { - if(ctx.declVariables()!=null) { + if(ctx.declVariables() != null) { this.visit(ctx.declVariables()); } return null; @@ -898,7 +910,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { loopStack.push(new Loop(blockScope)); // Create / find declared loop variable - if(ctx.declTypes()!=null) { + if(ctx.declTypes() != null) { this.visitDeclTypes(ctx.declTypes()); } SymbolType varType = declVarType; @@ -923,7 +935,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { // Assign loop variable with first value RValue rangeLastValue = (RValue) visit(rangeLastCtx); RValue rangeFirstValue = (RValue) visit(rangeFirstCtx); - if(varType!=null) { + if(varType != null) { if(rangeFirstValue instanceof ConstantInteger) ((ConstantInteger) rangeFirstValue).setType(SymbolType.NUMBER); if(rangeLastValue instanceof ConstantInteger) ((ConstantInteger) rangeLastValue).setType(SymbolType.NUMBER); } @@ -1136,12 +1148,10 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { } - - @Override public Object visitStructDef(KickCParser.StructDefContext ctx) { String structDefName; - if(ctx.NAME()!=null) { + if(ctx.NAME() != null) { structDefName = ctx.NAME().getText(); } else { structDefName = getCurrentScope().allocateIntermediateVariableName(); @@ -1169,7 +1179,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { String signedness = ctx.getChild(0).getText(); String simpleTypeName; - if(ctx.SIMPLETYPE()!=null) { + if(ctx.SIMPLETYPE() != null) { simpleTypeName = ctx.SIMPLETYPE().getText(); } else { simpleTypeName = "int"; @@ -1255,7 +1265,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { } else if(lValue instanceof PointerDereferenceIndexed) { return new PointerDereferenceIndexed(((PointerDereferenceIndexed) lValue).getPointer(), ((PointerDereferenceIndexed) lValue).getIndex()); } else { - throw new CompileError("Unknown LValue type "+lValue); + throw new CompileError("Unknown LValue type " + lValue); } } @@ -1280,7 +1290,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public Object visitExprSizeOf(KickCParser.ExprSizeOfContext ctx) { - if(ctx.typeDecl()!=null) { + if(ctx.typeDecl() != null) { // sizeof(type) - add directly SymbolType type = (SymbolType) this.visit(ctx.typeDecl()); return OperatorSizeOf.getSizeOfConstantVar(program.getScope(), type); @@ -1297,7 +1307,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public Object visitExprTypeId(KickCParser.ExprTypeIdContext ctx) { - if(ctx.typeDecl()!=null) { + if(ctx.typeDecl() != null) { // typeid(type) - add directly SymbolType type = (SymbolType) this.visit(ctx.typeDecl()); return OperatorTypeId.getTypeIdConstantVar(program.getScope(), type); @@ -1359,13 +1369,13 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { @Override public RValue visitExprString(KickCParser.ExprStringContext ctx) { - String stringValue =""; + String stringValue = ""; String subText = ""; for(TerminalNode stringNode : ctx.STRING()) { subText = stringNode.getText(); if(subText.endsWith("z")) { stringValue += subText.substring(1, subText.length() - 2); - } else { + } else { stringValue += subText.substring(1, subText.length() - 1); } } @@ -1413,7 +1423,7 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor { // Special handling of negative literal number if(child instanceof ConstantInteger && operator.equals(Operators.NEG)) { return new ConstantInteger(-((ConstantInteger) child).getInteger(), ((ConstantInteger) child).getType()); - } else { + } else { VariableIntermediate tmpVar = getCurrentScope().addVariableIntermediate(); VariableRef tmpVarRef = tmpVar.getRef(); Statement stmt = new StatementAssignment(tmpVarRef, operator, child, new StatementSource(ctx), ensureUnusedComments(getCommentsSymbol(ctx))); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 8a3920906..a76817163 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -50,10 +50,17 @@ public class Pass4CodeGeneration { asm.startSegment(currentScope, null, "File Comments"); generateComments(asm, program.getFileComments()); + Number programPc; + if(program.getProgramPc()!=null) { + programPc = program.getProgramPc(); + } else { + programPc = 0x080d; + } + asm.startSegment(currentScope, null, "Basic Upstart"); asm.addLine(new AsmSetPc("Basic", AsmFormat.getAsmNumber(0x0801))); asm.addLine(new AsmBasicUpstart("bbegin")); - asm.addLine(new AsmSetPc("Program", AsmFormat.getAsmNumber(0x080d))); + asm.addLine(new AsmSetPc("Program", AsmFormat.getAsmNumber(programPc))); // Generate global ZP labels asm.startSegment(currentScope, null, "Global Constants & labels"); diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 57ba11202..c53ea9c5c 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -32,6 +32,11 @@ public class TestPrograms { public TestPrograms() { } + @Test + public void testGlobalPc() throws IOException, URISyntaxException { + compileAndCompare("global-pc"); + } + @Test public void testNoopCastElimination() throws IOException, URISyntaxException { compileAndCompare("noop-cast-elimination"); diff --git a/src/test/kc/global-pc.kc b/src/test/kc/global-pc.kc new file mode 100644 index 000000000..90ff2d028 --- /dev/null +++ b/src/test/kc/global-pc.kc @@ -0,0 +1,15 @@ +// Test setting the program PC through a #pc directive + +#pc(0x1000) + +const byte* BGCOL = 0xd021; +const byte* RASTER = 0xd012; + +void main() { + asm { sei } + while(true) { + byte col = *RASTER; + *BGCOL = col; + } +} + diff --git a/src/test/kc/reserve-zp-global.kc b/src/test/kc/reserve-zp-global.kc index 7c511a076..dde718ded 100644 --- a/src/test/kc/reserve-zp-global.kc +++ b/src/test/kc/reserve-zp-global.kc @@ -1,6 +1,6 @@ // Demonstrates global directive reserving addresses on zeropage -reserve(2,5); +#reserve(2,5) void main() { const byte* SCREEN = $400; diff --git a/src/test/ref/derefidx-word-1.log b/src/test/ref/derefidx-word-1.log index c0d10e2b4..9c6da912c 100644 --- a/src/test/ref/derefidx-word-1.log +++ b/src/test/ref/derefidx-word-1.log @@ -31,7 +31,7 @@ SYMBOL TABLE SSA Adding number conversion cast (unumber) main::$0 in *((byte*) main::screen#0 + (number~) main::$0) ← (byte) 'a' Successful SSA optimization PassNAddNumberTypeConversions -Adding number conversion cast (unumber) dk.camelot64.kickc.model.values.AssignmentRValue@7e09bee in (unumber~) main::$0 ← (number) $28 * (number) $a +Adding number conversion cast (unumber) $28 * $a in (unumber~) main::$0 ← (number) $28 * (number) $a Successful SSA optimization PassNAddNumberTypeConversions Inlining cast (byte*) main::screen#0 ← (byte*)(number) $400 Inlining cast (unumber~) main::$0 ← (unumber)(number~) main::$1 diff --git a/src/test/ref/examples/fire/fire.log b/src/test/ref/examples/fire/fire.log index 053fd228f..199dcf93f 100644 --- a/src/test/ref/examples/fire/fire.log +++ b/src/test/ref/examples/fire/fire.log @@ -810,8 +810,8 @@ Adding number conversion cast (unumber) 8 in (bool~) makecharset::$20 ← (byte) Adding number conversion cast (unumber) $40 in (bool~) makecharset::$21 ← (byte) makecharset::c#1 < (number) $40 Adding number conversion cast (unumber) 0 in (word) fillscreen::i#0 ← (number) 0 Successful SSA optimization PassNAddNumberTypeConversions -Adding number conversion cast (unumber) dk.camelot64.kickc.model.values.AssignmentRValue@6f330eb9 in (unumber~) fire::$7 ← (number) $28 - (number) 1 -Adding number conversion cast (unumber) dk.camelot64.kickc.model.values.AssignmentRValue@125c082e in (unumber~) fire::$8 ← (number) $28 - (number) 1 +Adding number conversion cast (unumber) $28 - 1 in (unumber~) fire::$7 ← (number) $28 - (number) 1 +Adding number conversion cast (unumber) $28 - 1 in (unumber~) fire::$8 ← (number) $28 - (number) 1 Successful SSA optimization PassNAddNumberTypeConversions Adding number conversion cast (byte) to elements in (byte[8]) makecharset::bittab#0 ← { (byte)(number) 1, (byte)(number) 2, (byte)(number) 4, (byte)(number) 8, (byte)(number) $10, (byte)(number) $20, (byte)(number) $40, (byte)(number) $80 } Successful SSA optimization PassNAddArrayNumberTypeConversions diff --git a/src/test/ref/global-pc.asm b/src/test/ref/global-pc.asm new file mode 100644 index 000000000..d47a3ef0d --- /dev/null +++ b/src/test/ref/global-pc.asm @@ -0,0 +1,13 @@ +// Test setting the program PC through a #pc directive +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $1000 "Program" + .label BGCOL = $d021 + .label RASTER = $d012 +main: { + sei + b1: + lda RASTER + sta BGCOL + jmp b1 +} diff --git a/src/test/ref/global-pc.cfg b/src/test/ref/global-pc.cfg new file mode 100644 index 000000000..0a03228ba --- /dev/null +++ b/src/test/ref/global-pc.cfg @@ -0,0 +1,16 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + asm { sei } + to:main::@1 +main::@1: scope:[main] from main main::@1 + [5] (byte) main::col#0 ← *((const byte*) RASTER#0) + [6] *((const byte*) BGCOL#0) ← (byte) main::col#0 + to:main::@1 diff --git a/src/test/ref/global-pc.log b/src/test/ref/global-pc.log new file mode 100644 index 000000000..9c91ba7ef --- /dev/null +++ b/src/test/ref/global-pc.log @@ -0,0 +1,263 @@ +Adding pointer type conversion cast (byte*) BGCOL in (byte*) BGCOL ← (number) $d021 +Adding pointer type conversion cast (byte*) RASTER in (byte*) RASTER ← (number) $d012 +Culled Empty Block (label) main::@4 +Culled Empty Block (label) main::@3 +Culled Empty Block (label) main::@5 +Culled Empty Block (label) main::@6 + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + (byte*) BGCOL#0 ← ((byte*)) (number) $d021 + (byte*) RASTER#0 ← ((byte*)) (number) $d012 + to:@1 +main: scope:[main] from @1 + asm { sei } + to:main::@1 +main::@1: scope:[main] from main main::@2 + if(true) goto main::@2 + to:main::@return +main::@2: scope:[main] from main::@1 + (byte) main::col#0 ← *((byte*) RASTER#0) + *((byte*) BGCOL#0) ← (byte) main::col#0 + to:main::@1 +main::@return: scope:[main] from main::@1 + return + to:@return +@1: scope:[] from @begin + call main + to:@2 +@2: scope:[] from @1 + to:@end +@end: scope:[] from @2 + +SYMBOL TABLE SSA +(label) @1 +(label) @2 +(label) @begin +(label) @end +(byte*) BGCOL +(byte*) BGCOL#0 +(byte*) RASTER +(byte*) RASTER#0 +(void()) main() +(label) main::@1 +(label) main::@2 +(label) main::@return +(byte) main::col +(byte) main::col#0 + +Inlining cast (byte*) BGCOL#0 ← (byte*)(number) $d021 +Inlining cast (byte*) RASTER#0 ← (byte*)(number) $d012 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 53281 +Simplifying constant pointer cast (byte*) 53266 +Successful SSA optimization PassNCastSimplification +Constant (const byte*) BGCOL#0 = (byte*) 53281 +Constant (const byte*) RASTER#0 = (byte*) 53266 +Successful SSA optimization Pass2ConstantIdentification +if() condition always true - replacing block destination [3] if(true) goto main::@2 +Successful SSA optimization Pass2ConstantIfs +Removing unused block main::@return +Successful SSA optimization Pass2EliminateUnusedBlocks +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +Adding NOP phi() at start of main::@1 +CALL GRAPH +Calls in [] to main:2 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block (label) @2 +Culled Empty Block (label) main::@1 +Renumbering block main::@2 to main::@1 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + asm { sei } + to:main::@1 +main::@1: scope:[main] from main main::@1 + [5] (byte) main::col#0 ← *((const byte*) RASTER#0) + [6] *((const byte*) BGCOL#0) ← (byte) main::col#0 + to:main::@1 + + +VARIABLE REGISTER WEIGHTS +(byte*) BGCOL +(byte*) RASTER +(void()) main() +(byte) main::col +(byte) main::col#0 22.0 + +Initial phi equivalence classes +Added variable main::col#0 to zero page equivalence class [ main::col#0 ] +Complete equivalence classes +[ main::col#0 ] +Allocated zp ZP_BYTE:2 [ main::col#0 ] + +INITIAL ASM +//SEG0 File Comments +// Test setting the program PC through a #pc directive +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $1000 "Program" +//SEG2 Global Constants & labels + .label BGCOL = $d021 + .label RASTER = $d012 +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + .label col = 2 + //SEG10 asm { sei } + sei + jmp b1 + //SEG11 main::@1 + b1: + //SEG12 [5] (byte) main::col#0 ← *((const byte*) RASTER#0) -- vbuz1=_deref_pbuc1 + lda RASTER + sta col + //SEG13 [6] *((const byte*) BGCOL#0) ← (byte) main::col#0 -- _deref_pbuc1=vbuz1 + lda col + sta BGCOL + jmp b1 +} + +REGISTER UPLIFT POTENTIAL REGISTERS +Potential registers zp ZP_BYTE:2 [ main::col#0 ] : zp ZP_BYTE:2 , reg byte a , reg byte x , reg byte y , + +REGISTER UPLIFT SCOPES +Uplift Scope [main] 22: zp ZP_BYTE:2 [ main::col#0 ] +Uplift Scope [] + +Uplifting [main] best 127 combination reg byte a [ main::col#0 ] +Uplifting [] best 127 combination + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Test setting the program PC through a #pc directive +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $1000 "Program" +//SEG2 Global Constants & labels + .label BGCOL = $d021 + .label RASTER = $d012 +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + //SEG10 asm { sei } + sei + jmp b1 + //SEG11 main::@1 + b1: + //SEG12 [5] (byte) main::col#0 ← *((const byte*) RASTER#0) -- vbuaa=_deref_pbuc1 + lda RASTER + //SEG13 [6] *((const byte*) BGCOL#0) ← (byte) main::col#0 -- _deref_pbuc1=vbuaa + sta BGCOL + jmp b1 +} + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b1 +Removing instruction jmp bend +Removing instruction jmp b1 +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction b1_from_bbegin: +Removing instruction b1: +Removing instruction bend_from_b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction bend: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(byte*) BGCOL +(const byte*) BGCOL#0 BGCOL = (byte*) 53281 +(byte*) RASTER +(const byte*) RASTER#0 RASTER = (byte*) 53266 +(void()) main() +(label) main::@1 +(byte) main::col +(byte) main::col#0 reg byte a 22.0 + +reg byte a [ main::col#0 ] + + +FINAL ASSEMBLER +Score: 112 + +//SEG0 File Comments +// Test setting the program PC through a #pc directive +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $1000 "Program" +//SEG2 Global Constants & labels + .label BGCOL = $d021 + .label RASTER = $d012 +//SEG3 @begin +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +//SEG5 @1 +//SEG6 [2] call main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +//SEG8 @end +//SEG9 main +main: { + //SEG10 asm { sei } + sei + //SEG11 main::@1 + b1: + //SEG12 [5] (byte) main::col#0 ← *((const byte*) RASTER#0) -- vbuaa=_deref_pbuc1 + lda RASTER + //SEG13 [6] *((const byte*) BGCOL#0) ← (byte) main::col#0 -- _deref_pbuc1=vbuaa + sta BGCOL + jmp b1 +} + diff --git a/src/test/ref/global-pc.sym b/src/test/ref/global-pc.sym new file mode 100644 index 000000000..1daabbadc --- /dev/null +++ b/src/test/ref/global-pc.sym @@ -0,0 +1 @@ +program \ No newline at end of file