From f5261a3425060fae95a818992fffc436e8b413bb Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Tue, 9 Oct 2018 00:01:53 +0200 Subject: [PATCH] added %zpreserved --- compiler/antlr/prog8.g4 | 2 +- compiler/examples/test.p8 | 32 +- compiler/src/prog8/CompilerMain.kt | 19 +- compiler/src/prog8/ast/AstChecker.kt | 7 +- compiler/src/prog8/ast/ImportedAstChecker.kt | 2 +- compiler/src/prog8/ast/StmtReorderer.kt | 4 +- compiler/src/prog8/compiler/Compiler.kt | 1 + compiler/src/prog8/compiler/Zeropage.kt | 2 + .../prog8/compiler/target/c64/Commodore64.kt | 3 + compiler/src/prog8/parser/prog8Lexer.java | 544 ++++++++--------- compiler/src/prog8/parser/prog8Parser.java | 546 +++++++++--------- compiler/test/UnitTests.kt | 41 +- docs/source/syntaxreference.rst | 6 + 13 files changed, 625 insertions(+), 584 deletions(-) diff --git a/compiler/antlr/prog8.g4 b/compiler/antlr/prog8.g4 index 7046249c0..6937e1d98 100644 --- a/compiler/antlr/prog8.g4 +++ b/compiler/antlr/prog8.g4 @@ -88,7 +88,7 @@ labeldef : identifier ':' ; unconditionaljump : 'goto' (integerliteral | identifier | scoped_identifier) ; directive : - directivename=('%output' | '%launcher' | '%zeropage' | '%address' | '%import' | + directivename=('%output' | '%launcher' | '%zeropage' | '%zpreserved' | '%address' | '%import' | '%breakpoint' | '%asminclude' | '%asmbinary' | '%option') (directivearg? | directivearg (',' directivearg)*) ; diff --git a/compiler/examples/test.p8 b/compiler/examples/test.p8 index 6b8fa6729..ab29585bb 100644 --- a/compiler/examples/test.p8 +++ b/compiler/examples/test.p8 @@ -1,41 +1,15 @@ -%option enable_floats +%zeropage full +%zpreserved $40,200 +%zpreserved 100,250 ~ main { sub start() { - str s1 = "hello" - str s2 = "bye" - A=X - X=Y - X=X - - _vm_write_str(s1) - s1 = s2 - _vm_write_str(s1) - s1 = "ciao" - _vm_write_str(s1) - - A=xyz() - asmxyz(333, 2) - asmxyz(333,2) - X=asmxyz2(333,2) return } - -sub xyz() -> byte { - - return 33 -} - -asmsub asmxyz(v1: word @ XY, v2: byte @ A) -> clobbers() -> (byte @ A, word @ XY) { - return 44,4455 -} -asmsub asmxyz2(v1: word @ XY, v2: byte @ A) -> clobbers(X) -> (byte @ A) { - return 44 -} } diff --git a/compiler/src/prog8/CompilerMain.kt b/compiler/src/prog8/CompilerMain.kt index fbd421e1c..008b45b40 100644 --- a/compiler/src/prog8/CompilerMain.kt +++ b/compiler/src/prog8/CompilerMain.kt @@ -9,6 +9,7 @@ import prog8.parser.ParsingFailedError import prog8.parser.importModule import java.io.File import java.io.PrintStream +import java.lang.IllegalArgumentException import java.nio.file.Paths import kotlin.system.exitProcess @@ -41,13 +42,27 @@ fun main(args: Array) { as? Directive)?.args?.single()?.name?.toUpperCase() val launcherType = (moduleAst.statements.singleOrNull { it is Directive && it.directive=="%launcher"} as? Directive)?.args?.single()?.name?.toUpperCase() - val zpType = (moduleAst.statements.singleOrNull { it is Directive && it.directive=="%zeropage"} + val zpoption: String? = (moduleAst.statements.singleOrNull { it is Directive && it.directive=="%zeropage"} as? Directive)?.args?.single()?.name?.toUpperCase() + val zpType: ZeropageType = + if(zpoption==null) + ZeropageType.KERNALSAFE + else + try { + ZeropageType.valueOf(zpoption) + } catch(x: IllegalArgumentException) { + ZeropageType.KERNALSAFE + // error will be printed by the astchecker + } + val zpReserved = moduleAst.statements + .filter{it is Directive && it.directive=="%zpreserved"} + .map{ (it as Directive).args } + .map{ it[0].int!! .. it[1].int!! } val compilerOptions = CompilationOptions( if(outputType==null) OutputType.PRG else OutputType.valueOf(outputType), if(launcherType==null) LauncherType.BASIC else LauncherType.valueOf(launcherType), - if(zpType==null) ZeropageType.KERNALSAFE else ZeropageType.valueOf(zpType), + zpType, zpReserved, options.any{ it.name=="enable_floats"}) diff --git a/compiler/src/prog8/ast/AstChecker.kt b/compiler/src/prog8/ast/AstChecker.kt index eeaea5d7d..e082ac5ad 100644 --- a/compiler/src/prog8/ast/AstChecker.kt +++ b/compiler/src/prog8/ast/AstChecker.kt @@ -473,7 +473,12 @@ class AstChecker(private val namespace: INameScope, directive.args[0].name != "basicsafe" && directive.args[0].name != "kernalsafe" && directive.args[0].name != "full") - err("invalid zp directive style, expected basicsafe, kernalsafe, or full") + err("invalid zp type, expected basicsafe, kernalsafe, or full") + } + "%zpreserved" -> { + if(directive.parent !is Module) err("this directive may only occur at module level") + if(directive.args.size!=2 || directive.args[0].int==null || directive.args[1].int==null) + err("requires two addresses (start, end)") } "%address" -> { if(directive.parent !is Module) err("this directive may only occur at module level") diff --git a/compiler/src/prog8/ast/ImportedAstChecker.kt b/compiler/src/prog8/ast/ImportedAstChecker.kt index 4fe3e345a..6280c63d8 100644 --- a/compiler/src/prog8/ast/ImportedAstChecker.kt +++ b/compiler/src/prog8/ast/ImportedAstChecker.kt @@ -27,7 +27,7 @@ class ImportedAstChecker : IAstProcessor { super.process(module) val newStatements : MutableList = mutableListOf() - val moduleLevelDirectives = listOf("%output", "%launcher", "%zeropage", "%address") + val moduleLevelDirectives = listOf("%output", "%launcher", "%zeropage", "%zpreserved", "%address") for (sourceStmt in module.statements) { val stmt = sourceStmt.process(this) if(stmt is Directive && stmt.parent is Module) { diff --git a/compiler/src/prog8/ast/StmtReorderer.kt b/compiler/src/prog8/ast/StmtReorderer.kt index a8be0296b..5454236af 100644 --- a/compiler/src/prog8/ast/StmtReorderer.kt +++ b/compiler/src/prog8/ast/StmtReorderer.kt @@ -6,14 +6,14 @@ class StatementReorderer(private val namespace: INameScope, private val heap: He // Reorders the statements in a way the compiler needs. // - 'main' block must be the very first statement. // - in every scope: - // -- the directives '%output', '%launcher', '%zeropage', '%address' and '%option' will come first. + // -- the directives '%output', '%launcher', '%zeropage', '%zpreserved', '%address' and '%option' will come first. // -- all vardecls then follow. // -- the remaining statements then follow in their original order. // // - the 'start' subroutine in the 'main' block will be moved to the top immediately following the directives. // - all other subroutines will be moved to the end of their block. - private val directivesToMove = setOf("%output", "%launcher", "%zeropage", "%address", "%option") + private val directivesToMove = setOf("%output", "%launcher", "%zeropage", "%zpreserved", "%address", "%option") private val vardeclsToAdd = mutableMapOf>() override fun process(module: Module) { diff --git a/compiler/src/prog8/compiler/Compiler.kt b/compiler/src/prog8/compiler/Compiler.kt index 5c98e6159..b5b6f0655 100644 --- a/compiler/src/prog8/compiler/Compiler.kt +++ b/compiler/src/prog8/compiler/Compiler.kt @@ -369,6 +369,7 @@ enum class ZeropageType { data class CompilationOptions(val output: OutputType, val launcher: LauncherType, val zeropage: ZeropageType, + val zpReserved: List, val floats: Boolean) diff --git a/compiler/src/prog8/compiler/Zeropage.kt b/compiler/src/prog8/compiler/Zeropage.kt index a2358e65d..1a23d7fdf 100644 --- a/compiler/src/prog8/compiler/Zeropage.kt +++ b/compiler/src/prog8/compiler/Zeropage.kt @@ -64,6 +64,8 @@ abstract class Zeropage(private val options: CompilationOptions) { throw CompilerException("ERROR: no free space in ZP to allocate $size sequential bytes") } + protected fun reserve(range: IntRange) = free.removeAll(range) + private fun makeAllocation(location: Int, size: Int, datatype: DataType, name: String?): Int { free.removeAll(location until location+size) allocations[location] = Pair(name ?: "", datatype) diff --git a/compiler/src/prog8/compiler/target/c64/Commodore64.kt b/compiler/src/prog8/compiler/target/c64/Commodore64.kt index 42d2cb839..dcc085651 100644 --- a/compiler/src/prog8/compiler/target/c64/Commodore64.kt +++ b/compiler/src/prog8/compiler/target/c64/Commodore64.kt @@ -47,6 +47,9 @@ class C64Zeropage(options: CompilationOptions) : Zeropage(options) { assert(SCRATCH_B2 !in free) assert(SCRATCH_W1 !in free) assert(SCRATCH_W2 !in free) + + for(reserved in options.zpReserved) + reserve(reserved) } } diff --git a/compiler/src/prog8/parser/prog8Lexer.java b/compiler/src/prog8/parser/prog8Lexer.java index e91c2ec5d..8d9258991 100644 --- a/compiler/src/prog8/parser/prog8Lexer.java +++ b/compiler/src/prog8/parser/prog8Lexer.java @@ -1,12 +1,13 @@ // Generated from /home/irmen/Projects/prog8/compiler/antlr/prog8.g4 by ANTLR 4.7 package prog8.parser; - +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.atn.ATNDeserializer; -import org.antlr.v4.runtime.atn.LexerATNSimulator; -import org.antlr.v4.runtime.atn.PredictionContextCache; +import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class prog8Lexer extends Lexer { @@ -30,9 +31,9 @@ public class prog8Lexer extends Lexer { T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87, T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, - T__101=102, T__102=103, T__103=104, LINECOMMENT=105, COMMENT=106, WS=107, - EOL=108, NAME=109, DEC_INTEGER=110, HEX_INTEGER=111, BIN_INTEGER=112, - FLOAT_NUMBER=113, STRING=114, INLINEASMBLOCK=115, SINGLECHAR=116; + T__101=102, T__102=103, T__103=104, T__104=105, LINECOMMENT=106, COMMENT=107, + WS=108, EOL=109, NAME=110, DEC_INTEGER=111, HEX_INTEGER=112, BIN_INTEGER=113, + FLOAT_NUMBER=114, STRING=115, INLINEASMBLOCK=116, SINGLECHAR=117; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -54,27 +55,27 @@ public class prog8Lexer extends Lexer { "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", "T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "T__87", "T__88", "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96", - "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "LINECOMMENT", - "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", - "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK", - "SINGLECHAR" + "T__97", "T__98", "T__99", "T__100", "T__101", "T__102", "T__103", "T__104", + "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", + "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", + "INLINEASMBLOCK", "SINGLECHAR" }; private static final String[] _LITERAL_NAMES = { null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zeropage'", - "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", - "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", - "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", - "'-='", "'/='", "'//='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", - "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'//'", "'%'", - "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", - "'step'", "'and'", "'or'", "'xor'", "'not'", "'return'", "'break'", "'continue'", - "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", - "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", - "'}'", "'asmsub'", "'clobbers'", "'@'", "'if'", "'else'", "'if_cs'", "'if_cc'", - "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", - "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", - "'until'" + "'%zpreserved'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", + "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", + "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", + "']'", "'+='", "'-='", "'/='", "'//='", "'*='", "'**='", "'&='", "'|='", + "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", + "'//'", "'%'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", + "'|'", "'to'", "'step'", "'and'", "'or'", "'xor'", "'not'", "'return'", + "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", + "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", + "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'@'", "'if'", + "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", + "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", + "'in'", "'while'", "'repeat'", "'until'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -85,9 +86,9 @@ public class prog8Lexer extends Lexer { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT", - "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", - "STRING", "INLINEASMBLOCK", "SINGLECHAR" + null, null, null, null, null, null, null, null, null, null, "LINECOMMENT", + "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", + "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "SINGLECHAR" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -149,13 +150,13 @@ public class prog8Lexer extends Lexer { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 115: + case 116: STRING_action((RuleContext)_localctx, actionIndex); break; - case 116: + case 117: INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); break; - case 117: + case 118: SINGLECHAR_action((RuleContext)_localctx, actionIndex); break; } @@ -195,7 +196,7 @@ public class prog8Lexer extends Lexer { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2v\u0332\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2w\u0340\b\1\4\2\t"+ "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ @@ -208,49 +209,50 @@ public class prog8Lexer 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\4i\ti\4j\tj\4k\t"+ "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv\4"+ - "w\tw\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ - "\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7"+ - "\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3"+ - "\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\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\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\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\16\3\16\3\17"+ - "\3\17\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\22\3\22\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\25\3\26\3\26\3\26\3\26\3\26\3\26\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\30\3\31\3\31\3\32"+ - "\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3\36"+ - "\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3%"+ - "\3%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3"+ - "/\3/\3\60\3\60\3\61\3\61\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64"+ - "\3\64\3\65\3\65\3\66\3\66\3\67\3\67\38\38\38\39\39\39\39\39\3:\3:\3:\3"+ - ":\3;\3;\3;\3<\3<\3<\3<\3=\3=\3=\3=\3>\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3"+ - "?\3?\3@\3@\3@\3@\3@\3@\3@\3@\3@\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3E\3F\3"+ - "F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3"+ - "M\3M\3N\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3Q\3Q\3Q\3R\3R\3S\3"+ - "S\3T\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3U\3V\3V\3W\3W\3W\3X\3"+ - "X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3"+ - "\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3"+ - "`\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3"+ - "c\3c\3c\3d\3d\3d\3d\3d\3d\3e\3e\3e\3e\3f\3f\3f\3g\3g\3g\3g\3g\3g\3h\3"+ - "h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3j\3j\7j\u02c1\nj\fj\16j\u02c4\13j"+ - "\3j\3j\3j\3j\3k\3k\7k\u02cc\nk\fk\16k\u02cf\13k\3k\3k\3l\3l\3l\3l\3m\6"+ - "m\u02d8\nm\rm\16m\u02d9\3n\3n\7n\u02de\nn\fn\16n\u02e1\13n\3o\3o\3o\6"+ - "o\u02e6\no\ro\16o\u02e7\5o\u02ea\no\3p\3p\6p\u02ee\np\rp\16p\u02ef\3q"+ - "\3q\6q\u02f4\nq\rq\16q\u02f5\3r\3r\3r\5r\u02fb\nr\3r\5r\u02fe\nr\3s\6"+ - "s\u0301\ns\rs\16s\u0302\3s\3s\6s\u0307\ns\rs\16s\u0308\5s\u030b\ns\3t"+ - "\3t\3t\3t\5t\u0311\nt\3u\3u\3u\7u\u0316\nu\fu\16u\u0319\13u\3u\3u\3u\3"+ - "v\3v\3v\3v\6v\u0322\nv\rv\16v\u0323\3v\3v\3v\3v\3v\3w\3w\3w\5w\u032e\n"+ - "w\3w\3w\3w\3\u0323\2x\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27"+ - "\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33"+ - "\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63"+ - "e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089"+ - "F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009d"+ - "P\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1"+ - "Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5"+ - "d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9"+ - "n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5\2\u00e7\2\u00e9t\u00ebu\u00ed"+ - "v\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;"+ - "CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u0341\2\3\3\2\2\2\2\5\3\2\2\2"+ + "w\tw\4x\tx\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5"+ + "\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3"+ + "\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t"+ + "\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\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\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\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\16\3\17\3\17\3\20\3\20\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\23\3"+ + "\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\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\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\32\3\32\3\33\3\33\3"+ + "\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\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\60\3\60\3\61"+ + "\3\61\3\62\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65\3\65\3\65\3\66"+ + "\3\66\3\67\3\67\38\38\39\39\39\3:\3:\3:\3:\3:\3;\3;\3;\3;\3<\3<\3<\3="+ + "\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A"+ + "\3A\3A\3A\3A\3A\3A\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3H"+ + "\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O"+ + "\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3R\3R\3R\3S\3S\3T\3T\3U\3U\3U\3U"+ + "\3U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3V\3V\3W\3W\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Z"+ + "\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3[\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]"+ + "\3]\3^\3^\3^\3^\3^\3^\3_\3_\3_\3_\3_\3_\3`\3`\3`\3`\3`\3`\3a\3a\3a\3a"+ + "\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3d\3d\3d\3d\3d\3d\3e"+ + "\3e\3e\3e\3e\3e\3f\3f\3f\3f\3g\3g\3g\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i"+ + "\3i\3i\3j\3j\3j\3j\3j\3j\3k\3k\7k\u02cf\nk\fk\16k\u02d2\13k\3k\3k\3k\3"+ + "k\3l\3l\7l\u02da\nl\fl\16l\u02dd\13l\3l\3l\3m\3m\3m\3m\3n\6n\u02e6\nn"+ + "\rn\16n\u02e7\3o\3o\7o\u02ec\no\fo\16o\u02ef\13o\3p\3p\3p\6p\u02f4\np"+ + "\rp\16p\u02f5\5p\u02f8\np\3q\3q\6q\u02fc\nq\rq\16q\u02fd\3r\3r\6r\u0302"+ + "\nr\rr\16r\u0303\3s\3s\3s\5s\u0309\ns\3s\5s\u030c\ns\3t\6t\u030f\nt\r"+ + "t\16t\u0310\3t\3t\6t\u0315\nt\rt\16t\u0316\5t\u0319\nt\3u\3u\3u\3u\5u"+ + "\u031f\nu\3v\3v\3v\7v\u0324\nv\fv\16v\u0327\13v\3v\3v\3v\3w\3w\3w\3w\6"+ + "w\u0330\nw\rw\16w\u0331\3w\3w\3w\3w\3w\3x\3x\3x\5x\u033c\nx\3x\3x\3x\3"+ + "\u0331\2y\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+ + "\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+ + "\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65"+ + "i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008b"+ + "G\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009f"+ + "Q\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3"+ + "[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7"+ + "e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7m\u00d9n\u00db"+ + "o\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7\2\u00e9\2\u00ebu\u00edv\u00ef"+ + "w\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;"+ + "CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u034f\2\3\3\2\2\2\2\5\3\2\2\2"+ "\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3"+ "\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2"+ "\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2"+ @@ -272,200 +274,204 @@ public class prog8Lexer extends Lexer { "\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\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+ "\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+ - "\2\2\u00e3\3\2\2\2\2\u00e9\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\3\u00ef"+ - "\3\2\2\2\5\u00f1\3\2\2\2\7\u00f3\3\2\2\2\t\u00f8\3\2\2\2\13\u0100\3\2"+ - "\2\2\r\u010a\3\2\2\2\17\u0114\3\2\2\2\21\u011d\3\2\2\2\23\u0125\3\2\2"+ - "\2\25\u0131\3\2\2\2\27\u013d\3\2\2\2\31\u0148\3\2\2\2\33\u0150\3\2\2\2"+ - "\35\u0152\3\2\2\2\37\u0154\3\2\2\2!\u015a\3\2\2\2#\u0161\3\2\2\2%\u0166"+ - "\3\2\2\2\'\u016b\3\2\2\2)\u0171\3\2\2\2+\u0175\3\2\2\2-\u017b\3\2\2\2"+ - "/\u0181\3\2\2\2\61\u0188\3\2\2\2\63\u018a\3\2\2\2\65\u018c\3\2\2\2\67"+ - "\u018f\3\2\2\29\u0192\3\2\2\2;\u0195\3\2\2\2=\u0199\3\2\2\2?\u019c\3\2"+ - "\2\2A\u01a0\3\2\2\2C\u01a3\3\2\2\2E\u01a6\3\2\2\2G\u01a9\3\2\2\2I\u01ac"+ - "\3\2\2\2K\u01af\3\2\2\2M\u01b1\3\2\2\2O\u01b3\3\2\2\2Q\u01b5\3\2\2\2S"+ - "\u01b7\3\2\2\2U\u01ba\3\2\2\2W\u01bc\3\2\2\2Y\u01be\3\2\2\2[\u01c1\3\2"+ - "\2\2]\u01c3\3\2\2\2_\u01c5\3\2\2\2a\u01c7\3\2\2\2c\u01ca\3\2\2\2e\u01cd"+ - "\3\2\2\2g\u01d0\3\2\2\2i\u01d3\3\2\2\2k\u01d5\3\2\2\2m\u01d7\3\2\2\2o"+ - "\u01d9\3\2\2\2q\u01dc\3\2\2\2s\u01e1\3\2\2\2u\u01e5\3\2\2\2w\u01e8\3\2"+ - "\2\2y\u01ec\3\2\2\2{\u01f0\3\2\2\2}\u01f7\3\2\2\2\177\u01fd\3\2\2\2\u0081"+ - "\u0206\3\2\2\2\u0083\u0208\3\2\2\2\u0085\u020a\3\2\2\2\u0087\u020c\3\2"+ - "\2\2\u0089\u020e\3\2\2\2\u008b\u0211\3\2\2\2\u008d\u0214\3\2\2\2\u008f"+ - "\u0217\3\2\2\2\u0091\u021a\3\2\2\2\u0093\u021d\3\2\2\2\u0095\u0220\3\2"+ - "\2\2\u0097\u0223\3\2\2\2\u0099\u0226\3\2\2\2\u009b\u022b\3\2\2\2\u009d"+ - "\u0231\3\2\2\2\u009f\u0236\3\2\2\2\u00a1\u023a\3\2\2\2\u00a3\u023d\3\2"+ - "\2\2\u00a5\u023f\3\2\2\2\u00a7\u0241\3\2\2\2\u00a9\u0248\3\2\2\2\u00ab"+ - "\u0251\3\2\2\2\u00ad\u0253\3\2\2\2\u00af\u0256\3\2\2\2\u00b1\u025b\3\2"+ - "\2\2\u00b3\u0261\3\2\2\2\u00b5\u0267\3\2\2\2\u00b7\u026d\3\2\2\2\u00b9"+ - "\u0272\3\2\2\2\u00bb\u0278\3\2\2\2\u00bd\u027e\3\2\2\2\u00bf\u0284\3\2"+ - "\2\2\u00c1\u028b\3\2\2\2\u00c3\u0291\3\2\2\2\u00c5\u0298\3\2\2\2\u00c7"+ - "\u029e\3\2\2\2\u00c9\u02a4\3\2\2\2\u00cb\u02a8\3\2\2\2\u00cd\u02ab\3\2"+ - "\2\2\u00cf\u02b1\3\2\2\2\u00d1\u02b8\3\2\2\2\u00d3\u02be\3\2\2\2\u00d5"+ - "\u02c9\3\2\2\2\u00d7\u02d2\3\2\2\2\u00d9\u02d7\3\2\2\2\u00db\u02db\3\2"+ - "\2\2\u00dd\u02e9\3\2\2\2\u00df\u02eb\3\2\2\2\u00e1\u02f1\3\2\2\2\u00e3"+ - "\u02f7\3\2\2\2\u00e5\u0300\3\2\2\2\u00e7\u0310\3\2\2\2\u00e9\u0312\3\2"+ - "\2\2\u00eb\u031d\3\2\2\2\u00ed\u032a\3\2\2\2\u00ef\u00f0\7\u0080\2\2\u00f0"+ - "\4\3\2\2\2\u00f1\u00f2\7<\2\2\u00f2\6\3\2\2\2\u00f3\u00f4\7i\2\2\u00f4"+ - "\u00f5\7q\2\2\u00f5\u00f6\7v\2\2\u00f6\u00f7\7q\2\2\u00f7\b\3\2\2\2\u00f8"+ - "\u00f9\7\'\2\2\u00f9\u00fa\7q\2\2\u00fa\u00fb\7w\2\2\u00fb\u00fc\7v\2"+ - "\2\u00fc\u00fd\7r\2\2\u00fd\u00fe\7w\2\2\u00fe\u00ff\7v\2\2\u00ff\n\3"+ - "\2\2\2\u0100\u0101\7\'\2\2\u0101\u0102\7n\2\2\u0102\u0103\7c\2\2\u0103"+ - "\u0104\7w\2\2\u0104\u0105\7p\2\2\u0105\u0106\7e\2\2\u0106\u0107\7j\2\2"+ - "\u0107\u0108\7g\2\2\u0108\u0109\7t\2\2\u0109\f\3\2\2\2\u010a\u010b\7\'"+ - "\2\2\u010b\u010c\7|\2\2\u010c\u010d\7g\2\2\u010d\u010e\7t\2\2\u010e\u010f"+ - "\7q\2\2\u010f\u0110\7r\2\2\u0110\u0111\7c\2\2\u0111\u0112\7i\2\2\u0112"+ - "\u0113\7g\2\2\u0113\16\3\2\2\2\u0114\u0115\7\'\2\2\u0115\u0116\7c\2\2"+ - "\u0116\u0117\7f\2\2\u0117\u0118\7f\2\2\u0118\u0119\7t\2\2\u0119\u011a"+ - "\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7u\2\2\u011c\20\3\2\2\2\u011d\u011e"+ - "\7\'\2\2\u011e\u011f\7k\2\2\u011f\u0120\7o\2\2\u0120\u0121\7r\2\2\u0121"+ - "\u0122\7q\2\2\u0122\u0123\7t\2\2\u0123\u0124\7v\2\2\u0124\22\3\2\2\2\u0125"+ - "\u0126\7\'\2\2\u0126\u0127\7d\2\2\u0127\u0128\7t\2\2\u0128\u0129\7g\2"+ - "\2\u0129\u012a\7c\2\2\u012a\u012b\7m\2\2\u012b\u012c\7r\2\2\u012c\u012d"+ - "\7q\2\2\u012d\u012e\7k\2\2\u012e\u012f\7p\2\2\u012f\u0130\7v\2\2\u0130"+ - "\24\3\2\2\2\u0131\u0132\7\'\2\2\u0132\u0133\7c\2\2\u0133\u0134\7u\2\2"+ - "\u0134\u0135\7o\2\2\u0135\u0136\7k\2\2\u0136\u0137\7p\2\2\u0137\u0138"+ - "\7e\2\2\u0138\u0139\7n\2\2\u0139\u013a\7w\2\2\u013a\u013b\7f\2\2\u013b"+ - "\u013c\7g\2\2\u013c\26\3\2\2\2\u013d\u013e\7\'\2\2\u013e\u013f\7c\2\2"+ - "\u013f\u0140\7u\2\2\u0140\u0141\7o\2\2\u0141\u0142\7d\2\2\u0142\u0143"+ - "\7k\2\2\u0143\u0144\7p\2\2\u0144\u0145\7c\2\2\u0145\u0146\7t\2\2\u0146"+ - "\u0147\7{\2\2\u0147\30\3\2\2\2\u0148\u0149\7\'\2\2\u0149\u014a\7q\2\2"+ - "\u014a\u014b\7r\2\2\u014b\u014c\7v\2\2\u014c\u014d\7k\2\2\u014d\u014e"+ - "\7q\2\2\u014e\u014f\7p\2\2\u014f\32\3\2\2\2\u0150\u0151\7.\2\2\u0151\34"+ - "\3\2\2\2\u0152\u0153\7?\2\2\u0153\36\3\2\2\2\u0154\u0155\7e\2\2\u0155"+ - "\u0156\7q\2\2\u0156\u0157\7p\2\2\u0157\u0158\7u\2\2\u0158\u0159\7v\2\2"+ - "\u0159 \3\2\2\2\u015a\u015b\7o\2\2\u015b\u015c\7g\2\2\u015c\u015d\7o\2"+ - "\2\u015d\u015e\7q\2\2\u015e\u015f\7t\2\2\u015f\u0160\7{\2\2\u0160\"\3"+ - "\2\2\2\u0161\u0162\7d\2\2\u0162\u0163\7{\2\2\u0163\u0164\7v\2\2\u0164"+ - "\u0165\7g\2\2\u0165$\3\2\2\2\u0166\u0167\7y\2\2\u0167\u0168\7q\2\2\u0168"+ - "\u0169\7t\2\2\u0169\u016a\7f\2\2\u016a&\3\2\2\2\u016b\u016c\7h\2\2\u016c"+ - "\u016d\7n\2\2\u016d\u016e\7q\2\2\u016e\u016f\7c\2\2\u016f\u0170\7v\2\2"+ - "\u0170(\3\2\2\2\u0171\u0172\7u\2\2\u0172\u0173\7v\2\2\u0173\u0174\7t\2"+ - "\2\u0174*\3\2\2\2\u0175\u0176\7u\2\2\u0176\u0177\7v\2\2\u0177\u0178\7"+ - "t\2\2\u0178\u0179\7a\2\2\u0179\u017a\7r\2\2\u017a,\3\2\2\2\u017b\u017c"+ - "\7u\2\2\u017c\u017d\7v\2\2\u017d\u017e\7t\2\2\u017e\u017f\7a\2\2\u017f"+ - "\u0180\7u\2\2\u0180.\3\2\2\2\u0181\u0182\7u\2\2\u0182\u0183\7v\2\2\u0183"+ - "\u0184\7t\2\2\u0184\u0185\7a\2\2\u0185\u0186\7r\2\2\u0186\u0187\7u\2\2"+ - "\u0187\60\3\2\2\2\u0188\u0189\7]\2\2\u0189\62\3\2\2\2\u018a\u018b\7_\2"+ - "\2\u018b\64\3\2\2\2\u018c\u018d\7-\2\2\u018d\u018e\7?\2\2\u018e\66\3\2"+ - "\2\2\u018f\u0190\7/\2\2\u0190\u0191\7?\2\2\u01918\3\2\2\2\u0192\u0193"+ - "\7\61\2\2\u0193\u0194\7?\2\2\u0194:\3\2\2\2\u0195\u0196\7\61\2\2\u0196"+ - "\u0197\7\61\2\2\u0197\u0198\7?\2\2\u0198<\3\2\2\2\u0199\u019a\7,\2\2\u019a"+ - "\u019b\7?\2\2\u019b>\3\2\2\2\u019c\u019d\7,\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\u01a2"+ - "B\3\2\2\2\u01a3\u01a4\7~\2\2\u01a4\u01a5\7?\2\2\u01a5D\3\2\2\2\u01a6\u01a7"+ - "\7`\2\2\u01a7\u01a8\7?\2\2\u01a8F\3\2\2\2\u01a9\u01aa\7-\2\2\u01aa\u01ab"+ - "\7-\2\2\u01abH\3\2\2\2\u01ac\u01ad\7/\2\2\u01ad\u01ae\7/\2\2\u01aeJ\3"+ - "\2\2\2\u01af\u01b0\7*\2\2\u01b0L\3\2\2\2\u01b1\u01b2\7+\2\2\u01b2N\3\2"+ - "\2\2\u01b3\u01b4\7-\2\2\u01b4P\3\2\2\2\u01b5\u01b6\7/\2\2\u01b6R\3\2\2"+ - "\2\u01b7\u01b8\7,\2\2\u01b8\u01b9\7,\2\2\u01b9T\3\2\2\2\u01ba\u01bb\7"+ - ",\2\2\u01bbV\3\2\2\2\u01bc\u01bd\7\61\2\2\u01bdX\3\2\2\2\u01be\u01bf\7"+ - "\61\2\2\u01bf\u01c0\7\61\2\2\u01c0Z\3\2\2\2\u01c1\u01c2\7\'\2\2\u01c2"+ - "\\\3\2\2\2\u01c3\u01c4\7>\2\2\u01c4^\3\2\2\2\u01c5\u01c6\7@\2\2\u01c6"+ - "`\3\2\2\2\u01c7\u01c8\7>\2\2\u01c8\u01c9\7?\2\2\u01c9b\3\2\2\2\u01ca\u01cb"+ - "\7@\2\2\u01cb\u01cc\7?\2\2\u01ccd\3\2\2\2\u01cd\u01ce\7?\2\2\u01ce\u01cf"+ - "\7?\2\2\u01cff\3\2\2\2\u01d0\u01d1\7#\2\2\u01d1\u01d2\7?\2\2\u01d2h\3"+ - "\2\2\2\u01d3\u01d4\7(\2\2\u01d4j\3\2\2\2\u01d5\u01d6\7`\2\2\u01d6l\3\2"+ - "\2\2\u01d7\u01d8\7~\2\2\u01d8n\3\2\2\2\u01d9\u01da\7v\2\2\u01da\u01db"+ - "\7q\2\2\u01dbp\3\2\2\2\u01dc\u01dd\7u\2\2\u01dd\u01de\7v\2\2\u01de\u01df"+ - "\7g\2\2\u01df\u01e0\7r\2\2\u01e0r\3\2\2\2\u01e1\u01e2\7c\2\2\u01e2\u01e3"+ - "\7p\2\2\u01e3\u01e4\7f\2\2\u01e4t\3\2\2\2\u01e5\u01e6\7q\2\2\u01e6\u01e7"+ - "\7t\2\2\u01e7v\3\2\2\2\u01e8\u01e9\7z\2\2\u01e9\u01ea\7q\2\2\u01ea\u01eb"+ - "\7t\2\2\u01ebx\3\2\2\2\u01ec\u01ed\7p\2\2\u01ed\u01ee\7q\2\2\u01ee\u01ef"+ - "\7v\2\2\u01efz\3\2\2\2\u01f0\u01f1\7t\2\2\u01f1\u01f2\7g\2\2\u01f2\u01f3"+ - "\7v\2\2\u01f3\u01f4\7w\2\2\u01f4\u01f5\7t\2\2\u01f5\u01f6\7p\2\2\u01f6"+ - "|\3\2\2\2\u01f7\u01f8\7d\2\2\u01f8\u01f9\7t\2\2\u01f9\u01fa\7g\2\2\u01fa"+ - "\u01fb\7c\2\2\u01fb\u01fc\7m\2\2\u01fc~\3\2\2\2\u01fd\u01fe\7e\2\2\u01fe"+ - "\u01ff\7q\2\2\u01ff\u0200\7p\2\2\u0200\u0201\7v\2\2\u0201\u0202\7k\2\2"+ - "\u0202\u0203\7p\2\2\u0203\u0204\7w\2\2\u0204\u0205\7g\2\2\u0205\u0080"+ - "\3\2\2\2\u0206\u0207\7\60\2\2\u0207\u0082\3\2\2\2\u0208\u0209\7C\2\2\u0209"+ - "\u0084\3\2\2\2\u020a\u020b\7Z\2\2\u020b\u0086\3\2\2\2\u020c\u020d\7[\2"+ - "\2\u020d\u0088\3\2\2\2\u020e\u020f\7C\2\2\u020f\u0210\7Z\2\2\u0210\u008a"+ - "\3\2\2\2\u0211\u0212\7C\2\2\u0212\u0213\7[\2\2\u0213\u008c\3\2\2\2\u0214"+ - "\u0215\7Z\2\2\u0215\u0216\7[\2\2\u0216\u008e\3\2\2\2\u0217\u0218\7R\2"+ - "\2\u0218\u0219\7e\2\2\u0219\u0090\3\2\2\2\u021a\u021b\7R\2\2\u021b\u021c"+ - "\7|\2\2\u021c\u0092\3\2\2\2\u021d\u021e\7R\2\2\u021e\u021f\7p\2\2\u021f"+ - "\u0094\3\2\2\2\u0220\u0221\7R\2\2\u0221\u0222\7x\2\2\u0222\u0096\3\2\2"+ - "\2\u0223\u0224\7\60\2\2\u0224\u0225\7y\2\2\u0225\u0098\3\2\2\2\u0226\u0227"+ - "\7v\2\2\u0227\u0228\7t\2\2\u0228\u0229\7w\2\2\u0229\u022a\7g\2\2\u022a"+ - "\u009a\3\2\2\2\u022b\u022c\7h\2\2\u022c\u022d\7c\2\2\u022d\u022e\7n\2"+ - "\2\u022e\u022f\7u\2\2\u022f\u0230\7g\2\2\u0230\u009c\3\2\2\2\u0231\u0232"+ - "\7\'\2\2\u0232\u0233\7c\2\2\u0233\u0234\7u\2\2\u0234\u0235\7o\2\2\u0235"+ - "\u009e\3\2\2\2\u0236\u0237\7u\2\2\u0237\u0238\7w\2\2\u0238\u0239\7d\2"+ - "\2\u0239\u00a0\3\2\2\2\u023a\u023b\7/\2\2\u023b\u023c\7@\2\2\u023c\u00a2"+ - "\3\2\2\2\u023d\u023e\7}\2\2\u023e\u00a4\3\2\2\2\u023f\u0240\7\177\2\2"+ - "\u0240\u00a6\3\2\2\2\u0241\u0242\7c\2\2\u0242\u0243\7u\2\2\u0243\u0244"+ - "\7o\2\2\u0244\u0245\7u\2\2\u0245\u0246\7w\2\2\u0246\u0247\7d\2\2\u0247"+ - "\u00a8\3\2\2\2\u0248\u0249\7e\2\2\u0249\u024a\7n\2\2\u024a\u024b\7q\2"+ - "\2\u024b\u024c\7d\2\2\u024c\u024d\7d\2\2\u024d\u024e\7g\2\2\u024e\u024f"+ - "\7t\2\2\u024f\u0250\7u\2\2\u0250\u00aa\3\2\2\2\u0251\u0252\7B\2\2\u0252"+ - "\u00ac\3\2\2\2\u0253\u0254\7k\2\2\u0254\u0255\7h\2\2\u0255\u00ae\3\2\2"+ - "\2\u0256\u0257\7g\2\2\u0257\u0258\7n\2\2\u0258\u0259\7u\2\2\u0259\u025a"+ - "\7g\2\2\u025a\u00b0\3\2\2\2\u025b\u025c\7k\2\2\u025c\u025d\7h\2\2\u025d"+ - "\u025e\7a\2\2\u025e\u025f\7e\2\2\u025f\u0260\7u\2\2\u0260\u00b2\3\2\2"+ - "\2\u0261\u0262\7k\2\2\u0262\u0263\7h\2\2\u0263\u0264\7a\2\2\u0264\u0265"+ - "\7e\2\2\u0265\u0266\7e\2\2\u0266\u00b4\3\2\2\2\u0267\u0268\7k\2\2\u0268"+ - "\u0269\7h\2\2\u0269\u026a\7a\2\2\u026a\u026b\7g\2\2\u026b\u026c\7s\2\2"+ - "\u026c\u00b6\3\2\2\2\u026d\u026e\7k\2\2\u026e\u026f\7h\2\2\u026f\u0270"+ - "\7a\2\2\u0270\u0271\7|\2\2\u0271\u00b8\3\2\2\2\u0272\u0273\7k\2\2\u0273"+ - "\u0274\7h\2\2\u0274\u0275\7a\2\2\u0275\u0276\7p\2\2\u0276\u0277\7g\2\2"+ - "\u0277\u00ba\3\2\2\2\u0278\u0279\7k\2\2\u0279\u027a\7h\2\2\u027a\u027b"+ - "\7a\2\2\u027b\u027c\7p\2\2\u027c\u027d\7|\2\2\u027d\u00bc\3\2\2\2\u027e"+ - "\u027f\7k\2\2\u027f\u0280\7h\2\2\u0280\u0281\7a\2\2\u0281\u0282\7r\2\2"+ - "\u0282\u0283\7n\2\2\u0283\u00be\3\2\2\2\u0284\u0285\7k\2\2\u0285\u0286"+ - "\7h\2\2\u0286\u0287\7a\2\2\u0287\u0288\7r\2\2\u0288\u0289\7q\2\2\u0289"+ - "\u028a\7u\2\2\u028a\u00c0\3\2\2\2\u028b\u028c\7k\2\2\u028c\u028d\7h\2"+ - "\2\u028d\u028e\7a\2\2\u028e\u028f\7o\2\2\u028f\u0290\7k\2\2\u0290\u00c2"+ - "\3\2\2\2\u0291\u0292\7k\2\2\u0292\u0293\7h\2\2\u0293\u0294\7a\2\2\u0294"+ - "\u0295\7p\2\2\u0295\u0296\7g\2\2\u0296\u0297\7i\2\2\u0297\u00c4\3\2\2"+ - "\2\u0298\u0299\7k\2\2\u0299\u029a\7h\2\2\u029a\u029b\7a\2\2\u029b\u029c"+ - "\7x\2\2\u029c\u029d\7u\2\2\u029d\u00c6\3\2\2\2\u029e\u029f\7k\2\2\u029f"+ - "\u02a0\7h\2\2\u02a0\u02a1\7a\2\2\u02a1\u02a2\7x\2\2\u02a2\u02a3\7e\2\2"+ - "\u02a3\u00c8\3\2\2\2\u02a4\u02a5\7h\2\2\u02a5\u02a6\7q\2\2\u02a6\u02a7"+ - "\7t\2\2\u02a7\u00ca\3\2\2\2\u02a8\u02a9\7k\2\2\u02a9\u02aa\7p\2\2\u02aa"+ - "\u00cc\3\2\2\2\u02ab\u02ac\7y\2\2\u02ac\u02ad\7j\2\2\u02ad\u02ae\7k\2"+ - "\2\u02ae\u02af\7n\2\2\u02af\u02b0\7g\2\2\u02b0\u00ce\3\2\2\2\u02b1\u02b2"+ - "\7t\2\2\u02b2\u02b3\7g\2\2\u02b3\u02b4\7r\2\2\u02b4\u02b5\7g\2\2\u02b5"+ - "\u02b6\7c\2\2\u02b6\u02b7\7v\2\2\u02b7\u00d0\3\2\2\2\u02b8\u02b9\7w\2"+ - "\2\u02b9\u02ba\7p\2\2\u02ba\u02bb\7v\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd"+ - "\7n\2\2\u02bd\u00d2\3\2\2\2\u02be\u02c2\t\2\2\2\u02bf\u02c1\t\3\2\2\u02c0"+ - "\u02bf\3\2\2\2\u02c1\u02c4\3\2\2\2\u02c2\u02c0\3\2\2\2\u02c2\u02c3\3\2"+ - "\2\2\u02c3\u02c5\3\2\2\2\u02c4\u02c2\3\2\2\2\u02c5\u02c6\5\u00d5k\2\u02c6"+ - "\u02c7\3\2\2\2\u02c7\u02c8\bj\2\2\u02c8\u00d4\3\2\2\2\u02c9\u02cd\7=\2"+ - "\2\u02ca\u02cc\n\2\2\2\u02cb\u02ca\3\2\2\2\u02cc\u02cf\3\2\2\2\u02cd\u02cb"+ - "\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce\u02d0\3\2\2\2\u02cf\u02cd\3\2\2\2\u02d0"+ - "\u02d1\bk\2\2\u02d1\u00d6\3\2\2\2\u02d2\u02d3\t\3\2\2\u02d3\u02d4\3\2"+ - "\2\2\u02d4\u02d5\bl\3\2\u02d5\u00d8\3\2\2\2\u02d6\u02d8\t\2\2\2\u02d7"+ - "\u02d6\3\2\2\2\u02d8\u02d9\3\2\2\2\u02d9\u02d7\3\2\2\2\u02d9\u02da\3\2"+ - "\2\2\u02da\u00da\3\2\2\2\u02db\u02df\t\4\2\2\u02dc\u02de\t\5\2\2\u02dd"+ - "\u02dc\3\2\2\2\u02de\u02e1\3\2\2\2\u02df\u02dd\3\2\2\2\u02df\u02e0\3\2"+ - "\2\2\u02e0\u00dc\3\2\2\2\u02e1\u02df\3\2\2\2\u02e2\u02ea\4\62;\2\u02e3"+ - "\u02e5\4\63;\2\u02e4\u02e6\4\62;\2\u02e5\u02e4\3\2\2\2\u02e6\u02e7\3\2"+ - "\2\2\u02e7\u02e5\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8\u02ea\3\2\2\2\u02e9"+ - "\u02e2\3\2\2\2\u02e9\u02e3\3\2\2\2\u02ea\u00de\3\2\2\2\u02eb\u02ed\7&"+ - "\2\2\u02ec\u02ee\t\6\2\2\u02ed\u02ec\3\2\2\2\u02ee\u02ef\3\2\2\2\u02ef"+ - "\u02ed\3\2\2\2\u02ef\u02f0\3\2\2\2\u02f0\u00e0\3\2\2\2\u02f1\u02f3\7\'"+ - "\2\2\u02f2\u02f4\4\62\63\2\u02f3\u02f2\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5"+ - "\u02f3\3\2\2\2\u02f5\u02f6\3\2\2\2\u02f6\u00e2\3\2\2\2\u02f7\u02fd\5\u00e5"+ - "s\2\u02f8\u02fa\t\7\2\2\u02f9\u02fb\t\b\2\2\u02fa\u02f9\3\2\2\2\u02fa"+ - "\u02fb\3\2\2\2\u02fb\u02fc\3\2\2\2\u02fc\u02fe\5\u00e5s\2\u02fd\u02f8"+ - "\3\2\2\2\u02fd\u02fe\3\2\2\2\u02fe\u00e4\3\2\2\2\u02ff\u0301\4\62;\2\u0300"+ - "\u02ff\3\2\2\2\u0301\u0302\3\2\2\2\u0302\u0300\3\2\2\2\u0302\u0303\3\2"+ - "\2\2\u0303\u030a\3\2\2\2\u0304\u0306\7\60\2\2\u0305\u0307\4\62;\2\u0306"+ - "\u0305\3\2\2\2\u0307\u0308\3\2\2\2\u0308\u0306\3\2\2\2\u0308\u0309\3\2"+ - "\2\2\u0309\u030b\3\2\2\2\u030a\u0304\3\2\2\2\u030a\u030b\3\2\2\2\u030b"+ - "\u00e6\3\2\2\2\u030c\u030d\7^\2\2\u030d\u0311\13\2\2\2\u030e\u030f\7^"+ - "\2\2\u030f\u0311\5\u00d9m\2\u0310\u030c\3\2\2\2\u0310\u030e\3\2\2\2\u0311"+ - "\u00e8\3\2\2\2\u0312\u0317\7$\2\2\u0313\u0316\5\u00e7t\2\u0314\u0316\n"+ - "\t\2\2\u0315\u0313\3\2\2\2\u0315\u0314\3\2\2\2\u0316\u0319\3\2\2\2\u0317"+ - "\u0315\3\2\2\2\u0317\u0318\3\2\2\2\u0318\u031a\3\2\2\2\u0319\u0317\3\2"+ - "\2\2\u031a\u031b\7$\2\2\u031b\u031c\bu\4\2\u031c\u00ea\3\2\2\2\u031d\u031e"+ - "\7}\2\2\u031e\u031f\7}\2\2\u031f\u0321\3\2\2\2\u0320\u0322\13\2\2\2\u0321"+ - "\u0320\3\2\2\2\u0322\u0323\3\2\2\2\u0323\u0324\3\2\2\2\u0323\u0321\3\2"+ - "\2\2\u0324\u0325\3\2\2\2\u0325\u0326\7\177\2\2\u0326\u0327\7\177\2\2\u0327"+ - "\u0328\3\2\2\2\u0328\u0329\bv\5\2\u0329\u00ec\3\2\2\2\u032a\u032d\7)\2"+ - "\2\u032b\u032e\5\u00e7t\2\u032c\u032e\n\t\2\2\u032d\u032b\3\2\2\2\u032d"+ - "\u032c\3\2\2\2\u032e\u032f\3\2\2\2\u032f\u0330\7)\2\2\u0330\u0331\bw\6"+ - "\2\u0331\u00ee\3\2\2\2\26\2\u02c2\u02cd\u02d9\u02df\u02e7\u02e9\u02ed"+ - "\u02ef\u02f5\u02fa\u02fd\u0302\u0308\u030a\u0310\u0315\u0317\u0323\u032d"+ - "\7\2\3\2\b\2\2\3u\2\3v\3\3w\4"; + "\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00eb\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef"+ + "\3\2\2\2\3\u00f1\3\2\2\2\5\u00f3\3\2\2\2\7\u00f5\3\2\2\2\t\u00fa\3\2\2"+ + "\2\13\u0102\3\2\2\2\r\u010c\3\2\2\2\17\u0116\3\2\2\2\21\u0122\3\2\2\2"+ + "\23\u012b\3\2\2\2\25\u0133\3\2\2\2\27\u013f\3\2\2\2\31\u014b\3\2\2\2\33"+ + "\u0156\3\2\2\2\35\u015e\3\2\2\2\37\u0160\3\2\2\2!\u0162\3\2\2\2#\u0168"+ + "\3\2\2\2%\u016f\3\2\2\2\'\u0174\3\2\2\2)\u0179\3\2\2\2+\u017f\3\2\2\2"+ + "-\u0183\3\2\2\2/\u0189\3\2\2\2\61\u018f\3\2\2\2\63\u0196\3\2\2\2\65\u0198"+ + "\3\2\2\2\67\u019a\3\2\2\29\u019d\3\2\2\2;\u01a0\3\2\2\2=\u01a3\3\2\2\2"+ + "?\u01a7\3\2\2\2A\u01aa\3\2\2\2C\u01ae\3\2\2\2E\u01b1\3\2\2\2G\u01b4\3"+ + "\2\2\2I\u01b7\3\2\2\2K\u01ba\3\2\2\2M\u01bd\3\2\2\2O\u01bf\3\2\2\2Q\u01c1"+ + "\3\2\2\2S\u01c3\3\2\2\2U\u01c5\3\2\2\2W\u01c8\3\2\2\2Y\u01ca\3\2\2\2["+ + "\u01cc\3\2\2\2]\u01cf\3\2\2\2_\u01d1\3\2\2\2a\u01d3\3\2\2\2c\u01d5\3\2"+ + "\2\2e\u01d8\3\2\2\2g\u01db\3\2\2\2i\u01de\3\2\2\2k\u01e1\3\2\2\2m\u01e3"+ + "\3\2\2\2o\u01e5\3\2\2\2q\u01e7\3\2\2\2s\u01ea\3\2\2\2u\u01ef\3\2\2\2w"+ + "\u01f3\3\2\2\2y\u01f6\3\2\2\2{\u01fa\3\2\2\2}\u01fe\3\2\2\2\177\u0205"+ + "\3\2\2\2\u0081\u020b\3\2\2\2\u0083\u0214\3\2\2\2\u0085\u0216\3\2\2\2\u0087"+ + "\u0218\3\2\2\2\u0089\u021a\3\2\2\2\u008b\u021c\3\2\2\2\u008d\u021f\3\2"+ + "\2\2\u008f\u0222\3\2\2\2\u0091\u0225\3\2\2\2\u0093\u0228\3\2\2\2\u0095"+ + "\u022b\3\2\2\2\u0097\u022e\3\2\2\2\u0099\u0231\3\2\2\2\u009b\u0234\3\2"+ + "\2\2\u009d\u0239\3\2\2\2\u009f\u023f\3\2\2\2\u00a1\u0244\3\2\2\2\u00a3"+ + "\u0248\3\2\2\2\u00a5\u024b\3\2\2\2\u00a7\u024d\3\2\2\2\u00a9\u024f\3\2"+ + "\2\2\u00ab\u0256\3\2\2\2\u00ad\u025f\3\2\2\2\u00af\u0261\3\2\2\2\u00b1"+ + "\u0264\3\2\2\2\u00b3\u0269\3\2\2\2\u00b5\u026f\3\2\2\2\u00b7\u0275\3\2"+ + "\2\2\u00b9\u027b\3\2\2\2\u00bb\u0280\3\2\2\2\u00bd\u0286\3\2\2\2\u00bf"+ + "\u028c\3\2\2\2\u00c1\u0292\3\2\2\2\u00c3\u0299\3\2\2\2\u00c5\u029f\3\2"+ + "\2\2\u00c7\u02a6\3\2\2\2\u00c9\u02ac\3\2\2\2\u00cb\u02b2\3\2\2\2\u00cd"+ + "\u02b6\3\2\2\2\u00cf\u02b9\3\2\2\2\u00d1\u02bf\3\2\2\2\u00d3\u02c6\3\2"+ + "\2\2\u00d5\u02cc\3\2\2\2\u00d7\u02d7\3\2\2\2\u00d9\u02e0\3\2\2\2\u00db"+ + "\u02e5\3\2\2\2\u00dd\u02e9\3\2\2\2\u00df\u02f7\3\2\2\2\u00e1\u02f9\3\2"+ + "\2\2\u00e3\u02ff\3\2\2\2\u00e5\u0305\3\2\2\2\u00e7\u030e\3\2\2\2\u00e9"+ + "\u031e\3\2\2\2\u00eb\u0320\3\2\2\2\u00ed\u032b\3\2\2\2\u00ef\u0338\3\2"+ + "\2\2\u00f1\u00f2\7\u0080\2\2\u00f2\4\3\2\2\2\u00f3\u00f4\7<\2\2\u00f4"+ + "\6\3\2\2\2\u00f5\u00f6\7i\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7v\2\2\u00f8"+ + "\u00f9\7q\2\2\u00f9\b\3\2\2\2\u00fa\u00fb\7\'\2\2\u00fb\u00fc\7q\2\2\u00fc"+ + "\u00fd\7w\2\2\u00fd\u00fe\7v\2\2\u00fe\u00ff\7r\2\2\u00ff\u0100\7w\2\2"+ + "\u0100\u0101\7v\2\2\u0101\n\3\2\2\2\u0102\u0103\7\'\2\2\u0103\u0104\7"+ + "n\2\2\u0104\u0105\7c\2\2\u0105\u0106\7w\2\2\u0106\u0107\7p\2\2\u0107\u0108"+ + "\7e\2\2\u0108\u0109\7j\2\2\u0109\u010a\7g\2\2\u010a\u010b\7t\2\2\u010b"+ + "\f\3\2\2\2\u010c\u010d\7\'\2\2\u010d\u010e\7|\2\2\u010e\u010f\7g\2\2\u010f"+ + "\u0110\7t\2\2\u0110\u0111\7q\2\2\u0111\u0112\7r\2\2\u0112\u0113\7c\2\2"+ + "\u0113\u0114\7i\2\2\u0114\u0115\7g\2\2\u0115\16\3\2\2\2\u0116\u0117\7"+ + "\'\2\2\u0117\u0118\7|\2\2\u0118\u0119\7r\2\2\u0119\u011a\7t\2\2\u011a"+ + "\u011b\7g\2\2\u011b\u011c\7u\2\2\u011c\u011d\7g\2\2\u011d\u011e\7t\2\2"+ + "\u011e\u011f\7x\2\2\u011f\u0120\7g\2\2\u0120\u0121\7f\2\2\u0121\20\3\2"+ + "\2\2\u0122\u0123\7\'\2\2\u0123\u0124\7c\2\2\u0124\u0125\7f\2\2\u0125\u0126"+ + "\7f\2\2\u0126\u0127\7t\2\2\u0127\u0128\7g\2\2\u0128\u0129\7u\2\2\u0129"+ + "\u012a\7u\2\2\u012a\22\3\2\2\2\u012b\u012c\7\'\2\2\u012c\u012d\7k\2\2"+ + "\u012d\u012e\7o\2\2\u012e\u012f\7r\2\2\u012f\u0130\7q\2\2\u0130\u0131"+ + "\7t\2\2\u0131\u0132\7v\2\2\u0132\24\3\2\2\2\u0133\u0134\7\'\2\2\u0134"+ + "\u0135\7d\2\2\u0135\u0136\7t\2\2\u0136\u0137\7g\2\2\u0137\u0138\7c\2\2"+ + "\u0138\u0139\7m\2\2\u0139\u013a\7r\2\2\u013a\u013b\7q\2\2\u013b\u013c"+ + "\7k\2\2\u013c\u013d\7p\2\2\u013d\u013e\7v\2\2\u013e\26\3\2\2\2\u013f\u0140"+ + "\7\'\2\2\u0140\u0141\7c\2\2\u0141\u0142\7u\2\2\u0142\u0143\7o\2\2\u0143"+ + "\u0144\7k\2\2\u0144\u0145\7p\2\2\u0145\u0146\7e\2\2\u0146\u0147\7n\2\2"+ + "\u0147\u0148\7w\2\2\u0148\u0149\7f\2\2\u0149\u014a\7g\2\2\u014a\30\3\2"+ + "\2\2\u014b\u014c\7\'\2\2\u014c\u014d\7c\2\2\u014d\u014e\7u\2\2\u014e\u014f"+ + "\7o\2\2\u014f\u0150\7d\2\2\u0150\u0151\7k\2\2\u0151\u0152\7p\2\2\u0152"+ + "\u0153\7c\2\2\u0153\u0154\7t\2\2\u0154\u0155\7{\2\2\u0155\32\3\2\2\2\u0156"+ + "\u0157\7\'\2\2\u0157\u0158\7q\2\2\u0158\u0159\7r\2\2\u0159\u015a\7v\2"+ + "\2\u015a\u015b\7k\2\2\u015b\u015c\7q\2\2\u015c\u015d\7p\2\2\u015d\34\3"+ + "\2\2\2\u015e\u015f\7.\2\2\u015f\36\3\2\2\2\u0160\u0161\7?\2\2\u0161 \3"+ + "\2\2\2\u0162\u0163\7e\2\2\u0163\u0164\7q\2\2\u0164\u0165\7p\2\2\u0165"+ + "\u0166\7u\2\2\u0166\u0167\7v\2\2\u0167\"\3\2\2\2\u0168\u0169\7o\2\2\u0169"+ + "\u016a\7g\2\2\u016a\u016b\7o\2\2\u016b\u016c\7q\2\2\u016c\u016d\7t\2\2"+ + "\u016d\u016e\7{\2\2\u016e$\3\2\2\2\u016f\u0170\7d\2\2\u0170\u0171\7{\2"+ + "\2\u0171\u0172\7v\2\2\u0172\u0173\7g\2\2\u0173&\3\2\2\2\u0174\u0175\7"+ + "y\2\2\u0175\u0176\7q\2\2\u0176\u0177\7t\2\2\u0177\u0178\7f\2\2\u0178("+ + "\3\2\2\2\u0179\u017a\7h\2\2\u017a\u017b\7n\2\2\u017b\u017c\7q\2\2\u017c"+ + "\u017d\7c\2\2\u017d\u017e\7v\2\2\u017e*\3\2\2\2\u017f\u0180\7u\2\2\u0180"+ + "\u0181\7v\2\2\u0181\u0182\7t\2\2\u0182,\3\2\2\2\u0183\u0184\7u\2\2\u0184"+ + "\u0185\7v\2\2\u0185\u0186\7t\2\2\u0186\u0187\7a\2\2\u0187\u0188\7r\2\2"+ + "\u0188.\3\2\2\2\u0189\u018a\7u\2\2\u018a\u018b\7v\2\2\u018b\u018c\7t\2"+ + "\2\u018c\u018d\7a\2\2\u018d\u018e\7u\2\2\u018e\60\3\2\2\2\u018f\u0190"+ + "\7u\2\2\u0190\u0191\7v\2\2\u0191\u0192\7t\2\2\u0192\u0193\7a\2\2\u0193"+ + "\u0194\7r\2\2\u0194\u0195\7u\2\2\u0195\62\3\2\2\2\u0196\u0197\7]\2\2\u0197"+ + "\64\3\2\2\2\u0198\u0199\7_\2\2\u0199\66\3\2\2\2\u019a\u019b\7-\2\2\u019b"+ + "\u019c\7?\2\2\u019c8\3\2\2\2\u019d\u019e\7/\2\2\u019e\u019f\7?\2\2\u019f"+ + ":\3\2\2\2\u01a0\u01a1\7\61\2\2\u01a1\u01a2\7?\2\2\u01a2<\3\2\2\2\u01a3"+ + "\u01a4\7\61\2\2\u01a4\u01a5\7\61\2\2\u01a5\u01a6\7?\2\2\u01a6>\3\2\2\2"+ + "\u01a7\u01a8\7,\2\2\u01a8\u01a9\7?\2\2\u01a9@\3\2\2\2\u01aa\u01ab\7,\2"+ + "\2\u01ab\u01ac\7,\2\2\u01ac\u01ad\7?\2\2\u01adB\3\2\2\2\u01ae\u01af\7"+ + "(\2\2\u01af\u01b0\7?\2\2\u01b0D\3\2\2\2\u01b1\u01b2\7~\2\2\u01b2\u01b3"+ + "\7?\2\2\u01b3F\3\2\2\2\u01b4\u01b5\7`\2\2\u01b5\u01b6\7?\2\2\u01b6H\3"+ + "\2\2\2\u01b7\u01b8\7-\2\2\u01b8\u01b9\7-\2\2\u01b9J\3\2\2\2\u01ba\u01bb"+ + "\7/\2\2\u01bb\u01bc\7/\2\2\u01bcL\3\2\2\2\u01bd\u01be\7*\2\2\u01beN\3"+ + "\2\2\2\u01bf\u01c0\7+\2\2\u01c0P\3\2\2\2\u01c1\u01c2\7-\2\2\u01c2R\3\2"+ + "\2\2\u01c3\u01c4\7/\2\2\u01c4T\3\2\2\2\u01c5\u01c6\7,\2\2\u01c6\u01c7"+ + "\7,\2\2\u01c7V\3\2\2\2\u01c8\u01c9\7,\2\2\u01c9X\3\2\2\2\u01ca\u01cb\7"+ + "\61\2\2\u01cbZ\3\2\2\2\u01cc\u01cd\7\61\2\2\u01cd\u01ce\7\61\2\2\u01ce"+ + "\\\3\2\2\2\u01cf\u01d0\7\'\2\2\u01d0^\3\2\2\2\u01d1\u01d2\7>\2\2\u01d2"+ + "`\3\2\2\2\u01d3\u01d4\7@\2\2\u01d4b\3\2\2\2\u01d5\u01d6\7>\2\2\u01d6\u01d7"+ + "\7?\2\2\u01d7d\3\2\2\2\u01d8\u01d9\7@\2\2\u01d9\u01da\7?\2\2\u01daf\3"+ + "\2\2\2\u01db\u01dc\7?\2\2\u01dc\u01dd\7?\2\2\u01ddh\3\2\2\2\u01de\u01df"+ + "\7#\2\2\u01df\u01e0\7?\2\2\u01e0j\3\2\2\2\u01e1\u01e2\7(\2\2\u01e2l\3"+ + "\2\2\2\u01e3\u01e4\7`\2\2\u01e4n\3\2\2\2\u01e5\u01e6\7~\2\2\u01e6p\3\2"+ + "\2\2\u01e7\u01e8\7v\2\2\u01e8\u01e9\7q\2\2\u01e9r\3\2\2\2\u01ea\u01eb"+ + "\7u\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7g\2\2\u01ed\u01ee\7r\2\2\u01ee"+ + "t\3\2\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7p\2\2\u01f1\u01f2\7f\2\2\u01f2"+ + "v\3\2\2\2\u01f3\u01f4\7q\2\2\u01f4\u01f5\7t\2\2\u01f5x\3\2\2\2\u01f6\u01f7"+ + "\7z\2\2\u01f7\u01f8\7q\2\2\u01f8\u01f9\7t\2\2\u01f9z\3\2\2\2\u01fa\u01fb"+ + "\7p\2\2\u01fb\u01fc\7q\2\2\u01fc\u01fd\7v\2\2\u01fd|\3\2\2\2\u01fe\u01ff"+ + "\7t\2\2\u01ff\u0200\7g\2\2\u0200\u0201\7v\2\2\u0201\u0202\7w\2\2\u0202"+ + "\u0203\7t\2\2\u0203\u0204\7p\2\2\u0204~\3\2\2\2\u0205\u0206\7d\2\2\u0206"+ + "\u0207\7t\2\2\u0207\u0208\7g\2\2\u0208\u0209\7c\2\2\u0209\u020a\7m\2\2"+ + "\u020a\u0080\3\2\2\2\u020b\u020c\7e\2\2\u020c\u020d\7q\2\2\u020d\u020e"+ + "\7p\2\2\u020e\u020f\7v\2\2\u020f\u0210\7k\2\2\u0210\u0211\7p\2\2\u0211"+ + "\u0212\7w\2\2\u0212\u0213\7g\2\2\u0213\u0082\3\2\2\2\u0214\u0215\7\60"+ + "\2\2\u0215\u0084\3\2\2\2\u0216\u0217\7C\2\2\u0217\u0086\3\2\2\2\u0218"+ + "\u0219\7Z\2\2\u0219\u0088\3\2\2\2\u021a\u021b\7[\2\2\u021b\u008a\3\2\2"+ + "\2\u021c\u021d\7C\2\2\u021d\u021e\7Z\2\2\u021e\u008c\3\2\2\2\u021f\u0220"+ + "\7C\2\2\u0220\u0221\7[\2\2\u0221\u008e\3\2\2\2\u0222\u0223\7Z\2\2\u0223"+ + "\u0224\7[\2\2\u0224\u0090\3\2\2\2\u0225\u0226\7R\2\2\u0226\u0227\7e\2"+ + "\2\u0227\u0092\3\2\2\2\u0228\u0229\7R\2\2\u0229\u022a\7|\2\2\u022a\u0094"+ + "\3\2\2\2\u022b\u022c\7R\2\2\u022c\u022d\7p\2\2\u022d\u0096\3\2\2\2\u022e"+ + "\u022f\7R\2\2\u022f\u0230\7x\2\2\u0230\u0098\3\2\2\2\u0231\u0232\7\60"+ + "\2\2\u0232\u0233\7y\2\2\u0233\u009a\3\2\2\2\u0234\u0235\7v\2\2\u0235\u0236"+ + "\7t\2\2\u0236\u0237\7w\2\2\u0237\u0238\7g\2\2\u0238\u009c\3\2\2\2\u0239"+ + "\u023a\7h\2\2\u023a\u023b\7c\2\2\u023b\u023c\7n\2\2\u023c\u023d\7u\2\2"+ + "\u023d\u023e\7g\2\2\u023e\u009e\3\2\2\2\u023f\u0240\7\'\2\2\u0240\u0241"+ + "\7c\2\2\u0241\u0242\7u\2\2\u0242\u0243\7o\2\2\u0243\u00a0\3\2\2\2\u0244"+ + "\u0245\7u\2\2\u0245\u0246\7w\2\2\u0246\u0247\7d\2\2\u0247\u00a2\3\2\2"+ + "\2\u0248\u0249\7/\2\2\u0249\u024a\7@\2\2\u024a\u00a4\3\2\2\2\u024b\u024c"+ + "\7}\2\2\u024c\u00a6\3\2\2\2\u024d\u024e\7\177\2\2\u024e\u00a8\3\2\2\2"+ + "\u024f\u0250\7c\2\2\u0250\u0251\7u\2\2\u0251\u0252\7o\2\2\u0252\u0253"+ + "\7u\2\2\u0253\u0254\7w\2\2\u0254\u0255\7d\2\2\u0255\u00aa\3\2\2\2\u0256"+ + "\u0257\7e\2\2\u0257\u0258\7n\2\2\u0258\u0259\7q\2\2\u0259\u025a\7d\2\2"+ + "\u025a\u025b\7d\2\2\u025b\u025c\7g\2\2\u025c\u025d\7t\2\2\u025d\u025e"+ + "\7u\2\2\u025e\u00ac\3\2\2\2\u025f\u0260\7B\2\2\u0260\u00ae\3\2\2\2\u0261"+ + "\u0262\7k\2\2\u0262\u0263\7h\2\2\u0263\u00b0\3\2\2\2\u0264\u0265\7g\2"+ + "\2\u0265\u0266\7n\2\2\u0266\u0267\7u\2\2\u0267\u0268\7g\2\2\u0268\u00b2"+ + "\3\2\2\2\u0269\u026a\7k\2\2\u026a\u026b\7h\2\2\u026b\u026c\7a\2\2\u026c"+ + "\u026d\7e\2\2\u026d\u026e\7u\2\2\u026e\u00b4\3\2\2\2\u026f\u0270\7k\2"+ + "\2\u0270\u0271\7h\2\2\u0271\u0272\7a\2\2\u0272\u0273\7e\2\2\u0273\u0274"+ + "\7e\2\2\u0274\u00b6\3\2\2\2\u0275\u0276\7k\2\2\u0276\u0277\7h\2\2\u0277"+ + "\u0278\7a\2\2\u0278\u0279\7g\2\2\u0279\u027a\7s\2\2\u027a\u00b8\3\2\2"+ + "\2\u027b\u027c\7k\2\2\u027c\u027d\7h\2\2\u027d\u027e\7a\2\2\u027e\u027f"+ + "\7|\2\2\u027f\u00ba\3\2\2\2\u0280\u0281\7k\2\2\u0281\u0282\7h\2\2\u0282"+ + "\u0283\7a\2\2\u0283\u0284\7p\2\2\u0284\u0285\7g\2\2\u0285\u00bc\3\2\2"+ + "\2\u0286\u0287\7k\2\2\u0287\u0288\7h\2\2\u0288\u0289\7a\2\2\u0289\u028a"+ + "\7p\2\2\u028a\u028b\7|\2\2\u028b\u00be\3\2\2\2\u028c\u028d\7k\2\2\u028d"+ + "\u028e\7h\2\2\u028e\u028f\7a\2\2\u028f\u0290\7r\2\2\u0290\u0291\7n\2\2"+ + "\u0291\u00c0\3\2\2\2\u0292\u0293\7k\2\2\u0293\u0294\7h\2\2\u0294\u0295"+ + "\7a\2\2\u0295\u0296\7r\2\2\u0296\u0297\7q\2\2\u0297\u0298\7u\2\2\u0298"+ + "\u00c2\3\2\2\2\u0299\u029a\7k\2\2\u029a\u029b\7h\2\2\u029b\u029c\7a\2"+ + "\2\u029c\u029d\7o\2\2\u029d\u029e\7k\2\2\u029e\u00c4\3\2\2\2\u029f\u02a0"+ + "\7k\2\2\u02a0\u02a1\7h\2\2\u02a1\u02a2\7a\2\2\u02a2\u02a3\7p\2\2\u02a3"+ + "\u02a4\7g\2\2\u02a4\u02a5\7i\2\2\u02a5\u00c6\3\2\2\2\u02a6\u02a7\7k\2"+ + "\2\u02a7\u02a8\7h\2\2\u02a8\u02a9\7a\2\2\u02a9\u02aa\7x\2\2\u02aa\u02ab"+ + "\7u\2\2\u02ab\u00c8\3\2\2\2\u02ac\u02ad\7k\2\2\u02ad\u02ae\7h\2\2\u02ae"+ + "\u02af\7a\2\2\u02af\u02b0\7x\2\2\u02b0\u02b1\7e\2\2\u02b1\u00ca\3\2\2"+ + "\2\u02b2\u02b3\7h\2\2\u02b3\u02b4\7q\2\2\u02b4\u02b5\7t\2\2\u02b5\u00cc"+ + "\3\2\2\2\u02b6\u02b7\7k\2\2\u02b7\u02b8\7p\2\2\u02b8\u00ce\3\2\2\2\u02b9"+ + "\u02ba\7y\2\2\u02ba\u02bb\7j\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd\7n\2\2"+ + "\u02bd\u02be\7g\2\2\u02be\u00d0\3\2\2\2\u02bf\u02c0\7t\2\2\u02c0\u02c1"+ + "\7g\2\2\u02c1\u02c2\7r\2\2\u02c2\u02c3\7g\2\2\u02c3\u02c4\7c\2\2\u02c4"+ + "\u02c5\7v\2\2\u02c5\u00d2\3\2\2\2\u02c6\u02c7\7w\2\2\u02c7\u02c8\7p\2"+ + "\2\u02c8\u02c9\7v\2\2\u02c9\u02ca\7k\2\2\u02ca\u02cb\7n\2\2\u02cb\u00d4"+ + "\3\2\2\2\u02cc\u02d0\t\2\2\2\u02cd\u02cf\t\3\2\2\u02ce\u02cd\3\2\2\2\u02cf"+ + "\u02d2\3\2\2\2\u02d0\u02ce\3\2\2\2\u02d0\u02d1\3\2\2\2\u02d1\u02d3\3\2"+ + "\2\2\u02d2\u02d0\3\2\2\2\u02d3\u02d4\5\u00d7l\2\u02d4\u02d5\3\2\2\2\u02d5"+ + "\u02d6\bk\2\2\u02d6\u00d6\3\2\2\2\u02d7\u02db\7=\2\2\u02d8\u02da\n\2\2"+ + "\2\u02d9\u02d8\3\2\2\2\u02da\u02dd\3\2\2\2\u02db\u02d9\3\2\2\2\u02db\u02dc"+ + "\3\2\2\2\u02dc\u02de\3\2\2\2\u02dd\u02db\3\2\2\2\u02de\u02df\bl\2\2\u02df"+ + "\u00d8\3\2\2\2\u02e0\u02e1\t\3\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\bm"+ + "\3\2\u02e3\u00da\3\2\2\2\u02e4\u02e6\t\2\2\2\u02e5\u02e4\3\2\2\2\u02e6"+ + "\u02e7\3\2\2\2\u02e7\u02e5\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8\u00dc\3\2"+ + "\2\2\u02e9\u02ed\t\4\2\2\u02ea\u02ec\t\5\2\2\u02eb\u02ea\3\2\2\2\u02ec"+ + "\u02ef\3\2\2\2\u02ed\u02eb\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ee\u00de\3\2"+ + "\2\2\u02ef\u02ed\3\2\2\2\u02f0\u02f8\4\62;\2\u02f1\u02f3\4\63;\2\u02f2"+ + "\u02f4\4\62;\2\u02f3\u02f2\3\2\2\2\u02f4\u02f5\3\2\2\2\u02f5\u02f3\3\2"+ + "\2\2\u02f5\u02f6\3\2\2\2\u02f6\u02f8\3\2\2\2\u02f7\u02f0\3\2\2\2\u02f7"+ + "\u02f1\3\2\2\2\u02f8\u00e0\3\2\2\2\u02f9\u02fb\7&\2\2\u02fa\u02fc\t\6"+ + "\2\2\u02fb\u02fa\3\2\2\2\u02fc\u02fd\3\2\2\2\u02fd\u02fb\3\2\2\2\u02fd"+ + "\u02fe\3\2\2\2\u02fe\u00e2\3\2\2\2\u02ff\u0301\7\'\2\2\u0300\u0302\4\62"+ + "\63\2\u0301\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u0301\3\2\2\2\u0303"+ + "\u0304\3\2\2\2\u0304\u00e4\3\2\2\2\u0305\u030b\5\u00e7t\2\u0306\u0308"+ + "\t\7\2\2\u0307\u0309\t\b\2\2\u0308\u0307\3\2\2\2\u0308\u0309\3\2\2\2\u0309"+ + "\u030a\3\2\2\2\u030a\u030c\5\u00e7t\2\u030b\u0306\3\2\2\2\u030b\u030c"+ + "\3\2\2\2\u030c\u00e6\3\2\2\2\u030d\u030f\4\62;\2\u030e\u030d\3\2\2\2\u030f"+ + "\u0310\3\2\2\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0318\3\2"+ + "\2\2\u0312\u0314\7\60\2\2\u0313\u0315\4\62;\2\u0314\u0313\3\2\2\2\u0315"+ + "\u0316\3\2\2\2\u0316\u0314\3\2\2\2\u0316\u0317\3\2\2\2\u0317\u0319\3\2"+ + "\2\2\u0318\u0312\3\2\2\2\u0318\u0319\3\2\2\2\u0319\u00e8\3\2\2\2\u031a"+ + "\u031b\7^\2\2\u031b\u031f\13\2\2\2\u031c\u031d\7^\2\2\u031d\u031f\5\u00db"+ + "n\2\u031e\u031a\3\2\2\2\u031e\u031c\3\2\2\2\u031f\u00ea\3\2\2\2\u0320"+ + "\u0325\7$\2\2\u0321\u0324\5\u00e9u\2\u0322\u0324\n\t\2\2\u0323\u0321\3"+ + "\2\2\2\u0323\u0322\3\2\2\2\u0324\u0327\3\2\2\2\u0325\u0323\3\2\2\2\u0325"+ + "\u0326\3\2\2\2\u0326\u0328\3\2\2\2\u0327\u0325\3\2\2\2\u0328\u0329\7$"+ + "\2\2\u0329\u032a\bv\4\2\u032a\u00ec\3\2\2\2\u032b\u032c\7}\2\2\u032c\u032d"+ + "\7}\2\2\u032d\u032f\3\2\2\2\u032e\u0330\13\2\2\2\u032f\u032e\3\2\2\2\u0330"+ + "\u0331\3\2\2\2\u0331\u0332\3\2\2\2\u0331\u032f\3\2\2\2\u0332\u0333\3\2"+ + "\2\2\u0333\u0334\7\177\2\2\u0334\u0335\7\177\2\2\u0335\u0336\3\2\2\2\u0336"+ + "\u0337\bw\5\2\u0337\u00ee\3\2\2\2\u0338\u033b\7)\2\2\u0339\u033c\5\u00e9"+ + "u\2\u033a\u033c\n\t\2\2\u033b\u0339\3\2\2\2\u033b\u033a\3\2\2\2\u033c"+ + "\u033d\3\2\2\2\u033d\u033e\7)\2\2\u033e\u033f\bx\6\2\u033f\u00f0\3\2\2"+ + "\2\26\2\u02d0\u02db\u02e7\u02ed\u02f5\u02f7\u02fb\u02fd\u0303\u0308\u030b"+ + "\u0310\u0316\u0318\u031e\u0323\u0325\u0331\u033b\7\2\3\2\b\2\2\3v\2\3"+ + "w\3\3x\4"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/compiler/src/prog8/parser/prog8Parser.java b/compiler/src/prog8/parser/prog8Parser.java index ec5434832..11274e923 100644 --- a/compiler/src/prog8/parser/prog8Parser.java +++ b/compiler/src/prog8/parser/prog8Parser.java @@ -1,15 +1,13 @@ // Generated from /home/irmen/Projects/prog8/compiler/antlr/prog8.g4 by ANTLR 4.7 package prog8.parser; - -import org.antlr.v4.runtime.*; -import org.antlr.v4.runtime.atn.ATN; -import org.antlr.v4.runtime.atn.ATNDeserializer; -import org.antlr.v4.runtime.atn.ParserATNSimulator; -import org.antlr.v4.runtime.atn.PredictionContextCache; +import org.antlr.v4.runtime.atn.*; import org.antlr.v4.runtime.dfa.DFA; -import org.antlr.v4.runtime.tree.TerminalNode; - +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class prog8Parser extends Parser { @@ -33,9 +31,9 @@ public class prog8Parser extends Parser { T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87, T__87=88, T__88=89, T__89=90, T__90=91, T__91=92, T__92=93, T__93=94, T__94=95, T__95=96, T__96=97, T__97=98, T__98=99, T__99=100, T__100=101, - T__101=102, T__102=103, T__103=104, LINECOMMENT=105, COMMENT=106, WS=107, - EOL=108, NAME=109, DEC_INTEGER=110, HEX_INTEGER=111, BIN_INTEGER=112, - FLOAT_NUMBER=113, STRING=114, INLINEASMBLOCK=115, SINGLECHAR=116; + T__101=102, T__102=103, T__103=104, T__104=105, LINECOMMENT=106, COMMENT=107, + WS=108, EOL=109, NAME=110, DEC_INTEGER=111, HEX_INTEGER=112, BIN_INTEGER=113, + FLOAT_NUMBER=114, STRING=115, INLINEASMBLOCK=116, SINGLECHAR=117; public static final int RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7, @@ -71,19 +69,19 @@ public class prog8Parser extends Parser { private static final String[] _LITERAL_NAMES = { null, "'~'", "':'", "'goto'", "'%output'", "'%launcher'", "'%zeropage'", - "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", - "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", - "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", - "'-='", "'/='", "'//='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", - "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'//'", "'%'", - "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", - "'step'", "'and'", "'or'", "'xor'", "'not'", "'return'", "'break'", "'continue'", - "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", - "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", "'sub'", "'->'", "'{'", - "'}'", "'asmsub'", "'clobbers'", "'@'", "'if'", "'else'", "'if_cs'", "'if_cc'", - "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", "'if_pl'", "'if_pos'", "'if_mi'", - "'if_neg'", "'if_vs'", "'if_vc'", "'for'", "'in'", "'while'", "'repeat'", - "'until'" + "'%zpreserved'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", + "'%asmbinary'", "'%option'", "','", "'='", "'const'", "'memory'", "'byte'", + "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", + "']'", "'+='", "'-='", "'/='", "'//='", "'*='", "'**='", "'&='", "'|='", + "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", + "'//'", "'%'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", + "'|'", "'to'", "'step'", "'and'", "'or'", "'xor'", "'not'", "'return'", + "'break'", "'continue'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", + "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'.w'", "'true'", "'false'", "'%asm'", + "'sub'", "'->'", "'{'", "'}'", "'asmsub'", "'clobbers'", "'@'", "'if'", + "'else'", "'if_cs'", "'if_cc'", "'if_eq'", "'if_z'", "'if_ne'", "'if_nz'", + "'if_pl'", "'if_pos'", "'if_mi'", "'if_neg'", "'if_vs'", "'if_vc'", "'for'", + "'in'", "'while'", "'repeat'", "'until'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -94,9 +92,9 @@ public class prog8Parser extends Parser { null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT", - "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", - "STRING", "INLINEASMBLOCK", "SINGLECHAR" + null, null, null, null, null, null, null, null, null, null, "LINECOMMENT", + "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", + "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", "SINGLECHAR" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -175,7 +173,7 @@ public class prog8Parser extends Parser { setState(122); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11))) != 0) || _la==EOL) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12))) != 0) || _la==EOL) { { setState(120); _errHandler.sync(this); @@ -190,6 +188,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: + case T__12: { setState(118); modulestatement(); @@ -253,6 +252,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: + case T__12: enterOuterAlt(_localctx, 1); { setState(127); @@ -312,7 +312,7 @@ public class prog8Parser extends Parser { setState(134); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (DEC_INTEGER - 110)) | (1L << (HEX_INTEGER - 110)) | (1L << (BIN_INTEGER - 110)))) != 0)) { + if (((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (DEC_INTEGER - 111)) | (1L << (HEX_INTEGER - 111)) | (1L << (BIN_INTEGER - 111)))) != 0)) { { setState(133); integerliteral(); @@ -699,7 +699,7 @@ public class prog8Parser extends Parser { setState(172); ((DirectiveContext)_localctx).directivename = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12))) != 0)) ) { ((DirectiveContext)_localctx).directivename = (Token)_errHandler.recoverInline(this); } else { @@ -731,11 +731,11 @@ public class prog8Parser extends Parser { setState(181); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(177); - match(T__12); + match(T__13); setState(178); directivearg(); } @@ -849,7 +849,7 @@ public class prog8Parser extends Parser { setState(193); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__23) { + if (_la==T__24) { { setState(192); arrayspec(); @@ -902,7 +902,7 @@ public class prog8Parser extends Parser { setState(199); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__23) { + if (_la==T__24) { { setState(198); arrayspec(); @@ -912,7 +912,7 @@ public class prog8Parser extends Parser { setState(201); identifier(); setState(202); - match(T__13); + match(T__14); setState(203); expression(0); } @@ -945,7 +945,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(205); - match(T__14); + match(T__15); setState(206); varinitializer(); } @@ -978,7 +978,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(208); - match(T__15); + match(T__16); setState(209); varinitializer(); } @@ -1010,7 +1010,7 @@ public class prog8Parser extends Parser { { setState(211); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -1052,23 +1052,23 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(213); - match(T__23); + match(T__24); setState(214); expression(0); setState(217); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__12) { + if (_la==T__13) { { setState(215); - match(T__12); + match(T__13); setState(216); expression(0); } } setState(219); - match(T__24); + match(T__25); } } catch (RecognitionException re) { @@ -1104,7 +1104,7 @@ public class prog8Parser extends Parser { setState(221); assign_target(); setState(222); - match(T__13); + match(T__14); setState(223); expression(0); } @@ -1146,7 +1146,7 @@ public class prog8Parser extends Parser { setState(226); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34))) != 0)) ) { ((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1259,7 +1259,7 @@ public class prog8Parser extends Parser { setState(236); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__34 || _la==T__35) ) { + if ( !(_la==T__35 || _la==T__36) ) { ((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1340,11 +1340,11 @@ public class prog8Parser extends Parser { case 1: { setState(239); - match(T__36); + match(T__37); setState(240); expression(0); setState(241); - match(T__37); + match(T__38); } break; case 2: @@ -1358,7 +1358,7 @@ public class prog8Parser extends Parser { setState(244); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__38) | (1L << T__39))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__39) | (1L << T__40))) != 0)) ) { ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this); } else { @@ -1373,7 +1373,7 @@ public class prog8Parser extends Parser { case 4: { setState(246); - ((ExpressionContext)_localctx).prefix = match(T__59); + ((ExpressionContext)_localctx).prefix = match(T__60); setState(247); expression(6); } @@ -1430,7 +1430,7 @@ public class prog8Parser extends Parser { setState(255); if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(256); - ((ExpressionContext)_localctx).bop = match(T__40); + ((ExpressionContext)_localctx).bop = match(T__41); setState(257); ((ExpressionContext)_localctx).right = expression(19); } @@ -1446,7 +1446,7 @@ public class prog8Parser extends Parser { setState(259); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1469,7 +1469,7 @@ public class prog8Parser extends Parser { setState(262); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__38 || _la==T__39) ) { + if ( !(_la==T__39 || _la==T__40) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1492,7 +1492,7 @@ public class prog8Parser extends Parser { setState(265); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1515,7 +1515,7 @@ public class prog8Parser extends Parser { setState(268); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__49 || _la==T__50) ) { + if ( !(_la==T__50 || _la==T__51) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1536,7 +1536,7 @@ public class prog8Parser extends Parser { setState(270); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); setState(271); - ((ExpressionContext)_localctx).bop = match(T__51); + ((ExpressionContext)_localctx).bop = match(T__52); setState(272); ((ExpressionContext)_localctx).right = expression(14); } @@ -1550,7 +1550,7 @@ public class prog8Parser extends Parser { setState(273); if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); setState(274); - ((ExpressionContext)_localctx).bop = match(T__52); + ((ExpressionContext)_localctx).bop = match(T__53); setState(275); ((ExpressionContext)_localctx).right = expression(13); } @@ -1564,7 +1564,7 @@ public class prog8Parser extends Parser { setState(276); if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(277); - ((ExpressionContext)_localctx).bop = match(T__53); + ((ExpressionContext)_localctx).bop = match(T__54); setState(278); ((ExpressionContext)_localctx).right = expression(12); } @@ -1578,7 +1578,7 @@ public class prog8Parser extends Parser { setState(279); if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(280); - ((ExpressionContext)_localctx).bop = match(T__56); + ((ExpressionContext)_localctx).bop = match(T__57); setState(281); ((ExpressionContext)_localctx).right = expression(10); } @@ -1592,7 +1592,7 @@ public class prog8Parser extends Parser { setState(282); if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(283); - ((ExpressionContext)_localctx).bop = match(T__57); + ((ExpressionContext)_localctx).bop = match(T__58); setState(284); ((ExpressionContext)_localctx).right = expression(9); } @@ -1606,7 +1606,7 @@ public class prog8Parser extends Parser { setState(285); if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(286); - ((ExpressionContext)_localctx).bop = match(T__58); + ((ExpressionContext)_localctx).bop = match(T__59); setState(287); ((ExpressionContext)_localctx).right = expression(8); } @@ -1620,7 +1620,7 @@ public class prog8Parser extends Parser { setState(288); if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(289); - match(T__54); + match(T__55); setState(290); ((ExpressionContext)_localctx).rangeto = expression(0); setState(293); @@ -1629,7 +1629,7 @@ public class prog8Parser extends Parser { case 1: { setState(291); - match(T__55); + match(T__56); setState(292); ((ExpressionContext)_localctx).rangestep = expression(0); } @@ -1759,11 +1759,11 @@ public class prog8Parser extends Parser { break; } setState(311); - match(T__36); + match(T__37); setState(313); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__36) | (1L << T__38) | (1L << T__39) | (1L << T__59))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)) | (1L << (SINGLECHAR - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__37) | (1L << T__39) | (1L << T__40) | (1L << T__60))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__69 - 66)) | (1L << (T__70 - 66)) | (1L << (T__76 - 66)) | (1L << (T__77 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { { setState(312); expression_list(); @@ -1771,7 +1771,7 @@ public class prog8Parser extends Parser { } setState(315); - match(T__37); + match(T__38); } } catch (RecognitionException re) { @@ -1825,11 +1825,11 @@ public class prog8Parser extends Parser { break; } setState(321); - match(T__36); + match(T__37); setState(323); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__36) | (1L << T__38) | (1L << T__39) | (1L << T__59))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)) | (1L << (SINGLECHAR - 65)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__37) | (1L << T__39) | (1L << T__40) | (1L << T__60))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__69 - 66)) | (1L << (T__70 - 66)) | (1L << (T__76 - 66)) | (1L << (T__77 - 66)) | (1L << (NAME - 66)) | (1L << (DEC_INTEGER - 66)) | (1L << (HEX_INTEGER - 66)) | (1L << (BIN_INTEGER - 66)) | (1L << (FLOAT_NUMBER - 66)) | (1L << (STRING - 66)) | (1L << (SINGLECHAR - 66)))) != 0)) { { setState(322); expression_list(); @@ -1837,7 +1837,7 @@ public class prog8Parser extends Parser { } setState(325); - match(T__37); + match(T__38); } } catch (RecognitionException re) { @@ -1880,11 +1880,11 @@ public class prog8Parser extends Parser { setState(335); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(328); - match(T__12); + match(T__13); setState(330); _errHandler.sync(this); _la = _input.LA(1); @@ -1933,7 +1933,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(338); - match(T__60); + match(T__61); setState(340); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { @@ -1971,7 +1971,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(342); - match(T__61); + match(T__62); } } catch (RecognitionException re) { @@ -1999,7 +1999,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(344); - match(T__62); + match(T__63); } } catch (RecognitionException re) { @@ -2071,7 +2071,7 @@ public class prog8Parser extends Parser { { { setState(349); - match(T__63); + match(T__64); setState(350); match(NAME); } @@ -2113,7 +2113,7 @@ public class prog8Parser extends Parser { { setState(355); _la = _input.LA(1); - if ( !(((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)))) != 0)) ) { + if ( !(((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__69 - 66)) | (1L << (T__70 - 66)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2150,7 +2150,7 @@ public class prog8Parser extends Parser { { setState(357); _la = _input.LA(1); - if ( !(((((_la - 71)) & ~0x3f) == 0 && ((1L << (_la - 71)) & ((1L << (T__70 - 71)) | (1L << (T__71 - 71)) | (1L << (T__72 - 71)) | (1L << (T__73 - 71)))) != 0)) ) { + if ( !(((((_la - 72)) & ~0x3f) == 0 && ((1L << (_la - 72)) & ((1L << (T__71 - 72)) | (1L << (T__72 - 72)) | (1L << (T__73 - 72)) | (1L << (T__74 - 72)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -2195,7 +2195,7 @@ public class prog8Parser extends Parser { setState(359); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); - if ( !(((((_la - 110)) & ~0x3f) == 0 && ((1L << (_la - 110)) & ((1L << (DEC_INTEGER - 110)) | (1L << (HEX_INTEGER - 110)) | (1L << (BIN_INTEGER - 110)))) != 0)) ) { + if ( !(((((_la - 111)) & ~0x3f) == 0 && ((1L << (_la - 111)) & ((1L << (DEC_INTEGER - 111)) | (1L << (HEX_INTEGER - 111)) | (1L << (BIN_INTEGER - 111)))) != 0)) ) { ((IntegerliteralContext)_localctx).intpart = (Token)_errHandler.recoverInline(this); } else { @@ -2240,7 +2240,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(363); - match(T__74); + match(T__75); } } catch (RecognitionException re) { @@ -2270,7 +2270,7 @@ public class prog8Parser extends Parser { { setState(365); _la = _input.LA(1); - if ( !(_la==T__75 || _la==T__76) ) { + if ( !(_la==T__76 || _la==T__77) ) { _errHandler.recoverInline(this); } else { @@ -2316,7 +2316,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(367); - match(T__23); + match(T__24); setState(369); _errHandler.sync(this); _la = _input.LA(1); @@ -2332,11 +2332,11 @@ public class prog8Parser extends Parser { setState(379); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(372); - match(T__12); + match(T__13); setState(374); _errHandler.sync(this); _la = _input.LA(1); @@ -2366,7 +2366,7 @@ public class prog8Parser extends Parser { } setState(385); - match(T__24); + match(T__25); } } catch (RecognitionException re) { @@ -2508,15 +2508,15 @@ public class prog8Parser extends Parser { integerliteral(); } break; - case T__75: case T__76: + case T__77: enterOuterAlt(_localctx, 2); { setState(394); booleanliteral(); } break; - case T__23: + case T__24: enterOuterAlt(_localctx, 3); { setState(395); @@ -2574,7 +2574,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(401); - match(T__77); + match(T__78); setState(402); match(INLINEASMBLOCK); } @@ -2618,11 +2618,11 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(404); - match(T__78); + match(T__79); setState(405); identifier(); setState(406); - match(T__36); + match(T__37); setState(408); _errHandler.sync(this); _la = _input.LA(1); @@ -2634,11 +2634,11 @@ public class prog8Parser extends Parser { } setState(410); - match(T__37); + match(T__38); setState(412); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__79) { + if (_la==T__80) { { setState(411); sub_return_part(); @@ -2681,7 +2681,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(417); - match(T__79); + match(T__80); setState(418); sub_returns(); } @@ -2722,13 +2722,13 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(420); - match(T__80); + match(T__81); setState(421); match(EOL); setState(426); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__77 - 65)) | (1L << (T__78 - 65)) | (1L << (T__82 - 65)) | (1L << (T__85 - 65)) | (1L << (T__87 - 65)) | (1L << (T__88 - 65)) | (1L << (T__89 - 65)) | (1L << (T__90 - 65)) | (1L << (T__91 - 65)) | (1L << (T__92 - 65)) | (1L << (T__93 - 65)) | (1L << (T__94 - 65)) | (1L << (T__95 - 65)) | (1L << (T__96 - 65)) | (1L << (T__97 - 65)) | (1L << (T__98 - 65)) | (1L << (T__99 - 65)) | (1L << (T__101 - 65)) | (1L << (T__102 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__78 - 64)) | (1L << (T__79 - 64)) | (1L << (T__83 - 64)) | (1L << (T__86 - 64)) | (1L << (T__88 - 64)) | (1L << (T__89 - 64)) | (1L << (T__90 - 64)) | (1L << (T__91 - 64)) | (1L << (T__92 - 64)) | (1L << (T__93 - 64)) | (1L << (T__94 - 64)) | (1L << (T__95 - 64)) | (1L << (T__96 - 64)) | (1L << (T__97 - 64)) | (1L << (T__98 - 64)) | (1L << (T__99 - 64)) | (1L << (T__100 - 64)) | (1L << (T__102 - 64)) | (1L << (T__103 - 64)) | (1L << (EOL - 64)) | (1L << (NAME - 64)))) != 0)) { { setState(424); _errHandler.sync(this); @@ -2743,7 +2743,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -2752,20 +2752,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -2778,8 +2778,9 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(422); @@ -2801,7 +2802,7 @@ public class prog8Parser extends Parser { _la = _input.LA(1); } setState(429); - match(T__81); + match(T__82); } } catch (RecognitionException re) { @@ -2844,11 +2845,11 @@ public class prog8Parser extends Parser { setState(439); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(432); - match(T__12); + match(T__13); setState(434); _errHandler.sync(this); _la = _input.LA(1); @@ -2947,11 +2948,11 @@ public class prog8Parser extends Parser { setState(454); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(447); - match(T__12); + match(T__13); setState(449); _errHandler.sync(this); _la = _input.LA(1); @@ -3016,11 +3017,11 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(457); - match(T__82); + match(T__83); setState(458); identifier(); setState(459); - match(T__36); + match(T__37); setState(461); _errHandler.sync(this); _la = _input.LA(1); @@ -3032,17 +3033,17 @@ public class prog8Parser extends Parser { } setState(463); - match(T__37); + match(T__38); setState(464); - match(T__79); + match(T__80); setState(465); - match(T__83); + match(T__84); setState(466); - match(T__36); + match(T__37); setState(468); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__65 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)))) != 0)) { + if (((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (T__66 - 66)) | (1L << (T__67 - 66)) | (1L << (T__68 - 66)) | (1L << (T__69 - 66)) | (1L << (T__70 - 66)))) != 0)) { { setState(467); clobber(); @@ -3050,15 +3051,15 @@ public class prog8Parser extends Parser { } setState(470); - match(T__37); + match(T__38); setState(471); - match(T__79); + match(T__80); setState(472); - match(T__36); + match(T__37); setState(474); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { { setState(473); asmsub_returns(); @@ -3066,17 +3067,17 @@ public class prog8Parser extends Parser { } setState(476); - match(T__37); + match(T__38); setState(479); _errHandler.sync(this); switch (_input.LA(1)) { - case T__13: + case T__14: { setState(477); asmsub_address(); } break; - case T__80: + case T__81: { setState(478); statement_block(); @@ -3116,7 +3117,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(481); - match(T__13); + match(T__14); setState(482); ((Asmsub_addressContext)_localctx).address = integerliteral(); } @@ -3161,11 +3162,11 @@ public class prog8Parser extends Parser { setState(492); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(485); - match(T__12); + match(T__13); setState(487); _errHandler.sync(this); _la = _input.LA(1); @@ -3229,25 +3230,25 @@ public class prog8Parser extends Parser { setState(497); datatype(); setState(498); - match(T__84); + match(T__85); setState(501); _errHandler.sync(this); switch (_input.LA(1)) { - case T__64: case T__65: case T__66: case T__67: case T__68: case T__69: + case T__70: { setState(499); register(); } break; - case T__70: case T__71: case T__72: case T__73: + case T__74: { setState(500); statusregister(); @@ -3294,11 +3295,11 @@ public class prog8Parser extends Parser { setState(508); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(504); - match(T__12); + match(T__13); setState(505); register(); } @@ -3349,11 +3350,11 @@ public class prog8Parser extends Parser { setState(519); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__12) { + while (_la==T__13) { { { setState(512); - match(T__12); + match(T__13); setState(514); _errHandler.sync(this); _la = _input.LA(1); @@ -3410,25 +3411,25 @@ public class prog8Parser extends Parser { setState(522); datatype(); setState(523); - match(T__84); + match(T__85); setState(526); _errHandler.sync(this); switch (_input.LA(1)) { - case T__64: case T__65: case T__66: case T__67: case T__68: case T__69: + case T__70: { setState(524); register(); } break; - case T__70: case T__71: case T__72: case T__73: + case T__74: { setState(525); statusregister(); @@ -3481,7 +3482,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(528); - match(T__85); + match(T__86); setState(529); expression(0); setState(531); @@ -3507,7 +3508,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -3516,20 +3517,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -3542,15 +3543,16 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(533); statement(); } break; - case T__80: + case T__81: { setState(534); statement_block(); @@ -3572,7 +3574,7 @@ public class prog8Parser extends Parser { setState(541); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__86) { + if (_la==T__87) { { setState(540); else_part(); @@ -3616,7 +3618,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(545); - match(T__86); + match(T__87); setState(547); _errHandler.sync(this); _la = _input.LA(1); @@ -3640,7 +3642,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -3649,20 +3651,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -3675,15 +3677,16 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(549); statement(); } break; - case T__80: + case T__81: { setState(550); statement_block(); @@ -3760,7 +3763,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -3769,20 +3772,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -3795,15 +3798,16 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(557); statement(); } break; - case T__80: + case T__81: { setState(558); statement_block(); @@ -3825,7 +3829,7 @@ public class prog8Parser extends Parser { setState(565); _errHandler.sync(this); _la = _input.LA(1); - if (_la==T__86) { + if (_la==T__87) { { setState(564); else_part(); @@ -3863,7 +3867,7 @@ public class prog8Parser extends Parser { { setState(569); _la = _input.LA(1); - if ( !(((((_la - 88)) & ~0x3f) == 0 && ((1L << (_la - 88)) & ((1L << (T__87 - 88)) | (1L << (T__88 - 88)) | (1L << (T__89 - 88)) | (1L << (T__90 - 88)) | (1L << (T__91 - 88)) | (1L << (T__92 - 88)) | (1L << (T__93 - 88)) | (1L << (T__94 - 88)) | (1L << (T__95 - 88)) | (1L << (T__96 - 88)) | (1L << (T__97 - 88)) | (1L << (T__98 - 88)))) != 0)) ) { + if ( !(((((_la - 89)) & ~0x3f) == 0 && ((1L << (_la - 89)) & ((1L << (T__88 - 89)) | (1L << (T__89 - 89)) | (1L << (T__90 - 89)) | (1L << (T__91 - 89)) | (1L << (T__92 - 89)) | (1L << (T__93 - 89)) | (1L << (T__94 - 89)) | (1L << (T__95 - 89)) | (1L << (T__96 - 89)) | (1L << (T__97 - 89)) | (1L << (T__98 - 89)) | (1L << (T__99 - 89)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -3915,11 +3919,11 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(571); - match(T__99); + match(T__100); setState(573); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0)) { { setState(572); datatype(); @@ -3929,12 +3933,12 @@ public class prog8Parser extends Parser { setState(577); _errHandler.sync(this); switch (_input.LA(1)) { - case T__64: case T__65: case T__66: case T__67: case T__68: case T__69: + case T__70: { setState(575); register(); @@ -3950,7 +3954,7 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } setState(579); - match(T__100); + match(T__101); setState(580); expression(0); setState(582); @@ -4003,7 +4007,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(586); - match(T__101); + match(T__102); setState(587); expression(0); setState(589); @@ -4029,7 +4033,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -4038,20 +4042,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -4064,15 +4068,16 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(591); statement(); } break; - case T__80: + case T__81: { setState(592); statement_block(); @@ -4119,7 +4124,7 @@ public class prog8Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(595); - match(T__102); + match(T__103); setState(598); _errHandler.sync(this); switch (_input.LA(1)) { @@ -4133,7 +4138,7 @@ public class prog8Parser extends Parser { case T__9: case T__10: case T__11: - case T__14: + case T__12: case T__15: case T__16: case T__17: @@ -4142,20 +4147,20 @@ public class prog8Parser extends Parser { case T__20: case T__21: case T__22: - case T__60: + case T__23: case T__61: case T__62: - case T__64: + case T__63: case T__65: case T__66: case T__67: case T__68: case T__69: - case T__77: + case T__70: case T__78: - case T__82: - case T__85: - case T__87: + case T__79: + case T__83: + case T__86: case T__88: case T__89: case T__90: @@ -4168,15 +4173,16 @@ public class prog8Parser extends Parser { case T__97: case T__98: case T__99: - case T__101: + case T__100: case T__102: + case T__103: case NAME: { setState(596); statement(); } break; - case T__80: + case T__81: { setState(597); statement_block(); @@ -4196,7 +4202,7 @@ public class prog8Parser extends Parser { } setState(603); - match(T__103); + match(T__104); setState(604); expression(0); } @@ -4250,7 +4256,7 @@ public class prog8Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3v\u0261\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3w\u0261\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"+ @@ -4295,8 +4301,8 @@ public class prog8Parser extends Parser { "\3:\3:\5:\u0249\n:\3:\3:\3;\3;\3;\5;\u0250\n;\3;\3;\5;\u0254\n;\3<\3<"+ "\3<\5<\u0259\n<\3<\5<\u025c\n<\3<\3<\3<\3<\2\3&=\2\4\6\b\n\f\16\20\22"+ "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnp"+ - "rtv\2\20\3\2\6\16\3\2\23\31\3\2\34$\3\2%&\4\2\3\3)*\3\2,/\3\2)*\3\2\60"+ - "\63\3\2\64\65\3\2CH\3\2IL\3\2pr\3\2NO\3\2Ze\2\u0298\2|\3\2\2\2\4\u0083"+ + "rtv\2\20\3\2\6\17\3\2\24\32\3\2\35%\3\2&\'\4\2\3\3*+\3\2-\60\3\2*+\3\2"+ + "\61\64\3\2\65\66\3\2DI\3\2JM\3\2qs\3\2OP\3\2[f\2\u0298\2|\3\2\2\2\4\u0083"+ "\3\2\2\2\6\u0085\3\2\2\2\b\u00a3\3\2\2\2\n\u00a5\3\2\2\2\f\u00a8\3\2\2"+ "\2\16\u00ae\3\2\2\2\20\u00bf\3\2\2\2\22\u00c1\3\2\2\2\24\u00c7\3\2\2\2"+ "\26\u00cf\3\2\2\2\30\u00d2\3\2\2\2\32\u00d5\3\2\2\2\34\u00d7\3\2\2\2\36"+ @@ -4309,13 +4315,13 @@ public class prog8Parser extends Parser { "\3\2\2\2V\u01b1\3\2\2\2X\u01bc\3\2\2\2Z\u01c0\3\2\2\2\\\u01cb\3\2\2\2"+ "^\u01e3\3\2\2\2`\u01e6\3\2\2\2b\u01f1\3\2\2\2d\u01f9\3\2\2\2f\u0201\3"+ "\2\2\2h\u020c\3\2\2\2j\u0212\3\2\2\2l\u0223\3\2\2\2n\u022b\3\2\2\2p\u023b"+ - "\3\2\2\2r\u023d\3\2\2\2t\u024c\3\2\2\2v\u0255\3\2\2\2x{\5\4\3\2y{\7n\2"+ + "\3\2\2\2r\u023d\3\2\2\2t\u024c\3\2\2\2v\u0255\3\2\2\2x{\5\4\3\2y{\7o\2"+ "\2zx\3\2\2\2zy\3\2\2\2{~\3\2\2\2|z\3\2\2\2|}\3\2\2\2}\177\3\2\2\2~|\3"+ "\2\2\2\177\u0080\7\2\2\3\u0080\3\3\2\2\2\u0081\u0084\5\16\b\2\u0082\u0084"+ "\5\6\4\2\u0083\u0081\3\2\2\2\u0083\u0082\3\2\2\2\u0084\5\3\2\2\2\u0085"+ "\u0086\7\3\2\2\u0086\u0088\5\66\34\2\u0087\u0089\5> \2\u0088\u0087\3\2"+ "\2\2\u0088\u0089\3\2\2\2\u0089\u008a\3\2\2\2\u008a\u008b\5T+\2\u008b\u008c"+ - "\7n\2\2\u008c\7\3\2\2\2\u008d\u00a4\5\16\b\2\u008e\u00a4\5\24\13\2\u008f"+ + "\7o\2\2\u008c\7\3\2\2\2\u008d\u00a4\5\16\b\2\u008e\u00a4\5\24\13\2\u008f"+ "\u00a4\5\22\n\2\u0090\u00a4\5\26\f\2\u0091\u00a4\5\30\r\2\u0092\u00a4"+ "\5\36\20\2\u0093\u00a4\5 \21\2\u0094\u00a4\5\f\7\2\u0095\u00a4\5$\23\2"+ "\u0096\u00a4\5,\27\2\u0097\u00a4\5j\66\2\u0098\u00a4\5n8\2\u0099\u00a4"+ @@ -4332,7 +4338,7 @@ public class prog8Parser extends Parser { "\7\5\2\2\u00a9\u00ad\5> \2\u00aa\u00ad\5\66\34\2\u00ab\u00ad\58\35\2\u00ac"+ "\u00a9\3\2\2\2\u00ac\u00aa\3\2\2\2\u00ac\u00ab\3\2\2\2\u00ad\r\3\2\2\2"+ "\u00ae\u00ba\t\2\2\2\u00af\u00b1\5\20\t\2\u00b0\u00af\3\2\2\2\u00b0\u00b1"+ - "\3\2\2\2\u00b1\u00bb\3\2\2\2\u00b2\u00b7\5\20\t\2\u00b3\u00b4\7\17\2\2"+ + "\3\2\2\2\u00b1\u00bb\3\2\2\2\u00b2\u00b7\5\20\t\2\u00b3\u00b4\7\20\2\2"+ "\u00b4\u00b6\5\20\t\2\u00b5\u00b3\3\2\2\2\u00b6\u00b9\3\2\2\2\u00b7\u00b5"+ "\3\2\2\2\u00b7\u00b8\3\2\2\2\u00b8\u00bb\3\2\2\2\u00b9\u00b7\3\2\2\2\u00ba"+ "\u00b0\3\2\2\2\u00ba\u00b2\3\2\2\2\u00bb\17\3\2\2\2\u00bc\u00c0\5F$\2"+ @@ -4341,37 +4347,37 @@ public class prog8Parser extends Parser { "\u00c4\5\34\17\2\u00c3\u00c2\3\2\2\2\u00c3\u00c4\3\2\2\2\u00c4\u00c5\3"+ "\2\2\2\u00c5\u00c6\5\66\34\2\u00c6\23\3\2\2\2\u00c7\u00c9\5\32\16\2\u00c8"+ "\u00ca\5\34\17\2\u00c9\u00c8\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cb\3"+ - "\2\2\2\u00cb\u00cc\5\66\34\2\u00cc\u00cd\7\20\2\2\u00cd\u00ce\5&\24\2"+ - "\u00ce\25\3\2\2\2\u00cf\u00d0\7\21\2\2\u00d0\u00d1\5\24\13\2\u00d1\27"+ - "\3\2\2\2\u00d2\u00d3\7\22\2\2\u00d3\u00d4\5\24\13\2\u00d4\31\3\2\2\2\u00d5"+ - "\u00d6\t\3\2\2\u00d6\33\3\2\2\2\u00d7\u00d8\7\32\2\2\u00d8\u00db\5&\24"+ - "\2\u00d9\u00da\7\17\2\2\u00da\u00dc\5&\24\2\u00db\u00d9\3\2\2\2\u00db"+ - "\u00dc\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00de\7\33\2\2\u00de\35\3\2\2"+ - "\2\u00df\u00e0\5\"\22\2\u00e0\u00e1\7\20\2\2\u00e1\u00e2\5&\24\2\u00e2"+ + "\2\2\2\u00cb\u00cc\5\66\34\2\u00cc\u00cd\7\21\2\2\u00cd\u00ce\5&\24\2"+ + "\u00ce\25\3\2\2\2\u00cf\u00d0\7\22\2\2\u00d0\u00d1\5\24\13\2\u00d1\27"+ + "\3\2\2\2\u00d2\u00d3\7\23\2\2\u00d3\u00d4\5\24\13\2\u00d4\31\3\2\2\2\u00d5"+ + "\u00d6\t\3\2\2\u00d6\33\3\2\2\2\u00d7\u00d8\7\33\2\2\u00d8\u00db\5&\24"+ + "\2\u00d9\u00da\7\20\2\2\u00da\u00dc\5&\24\2\u00db\u00d9\3\2\2\2\u00db"+ + "\u00dc\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00de\7\34\2\2\u00de\35\3\2\2"+ + "\2\u00df\u00e0\5\"\22\2\u00e0\u00e1\7\21\2\2\u00e1\u00e2\5&\24\2\u00e2"+ "\37\3\2\2\2\u00e3\u00e4\5\"\22\2\u00e4\u00e5\t\4\2\2\u00e5\u00e6\5&\24"+ "\2\u00e6!\3\2\2\2\u00e7\u00ec\5:\36\2\u00e8\u00ec\5\66\34\2\u00e9\u00ec"+ "\58\35\2\u00ea\u00ec\5(\25\2\u00eb\u00e7\3\2\2\2\u00eb\u00e8\3\2\2\2\u00eb"+ "\u00e9\3\2\2\2\u00eb\u00ea\3\2\2\2\u00ec#\3\2\2\2\u00ed\u00ee\5\"\22\2"+ "\u00ee\u00ef\t\5\2\2\u00ef%\3\2\2\2\u00f0\u00f1\b\24\1\2\u00f1\u00f2\7"+ - "\'\2\2\u00f2\u00f3\5&\24\2\u00f3\u00f4\7(\2\2\u00f4\u0100\3\2\2\2\u00f5"+ + "(\2\2\u00f2\u00f3\5&\24\2\u00f3\u00f4\7)\2\2\u00f4\u0100\3\2\2\2\u00f5"+ "\u0100\5*\26\2\u00f6\u00f7\t\6\2\2\u00f7\u0100\5&\24\25\u00f8\u00f9\7"+ - ">\2\2\u00f9\u0100\5&\24\b\u00fa\u0100\5L\'\2\u00fb\u0100\5:\36\2\u00fc"+ + "?\2\2\u00f9\u0100\5&\24\b\u00fa\u0100\5L\'\2\u00fb\u0100\5:\36\2\u00fc"+ "\u0100\5\66\34\2\u00fd\u0100\58\35\2\u00fe\u0100\5(\25\2\u00ff\u00f0\3"+ "\2\2\2\u00ff\u00f5\3\2\2\2\u00ff\u00f6\3\2\2\2\u00ff\u00f8\3\2\2\2\u00ff"+ "\u00fa\3\2\2\2\u00ff\u00fb\3\2\2\2\u00ff\u00fc\3\2\2\2\u00ff\u00fd\3\2"+ "\2\2\u00ff\u00fe\3\2\2\2\u0100\u012b\3\2\2\2\u0101\u0102\f\24\2\2\u0102"+ - "\u0103\7+\2\2\u0103\u012a\5&\24\25\u0104\u0105\f\23\2\2\u0105\u0106\t"+ + "\u0103\7,\2\2\u0103\u012a\5&\24\25\u0104\u0105\f\23\2\2\u0105\u0106\t"+ "\7\2\2\u0106\u012a\5&\24\24\u0107\u0108\f\22\2\2\u0108\u0109\t\b\2\2\u0109"+ "\u012a\5&\24\23\u010a\u010b\f\21\2\2\u010b\u010c\t\t\2\2\u010c\u012a\5"+ "&\24\22\u010d\u010e\f\20\2\2\u010e\u010f\t\n\2\2\u010f\u012a\5&\24\21"+ - "\u0110\u0111\f\17\2\2\u0111\u0112\7\66\2\2\u0112\u012a\5&\24\20\u0113"+ - "\u0114\f\16\2\2\u0114\u0115\7\67\2\2\u0115\u012a\5&\24\17\u0116\u0117"+ - "\f\r\2\2\u0117\u0118\78\2\2\u0118\u012a\5&\24\16\u0119\u011a\f\13\2\2"+ - "\u011a\u011b\7;\2\2\u011b\u012a\5&\24\f\u011c\u011d\f\n\2\2\u011d\u011e"+ - "\7<\2\2\u011e\u012a\5&\24\13\u011f\u0120\f\t\2\2\u0120\u0121\7=\2\2\u0121"+ - "\u012a\5&\24\n\u0122\u0123\f\f\2\2\u0123\u0124\79\2\2\u0124\u0127\5&\24"+ - "\2\u0125\u0126\7:\2\2\u0126\u0128\5&\24\2\u0127\u0125\3\2\2\2\u0127\u0128"+ - "\3\2\2\2\u0128\u012a\3\2\2\2\u0129\u0101\3\2\2\2\u0129\u0104\3\2\2\2\u0129"+ + "\u0110\u0111\f\17\2\2\u0111\u0112\7\67\2\2\u0112\u012a\5&\24\20\u0113"+ + "\u0114\f\16\2\2\u0114\u0115\78\2\2\u0115\u012a\5&\24\17\u0116\u0117\f"+ + "\r\2\2\u0117\u0118\79\2\2\u0118\u012a\5&\24\16\u0119\u011a\f\13\2\2\u011a"+ + "\u011b\7<\2\2\u011b\u012a\5&\24\f\u011c\u011d\f\n\2\2\u011d\u011e\7=\2"+ + "\2\u011e\u012a\5&\24\13\u011f\u0120\f\t\2\2\u0120\u0121\7>\2\2\u0121\u012a"+ + "\5&\24\n\u0122\u0123\f\f\2\2\u0123\u0124\7:\2\2\u0124\u0127\5&\24\2\u0125"+ + "\u0126\7;\2\2\u0126\u0128\5&\24\2\u0127\u0125\3\2\2\2\u0127\u0128\3\2"+ + "\2\2\u0128\u012a\3\2\2\2\u0129\u0101\3\2\2\2\u0129\u0104\3\2\2\2\u0129"+ "\u0107\3\2\2\2\u0129\u010a\3\2\2\2\u0129\u010d\3\2\2\2\u0129\u0110\3\2"+ "\2\2\u0129\u0113\3\2\2\2\u0129\u0116\3\2\2\2\u0129\u0119\3\2\2\2\u0129"+ "\u011c\3\2\2\2\u0129\u011f\3\2\2\2\u0129\u0122\3\2\2\2\u012a\u012d\3\2"+ @@ -4380,100 +4386,100 @@ public class prog8Parser extends Parser { "\u0131\u012e\3\2\2\2\u0131\u012f\3\2\2\2\u0131\u0130\3\2\2\2\u0132\u0133"+ "\3\2\2\2\u0133\u0134\5\34\17\2\u0134)\3\2\2\2\u0135\u0138\5\66\34\2\u0136"+ "\u0138\58\35\2\u0137\u0135\3\2\2\2\u0137\u0136\3\2\2\2\u0138\u0139\3\2"+ - "\2\2\u0139\u013b\7\'\2\2\u013a\u013c\5.\30\2\u013b\u013a\3\2\2\2\u013b"+ - "\u013c\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013e\7(\2\2\u013e+\3\2\2\2\u013f"+ + "\2\2\u0139\u013b\7(\2\2\u013a\u013c\5.\30\2\u013b\u013a\3\2\2\2\u013b"+ + "\u013c\3\2\2\2\u013c\u013d\3\2\2\2\u013d\u013e\7)\2\2\u013e+\3\2\2\2\u013f"+ "\u0142\5\66\34\2\u0140\u0142\58\35\2\u0141\u013f\3\2\2\2\u0141\u0140\3"+ - "\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145\7\'\2\2\u0144\u0146\5.\30\2\u0145"+ - "\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0148\7("+ - "\2\2\u0148-\3\2\2\2\u0149\u0151\5&\24\2\u014a\u014c\7\17\2\2\u014b\u014d"+ - "\7n\2\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e"+ + "\2\2\2\u0142\u0143\3\2\2\2\u0143\u0145\7(\2\2\u0144\u0146\5.\30\2\u0145"+ + "\u0144\3\2\2\2\u0145\u0146\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0148\7)"+ + "\2\2\u0148-\3\2\2\2\u0149\u0151\5&\24\2\u014a\u014c\7\20\2\2\u014b\u014d"+ + "\7o\2\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d\u014e\3\2\2\2\u014e"+ "\u0150\5&\24\2\u014f\u014a\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\u0156"+ - "\7?\2\2\u0155\u0157\5.\30\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157"+ - "\61\3\2\2\2\u0158\u0159\7@\2\2\u0159\63\3\2\2\2\u015a\u015b\7A\2\2\u015b"+ - "\65\3\2\2\2\u015c\u015d\7o\2\2\u015d\67\3\2\2\2\u015e\u0161\7o\2\2\u015f"+ - "\u0160\7B\2\2\u0160\u0162\7o\2\2\u0161\u015f\3\2\2\2\u0162\u0163\3\2\2"+ + "\7@\2\2\u0155\u0157\5.\30\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157"+ + "\61\3\2\2\2\u0158\u0159\7A\2\2\u0159\63\3\2\2\2\u015a\u015b\7B\2\2\u015b"+ + "\65\3\2\2\2\u015c\u015d\7p\2\2\u015d\67\3\2\2\2\u015e\u0161\7p\2\2\u015f"+ + "\u0160\7C\2\2\u0160\u0162\7p\2\2\u0161\u015f\3\2\2\2\u0162\u0163\3\2\2"+ "\2\u0163\u0161\3\2\2\2\u0163\u0164\3\2\2\2\u01649\3\2\2\2\u0165\u0166"+ "\t\13\2\2\u0166;\3\2\2\2\u0167\u0168\t\f\2\2\u0168=\3\2\2\2\u0169\u016b"+ "\t\r\2\2\u016a\u016c\5@!\2\u016b\u016a\3\2\2\2\u016b\u016c\3\2\2\2\u016c"+ - "?\3\2\2\2\u016d\u016e\7M\2\2\u016eA\3\2\2\2\u016f\u0170\t\16\2\2\u0170"+ - "C\3\2\2\2\u0171\u0173\7\32\2\2\u0172\u0174\7n\2\2\u0173\u0172\3\2\2\2"+ + "?\3\2\2\2\u016d\u016e\7N\2\2\u016eA\3\2\2\2\u016f\u0170\t\16\2\2\u0170"+ + "C\3\2\2\2\u0171\u0173\7\33\2\2\u0172\u0174\7o\2\2\u0173\u0172\3\2\2\2"+ "\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u017d\5&\24\2\u0176\u0178"+ - "\7\17\2\2\u0177\u0179\7n\2\2\u0178\u0177\3\2\2\2\u0178\u0179\3\2\2\2\u0179"+ + "\7\20\2\2\u0177\u0179\7o\2\2\u0178\u0177\3\2\2\2\u0178\u0179\3\2\2\2\u0179"+ "\u017a\3\2\2\2\u017a\u017c\5&\24\2\u017b\u0176\3\2\2\2\u017c\u017f\3\2"+ "\2\2\u017d\u017b\3\2\2\2\u017d\u017e\3\2\2\2\u017e\u0181\3\2\2\2\u017f"+ - "\u017d\3\2\2\2\u0180\u0182\7n\2\2\u0181\u0180\3\2\2\2\u0181\u0182\3\2"+ - "\2\2\u0182\u0183\3\2\2\2\u0183\u0184\7\33\2\2\u0184E\3\2\2\2\u0185\u0186"+ - "\7t\2\2\u0186G\3\2\2\2\u0187\u0188\7v\2\2\u0188I\3\2\2\2\u0189\u018a\7"+ - "s\2\2\u018aK\3\2\2\2\u018b\u0192\5> \2\u018c\u0192\5B\"\2\u018d\u0192"+ + "\u017d\3\2\2\2\u0180\u0182\7o\2\2\u0181\u0180\3\2\2\2\u0181\u0182\3\2"+ + "\2\2\u0182\u0183\3\2\2\2\u0183\u0184\7\34\2\2\u0184E\3\2\2\2\u0185\u0186"+ + "\7u\2\2\u0186G\3\2\2\2\u0187\u0188\7w\2\2\u0188I\3\2\2\2\u0189\u018a\7"+ + "t\2\2\u018aK\3\2\2\2\u018b\u0192\5> \2\u018c\u0192\5B\"\2\u018d\u0192"+ "\5D#\2\u018e\u0192\5F$\2\u018f\u0192\5H%\2\u0190\u0192\5J&\2\u0191\u018b"+ "\3\2\2\2\u0191\u018c\3\2\2\2\u0191\u018d\3\2\2\2\u0191\u018e\3\2\2\2\u0191"+ - "\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192M\3\2\2\2\u0193\u0194\7P\2\2\u0194"+ - "\u0195\7u\2\2\u0195O\3\2\2\2\u0196\u0197\7Q\2\2\u0197\u0198\5\66\34\2"+ - "\u0198\u019a\7\'\2\2\u0199\u019b\5V,\2\u019a\u0199\3\2\2\2\u019a\u019b"+ - "\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019e\7(\2\2\u019d\u019f\5R*\2\u019e"+ + "\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192M\3\2\2\2\u0193\u0194\7Q\2\2\u0194"+ + "\u0195\7v\2\2\u0195O\3\2\2\2\u0196\u0197\7R\2\2\u0197\u0198\5\66\34\2"+ + "\u0198\u019a\7(\2\2\u0199\u019b\5V,\2\u019a\u0199\3\2\2\2\u019a\u019b"+ + "\3\2\2\2\u019b\u019c\3\2\2\2\u019c\u019e\7)\2\2\u019d\u019f\5R*\2\u019e"+ "\u019d\3\2\2\2\u019e\u019f\3\2\2\2\u019f\u01a0\3\2\2\2\u01a0\u01a1\5T"+ - "+\2\u01a1\u01a2\7n\2\2\u01a2Q\3\2\2\2\u01a3\u01a4\7R\2\2\u01a4\u01a5\5"+ - "Z.\2\u01a5S\3\2\2\2\u01a6\u01a7\7S\2\2\u01a7\u01ac\7n\2\2\u01a8\u01ab"+ - "\5\b\5\2\u01a9\u01ab\7n\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01a9\3\2\2\2\u01ab"+ + "+\2\u01a1\u01a2\7o\2\2\u01a2Q\3\2\2\2\u01a3\u01a4\7S\2\2\u01a4\u01a5\5"+ + "Z.\2\u01a5S\3\2\2\2\u01a6\u01a7\7T\2\2\u01a7\u01ac\7o\2\2\u01a8\u01ab"+ + "\5\b\5\2\u01a9\u01ab\7o\2\2\u01aa\u01a8\3\2\2\2\u01aa\u01a9\3\2\2\2\u01ab"+ "\u01ae\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01af\3\2"+ - "\2\2\u01ae\u01ac\3\2\2\2\u01af\u01b0\7T\2\2\u01b0U\3\2\2\2\u01b1\u01b9"+ - "\5X-\2\u01b2\u01b4\7\17\2\2\u01b3\u01b5\7n\2\2\u01b4\u01b3\3\2\2\2\u01b4"+ + "\2\2\u01ae\u01ac\3\2\2\2\u01af\u01b0\7U\2\2\u01b0U\3\2\2\2\u01b1\u01b9"+ + "\5X-\2\u01b2\u01b4\7\20\2\2\u01b3\u01b5\7o\2\2\u01b4\u01b3\3\2\2\2\u01b4"+ "\u01b5\3\2\2\2\u01b5\u01b6\3\2\2\2\u01b6\u01b8\5X-\2\u01b7\u01b2\3\2\2"+ "\2\u01b8\u01bb\3\2\2\2\u01b9\u01b7\3\2\2\2\u01b9\u01ba\3\2\2\2\u01baW"+ "\3\2\2\2\u01bb\u01b9\3\2\2\2\u01bc\u01bd\5\66\34\2\u01bd\u01be\7\4\2\2"+ "\u01be\u01bf\5\32\16\2\u01bfY\3\2\2\2\u01c0\u01c8\5\32\16\2\u01c1\u01c3"+ - "\7\17\2\2\u01c2\u01c4\7n\2\2\u01c3\u01c2\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4"+ + "\7\20\2\2\u01c2\u01c4\7o\2\2\u01c3\u01c2\3\2\2\2\u01c3\u01c4\3\2\2\2\u01c4"+ "\u01c5\3\2\2\2\u01c5\u01c7\5\32\16\2\u01c6\u01c1\3\2\2\2\u01c7\u01ca\3"+ "\2\2\2\u01c8\u01c6\3\2\2\2\u01c8\u01c9\3\2\2\2\u01c9[\3\2\2\2\u01ca\u01c8"+ - "\3\2\2\2\u01cb\u01cc\7U\2\2\u01cc\u01cd\5\66\34\2\u01cd\u01cf\7\'\2\2"+ - "\u01ce\u01d0\5`\61\2\u01cf\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1"+ - "\3\2\2\2\u01d1\u01d2\7(\2\2\u01d2\u01d3\7R\2\2\u01d3\u01d4\7V\2\2\u01d4"+ - "\u01d6\7\'\2\2\u01d5\u01d7\5d\63\2\u01d6\u01d5\3\2\2\2\u01d6\u01d7\3\2"+ - "\2\2\u01d7\u01d8\3\2\2\2\u01d8\u01d9\7(\2\2\u01d9\u01da\7R\2\2\u01da\u01dc"+ - "\7\'\2\2\u01db\u01dd\5f\64\2\u01dc\u01db\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd"+ - "\u01de\3\2\2\2\u01de\u01e1\7(\2\2\u01df\u01e2\5^\60\2\u01e0\u01e2\5T+"+ - "\2\u01e1\u01df\3\2\2\2\u01e1\u01e0\3\2\2\2\u01e2]\3\2\2\2\u01e3\u01e4"+ - "\7\20\2\2\u01e4\u01e5\5> \2\u01e5_\3\2\2\2\u01e6\u01ee\5b\62\2\u01e7\u01e9"+ - "\7\17\2\2\u01e8\u01ea\7n\2\2\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea"+ + "\3\2\2\2\u01cb\u01cc\7V\2\2\u01cc\u01cd\5\66\34\2\u01cd\u01cf\7(\2\2\u01ce"+ + "\u01d0\5`\61\2\u01cf\u01ce\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\3\2"+ + "\2\2\u01d1\u01d2\7)\2\2\u01d2\u01d3\7S\2\2\u01d3\u01d4\7W\2\2\u01d4\u01d6"+ + "\7(\2\2\u01d5\u01d7\5d\63\2\u01d6\u01d5\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7"+ + "\u01d8\3\2\2\2\u01d8\u01d9\7)\2\2\u01d9\u01da\7S\2\2\u01da\u01dc\7(\2"+ + "\2\u01db\u01dd\5f\64\2\u01dc\u01db\3\2\2\2\u01dc\u01dd\3\2\2\2\u01dd\u01de"+ + "\3\2\2\2\u01de\u01e1\7)\2\2\u01df\u01e2\5^\60\2\u01e0\u01e2\5T+\2\u01e1"+ + "\u01df\3\2\2\2\u01e1\u01e0\3\2\2\2\u01e2]\3\2\2\2\u01e3\u01e4\7\21\2\2"+ + "\u01e4\u01e5\5> \2\u01e5_\3\2\2\2\u01e6\u01ee\5b\62\2\u01e7\u01e9\7\20"+ + "\2\2\u01e8\u01ea\7o\2\2\u01e9\u01e8\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea"+ "\u01eb\3\2\2\2\u01eb\u01ed\5b\62\2\u01ec\u01e7\3\2\2\2\u01ed\u01f0\3\2"+ "\2\2\u01ee\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01efa\3\2\2\2\u01f0\u01ee"+ "\3\2\2\2\u01f1\u01f2\5\66\34\2\u01f2\u01f3\7\4\2\2\u01f3\u01f4\5\32\16"+ - "\2\u01f4\u01f7\7W\2\2\u01f5\u01f8\5:\36\2\u01f6\u01f8\5<\37\2\u01f7\u01f5"+ + "\2\u01f4\u01f7\7X\2\2\u01f5\u01f8\5:\36\2\u01f6\u01f8\5<\37\2\u01f7\u01f5"+ "\3\2\2\2\u01f7\u01f6\3\2\2\2\u01f8c\3\2\2\2\u01f9\u01fe\5:\36\2\u01fa"+ - "\u01fb\7\17\2\2\u01fb\u01fd\5:\36\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3"+ + "\u01fb\7\20\2\2\u01fb\u01fd\5:\36\2\u01fc\u01fa\3\2\2\2\u01fd\u0200\3"+ "\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ffe\3\2\2\2\u0200\u01fe"+ - "\3\2\2\2\u0201\u0209\5h\65\2\u0202\u0204\7\17\2\2\u0203\u0205\7n\2\2\u0204"+ + "\3\2\2\2\u0201\u0209\5h\65\2\u0202\u0204\7\20\2\2\u0203\u0205\7o\2\2\u0204"+ "\u0203\3\2\2\2\u0204\u0205\3\2\2\2\u0205\u0206\3\2\2\2\u0206\u0208\5h"+ "\65\2\u0207\u0202\3\2\2\2\u0208\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u0209"+ "\u020a\3\2\2\2\u020ag\3\2\2\2\u020b\u0209\3\2\2\2\u020c\u020d\5\32\16"+ - "\2\u020d\u0210\7W\2\2\u020e\u0211\5:\36\2\u020f\u0211\5<\37\2\u0210\u020e"+ - "\3\2\2\2\u0210\u020f\3\2\2\2\u0211i\3\2\2\2\u0212\u0213\7X\2\2\u0213\u0215"+ - "\5&\24\2\u0214\u0216\7n\2\2\u0215\u0214\3\2\2\2\u0215\u0216\3\2\2\2\u0216"+ + "\2\u020d\u0210\7X\2\2\u020e\u0211\5:\36\2\u020f\u0211\5<\37\2\u0210\u020e"+ + "\3\2\2\2\u0210\u020f\3\2\2\2\u0211i\3\2\2\2\u0212\u0213\7Y\2\2\u0213\u0215"+ + "\5&\24\2\u0214\u0216\7o\2\2\u0215\u0214\3\2\2\2\u0215\u0216\3\2\2\2\u0216"+ "\u0219\3\2\2\2\u0217\u021a\5\b\5\2\u0218\u021a\5T+\2\u0219\u0217\3\2\2"+ - "\2\u0219\u0218\3\2\2\2\u021a\u021c\3\2\2\2\u021b\u021d\7n\2\2\u021c\u021b"+ + "\2\u0219\u0218\3\2\2\2\u021a\u021c\3\2\2\2\u021b\u021d\7o\2\2\u021c\u021b"+ "\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u021f\3\2\2\2\u021e\u0220\5l\67\2\u021f"+ - "\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u0222\7n"+ - "\2\2\u0222k\3\2\2\2\u0223\u0225\7Y\2\2\u0224\u0226\7n\2\2\u0225\u0224"+ + "\u021e\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u0222\7o"+ + "\2\2\u0222k\3\2\2\2\u0223\u0225\7Z\2\2\u0224\u0226\7o\2\2\u0225\u0224"+ "\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u0229\3\2\2\2\u0227\u022a\5\b\5\2\u0228"+ "\u022a\5T+\2\u0229\u0227\3\2\2\2\u0229\u0228\3\2\2\2\u022am\3\2\2\2\u022b"+ - "\u022d\5p9\2\u022c\u022e\7n\2\2\u022d\u022c\3\2\2\2\u022d\u022e\3\2\2"+ + "\u022d\5p9\2\u022c\u022e\7o\2\2\u022d\u022c\3\2\2\2\u022d\u022e\3\2\2"+ "\2\u022e\u0231\3\2\2\2\u022f\u0232\5\b\5\2\u0230\u0232\5T+\2\u0231\u022f"+ - "\3\2\2\2\u0231\u0230\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0235\7n\2\2\u0234"+ + "\3\2\2\2\u0231\u0230\3\2\2\2\u0232\u0234\3\2\2\2\u0233\u0235\7o\2\2\u0234"+ "\u0233\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0237\3\2\2\2\u0236\u0238\5l"+ "\67\2\u0237\u0236\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u0239\3\2\2\2\u0239"+ - "\u023a\7n\2\2\u023ao\3\2\2\2\u023b\u023c\t\17\2\2\u023cq\3\2\2\2\u023d"+ - "\u023f\7f\2\2\u023e\u0240\5\32\16\2\u023f\u023e\3\2\2\2\u023f\u0240\3"+ + "\u023a\7o\2\2\u023ao\3\2\2\2\u023b\u023c\t\17\2\2\u023cq\3\2\2\2\u023d"+ + "\u023f\7g\2\2\u023e\u0240\5\32\16\2\u023f\u023e\3\2\2\2\u023f\u0240\3"+ "\2\2\2\u0240\u0243\3\2\2\2\u0241\u0244\5:\36\2\u0242\u0244\5\66\34\2\u0243"+ - "\u0241\3\2\2\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0246\7g"+ - "\2\2\u0246\u0248\5&\24\2\u0247\u0249\7n\2\2\u0248\u0247\3\2\2\2\u0248"+ + "\u0241\3\2\2\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245\u0246\7h"+ + "\2\2\u0246\u0248\5&\24\2\u0247\u0249\7o\2\2\u0248\u0247\3\2\2\2\u0248"+ "\u0249\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024b\5T+\2\u024bs\3\2\2\2\u024c"+ - "\u024d\7h\2\2\u024d\u024f\5&\24\2\u024e\u0250\7n\2\2\u024f\u024e\3\2\2"+ + "\u024d\7i\2\2\u024d\u024f\5&\24\2\u024e\u0250\7o\2\2\u024f\u024e\3\2\2"+ "\2\u024f\u0250\3\2\2\2\u0250\u0253\3\2\2\2\u0251\u0254\5\b\5\2\u0252\u0254"+ "\5T+\2\u0253\u0251\3\2\2\2\u0253\u0252\3\2\2\2\u0254u\3\2\2\2\u0255\u0258"+ - "\7i\2\2\u0256\u0259\5\b\5\2\u0257\u0259\5T+\2\u0258\u0256\3\2\2\2\u0258"+ - "\u0257\3\2\2\2\u0259\u025b\3\2\2\2\u025a\u025c\7n\2\2\u025b\u025a\3\2"+ - "\2\2\u025b\u025c\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025e\7j\2\2\u025e"+ + "\7j\2\2\u0256\u0259\5\b\5\2\u0257\u0259\5T+\2\u0258\u0256\3\2\2\2\u0258"+ + "\u0257\3\2\2\2\u0259\u025b\3\2\2\2\u025a\u025c\7o\2\2\u025b\u025a\3\2"+ + "\2\2\u025b\u025c\3\2\2\2\u025c\u025d\3\2\2\2\u025d\u025e\7k\2\2\u025e"+ "\u025f\5&\24\2\u025fw\3\2\2\2Gz|\u0083\u0088\u00a3\u00ac\u00b0\u00b7\u00ba"+ "\u00bf\u00c3\u00c9\u00db\u00eb\u00ff\u0127\u0129\u012b\u0131\u0137\u013b"+ "\u0141\u0145\u014c\u0151\u0156\u0163\u016b\u0173\u0178\u017d\u0181\u0191"+ diff --git a/compiler/test/UnitTests.kt b/compiler/test/UnitTests.kt index 5576dbdcc..390e94011 100644 --- a/compiler/test/UnitTests.kt +++ b/compiler/test/UnitTests.kt @@ -113,7 +113,7 @@ private val dummypos = Position("test", 0, 0, 0) class TestZeropage { @Test fun testNames() { - val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, false)) + val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, emptyList(), false)) assertFailsWith { zp.allocate(VarDecl(VarDeclType.MEMORY, DataType.BYTE, null, "", null, dummypos)) @@ -130,27 +130,50 @@ class TestZeropage { @Test fun testZpFloatEnable() { - val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, false)) + val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), false)) assertFailsWith { zp.allocate(VarDecl(VarDeclType.VAR, DataType.FLOAT, null, "", null, dummypos)) } - val zp2 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, true)) + val zp2 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), true)) zp2.allocate(VarDecl(VarDeclType.VAR, DataType.FLOAT, null, "", null, dummypos)) } @Test fun testFreeSpaces() { - val zp1 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, true)) + val zp1 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, emptyList(), true)) assertEquals(23, zp1.available()) - val zp2 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.KERNALSAFE, true)) + val zp2 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.KERNALSAFE, emptyList(), true)) assertEquals(71, zp2.available()) - val zp3 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, true)) + val zp3 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), true)) assertEquals(239, zp3.available()) } + @Test + fun testReservedSpace() { + val zp1 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), true)) + assertEquals(239, zp1.available()) + assertTrue(50 in zp1.free) + assertTrue(100 in zp1.free) + assertTrue(49 in zp1.free) + assertTrue(101 in zp1.free) + assertTrue(200 in zp1.free) + assertTrue(255 in zp1.free) + assertTrue(199 in zp1.free) + val zp2 = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, + listOf(50 .. 100, 200..255), true)) + assertEquals(139, zp2.available()) + assertFalse(50 in zp2.free) + assertFalse(100 in zp2.free) + assertTrue(49 in zp2.free) + assertTrue(101 in zp2.free) + assertFalse(200 in zp2.free) + assertFalse(255 in zp2.free) + assertTrue(199 in zp2.free) + } + @Test fun testBasicsafeAllocation() { - val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, true)) + val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, emptyList(), true)) assertEquals(23, zp.available()) zp.allocate(VarDecl(VarDeclType.VAR, DataType.FLOAT, null, "", null, dummypos)) @@ -174,7 +197,7 @@ class TestZeropage { @Test fun testFullAllocation() { - val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, true)) + val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.FULL, emptyList(), true)) assertEquals(239, zp.available()) val loc = zp.allocate(VarDecl(VarDeclType.VAR, DataType.FLOAT, null, "", null, dummypos)) assertTrue(loc > 3) @@ -211,7 +234,7 @@ class TestZeropage { // free = (0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0d, 0x0e, // 0x12, 0x2a, 0x52, 0x94, 0x95, 0xa7, 0xa8, 0xa9, 0xaa, // 0xb5, 0xb6, 0xf7, 0xf8, 0xf9, 0xfa)) - val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, true)) + val zp = C64Zeropage(CompilationOptions(OutputType.RAW, LauncherType.NONE, ZeropageType.BASICSAFE, emptyList(), true)) assertEquals(23, zp.available()) assertEquals(0x04, zp.allocate(VarDecl(VarDeclType.VAR, DataType.FLOAT, null, "", null, dummypos))) assertEquals(0x09, zp.allocate(VarDecl(VarDeclType.VAR, DataType.BYTE, null, "", null, dummypos))) diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index 7598ef103..63221f181 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -73,6 +73,12 @@ Directives Also read :ref:`zeropage`. +.. data:: %zpreserved , + + Level: module. + Global setting, can occur multiple times. It allows you to reserve or 'block' a part of the zeropage so + that it will not be used by the compiler. + .. data:: %address