diff --git a/compiler/antlr/prog8.g4 b/compiler/antlr/prog8.g4 index 760fd3345..ba3ae8f02 100644 --- a/compiler/antlr/prog8.g4 +++ b/compiler/antlr/prog8.g4 @@ -41,6 +41,15 @@ INLINEASMBLOCK : } ; +SINGLECHAR : + '\'' ( STRING_ESCAPE_SEQ | ~[\\\r\n\f"] ) '\'' + { + // get rid of the enclosing quotes + String s = getText(); + setText(s.substring(1, s.length() - 1)); + } + ; + module : (modulestatement | EOL)* EOF ; @@ -172,6 +181,8 @@ arrayliteral : '[' expression (',' expression)* ']' ; stringliteral : STRING ; +charliteral : SINGLECHAR ; + floatliteral : FLOAT_NUMBER ; literalvalue : @@ -179,6 +190,7 @@ literalvalue : | booleanliteral | arrayliteral | stringliteral + | charliteral | floatliteral ; diff --git a/compiler/examples/test.p8 b/compiler/examples/test.p8 index eefef9202..1d1898e50 100644 --- a/compiler/examples/test.p8 +++ b/compiler/examples/test.p8 @@ -12,15 +12,16 @@ sub start() { byte[2,3] matrixvar byte[5] barrayvar word[5] warrayvar - ; byte eol = "\n" ;; todo: convert string of len 1 to byte + float eol = '\n' + _vm_write_char('\n') fvar=test(15, 222.22) _vm_write_num(fvar) - _vm_write_char($8d) + _vm_write_char('\n') fvar=test(17, 333.33) _vm_write_num(fvar) - _vm_write_char($8d) + _vm_write_char('\n') return sub test(arg: byte, f: float) -> float { diff --git a/compiler/src/prog8/ast/AST.kt b/compiler/src/prog8/ast/AST.kt index a6618afc3..b146be0b0 100644 --- a/compiler/src/prog8/ast/AST.kt +++ b/compiler/src/prog8/ast/AST.kt @@ -4,6 +4,7 @@ import org.antlr.v4.runtime.ParserRuleContext import org.antlr.v4.runtime.tree.TerminalNode import prog8.compiler.HeapValues import prog8.compiler.target.c64.Petscii +import prog8.compiler.unescape import prog8.functions.BuiltinFunctions import prog8.functions.NotConstArgumentException import prog8.functions.builtinFunctionReturnType @@ -1644,6 +1645,7 @@ private fun prog8Parser.ExpressionContext.toAst() : IExpression { } litval.floatliteral()!=null -> LiteralValue(DataType.FLOAT, floatvalue = litval.floatliteral().toAst(), position = litval.toPosition()) litval.stringliteral()!=null -> LiteralValue(DataType.STR, strvalue = litval.stringliteral().text, position = litval.toPosition()) + litval.charliteral()!=null -> LiteralValue(DataType.BYTE, bytevalue = Petscii.encodePetscii(litval.charliteral().text.unescape(), true)[0], position = litval.toPosition()) litval.arrayliteral()!=null -> { val array = litval.arrayliteral()?.toAst() // byte/word array type difference is not determined here. diff --git a/compiler/src/prog8/compiler/Compiler.kt b/compiler/src/prog8/compiler/Compiler.kt index bd9b73784..62dc6a720 100644 --- a/compiler/src/prog8/compiler/Compiler.kt +++ b/compiler/src/prog8/compiler/Compiler.kt @@ -24,6 +24,32 @@ fun Number.toHex(): String { } +fun String.unescape(): String { + val result = mutableListOf() + val iter = this.iterator() + while(iter.hasNext()) { + val c = iter.nextChar() + if(c=='\\') { + val ec = iter.nextChar() + result.add(when(ec) { + '\\' -> '\\' + 'b' -> '\b' + 'n' -> '\n' + 'r' -> '\r' + 't' -> '\t' + 'u' -> { + "${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}".toInt(16).toChar() + } + else -> throw VmExecutionException("invalid escape char: $ec") + }) + } else { + result.add(c) + } + } + return result.joinToString("") +} + + class HeapValues { data class HeapValue(val type: DataType, val str: String?, val array: IntArray?) { override fun equals(other: Any?): Boolean { diff --git a/compiler/src/prog8/parser/prog8Lexer.java b/compiler/src/prog8/parser/prog8Lexer.java index f6bf69335..c123ba1d4 100644 --- a/compiler/src/prog8/parser/prog8Lexer.java +++ b/compiler/src/prog8/parser/prog8Lexer.java @@ -32,7 +32,7 @@ public class prog8Lexer extends Lexer { 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, LINECOMMENT=98, COMMENT=99, WS=100, EOL=101, NAME=102, DEC_INTEGER=103, HEX_INTEGER=104, BIN_INTEGER=105, FLOAT_NUMBER=106, - STRING=107, INLINEASMBLOCK=108; + STRING=107, INLINEASMBLOCK=108, SINGLECHAR=109; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -56,7 +56,7 @@ public class prog8Lexer extends Lexer { "T__89", "T__90", "T__91", "T__92", "T__93", "T__94", "T__95", "T__96", "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", - "INLINEASMBLOCK" + "INLINEASMBLOCK", "SINGLECHAR" }; private static final String[] _LITERAL_NAMES = { @@ -84,7 +84,8 @@ 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, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" + "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", + "SINGLECHAR" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -152,6 +153,9 @@ public class prog8Lexer extends Lexer { case 109: INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); break; + case 110: + SINGLECHAR_action((RuleContext)_localctx, actionIndex); + break; } } private void STRING_action(RuleContext _localctx, int actionIndex) { @@ -176,9 +180,20 @@ public class prog8Lexer extends Lexer { break; } } + private void SINGLECHAR_action(RuleContext _localctx, int actionIndex) { + switch (actionIndex) { + case 2: + + // get rid of the enclosing quotes + String s = getText(); + setText(s.substring(1, s.length() - 1)); + + break; + } + } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2n\u02fc\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2o\u0306\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"+ @@ -190,247 +205,251 @@ public class prog8Lexer extends Lexer { "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ "\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\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\3"+ - "9\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\3"+ - "C\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J\3J\3"+ - "J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3M\3M\3M\3N\3N\3O\3O\3P\3P\3P\3Q\3"+ - "Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T\3U\3"+ - "U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X\3Y\3"+ - "Y\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"+ - "a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\7c\u0293\nc\fc\16c\u0296\13"+ - "c\3c\3c\3c\3c\3d\3d\7d\u029e\nd\fd\16d\u02a1\13d\3d\3d\3e\3e\3e\3e\3f"+ - "\6f\u02aa\nf\rf\16f\u02ab\3g\3g\7g\u02b0\ng\fg\16g\u02b3\13g\3h\3h\3h"+ - "\6h\u02b8\nh\rh\16h\u02b9\5h\u02bc\nh\3i\3i\6i\u02c0\ni\ri\16i\u02c1\3"+ - "j\3j\6j\u02c6\nj\rj\16j\u02c7\3k\3k\3k\5k\u02cd\nk\3k\5k\u02d0\nk\3l\6"+ - "l\u02d3\nl\rl\16l\u02d4\3l\3l\6l\u02d9\nl\rl\16l\u02da\5l\u02dd\nl\3m"+ - "\3m\3m\3m\5m\u02e3\nm\3n\3n\3n\7n\u02e8\nn\fn\16n\u02eb\13n\3n\3n\3n\3"+ - "o\3o\3o\3o\6o\u02f4\no\ro\16o\u02f5\3o\3o\3o\3o\3o\3\u02f5\2p\3\3\5\4"+ - "\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+ - "#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+ - "#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091"+ - "J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5"+ - "T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9"+ - "^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cd"+ - "h\u00cfi\u00d1j\u00d3k\u00d5l\u00d7\2\u00d9\2\u00dbm\u00ddn\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\2GGg"+ - "g\4\2--//\6\2\f\f\16\17$$^^\2\u030a\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2"+ - "\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23"+ - "\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2"+ - "\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2"+ - "\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3"+ - "\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2"+ - "\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2"+ - "\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2["+ - "\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2"+ - "\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2"+ - "\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2"+ - "\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089"+ - "\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+ - "\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b"+ - "\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2"+ - "\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad"+ - "\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2"+ - "\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf"+ - "\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\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\u00db\3\2\2\2\2\u00dd\3\2\2"+ - "\2\3\u00df\3\2\2\2\5\u00e1\3\2\2\2\7\u00e3\3\2\2\2\t\u00e8\3\2\2\2\13"+ - "\u00f0\3\2\2\2\r\u00fa\3\2\2\2\17\u0104\3\2\2\2\21\u010d\3\2\2\2\23\u0115"+ - "\3\2\2\2\25\u0121\3\2\2\2\27\u012d\3\2\2\2\31\u0138\3\2\2\2\33\u0140\3"+ - "\2\2\2\35\u0142\3\2\2\2\37\u0144\3\2\2\2!\u014a\3\2\2\2#\u0151\3\2\2\2"+ - "%\u0156\3\2\2\2\'\u015b\3\2\2\2)\u0161\3\2\2\2+\u0165\3\2\2\2-\u016b\3"+ - "\2\2\2/\u0171\3\2\2\2\61\u0178\3\2\2\2\63\u017a\3\2\2\2\65\u017c\3\2\2"+ - "\2\67\u017f\3\2\2\29\u0182\3\2\2\2;\u0185\3\2\2\2=\u0189\3\2\2\2?\u018c"+ - "\3\2\2\2A\u0190\3\2\2\2C\u0193\3\2\2\2E\u0196\3\2\2\2G\u0199\3\2\2\2I"+ - "\u019c\3\2\2\2K\u019f\3\2\2\2M\u01a1\3\2\2\2O\u01a3\3\2\2\2Q\u01a5\3\2"+ - "\2\2S\u01a7\3\2\2\2U\u01aa\3\2\2\2W\u01ac\3\2\2\2Y\u01ae\3\2\2\2[\u01b1"+ - "\3\2\2\2]\u01b3\3\2\2\2_\u01b5\3\2\2\2a\u01b7\3\2\2\2c\u01ba\3\2\2\2e"+ - "\u01bd\3\2\2\2g\u01c0\3\2\2\2i\u01c3\3\2\2\2k\u01c5\3\2\2\2m\u01c7\3\2"+ - "\2\2o\u01c9\3\2\2\2q\u01cc\3\2\2\2s\u01d1\3\2\2\2u\u01d5\3\2\2\2w\u01d8"+ - "\3\2\2\2y\u01dc\3\2\2\2{\u01e0\3\2\2\2}\u01e7\3\2\2\2\177\u01ed\3\2\2"+ - "\2\u0081\u01f6\3\2\2\2\u0083\u01f8\3\2\2\2\u0085\u01fa\3\2\2\2\u0087\u01fc"+ - "\3\2\2\2\u0089\u01fe\3\2\2\2\u008b\u0201\3\2\2\2\u008d\u0204\3\2\2\2\u008f"+ - "\u0207\3\2\2\2\u0091\u020a\3\2\2\2\u0093\u020f\3\2\2\2\u0095\u0215\3\2"+ - "\2\2\u0097\u021a\3\2\2\2\u0099\u021e\3\2\2\2\u009b\u0221\3\2\2\2\u009d"+ - "\u0223\3\2\2\2\u009f\u0225\3\2\2\2\u00a1\u0228\3\2\2\2\u00a3\u022d\3\2"+ - "\2\2\u00a5\u0233\3\2\2\2\u00a7\u0239\3\2\2\2\u00a9\u023f\3\2\2\2\u00ab"+ - "\u0244\3\2\2\2\u00ad\u024a\3\2\2\2\u00af\u0250\3\2\2\2\u00b1\u0256\3\2"+ - "\2\2\u00b3\u025d\3\2\2\2\u00b5\u0263\3\2\2\2\u00b7\u026a\3\2\2\2\u00b9"+ - "\u0270\3\2\2\2\u00bb\u0276\3\2\2\2\u00bd\u027a\3\2\2\2\u00bf\u027d\3\2"+ - "\2\2\u00c1\u0283\3\2\2\2\u00c3\u028a\3\2\2\2\u00c5\u0290\3\2\2\2\u00c7"+ - "\u029b\3\2\2\2\u00c9\u02a4\3\2\2\2\u00cb\u02a9\3\2\2\2\u00cd\u02ad\3\2"+ - "\2\2\u00cf\u02bb\3\2\2\2\u00d1\u02bd\3\2\2\2\u00d3\u02c3\3\2\2\2\u00d5"+ - "\u02c9\3\2\2\2\u00d7\u02d2\3\2\2\2\u00d9\u02e2\3\2\2\2\u00db\u02e4\3\2"+ - "\2\2\u00dd\u02ef\3\2\2\2\u00df\u00e0\7\u0080\2\2\u00e0\4\3\2\2\2\u00e1"+ - "\u00e2\7<\2\2\u00e2\6\3\2\2\2\u00e3\u00e4\7i\2\2\u00e4\u00e5\7q\2\2\u00e5"+ - "\u00e6\7v\2\2\u00e6\u00e7\7q\2\2\u00e7\b\3\2\2\2\u00e8\u00e9\7\'\2\2\u00e9"+ - "\u00ea\7q\2\2\u00ea\u00eb\7w\2\2\u00eb\u00ec\7v\2\2\u00ec\u00ed\7r\2\2"+ - "\u00ed\u00ee\7w\2\2\u00ee\u00ef\7v\2\2\u00ef\n\3\2\2\2\u00f0\u00f1\7\'"+ - "\2\2\u00f1\u00f2\7n\2\2\u00f2\u00f3\7c\2\2\u00f3\u00f4\7w\2\2\u00f4\u00f5"+ - "\7p\2\2\u00f5\u00f6\7e\2\2\u00f6\u00f7\7j\2\2\u00f7\u00f8\7g\2\2\u00f8"+ - "\u00f9\7t\2\2\u00f9\f\3\2\2\2\u00fa\u00fb\7\'\2\2\u00fb\u00fc\7|\2\2\u00fc"+ - "\u00fd\7g\2\2\u00fd\u00fe\7t\2\2\u00fe\u00ff\7q\2\2\u00ff\u0100\7r\2\2"+ - "\u0100\u0101\7c\2\2\u0101\u0102\7i\2\2\u0102\u0103\7g\2\2\u0103\16\3\2"+ - "\2\2\u0104\u0105\7\'\2\2\u0105\u0106\7c\2\2\u0106\u0107\7f\2\2\u0107\u0108"+ - "\7f\2\2\u0108\u0109\7t\2\2\u0109\u010a\7g\2\2\u010a\u010b\7u\2\2\u010b"+ - "\u010c\7u\2\2\u010c\20\3\2\2\2\u010d\u010e\7\'\2\2\u010e\u010f\7k\2\2"+ - "\u010f\u0110\7o\2\2\u0110\u0111\7r\2\2\u0111\u0112\7q\2\2\u0112\u0113"+ - "\7t\2\2\u0113\u0114\7v\2\2\u0114\22\3\2\2\2\u0115\u0116\7\'\2\2\u0116"+ - "\u0117\7d\2\2\u0117\u0118\7t\2\2\u0118\u0119\7g\2\2\u0119\u011a\7c\2\2"+ - "\u011a\u011b\7m\2\2\u011b\u011c\7r\2\2\u011c\u011d\7q\2\2\u011d\u011e"+ - "\7k\2\2\u011e\u011f\7p\2\2\u011f\u0120\7v\2\2\u0120\24\3\2\2\2\u0121\u0122"+ - "\7\'\2\2\u0122\u0123\7c\2\2\u0123\u0124\7u\2\2\u0124\u0125\7o\2\2\u0125"+ - "\u0126\7k\2\2\u0126\u0127\7p\2\2\u0127\u0128\7e\2\2\u0128\u0129\7n\2\2"+ - "\u0129\u012a\7w\2\2\u012a\u012b\7f\2\2\u012b\u012c\7g\2\2\u012c\26\3\2"+ - "\2\2\u012d\u012e\7\'\2\2\u012e\u012f\7c\2\2\u012f\u0130\7u\2\2\u0130\u0131"+ - "\7o\2\2\u0131\u0132\7d\2\2\u0132\u0133\7k\2\2\u0133\u0134\7p\2\2\u0134"+ - "\u0135\7c\2\2\u0135\u0136\7t\2\2\u0136\u0137\7{\2\2\u0137\30\3\2\2\2\u0138"+ - "\u0139\7\'\2\2\u0139\u013a\7q\2\2\u013a\u013b\7r\2\2\u013b\u013c\7v\2"+ - "\2\u013c\u013d\7k\2\2\u013d\u013e\7q\2\2\u013e\u013f\7p\2\2\u013f\32\3"+ - "\2\2\2\u0140\u0141\7.\2\2\u0141\34\3\2\2\2\u0142\u0143\7?\2\2\u0143\36"+ - "\3\2\2\2\u0144\u0145\7e\2\2\u0145\u0146\7q\2\2\u0146\u0147\7p\2\2\u0147"+ - "\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149 \3\2\2\2\u014a\u014b\7o\2\2\u014b"+ - "\u014c\7g\2\2\u014c\u014d\7o\2\2\u014d\u014e\7q\2\2\u014e\u014f\7t\2\2"+ - "\u014f\u0150\7{\2\2\u0150\"\3\2\2\2\u0151\u0152\7d\2\2\u0152\u0153\7{"+ - "\2\2\u0153\u0154\7v\2\2\u0154\u0155\7g\2\2\u0155$\3\2\2\2\u0156\u0157"+ - "\7y\2\2\u0157\u0158\7q\2\2\u0158\u0159\7t\2\2\u0159\u015a\7f\2\2\u015a"+ - "&\3\2\2\2\u015b\u015c\7h\2\2\u015c\u015d\7n\2\2\u015d\u015e\7q\2\2\u015e"+ - "\u015f\7c\2\2\u015f\u0160\7v\2\2\u0160(\3\2\2\2\u0161\u0162\7u\2\2\u0162"+ - "\u0163\7v\2\2\u0163\u0164\7t\2\2\u0164*\3\2\2\2\u0165\u0166\7u\2\2\u0166"+ - "\u0167\7v\2\2\u0167\u0168\7t\2\2\u0168\u0169\7a\2\2\u0169\u016a\7r\2\2"+ - "\u016a,\3\2\2\2\u016b\u016c\7u\2\2\u016c\u016d\7v\2\2\u016d\u016e\7t\2"+ - "\2\u016e\u016f\7a\2\2\u016f\u0170\7u\2\2\u0170.\3\2\2\2\u0171\u0172\7"+ - "u\2\2\u0172\u0173\7v\2\2\u0173\u0174\7t\2\2\u0174\u0175\7a\2\2\u0175\u0176"+ - "\7r\2\2\u0176\u0177\7u\2\2\u0177\60\3\2\2\2\u0178\u0179\7]\2\2\u0179\62"+ - "\3\2\2\2\u017a\u017b\7_\2\2\u017b\64\3\2\2\2\u017c\u017d\7-\2\2\u017d"+ - "\u017e\7?\2\2\u017e\66\3\2\2\2\u017f\u0180\7/\2\2\u0180\u0181\7?\2\2\u0181"+ - "8\3\2\2\2\u0182\u0183\7\61\2\2\u0183\u0184\7?\2\2\u0184:\3\2\2\2\u0185"+ - "\u0186\7\61\2\2\u0186\u0187\7\61\2\2\u0187\u0188\7?\2\2\u0188<\3\2\2\2"+ - "\u0189\u018a\7,\2\2\u018a\u018b\7?\2\2\u018b>\3\2\2\2\u018c\u018d\7,\2"+ - "\2\u018d\u018e\7,\2\2\u018e\u018f\7?\2\2\u018f@\3\2\2\2\u0190\u0191\7"+ - "(\2\2\u0191\u0192\7?\2\2\u0192B\3\2\2\2\u0193\u0194\7~\2\2\u0194\u0195"+ - "\7?\2\2\u0195D\3\2\2\2\u0196\u0197\7`\2\2\u0197\u0198\7?\2\2\u0198F\3"+ - "\2\2\2\u0199\u019a\7-\2\2\u019a\u019b\7-\2\2\u019bH\3\2\2\2\u019c\u019d"+ - "\7/\2\2\u019d\u019e\7/\2\2\u019eJ\3\2\2\2\u019f\u01a0\7*\2\2\u01a0L\3"+ - "\2\2\2\u01a1\u01a2\7+\2\2\u01a2N\3\2\2\2\u01a3\u01a4\7-\2\2\u01a4P\3\2"+ - "\2\2\u01a5\u01a6\7/\2\2\u01a6R\3\2\2\2\u01a7\u01a8\7,\2\2\u01a8\u01a9"+ - "\7,\2\2\u01a9T\3\2\2\2\u01aa\u01ab\7,\2\2\u01abV\3\2\2\2\u01ac\u01ad\7"+ - "\61\2\2\u01adX\3\2\2\2\u01ae\u01af\7\61\2\2\u01af\u01b0\7\61\2\2\u01b0"+ - "Z\3\2\2\2\u01b1\u01b2\7\'\2\2\u01b2\\\3\2\2\2\u01b3\u01b4\7>\2\2\u01b4"+ - "^\3\2\2\2\u01b5\u01b6\7@\2\2\u01b6`\3\2\2\2\u01b7\u01b8\7>\2\2\u01b8\u01b9"+ - "\7?\2\2\u01b9b\3\2\2\2\u01ba\u01bb\7@\2\2\u01bb\u01bc\7?\2\2\u01bcd\3"+ - "\2\2\2\u01bd\u01be\7?\2\2\u01be\u01bf\7?\2\2\u01bff\3\2\2\2\u01c0\u01c1"+ - "\7#\2\2\u01c1\u01c2\7?\2\2\u01c2h\3\2\2\2\u01c3\u01c4\7(\2\2\u01c4j\3"+ - "\2\2\2\u01c5\u01c6\7`\2\2\u01c6l\3\2\2\2\u01c7\u01c8\7~\2\2\u01c8n\3\2"+ - "\2\2\u01c9\u01ca\7v\2\2\u01ca\u01cb\7q\2\2\u01cbp\3\2\2\2\u01cc\u01cd"+ - "\7u\2\2\u01cd\u01ce\7v\2\2\u01ce\u01cf\7g\2\2\u01cf\u01d0\7r\2\2\u01d0"+ - "r\3\2\2\2\u01d1\u01d2\7c\2\2\u01d2\u01d3\7p\2\2\u01d3\u01d4\7f\2\2\u01d4"+ - "t\3\2\2\2\u01d5\u01d6\7q\2\2\u01d6\u01d7\7t\2\2\u01d7v\3\2\2\2\u01d8\u01d9"+ - "\7z\2\2\u01d9\u01da\7q\2\2\u01da\u01db\7t\2\2\u01dbx\3\2\2\2\u01dc\u01dd"+ - "\7p\2\2\u01dd\u01de\7q\2\2\u01de\u01df\7v\2\2\u01dfz\3\2\2\2\u01e0\u01e1"+ - "\7t\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3\7v\2\2\u01e3\u01e4\7w\2\2\u01e4"+ - "\u01e5\7t\2\2\u01e5\u01e6\7p\2\2\u01e6|\3\2\2\2\u01e7\u01e8\7d\2\2\u01e8"+ - "\u01e9\7t\2\2\u01e9\u01ea\7g\2\2\u01ea\u01eb\7c\2\2\u01eb\u01ec\7m\2\2"+ - "\u01ec~\3\2\2\2\u01ed\u01ee\7e\2\2\u01ee\u01ef\7q\2\2\u01ef\u01f0\7p\2"+ - "\2\u01f0\u01f1\7v\2\2\u01f1\u01f2\7k\2\2\u01f2\u01f3\7p\2\2\u01f3\u01f4"+ - "\7w\2\2\u01f4\u01f5\7g\2\2\u01f5\u0080\3\2\2\2\u01f6\u01f7\7\60\2\2\u01f7"+ - "\u0082\3\2\2\2\u01f8\u01f9\7C\2\2\u01f9\u0084\3\2\2\2\u01fa\u01fb\7Z\2"+ - "\2\u01fb\u0086\3\2\2\2\u01fc\u01fd\7[\2\2\u01fd\u0088\3\2\2\2\u01fe\u01ff"+ - "\7C\2\2\u01ff\u0200\7Z\2\2\u0200\u008a\3\2\2\2\u0201\u0202\7C\2\2\u0202"+ - "\u0203\7[\2\2\u0203\u008c\3\2\2\2\u0204\u0205\7Z\2\2\u0205\u0206\7[\2"+ - "\2\u0206\u008e\3\2\2\2\u0207\u0208\7\60\2\2\u0208\u0209\7y\2\2\u0209\u0090"+ - "\3\2\2\2\u020a\u020b\7v\2\2\u020b\u020c\7t\2\2\u020c\u020d\7w\2\2\u020d"+ - "\u020e\7g\2\2\u020e\u0092\3\2\2\2\u020f\u0210\7h\2\2\u0210\u0211\7c\2"+ - "\2\u0211\u0212\7n\2\2\u0212\u0213\7u\2\2\u0213\u0214\7g\2\2\u0214\u0094"+ - "\3\2\2\2\u0215\u0216\7\'\2\2\u0216\u0217\7c\2\2\u0217\u0218\7u\2\2\u0218"+ - "\u0219\7o\2\2\u0219\u0096\3\2\2\2\u021a\u021b\7u\2\2\u021b\u021c\7w\2"+ - "\2\u021c\u021d\7d\2\2\u021d\u0098\3\2\2\2\u021e\u021f\7/\2\2\u021f\u0220"+ - "\7@\2\2\u0220\u009a\3\2\2\2\u0221\u0222\7}\2\2\u0222\u009c\3\2\2\2\u0223"+ - "\u0224\7\177\2\2\u0224\u009e\3\2\2\2\u0225\u0226\7k\2\2\u0226\u0227\7"+ - "h\2\2\u0227\u00a0\3\2\2\2\u0228\u0229\7g\2\2\u0229\u022a\7n\2\2\u022a"+ - "\u022b\7u\2\2\u022b\u022c\7g\2\2\u022c\u00a2\3\2\2\2\u022d\u022e\7k\2"+ - "\2\u022e\u022f\7h\2\2\u022f\u0230\7a\2\2\u0230\u0231\7e\2\2\u0231\u0232"+ - "\7u\2\2\u0232\u00a4\3\2\2\2\u0233\u0234\7k\2\2\u0234\u0235\7h\2\2\u0235"+ - "\u0236\7a\2\2\u0236\u0237\7e\2\2\u0237\u0238\7e\2\2\u0238\u00a6\3\2\2"+ - "\2\u0239\u023a\7k\2\2\u023a\u023b\7h\2\2\u023b\u023c\7a\2\2\u023c\u023d"+ - "\7g\2\2\u023d\u023e\7s\2\2\u023e\u00a8\3\2\2\2\u023f\u0240\7k\2\2\u0240"+ - "\u0241\7h\2\2\u0241\u0242\7a\2\2\u0242\u0243\7|\2\2\u0243\u00aa\3\2\2"+ - "\2\u0244\u0245\7k\2\2\u0245\u0246\7h\2\2\u0246\u0247\7a\2\2\u0247\u0248"+ - "\7p\2\2\u0248\u0249\7g\2\2\u0249\u00ac\3\2\2\2\u024a\u024b\7k\2\2\u024b"+ - "\u024c\7h\2\2\u024c\u024d\7a\2\2\u024d\u024e\7p\2\2\u024e\u024f\7|\2\2"+ - "\u024f\u00ae\3\2\2\2\u0250\u0251\7k\2\2\u0251\u0252\7h\2\2\u0252\u0253"+ - "\7a\2\2\u0253\u0254\7r\2\2\u0254\u0255\7n\2\2\u0255\u00b0\3\2\2\2\u0256"+ - "\u0257\7k\2\2\u0257\u0258\7h\2\2\u0258\u0259\7a\2\2\u0259\u025a\7r\2\2"+ - "\u025a\u025b\7q\2\2\u025b\u025c\7u\2\2\u025c\u00b2\3\2\2\2\u025d\u025e"+ - "\7k\2\2\u025e\u025f\7h\2\2\u025f\u0260\7a\2\2\u0260\u0261\7o\2\2\u0261"+ - "\u0262\7k\2\2\u0262\u00b4\3\2\2\2\u0263\u0264\7k\2\2\u0264\u0265\7h\2"+ - "\2\u0265\u0266\7a\2\2\u0266\u0267\7p\2\2\u0267\u0268\7g\2\2\u0268\u0269"+ - "\7i\2\2\u0269\u00b6\3\2\2\2\u026a\u026b\7k\2\2\u026b\u026c\7h\2\2\u026c"+ - "\u026d\7a\2\2\u026d\u026e\7x\2\2\u026e\u026f\7u\2\2\u026f\u00b8\3\2\2"+ - "\2\u0270\u0271\7k\2\2\u0271\u0272\7h\2\2\u0272\u0273\7a\2\2\u0273\u0274"+ - "\7x\2\2\u0274\u0275\7e\2\2\u0275\u00ba\3\2\2\2\u0276\u0277\7h\2\2\u0277"+ - "\u0278\7q\2\2\u0278\u0279\7t\2\2\u0279\u00bc\3\2\2\2\u027a\u027b\7k\2"+ - "\2\u027b\u027c\7p\2\2\u027c\u00be\3\2\2\2\u027d\u027e\7y\2\2\u027e\u027f"+ - "\7j\2\2\u027f\u0280\7k\2\2\u0280\u0281\7n\2\2\u0281\u0282\7g\2\2\u0282"+ - "\u00c0\3\2\2\2\u0283\u0284\7t\2\2\u0284\u0285\7g\2\2\u0285\u0286\7r\2"+ - "\2\u0286\u0287\7g\2\2\u0287\u0288\7c\2\2\u0288\u0289\7v\2\2\u0289\u00c2"+ - "\3\2\2\2\u028a\u028b\7w\2\2\u028b\u028c\7p\2\2\u028c\u028d\7v\2\2\u028d"+ - "\u028e\7k\2\2\u028e\u028f\7n\2\2\u028f\u00c4\3\2\2\2\u0290\u0294\t\2\2"+ - "\2\u0291\u0293\t\3\2\2\u0292\u0291\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292"+ - "\3\2\2\2\u0294\u0295\3\2\2\2\u0295\u0297\3\2\2\2\u0296\u0294\3\2\2\2\u0297"+ - "\u0298\5\u00c7d\2\u0298\u0299\3\2\2\2\u0299\u029a\bc\2\2\u029a\u00c6\3"+ - "\2\2\2\u029b\u029f\7=\2\2\u029c\u029e\n\2\2\2\u029d\u029c\3\2\2\2\u029e"+ - "\u02a1\3\2\2\2\u029f\u029d\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0\u02a2\3\2"+ - "\2\2\u02a1\u029f\3\2\2\2\u02a2\u02a3\bd\2\2\u02a3\u00c8\3\2\2\2\u02a4"+ - "\u02a5\t\3\2\2\u02a5\u02a6\3\2\2\2\u02a6\u02a7\be\3\2\u02a7\u00ca\3\2"+ - "\2\2\u02a8\u02aa\t\2\2\2\u02a9\u02a8\3\2\2\2\u02aa\u02ab\3\2\2\2\u02ab"+ - "\u02a9\3\2\2\2\u02ab\u02ac\3\2\2\2\u02ac\u00cc\3\2\2\2\u02ad\u02b1\t\4"+ - "\2\2\u02ae\u02b0\t\5\2\2\u02af\u02ae\3\2\2\2\u02b0\u02b3\3\2\2\2\u02b1"+ - "\u02af\3\2\2\2\u02b1\u02b2\3\2\2\2\u02b2\u00ce\3\2\2\2\u02b3\u02b1\3\2"+ - "\2\2\u02b4\u02bc\4\62;\2\u02b5\u02b7\4\63;\2\u02b6\u02b8\4\62;\2\u02b7"+ - "\u02b6\3\2\2\2\u02b8\u02b9\3\2\2\2\u02b9\u02b7\3\2\2\2\u02b9\u02ba\3\2"+ - "\2\2\u02ba\u02bc\3\2\2\2\u02bb\u02b4\3\2\2\2\u02bb\u02b5\3\2\2\2\u02bc"+ - "\u00d0\3\2\2\2\u02bd\u02bf\7&\2\2\u02be\u02c0\t\6\2\2\u02bf\u02be\3\2"+ - "\2\2\u02c0\u02c1\3\2\2\2\u02c1\u02bf\3\2\2\2\u02c1\u02c2\3\2\2\2\u02c2"+ - "\u00d2\3\2\2\2\u02c3\u02c5\7\'\2\2\u02c4\u02c6\4\62\63\2\u02c5\u02c4\3"+ - "\2\2\2\u02c6\u02c7\3\2\2\2\u02c7\u02c5\3\2\2\2\u02c7\u02c8\3\2\2\2\u02c8"+ - "\u00d4\3\2\2\2\u02c9\u02cf\5\u00d7l\2\u02ca\u02cc\t\7\2\2\u02cb\u02cd"+ - "\t\b\2\2\u02cc\u02cb\3\2\2\2\u02cc\u02cd\3\2\2\2\u02cd\u02ce\3\2\2\2\u02ce"+ - "\u02d0\5\u00d7l\2\u02cf\u02ca\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0\u00d6"+ - "\3\2\2\2\u02d1\u02d3\4\62;\2\u02d2\u02d1\3\2\2\2\u02d3\u02d4\3\2\2\2\u02d4"+ - "\u02d2\3\2\2\2\u02d4\u02d5\3\2\2\2\u02d5\u02dc\3\2\2\2\u02d6\u02d8\7\60"+ - "\2\2\u02d7\u02d9\4\62;\2\u02d8\u02d7\3\2\2\2\u02d9\u02da\3\2\2\2\u02da"+ - "\u02d8\3\2\2\2\u02da\u02db\3\2\2\2\u02db\u02dd\3\2\2\2\u02dc\u02d6\3\2"+ - "\2\2\u02dc\u02dd\3\2\2\2\u02dd\u00d8\3\2\2\2\u02de\u02df\7^\2\2\u02df"+ - "\u02e3\13\2\2\2\u02e0\u02e1\7^\2\2\u02e1\u02e3\5\u00cbf\2\u02e2\u02de"+ - "\3\2\2\2\u02e2\u02e0\3\2\2\2\u02e3\u00da\3\2\2\2\u02e4\u02e9\7$\2\2\u02e5"+ - "\u02e8\5\u00d9m\2\u02e6\u02e8\n\t\2\2\u02e7\u02e5\3\2\2\2\u02e7\u02e6"+ - "\3\2\2\2\u02e8\u02eb\3\2\2\2\u02e9\u02e7\3\2\2\2\u02e9\u02ea\3\2\2\2\u02ea"+ - "\u02ec\3\2\2\2\u02eb\u02e9\3\2\2\2\u02ec\u02ed\7$\2\2\u02ed\u02ee\bn\4"+ - "\2\u02ee\u00dc\3\2\2\2\u02ef\u02f0\7}\2\2\u02f0\u02f1\7}\2\2\u02f1\u02f3"+ - "\3\2\2\2\u02f2\u02f4\13\2\2\2\u02f3\u02f2\3\2\2\2\u02f4\u02f5\3\2\2\2"+ - "\u02f5\u02f6\3\2\2\2\u02f5\u02f3\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u02f8"+ - "\7\177\2\2\u02f8\u02f9\7\177\2\2\u02f9\u02fa\3\2\2\2\u02fa\u02fb\bo\5"+ - "\2\u02fb\u00de\3\2\2\2\25\2\u0294\u029f\u02ab\u02b1\u02b9\u02bb\u02bf"+ - "\u02c1\u02c7\u02cc\u02cf\u02d4\u02da\u02dc\u02e2\u02e7\u02e9\u02f5\6\2"+ - "\3\2\b\2\2\3n\2\3o\3"; + "k\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\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\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3I\3I\3J\3J"+ + "\3J\3J\3J\3J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3M\3M\3M\3N\3N\3O\3O\3P\3P\3P"+ + "\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3T\3T\3T\3T\3T\3T"+ + "\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\3X"+ + "\3Y\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"+ + "`\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3b\3b\3b\3c\3c\7c\u0295\nc\fc\16c\u0298"+ + "\13c\3c\3c\3c\3c\3d\3d\7d\u02a0\nd\fd\16d\u02a3\13d\3d\3d\3e\3e\3e\3e"+ + "\3f\6f\u02ac\nf\rf\16f\u02ad\3g\3g\7g\u02b2\ng\fg\16g\u02b5\13g\3h\3h"+ + "\3h\6h\u02ba\nh\rh\16h\u02bb\5h\u02be\nh\3i\3i\6i\u02c2\ni\ri\16i\u02c3"+ + "\3j\3j\6j\u02c8\nj\rj\16j\u02c9\3k\3k\3k\5k\u02cf\nk\3k\5k\u02d2\nk\3"+ + "l\6l\u02d5\nl\rl\16l\u02d6\3l\3l\6l\u02db\nl\rl\16l\u02dc\5l\u02df\nl"+ + "\3m\3m\3m\3m\5m\u02e5\nm\3n\3n\3n\7n\u02ea\nn\fn\16n\u02ed\13n\3n\3n\3"+ + "n\3o\3o\3o\3o\6o\u02f6\no\ro\16o\u02f7\3o\3o\3o\3o\3o\3p\3p\3p\5p\u0302"+ + "\np\3p\3p\3p\3\u02f7\2q\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+ + "\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+ + "\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+ + "c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087"+ + "E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+ + "O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+ + "Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1b\u00c3"+ + "c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3k\u00d5l\u00d7"+ + "\2\u00d9\2\u00dbm\u00ddn\u00dfo\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2"+ + "C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2"+ + "\u0315\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+ + "\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+ + "\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+ + "\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+ + "/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+ + "\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+ + "G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+ + "\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+ + "\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+ + "m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3"+ + "\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2"+ + "\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2"+ + "\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+ + "\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+ + "\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+ + "\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+ + "\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+ + "\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+ + "\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\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\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\3\u00e1"+ + "\3\2\2\2\5\u00e3\3\2\2\2\7\u00e5\3\2\2\2\t\u00ea\3\2\2\2\13\u00f2\3\2"+ + "\2\2\r\u00fc\3\2\2\2\17\u0106\3\2\2\2\21\u010f\3\2\2\2\23\u0117\3\2\2"+ + "\2\25\u0123\3\2\2\2\27\u012f\3\2\2\2\31\u013a\3\2\2\2\33\u0142\3\2\2\2"+ + "\35\u0144\3\2\2\2\37\u0146\3\2\2\2!\u014c\3\2\2\2#\u0153\3\2\2\2%\u0158"+ + "\3\2\2\2\'\u015d\3\2\2\2)\u0163\3\2\2\2+\u0167\3\2\2\2-\u016d\3\2\2\2"+ + "/\u0173\3\2\2\2\61\u017a\3\2\2\2\63\u017c\3\2\2\2\65\u017e\3\2\2\2\67"+ + "\u0181\3\2\2\29\u0184\3\2\2\2;\u0187\3\2\2\2=\u018b\3\2\2\2?\u018e\3\2"+ + "\2\2A\u0192\3\2\2\2C\u0195\3\2\2\2E\u0198\3\2\2\2G\u019b\3\2\2\2I\u019e"+ + "\3\2\2\2K\u01a1\3\2\2\2M\u01a3\3\2\2\2O\u01a5\3\2\2\2Q\u01a7\3\2\2\2S"+ + "\u01a9\3\2\2\2U\u01ac\3\2\2\2W\u01ae\3\2\2\2Y\u01b0\3\2\2\2[\u01b3\3\2"+ + "\2\2]\u01b5\3\2\2\2_\u01b7\3\2\2\2a\u01b9\3\2\2\2c\u01bc\3\2\2\2e\u01bf"+ + "\3\2\2\2g\u01c2\3\2\2\2i\u01c5\3\2\2\2k\u01c7\3\2\2\2m\u01c9\3\2\2\2o"+ + "\u01cb\3\2\2\2q\u01ce\3\2\2\2s\u01d3\3\2\2\2u\u01d7\3\2\2\2w\u01da\3\2"+ + "\2\2y\u01de\3\2\2\2{\u01e2\3\2\2\2}\u01e9\3\2\2\2\177\u01ef\3\2\2\2\u0081"+ + "\u01f8\3\2\2\2\u0083\u01fa\3\2\2\2\u0085\u01fc\3\2\2\2\u0087\u01fe\3\2"+ + "\2\2\u0089\u0200\3\2\2\2\u008b\u0203\3\2\2\2\u008d\u0206\3\2\2\2\u008f"+ + "\u0209\3\2\2\2\u0091\u020c\3\2\2\2\u0093\u0211\3\2\2\2\u0095\u0217\3\2"+ + "\2\2\u0097\u021c\3\2\2\2\u0099\u0220\3\2\2\2\u009b\u0223\3\2\2\2\u009d"+ + "\u0225\3\2\2\2\u009f\u0227\3\2\2\2\u00a1\u022a\3\2\2\2\u00a3\u022f\3\2"+ + "\2\2\u00a5\u0235\3\2\2\2\u00a7\u023b\3\2\2\2\u00a9\u0241\3\2\2\2\u00ab"+ + "\u0246\3\2\2\2\u00ad\u024c\3\2\2\2\u00af\u0252\3\2\2\2\u00b1\u0258\3\2"+ + "\2\2\u00b3\u025f\3\2\2\2\u00b5\u0265\3\2\2\2\u00b7\u026c\3\2\2\2\u00b9"+ + "\u0272\3\2\2\2\u00bb\u0278\3\2\2\2\u00bd\u027c\3\2\2\2\u00bf\u027f\3\2"+ + "\2\2\u00c1\u0285\3\2\2\2\u00c3\u028c\3\2\2\2\u00c5\u0292\3\2\2\2\u00c7"+ + "\u029d\3\2\2\2\u00c9\u02a6\3\2\2\2\u00cb\u02ab\3\2\2\2\u00cd\u02af\3\2"+ + "\2\2\u00cf\u02bd\3\2\2\2\u00d1\u02bf\3\2\2\2\u00d3\u02c5\3\2\2\2\u00d5"+ + "\u02cb\3\2\2\2\u00d7\u02d4\3\2\2\2\u00d9\u02e4\3\2\2\2\u00db\u02e6\3\2"+ + "\2\2\u00dd\u02f1\3\2\2\2\u00df\u02fe\3\2\2\2\u00e1\u00e2\7\u0080\2\2\u00e2"+ + "\4\3\2\2\2\u00e3\u00e4\7<\2\2\u00e4\6\3\2\2\2\u00e5\u00e6\7i\2\2\u00e6"+ + "\u00e7\7q\2\2\u00e7\u00e8\7v\2\2\u00e8\u00e9\7q\2\2\u00e9\b\3\2\2\2\u00ea"+ + "\u00eb\7\'\2\2\u00eb\u00ec\7q\2\2\u00ec\u00ed\7w\2\2\u00ed\u00ee\7v\2"+ + "\2\u00ee\u00ef\7r\2\2\u00ef\u00f0\7w\2\2\u00f0\u00f1\7v\2\2\u00f1\n\3"+ + "\2\2\2\u00f2\u00f3\7\'\2\2\u00f3\u00f4\7n\2\2\u00f4\u00f5\7c\2\2\u00f5"+ + "\u00f6\7w\2\2\u00f6\u00f7\7p\2\2\u00f7\u00f8\7e\2\2\u00f8\u00f9\7j\2\2"+ + "\u00f9\u00fa\7g\2\2\u00fa\u00fb\7t\2\2\u00fb\f\3\2\2\2\u00fc\u00fd\7\'"+ + "\2\2\u00fd\u00fe\7|\2\2\u00fe\u00ff\7g\2\2\u00ff\u0100\7t\2\2\u0100\u0101"+ + "\7q\2\2\u0101\u0102\7r\2\2\u0102\u0103\7c\2\2\u0103\u0104\7i\2\2\u0104"+ + "\u0105\7g\2\2\u0105\16\3\2\2\2\u0106\u0107\7\'\2\2\u0107\u0108\7c\2\2"+ + "\u0108\u0109\7f\2\2\u0109\u010a\7f\2\2\u010a\u010b\7t\2\2\u010b\u010c"+ + "\7g\2\2\u010c\u010d\7u\2\2\u010d\u010e\7u\2\2\u010e\20\3\2\2\2\u010f\u0110"+ + "\7\'\2\2\u0110\u0111\7k\2\2\u0111\u0112\7o\2\2\u0112\u0113\7r\2\2\u0113"+ + "\u0114\7q\2\2\u0114\u0115\7t\2\2\u0115\u0116\7v\2\2\u0116\22\3\2\2\2\u0117"+ + "\u0118\7\'\2\2\u0118\u0119\7d\2\2\u0119\u011a\7t\2\2\u011a\u011b\7g\2"+ + "\2\u011b\u011c\7c\2\2\u011c\u011d\7m\2\2\u011d\u011e\7r\2\2\u011e\u011f"+ + "\7q\2\2\u011f\u0120\7k\2\2\u0120\u0121\7p\2\2\u0121\u0122\7v\2\2\u0122"+ + "\24\3\2\2\2\u0123\u0124\7\'\2\2\u0124\u0125\7c\2\2\u0125\u0126\7u\2\2"+ + "\u0126\u0127\7o\2\2\u0127\u0128\7k\2\2\u0128\u0129\7p\2\2\u0129\u012a"+ + "\7e\2\2\u012a\u012b\7n\2\2\u012b\u012c\7w\2\2\u012c\u012d\7f\2\2\u012d"+ + "\u012e\7g\2\2\u012e\26\3\2\2\2\u012f\u0130\7\'\2\2\u0130\u0131\7c\2\2"+ + "\u0131\u0132\7u\2\2\u0132\u0133\7o\2\2\u0133\u0134\7d\2\2\u0134\u0135"+ + "\7k\2\2\u0135\u0136\7p\2\2\u0136\u0137\7c\2\2\u0137\u0138\7t\2\2\u0138"+ + "\u0139\7{\2\2\u0139\30\3\2\2\2\u013a\u013b\7\'\2\2\u013b\u013c\7q\2\2"+ + "\u013c\u013d\7r\2\2\u013d\u013e\7v\2\2\u013e\u013f\7k\2\2\u013f\u0140"+ + "\7q\2\2\u0140\u0141\7p\2\2\u0141\32\3\2\2\2\u0142\u0143\7.\2\2\u0143\34"+ + "\3\2\2\2\u0144\u0145\7?\2\2\u0145\36\3\2\2\2\u0146\u0147\7e\2\2\u0147"+ + "\u0148\7q\2\2\u0148\u0149\7p\2\2\u0149\u014a\7u\2\2\u014a\u014b\7v\2\2"+ + "\u014b \3\2\2\2\u014c\u014d\7o\2\2\u014d\u014e\7g\2\2\u014e\u014f\7o\2"+ + "\2\u014f\u0150\7q\2\2\u0150\u0151\7t\2\2\u0151\u0152\7{\2\2\u0152\"\3"+ + "\2\2\2\u0153\u0154\7d\2\2\u0154\u0155\7{\2\2\u0155\u0156\7v\2\2\u0156"+ + "\u0157\7g\2\2\u0157$\3\2\2\2\u0158\u0159\7y\2\2\u0159\u015a\7q\2\2\u015a"+ + "\u015b\7t\2\2\u015b\u015c\7f\2\2\u015c&\3\2\2\2\u015d\u015e\7h\2\2\u015e"+ + "\u015f\7n\2\2\u015f\u0160\7q\2\2\u0160\u0161\7c\2\2\u0161\u0162\7v\2\2"+ + "\u0162(\3\2\2\2\u0163\u0164\7u\2\2\u0164\u0165\7v\2\2\u0165\u0166\7t\2"+ + "\2\u0166*\3\2\2\2\u0167\u0168\7u\2\2\u0168\u0169\7v\2\2\u0169\u016a\7"+ + "t\2\2\u016a\u016b\7a\2\2\u016b\u016c\7r\2\2\u016c,\3\2\2\2\u016d\u016e"+ + "\7u\2\2\u016e\u016f\7v\2\2\u016f\u0170\7t\2\2\u0170\u0171\7a\2\2\u0171"+ + "\u0172\7u\2\2\u0172.\3\2\2\2\u0173\u0174\7u\2\2\u0174\u0175\7v\2\2\u0175"+ + "\u0176\7t\2\2\u0176\u0177\7a\2\2\u0177\u0178\7r\2\2\u0178\u0179\7u\2\2"+ + "\u0179\60\3\2\2\2\u017a\u017b\7]\2\2\u017b\62\3\2\2\2\u017c\u017d\7_\2"+ + "\2\u017d\64\3\2\2\2\u017e\u017f\7-\2\2\u017f\u0180\7?\2\2\u0180\66\3\2"+ + "\2\2\u0181\u0182\7/\2\2\u0182\u0183\7?\2\2\u01838\3\2\2\2\u0184\u0185"+ + "\7\61\2\2\u0185\u0186\7?\2\2\u0186:\3\2\2\2\u0187\u0188\7\61\2\2\u0188"+ + "\u0189\7\61\2\2\u0189\u018a\7?\2\2\u018a<\3\2\2\2\u018b\u018c\7,\2\2\u018c"+ + "\u018d\7?\2\2\u018d>\3\2\2\2\u018e\u018f\7,\2\2\u018f\u0190\7,\2\2\u0190"+ + "\u0191\7?\2\2\u0191@\3\2\2\2\u0192\u0193\7(\2\2\u0193\u0194\7?\2\2\u0194"+ + "B\3\2\2\2\u0195\u0196\7~\2\2\u0196\u0197\7?\2\2\u0197D\3\2\2\2\u0198\u0199"+ + "\7`\2\2\u0199\u019a\7?\2\2\u019aF\3\2\2\2\u019b\u019c\7-\2\2\u019c\u019d"+ + "\7-\2\2\u019dH\3\2\2\2\u019e\u019f\7/\2\2\u019f\u01a0\7/\2\2\u01a0J\3"+ + "\2\2\2\u01a1\u01a2\7*\2\2\u01a2L\3\2\2\2\u01a3\u01a4\7+\2\2\u01a4N\3\2"+ + "\2\2\u01a5\u01a6\7-\2\2\u01a6P\3\2\2\2\u01a7\u01a8\7/\2\2\u01a8R\3\2\2"+ + "\2\u01a9\u01aa\7,\2\2\u01aa\u01ab\7,\2\2\u01abT\3\2\2\2\u01ac\u01ad\7"+ + ",\2\2\u01adV\3\2\2\2\u01ae\u01af\7\61\2\2\u01afX\3\2\2\2\u01b0\u01b1\7"+ + "\61\2\2\u01b1\u01b2\7\61\2\2\u01b2Z\3\2\2\2\u01b3\u01b4\7\'\2\2\u01b4"+ + "\\\3\2\2\2\u01b5\u01b6\7>\2\2\u01b6^\3\2\2\2\u01b7\u01b8\7@\2\2\u01b8"+ + "`\3\2\2\2\u01b9\u01ba\7>\2\2\u01ba\u01bb\7?\2\2\u01bbb\3\2\2\2\u01bc\u01bd"+ + "\7@\2\2\u01bd\u01be\7?\2\2\u01bed\3\2\2\2\u01bf\u01c0\7?\2\2\u01c0\u01c1"+ + "\7?\2\2\u01c1f\3\2\2\2\u01c2\u01c3\7#\2\2\u01c3\u01c4\7?\2\2\u01c4h\3"+ + "\2\2\2\u01c5\u01c6\7(\2\2\u01c6j\3\2\2\2\u01c7\u01c8\7`\2\2\u01c8l\3\2"+ + "\2\2\u01c9\u01ca\7~\2\2\u01can\3\2\2\2\u01cb\u01cc\7v\2\2\u01cc\u01cd"+ + "\7q\2\2\u01cdp\3\2\2\2\u01ce\u01cf\7u\2\2\u01cf\u01d0\7v\2\2\u01d0\u01d1"+ + "\7g\2\2\u01d1\u01d2\7r\2\2\u01d2r\3\2\2\2\u01d3\u01d4\7c\2\2\u01d4\u01d5"+ + "\7p\2\2\u01d5\u01d6\7f\2\2\u01d6t\3\2\2\2\u01d7\u01d8\7q\2\2\u01d8\u01d9"+ + "\7t\2\2\u01d9v\3\2\2\2\u01da\u01db\7z\2\2\u01db\u01dc\7q\2\2\u01dc\u01dd"+ + "\7t\2\2\u01ddx\3\2\2\2\u01de\u01df\7p\2\2\u01df\u01e0\7q\2\2\u01e0\u01e1"+ + "\7v\2\2\u01e1z\3\2\2\2\u01e2\u01e3\7t\2\2\u01e3\u01e4\7g\2\2\u01e4\u01e5"+ + "\7v\2\2\u01e5\u01e6\7w\2\2\u01e6\u01e7\7t\2\2\u01e7\u01e8\7p\2\2\u01e8"+ + "|\3\2\2\2\u01e9\u01ea\7d\2\2\u01ea\u01eb\7t\2\2\u01eb\u01ec\7g\2\2\u01ec"+ + "\u01ed\7c\2\2\u01ed\u01ee\7m\2\2\u01ee~\3\2\2\2\u01ef\u01f0\7e\2\2\u01f0"+ + "\u01f1\7q\2\2\u01f1\u01f2\7p\2\2\u01f2\u01f3\7v\2\2\u01f3\u01f4\7k\2\2"+ + "\u01f4\u01f5\7p\2\2\u01f5\u01f6\7w\2\2\u01f6\u01f7\7g\2\2\u01f7\u0080"+ + "\3\2\2\2\u01f8\u01f9\7\60\2\2\u01f9\u0082\3\2\2\2\u01fa\u01fb\7C\2\2\u01fb"+ + "\u0084\3\2\2\2\u01fc\u01fd\7Z\2\2\u01fd\u0086\3\2\2\2\u01fe\u01ff\7[\2"+ + "\2\u01ff\u0088\3\2\2\2\u0200\u0201\7C\2\2\u0201\u0202\7Z\2\2\u0202\u008a"+ + "\3\2\2\2\u0203\u0204\7C\2\2\u0204\u0205\7[\2\2\u0205\u008c\3\2\2\2\u0206"+ + "\u0207\7Z\2\2\u0207\u0208\7[\2\2\u0208\u008e\3\2\2\2\u0209\u020a\7\60"+ + "\2\2\u020a\u020b\7y\2\2\u020b\u0090\3\2\2\2\u020c\u020d\7v\2\2\u020d\u020e"+ + "\7t\2\2\u020e\u020f\7w\2\2\u020f\u0210\7g\2\2\u0210\u0092\3\2\2\2\u0211"+ + "\u0212\7h\2\2\u0212\u0213\7c\2\2\u0213\u0214\7n\2\2\u0214\u0215\7u\2\2"+ + "\u0215\u0216\7g\2\2\u0216\u0094\3\2\2\2\u0217\u0218\7\'\2\2\u0218\u0219"+ + "\7c\2\2\u0219\u021a\7u\2\2\u021a\u021b\7o\2\2\u021b\u0096\3\2\2\2\u021c"+ + "\u021d\7u\2\2\u021d\u021e\7w\2\2\u021e\u021f\7d\2\2\u021f\u0098\3\2\2"+ + "\2\u0220\u0221\7/\2\2\u0221\u0222\7@\2\2\u0222\u009a\3\2\2\2\u0223\u0224"+ + "\7}\2\2\u0224\u009c\3\2\2\2\u0225\u0226\7\177\2\2\u0226\u009e\3\2\2\2"+ + "\u0227\u0228\7k\2\2\u0228\u0229\7h\2\2\u0229\u00a0\3\2\2\2\u022a\u022b"+ + "\7g\2\2\u022b\u022c\7n\2\2\u022c\u022d\7u\2\2\u022d\u022e\7g\2\2\u022e"+ + "\u00a2\3\2\2\2\u022f\u0230\7k\2\2\u0230\u0231\7h\2\2\u0231\u0232\7a\2"+ + "\2\u0232\u0233\7e\2\2\u0233\u0234\7u\2\2\u0234\u00a4\3\2\2\2\u0235\u0236"+ + "\7k\2\2\u0236\u0237\7h\2\2\u0237\u0238\7a\2\2\u0238\u0239\7e\2\2\u0239"+ + "\u023a\7e\2\2\u023a\u00a6\3\2\2\2\u023b\u023c\7k\2\2\u023c\u023d\7h\2"+ + "\2\u023d\u023e\7a\2\2\u023e\u023f\7g\2\2\u023f\u0240\7s\2\2\u0240\u00a8"+ + "\3\2\2\2\u0241\u0242\7k\2\2\u0242\u0243\7h\2\2\u0243\u0244\7a\2\2\u0244"+ + "\u0245\7|\2\2\u0245\u00aa\3\2\2\2\u0246\u0247\7k\2\2\u0247\u0248\7h\2"+ + "\2\u0248\u0249\7a\2\2\u0249\u024a\7p\2\2\u024a\u024b\7g\2\2\u024b\u00ac"+ + "\3\2\2\2\u024c\u024d\7k\2\2\u024d\u024e\7h\2\2\u024e\u024f\7a\2\2\u024f"+ + "\u0250\7p\2\2\u0250\u0251\7|\2\2\u0251\u00ae\3\2\2\2\u0252\u0253\7k\2"+ + "\2\u0253\u0254\7h\2\2\u0254\u0255\7a\2\2\u0255\u0256\7r\2\2\u0256\u0257"+ + "\7n\2\2\u0257\u00b0\3\2\2\2\u0258\u0259\7k\2\2\u0259\u025a\7h\2\2\u025a"+ + "\u025b\7a\2\2\u025b\u025c\7r\2\2\u025c\u025d\7q\2\2\u025d\u025e\7u\2\2"+ + "\u025e\u00b2\3\2\2\2\u025f\u0260\7k\2\2\u0260\u0261\7h\2\2\u0261\u0262"+ + "\7a\2\2\u0262\u0263\7o\2\2\u0263\u0264\7k\2\2\u0264\u00b4\3\2\2\2\u0265"+ + "\u0266\7k\2\2\u0266\u0267\7h\2\2\u0267\u0268\7a\2\2\u0268\u0269\7p\2\2"+ + "\u0269\u026a\7g\2\2\u026a\u026b\7i\2\2\u026b\u00b6\3\2\2\2\u026c\u026d"+ + "\7k\2\2\u026d\u026e\7h\2\2\u026e\u026f\7a\2\2\u026f\u0270\7x\2\2\u0270"+ + "\u0271\7u\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\7x\2\2\u0276\u0277\7e\2\2\u0277\u00ba"+ + "\3\2\2\2\u0278\u0279\7h\2\2\u0279\u027a\7q\2\2\u027a\u027b\7t\2\2\u027b"+ + "\u00bc\3\2\2\2\u027c\u027d\7k\2\2\u027d\u027e\7p\2\2\u027e\u00be\3\2\2"+ + "\2\u027f\u0280\7y\2\2\u0280\u0281\7j\2\2\u0281\u0282\7k\2\2\u0282\u0283"+ + "\7n\2\2\u0283\u0284\7g\2\2\u0284\u00c0\3\2\2\2\u0285\u0286\7t\2\2\u0286"+ + "\u0287\7g\2\2\u0287\u0288\7r\2\2\u0288\u0289\7g\2\2\u0289\u028a\7c\2\2"+ + "\u028a\u028b\7v\2\2\u028b\u00c2\3\2\2\2\u028c\u028d\7w\2\2\u028d\u028e"+ + "\7p\2\2\u028e\u028f\7v\2\2\u028f\u0290\7k\2\2\u0290\u0291\7n\2\2\u0291"+ + "\u00c4\3\2\2\2\u0292\u0296\t\2\2\2\u0293\u0295\t\3\2\2\u0294\u0293\3\2"+ + "\2\2\u0295\u0298\3\2\2\2\u0296\u0294\3\2\2\2\u0296\u0297\3\2\2\2\u0297"+ + "\u0299\3\2\2\2\u0298\u0296\3\2\2\2\u0299\u029a\5\u00c7d\2\u029a\u029b"+ + "\3\2\2\2\u029b\u029c\bc\2\2\u029c\u00c6\3\2\2\2\u029d\u02a1\7=\2\2\u029e"+ + "\u02a0\n\2\2\2\u029f\u029e\3\2\2\2\u02a0\u02a3\3\2\2\2\u02a1\u029f\3\2"+ + "\2\2\u02a1\u02a2\3\2\2\2\u02a2\u02a4\3\2\2\2\u02a3\u02a1\3\2\2\2\u02a4"+ + "\u02a5\bd\2\2\u02a5\u00c8\3\2\2\2\u02a6\u02a7\t\3\2\2\u02a7\u02a8\3\2"+ + "\2\2\u02a8\u02a9\be\3\2\u02a9\u00ca\3\2\2\2\u02aa\u02ac\t\2\2\2\u02ab"+ + "\u02aa\3\2\2\2\u02ac\u02ad\3\2\2\2\u02ad\u02ab\3\2\2\2\u02ad\u02ae\3\2"+ + "\2\2\u02ae\u00cc\3\2\2\2\u02af\u02b3\t\4\2\2\u02b0\u02b2\t\5\2\2\u02b1"+ + "\u02b0\3\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b3\u02b4\3\2"+ + "\2\2\u02b4\u00ce\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b6\u02be\4\62;\2\u02b7"+ + "\u02b9\4\63;\2\u02b8\u02ba\4\62;\2\u02b9\u02b8\3\2\2\2\u02ba\u02bb\3\2"+ + "\2\2\u02bb\u02b9\3\2\2\2\u02bb\u02bc\3\2\2\2\u02bc\u02be\3\2\2\2\u02bd"+ + "\u02b6\3\2\2\2\u02bd\u02b7\3\2\2\2\u02be\u00d0\3\2\2\2\u02bf\u02c1\7&"+ + "\2\2\u02c0\u02c2\t\6\2\2\u02c1\u02c0\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3"+ + "\u02c1\3\2\2\2\u02c3\u02c4\3\2\2\2\u02c4\u00d2\3\2\2\2\u02c5\u02c7\7\'"+ + "\2\2\u02c6\u02c8\4\62\63\2\u02c7\u02c6\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c9"+ + "\u02c7\3\2\2\2\u02c9\u02ca\3\2\2\2\u02ca\u00d4\3\2\2\2\u02cb\u02d1\5\u00d7"+ + "l\2\u02cc\u02ce\t\7\2\2\u02cd\u02cf\t\b\2\2\u02ce\u02cd\3\2\2\2\u02ce"+ + "\u02cf\3\2\2\2\u02cf\u02d0\3\2\2\2\u02d0\u02d2\5\u00d7l\2\u02d1\u02cc"+ + "\3\2\2\2\u02d1\u02d2\3\2\2\2\u02d2\u00d6\3\2\2\2\u02d3\u02d5\4\62;\2\u02d4"+ + "\u02d3\3\2\2\2\u02d5\u02d6\3\2\2\2\u02d6\u02d4\3\2\2\2\u02d6\u02d7\3\2"+ + "\2\2\u02d7\u02de\3\2\2\2\u02d8\u02da\7\60\2\2\u02d9\u02db\4\62;\2\u02da"+ + "\u02d9\3\2\2\2\u02db\u02dc\3\2\2\2\u02dc\u02da\3\2\2\2\u02dc\u02dd\3\2"+ + "\2\2\u02dd\u02df\3\2\2\2\u02de\u02d8\3\2\2\2\u02de\u02df\3\2\2\2\u02df"+ + "\u00d8\3\2\2\2\u02e0\u02e1\7^\2\2\u02e1\u02e5\13\2\2\2\u02e2\u02e3\7^"+ + "\2\2\u02e3\u02e5\5\u00cbf\2\u02e4\u02e0\3\2\2\2\u02e4\u02e2\3\2\2\2\u02e5"+ + "\u00da\3\2\2\2\u02e6\u02eb\7$\2\2\u02e7\u02ea\5\u00d9m\2\u02e8\u02ea\n"+ + "\t\2\2\u02e9\u02e7\3\2\2\2\u02e9\u02e8\3\2\2\2\u02ea\u02ed\3\2\2\2\u02eb"+ + "\u02e9\3\2\2\2\u02eb\u02ec\3\2\2\2\u02ec\u02ee\3\2\2\2\u02ed\u02eb\3\2"+ + "\2\2\u02ee\u02ef\7$\2\2\u02ef\u02f0\bn\4\2\u02f0\u00dc\3\2\2\2\u02f1\u02f2"+ + "\7}\2\2\u02f2\u02f3\7}\2\2\u02f3\u02f5\3\2\2\2\u02f4\u02f6\13\2\2\2\u02f5"+ + "\u02f4\3\2\2\2\u02f6\u02f7\3\2\2\2\u02f7\u02f8\3\2\2\2\u02f7\u02f5\3\2"+ + "\2\2\u02f8\u02f9\3\2\2\2\u02f9\u02fa\7\177\2\2\u02fa\u02fb\7\177\2\2\u02fb"+ + "\u02fc\3\2\2\2\u02fc\u02fd\bo\5\2\u02fd\u00de\3\2\2\2\u02fe\u0301\7)\2"+ + "\2\u02ff\u0302\5\u00d9m\2\u0300\u0302\n\t\2\2\u0301\u02ff\3\2\2\2\u0301"+ + "\u0300\3\2\2\2\u0302\u0303\3\2\2\2\u0303\u0304\7)\2\2\u0304\u0305\bp\6"+ + "\2\u0305\u00e0\3\2\2\2\26\2\u0296\u02a1\u02ad\u02b3\u02bb\u02bd\u02c1"+ + "\u02c3\u02c9\u02ce\u02d1\u02d6\u02dc\u02de\u02e4\u02e9\u02eb\u02f7\u0301"+ + "\7\2\3\2\b\2\2\3n\2\3o\3\3p\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 c992e5673..6d793bcc4 100644 --- a/compiler/src/prog8/parser/prog8Parser.java +++ b/compiler/src/prog8/parser/prog8Parser.java @@ -32,7 +32,7 @@ public class prog8Parser extends Parser { 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, LINECOMMENT=98, COMMENT=99, WS=100, EOL=101, NAME=102, DEC_INTEGER=103, HEX_INTEGER=104, BIN_INTEGER=105, FLOAT_NUMBER=106, - STRING=107, INLINEASMBLOCK=108; + STRING=107, INLINEASMBLOCK=108, SINGLECHAR=109; 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, @@ -43,12 +43,12 @@ public class prog8Parser extends Parser { RULE_returnstmt = 22, RULE_breakstmt = 23, RULE_continuestmt = 24, RULE_identifier = 25, RULE_scoped_identifier = 26, RULE_register = 27, RULE_integerliteral = 28, RULE_wordsuffix = 29, RULE_booleanliteral = 30, RULE_arrayliteral = 31, - RULE_stringliteral = 32, RULE_floatliteral = 33, RULE_literalvalue = 34, - RULE_inlineasm = 35, RULE_subroutine = 36, RULE_sub_return_part = 37, - RULE_statement_block = 38, RULE_sub_address = 39, RULE_sub_params = 40, - RULE_sub_param = 41, RULE_sub_returns = 42, RULE_if_stmt = 43, RULE_else_part = 44, - RULE_branch_stmt = 45, RULE_branchcondition = 46, RULE_forloop = 47, RULE_whileloop = 48, - RULE_repeatloop = 49; + RULE_stringliteral = 32, RULE_charliteral = 33, RULE_floatliteral = 34, + RULE_literalvalue = 35, RULE_inlineasm = 36, RULE_subroutine = 37, RULE_sub_return_part = 38, + RULE_statement_block = 39, RULE_sub_address = 40, RULE_sub_params = 41, + RULE_sub_param = 42, RULE_sub_returns = 43, RULE_if_stmt = 44, RULE_else_part = 45, + RULE_branch_stmt = 46, RULE_branchcondition = 47, RULE_forloop = 48, RULE_whileloop = 49, + RULE_repeatloop = 50; public static final String[] ruleNames = { "module", "modulestatement", "block", "statement", "labeldef", "unconditionaljump", "directive", "directivearg", "vardecl", "varinitializer", "constdecl", @@ -56,10 +56,10 @@ public class prog8Parser extends Parser { "assign_target", "postincrdecr", "expression", "functioncall", "functioncall_stmt", "expression_list", "returnstmt", "breakstmt", "continuestmt", "identifier", "scoped_identifier", "register", "integerliteral", "wordsuffix", "booleanliteral", - "arrayliteral", "stringliteral", "floatliteral", "literalvalue", "inlineasm", - "subroutine", "sub_return_part", "statement_block", "sub_address", "sub_params", - "sub_param", "sub_returns", "if_stmt", "else_part", "branch_stmt", "branchcondition", - "forloop", "whileloop", "repeatloop" + "arrayliteral", "stringliteral", "charliteral", "floatliteral", "literalvalue", + "inlineasm", "subroutine", "sub_return_part", "statement_block", "sub_address", + "sub_params", "sub_param", "sub_returns", "if_stmt", "else_part", "branch_stmt", + "branchcondition", "forloop", "whileloop", "repeatloop" }; private static final String[] _LITERAL_NAMES = { @@ -87,7 +87,8 @@ 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, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", - "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" + "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK", + "SINGLECHAR" }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); @@ -163,12 +164,12 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(104); + setState(106); _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) { { - setState(102); + setState(104); _errHandler.sync(this); switch (_input.LA(1)) { case T__0: @@ -182,13 +183,13 @@ public class prog8Parser extends Parser { case T__10: case T__11: { - setState(100); + setState(102); modulestatement(); } break; case EOL: { - setState(101); + setState(103); match(EOL); } break; @@ -196,11 +197,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(106); + setState(108); _errHandler.sync(this); _la = _input.LA(1); } - setState(107); + setState(109); match(EOF); } } @@ -232,7 +233,7 @@ public class prog8Parser extends Parser { ModulestatementContext _localctx = new ModulestatementContext(_ctx, getState()); enterRule(_localctx, 2, RULE_modulestatement); try { - setState(111); + setState(113); _errHandler.sync(this); switch (_input.LA(1)) { case T__3: @@ -246,14 +247,14 @@ public class prog8Parser extends Parser { case T__11: enterOuterAlt(_localctx, 1); { - setState(109); + setState(111); directive(); } break; case T__0: enterOuterAlt(_localctx, 2); { - setState(110); + setState(112); block(); } break; @@ -296,23 +297,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(113); + setState(115); match(T__0); - setState(114); - identifier(); setState(116); + identifier(); + setState(118); _errHandler.sync(this); _la = _input.LA(1); if (((((_la - 103)) & ~0x3f) == 0 && ((1L << (_la - 103)) & ((1L << (DEC_INTEGER - 103)) | (1L << (HEX_INTEGER - 103)) | (1L << (BIN_INTEGER - 103)))) != 0)) { { - setState(115); + setState(117); integerliteral(); } } - setState(118); + setState(120); statement_block(); - setState(119); + setState(121); match(EOL); } } @@ -401,153 +402,153 @@ public class prog8Parser extends Parser { StatementContext _localctx = new StatementContext(_ctx, getState()); enterRule(_localctx, 6, RULE_statement); try { - setState(142); + setState(144); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,4,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(121); + setState(123); directive(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(122); + setState(124); varinitializer(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(123); + setState(125); vardecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(124); + setState(126); constdecl(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(125); + setState(127); memoryvardecl(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(126); + setState(128); assignment(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(127); + setState(129); augassignment(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(128); + setState(130); unconditionaljump(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(129); + setState(131); postincrdecr(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(130); + setState(132); functioncall_stmt(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(131); + setState(133); if_stmt(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(132); + setState(134); branch_stmt(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(133); + setState(135); subroutine(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(134); + setState(136); inlineasm(); } break; case 15: enterOuterAlt(_localctx, 15); { - setState(135); + setState(137); returnstmt(); } break; case 16: enterOuterAlt(_localctx, 16); { - setState(136); + setState(138); forloop(); } break; case 17: enterOuterAlt(_localctx, 17); { - setState(137); + setState(139); whileloop(); } break; case 18: enterOuterAlt(_localctx, 18); { - setState(138); + setState(140); repeatloop(); } break; case 19: enterOuterAlt(_localctx, 19); { - setState(139); + setState(141); breakstmt(); } break; case 20: enterOuterAlt(_localctx, 20); { - setState(140); + setState(142); continuestmt(); } break; case 21: enterOuterAlt(_localctx, 21); { - setState(141); + setState(143); labeldef(); } break; @@ -580,9 +581,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(144); + setState(146); identifier(); - setState(145); + setState(147); match(T__1); } } @@ -619,26 +620,26 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(147); + setState(149); match(T__2); - setState(151); + setState(153); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: { - setState(148); + setState(150); integerliteral(); } break; case 2: { - setState(149); + setState(151); identifier(); } break; case 3: { - setState(150); + setState(152); scoped_identifier(); } break; @@ -677,7 +678,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(153); + setState(155); ((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)) ) { @@ -688,17 +689,17 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(165); + setState(167); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,8,_ctx) ) { case 1: { - setState(155); + setState(157); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: { - setState(154); + setState(156); directivearg(); } break; @@ -707,21 +708,21 @@ public class prog8Parser extends Parser { break; case 2: { - setState(157); + setState(159); directivearg(); - setState(162); + setState(164); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(158); + setState(160); match(T__12); - setState(159); + setState(161); directivearg(); } } - setState(164); + setState(166); _errHandler.sync(this); _la = _input.LA(1); } @@ -761,20 +762,20 @@ public class prog8Parser extends Parser { DirectiveargContext _localctx = new DirectiveargContext(_ctx, getState()); enterRule(_localctx, 14, RULE_directivearg); try { - setState(170); + setState(172); _errHandler.sync(this); switch (_input.LA(1)) { case STRING: enterOuterAlt(_localctx, 1); { - setState(167); + setState(169); stringliteral(); } break; case NAME: enterOuterAlt(_localctx, 2); { - setState(168); + setState(170); identifier(); } break; @@ -783,7 +784,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 3); { - setState(169); + setState(171); integerliteral(); } break; @@ -825,19 +826,19 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(172); - datatype(); setState(174); + datatype(); + setState(176); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__23) { { - setState(173); + setState(175); arrayspec(); } } - setState(176); + setState(178); identifier(); } } @@ -878,23 +879,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(178); - datatype(); setState(180); + datatype(); + setState(182); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__23) { { - setState(179); + setState(181); arrayspec(); } } - setState(182); - identifier(); - setState(183); - match(T__13); setState(184); + identifier(); + setState(185); + match(T__13); + setState(186); expression(0); } } @@ -925,9 +926,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(186); + setState(188); match(T__14); - setState(187); + setState(189); varinitializer(); } } @@ -958,9 +959,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(189); + setState(191); match(T__15); - setState(190); + setState(192); varinitializer(); } } @@ -989,7 +990,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(192); + setState(194); _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)) ) { _errHandler.recoverInline(this); @@ -1032,23 +1033,23 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(194); + setState(196); match(T__23); - setState(195); + setState(197); expression(0); - setState(198); + setState(200); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__12) { { - setState(196); + setState(198); match(T__12); - setState(197); + setState(199); expression(0); } } - setState(200); + setState(202); match(T__24); } } @@ -1082,11 +1083,11 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(202); - assign_target(); - setState(203); - match(T__13); setState(204); + assign_target(); + setState(205); + match(T__13); + setState(206); expression(0); } } @@ -1122,9 +1123,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(206); + setState(208); assign_target(); - setState(207); + setState(209); ((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)) ) { @@ -1135,7 +1136,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(208); + setState(210); expression(0); } } @@ -1170,27 +1171,27 @@ public class prog8Parser extends Parser { Assign_targetContext _localctx = new Assign_targetContext(_ctx, getState()); enterRule(_localctx, 32, RULE_assign_target); try { - setState(213); + setState(215); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,13,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(210); + setState(212); register(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(211); + setState(213); identifier(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(212); + setState(214); scoped_identifier(); } break; @@ -1225,9 +1226,9 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(215); + setState(217); assign_target(); - setState(216); + setState(218); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__34 || _la==T__35) ) { @@ -1305,28 +1306,28 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(232); + setState(234); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,14,_ctx) ) { case 1: { - setState(219); - match(T__36); - setState(220); - expression(0); setState(221); + match(T__36); + setState(222); + expression(0); + setState(223); match(T__37); } break; case 2: { - setState(223); + setState(225); functioncall(); } break; case 3: { - setState(224); + setState(226); ((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)) ) { @@ -1337,45 +1338,45 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(225); + setState(227); expression(18); } break; case 4: { - setState(226); + setState(228); ((ExpressionContext)_localctx).prefix = match(T__59); - setState(227); + setState(229); expression(5); } break; case 5: { - setState(228); + setState(230); literalvalue(); } break; case 6: { - setState(229); + setState(231); register(); } break; case 7: { - setState(230); + setState(232); identifier(); } break; case 8: { - setState(231); + setState(233); scoped_identifier(); } break; } _ctx.stop = _input.LT(-1); - setState(278); + setState(280); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -1383,7 +1384,7 @@ public class prog8Parser extends Parser { if ( _parseListeners!=null ) triggerExitRuleEvent(); _prevctx = _localctx; { - setState(276); + setState(278); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,16,_ctx) ) { case 1: @@ -1392,11 +1393,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(234); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(235); - ((ExpressionContext)_localctx).bop = match(T__40); setState(236); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + setState(237); + ((ExpressionContext)_localctx).bop = match(T__40); + setState(238); ((ExpressionContext)_localctx).right = expression(18); } break; @@ -1406,9 +1407,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(237); + setState(239); if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); - setState(238); + setState(240); ((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)) ) { @@ -1419,7 +1420,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(239); + setState(241); ((ExpressionContext)_localctx).right = expression(17); } break; @@ -1429,9 +1430,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(240); + setState(242); if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(241); + setState(243); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__38 || _la==T__39) ) { @@ -1442,7 +1443,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(242); + setState(244); ((ExpressionContext)_localctx).right = expression(16); } break; @@ -1452,9 +1453,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(243); + setState(245); if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); - setState(244); + setState(246); ((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)) ) { @@ -1465,7 +1466,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(245); + setState(247); ((ExpressionContext)_localctx).right = expression(15); } break; @@ -1475,9 +1476,9 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(246); + setState(248); if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(247); + setState(249); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__49 || _la==T__50) ) { @@ -1488,7 +1489,7 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(248); + setState(250); ((ExpressionContext)_localctx).right = expression(14); } break; @@ -1498,11 +1499,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(249); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(250); - ((ExpressionContext)_localctx).bop = match(T__51); setState(251); + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + setState(252); + ((ExpressionContext)_localctx).bop = match(T__51); + setState(253); ((ExpressionContext)_localctx).right = expression(13); } break; @@ -1512,11 +1513,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(252); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(253); - ((ExpressionContext)_localctx).bop = match(T__52); setState(254); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + setState(255); + ((ExpressionContext)_localctx).bop = match(T__52); + setState(256); ((ExpressionContext)_localctx).right = expression(12); } break; @@ -1526,11 +1527,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(255); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(256); - ((ExpressionContext)_localctx).bop = match(T__53); setState(257); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + setState(258); + ((ExpressionContext)_localctx).bop = match(T__53); + setState(259); ((ExpressionContext)_localctx).right = expression(11); } break; @@ -1540,11 +1541,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(258); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(259); - ((ExpressionContext)_localctx).bop = match(T__56); setState(260); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + setState(261); + ((ExpressionContext)_localctx).bop = match(T__56); + setState(262); ((ExpressionContext)_localctx).right = expression(9); } break; @@ -1554,11 +1555,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(261); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(262); - ((ExpressionContext)_localctx).bop = match(T__57); setState(263); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + setState(264); + ((ExpressionContext)_localctx).bop = match(T__57); + setState(265); ((ExpressionContext)_localctx).right = expression(8); } break; @@ -1568,11 +1569,11 @@ public class prog8Parser extends Parser { _localctx.left = _prevctx; _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(264); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(265); - ((ExpressionContext)_localctx).bop = match(T__58); setState(266); + if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + setState(267); + ((ExpressionContext)_localctx).bop = match(T__58); + setState(268); ((ExpressionContext)_localctx).right = expression(7); } break; @@ -1580,9 +1581,9 @@ public class prog8Parser extends Parser { { _localctx = new ExpressionContext(_parentctx, _parentState); pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(267); + setState(269); if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); - setState(268); + setState(270); arrayspec(); } break; @@ -1592,20 +1593,20 @@ public class prog8Parser extends Parser { _localctx.rangefrom = _prevctx; _localctx.rangefrom = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); - setState(269); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(270); - match(T__54); setState(271); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + setState(272); + match(T__54); + setState(273); ((ExpressionContext)_localctx).rangeto = expression(0); - setState(274); + setState(276); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,15,_ctx) ) { case 1: { - setState(272); + setState(274); match(T__55); - setState(273); + setState(275); ((ExpressionContext)_localctx).rangestep = expression(0); } break; @@ -1615,7 +1616,7 @@ public class prog8Parser extends Parser { } } } - setState(280); + setState(282); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,17,_ctx); } @@ -1655,35 +1656,35 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(283); + setState(285); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,18,_ctx) ) { case 1: { - setState(281); + setState(283); identifier(); } break; case 2: { - setState(282); + setState(284); scoped_identifier(); } break; } - setState(285); - match(T__36); setState(287); + match(T__36); + setState(289); _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__71 - 65)) | (1L << (T__72 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) { + 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__71 - 65)) | (1L << (T__72 - 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)) { { - setState(286); + setState(288); expression_list(); } } - setState(289); + setState(291); match(T__37); } } @@ -1721,35 +1722,35 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(293); + setState(295); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,20,_ctx) ) { case 1: { - setState(291); + setState(293); identifier(); } break; case 2: { - setState(292); + setState(294); scoped_identifier(); } break; } - setState(295); - match(T__36); setState(297); + match(T__36); + setState(299); _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__71 - 65)) | (1L << (T__72 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) { + 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__71 - 65)) | (1L << (T__72 - 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)) { { - setState(296); + setState(298); expression_list(); } } - setState(299); + setState(301); match(T__37); } } @@ -1784,21 +1785,21 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(301); + setState(303); expression(0); - setState(306); + setState(308); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(302); + setState(304); match(T__12); - setState(303); + setState(305); expression(0); } } - setState(308); + setState(310); _errHandler.sync(this); _la = _input.LA(1); } @@ -1831,14 +1832,14 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(309); - match(T__60); setState(311); + match(T__60); + setState(313); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,23,_ctx) ) { case 1: { - setState(310); + setState(312); expression_list(); } break; @@ -1869,7 +1870,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(313); + setState(315); match(T__61); } } @@ -1897,7 +1898,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(315); + setState(317); match(T__62); } } @@ -1926,7 +1927,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(317); + setState(319); match(NAME); } } @@ -1959,9 +1960,9 @@ public class prog8Parser extends Parser { int _alt; enterOuterAlt(_localctx, 1); { - setState(319); + setState(321); match(NAME); - setState(322); + setState(324); _errHandler.sync(this); _alt = 1; do { @@ -1969,9 +1970,9 @@ public class prog8Parser extends Parser { case 1: { { - setState(320); + setState(322); match(T__63); - setState(321); + setState(323); match(NAME); } } @@ -1979,7 +1980,7 @@ public class prog8Parser extends Parser { default: throw new NoViableAltException(this); } - setState(324); + setState(326); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,24,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -2010,7 +2011,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(326); + setState(328); _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)) ) { _errHandler.recoverInline(this); @@ -2054,7 +2055,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(328); + setState(330); ((IntegerliteralContext)_localctx).intpart = _input.LT(1); _la = _input.LA(1); if ( !(((((_la - 103)) & ~0x3f) == 0 && ((1L << (_la - 103)) & ((1L << (DEC_INTEGER - 103)) | (1L << (HEX_INTEGER - 103)) | (1L << (BIN_INTEGER - 103)))) != 0)) ) { @@ -2065,12 +2066,12 @@ public class prog8Parser extends Parser { _errHandler.reportMatch(this); consume(); } - setState(330); + setState(332); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,25,_ctx) ) { case 1: { - setState(329); + setState(331); wordsuffix(); } break; @@ -2101,7 +2102,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(332); + setState(334); match(T__70); } } @@ -2130,7 +2131,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(334); + setState(336); _la = _input.LA(1); if ( !(_la==T__71 || _la==T__72) ) { _errHandler.recoverInline(this); @@ -2173,27 +2174,27 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(336); + setState(338); match(T__23); - setState(337); + setState(339); expression(0); - setState(342); + setState(344); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(338); + setState(340); match(T__12); - setState(339); + setState(341); expression(0); } } - setState(344); + setState(346); _errHandler.sync(this); _la = _input.LA(1); } - setState(345); + setState(347); match(T__24); } } @@ -2222,7 +2223,7 @@ public class prog8Parser extends Parser { try { enterOuterAlt(_localctx, 1); { - setState(347); + setState(349); match(STRING); } } @@ -2237,6 +2238,35 @@ public class prog8Parser extends Parser { return _localctx; } + public static class CharliteralContext extends ParserRuleContext { + public TerminalNode SINGLECHAR() { return getToken(prog8Parser.SINGLECHAR, 0); } + public CharliteralContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_charliteral; } + } + + public final CharliteralContext charliteral() throws RecognitionException { + CharliteralContext _localctx = new CharliteralContext(_ctx, getState()); + enterRule(_localctx, 66, RULE_charliteral); + try { + enterOuterAlt(_localctx, 1); + { + setState(351); + match(SINGLECHAR); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + public static class FloatliteralContext extends ParserRuleContext { public TerminalNode FLOAT_NUMBER() { return getToken(prog8Parser.FLOAT_NUMBER, 0); } public FloatliteralContext(ParserRuleContext parent, int invokingState) { @@ -2247,11 +2277,11 @@ public class prog8Parser extends Parser { public final FloatliteralContext floatliteral() throws RecognitionException { FloatliteralContext _localctx = new FloatliteralContext(_ctx, getState()); - enterRule(_localctx, 66, RULE_floatliteral); + enterRule(_localctx, 68, RULE_floatliteral); try { enterOuterAlt(_localctx, 1); { - setState(349); + setState(353); match(FLOAT_NUMBER); } } @@ -2279,6 +2309,9 @@ public class prog8Parser extends Parser { public StringliteralContext stringliteral() { return getRuleContext(StringliteralContext.class,0); } + public CharliteralContext charliteral() { + return getRuleContext(CharliteralContext.class,0); + } public FloatliteralContext floatliteral() { return getRuleContext(FloatliteralContext.class,0); } @@ -2290,9 +2323,9 @@ public class prog8Parser extends Parser { public final LiteralvalueContext literalvalue() throws RecognitionException { LiteralvalueContext _localctx = new LiteralvalueContext(_ctx, getState()); - enterRule(_localctx, 68, RULE_literalvalue); + enterRule(_localctx, 70, RULE_literalvalue); try { - setState(356); + setState(361); _errHandler.sync(this); switch (_input.LA(1)) { case DEC_INTEGER: @@ -2300,7 +2333,7 @@ public class prog8Parser extends Parser { case BIN_INTEGER: enterOuterAlt(_localctx, 1); { - setState(351); + setState(355); integerliteral(); } break; @@ -2308,28 +2341,35 @@ public class prog8Parser extends Parser { case T__72: enterOuterAlt(_localctx, 2); { - setState(352); + setState(356); booleanliteral(); } break; case T__23: enterOuterAlt(_localctx, 3); { - setState(353); + setState(357); arrayliteral(); } break; case STRING: enterOuterAlt(_localctx, 4); { - setState(354); + setState(358); stringliteral(); } break; - case FLOAT_NUMBER: + case SINGLECHAR: enterOuterAlt(_localctx, 5); { - setState(355); + setState(359); + charliteral(); + } + break; + case FLOAT_NUMBER: + enterOuterAlt(_localctx, 6); + { + setState(360); floatliteral(); } break; @@ -2358,13 +2398,13 @@ public class prog8Parser extends Parser { public final InlineasmContext inlineasm() throws RecognitionException { InlineasmContext _localctx = new InlineasmContext(_ctx, getState()); - enterRule(_localctx, 70, RULE_inlineasm); + enterRule(_localctx, 72, RULE_inlineasm); try { enterOuterAlt(_localctx, 1); { - setState(358); + setState(363); match(T__73); - setState(359); + setState(364); match(INLINEASMBLOCK); } } @@ -2404,54 +2444,54 @@ public class prog8Parser extends Parser { public final SubroutineContext subroutine() throws RecognitionException { SubroutineContext _localctx = new SubroutineContext(_ctx, getState()); - enterRule(_localctx, 72, RULE_subroutine); + enterRule(_localctx, 74, RULE_subroutine); int _la; try { enterOuterAlt(_localctx, 1); { - setState(361); + setState(366); match(T__74); - setState(362); + setState(367); identifier(); - setState(363); + setState(368); match(T__36); - setState(365); + setState(370); _errHandler.sync(this); _la = _input.LA(1); if (_la==NAME) { { - setState(364); + setState(369); sub_params(); } } - setState(367); + setState(372); match(T__37); - setState(369); + setState(374); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__75) { { - setState(368); + setState(373); sub_return_part(); } } - setState(375); + setState(380); _errHandler.sync(this); switch (_input.LA(1)) { case T__13: { - setState(371); + setState(376); sub_address(); } break; case T__76: { { - setState(372); + setState(377); statement_block(); - setState(373); + setState(378); match(EOL); } } @@ -2484,13 +2524,13 @@ public class prog8Parser extends Parser { public final Sub_return_partContext sub_return_part() throws RecognitionException { Sub_return_partContext _localctx = new Sub_return_partContext(_ctx, getState()); - enterRule(_localctx, 74, RULE_sub_return_part); + enterRule(_localctx, 76, RULE_sub_return_part); try { enterOuterAlt(_localctx, 1); { - setState(377); + setState(382); match(T__75); - setState(378); + setState(383); sub_returns(); } } @@ -2524,21 +2564,21 @@ public class prog8Parser extends Parser { public final Statement_blockContext statement_block() throws RecognitionException { Statement_blockContext _localctx = new Statement_blockContext(_ctx, getState()); - enterRule(_localctx, 76, RULE_statement_block); + enterRule(_localctx, 78, RULE_statement_block); int _la; try { enterOuterAlt(_localctx, 1); { - setState(380); + setState(385); match(T__76); - setState(381); - match(EOL); setState(386); + match(EOL); + setState(391); _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__73 - 65)) | (1L << (T__74 - 65)) | (1L << (T__78 - 65)) | (1L << (T__80 - 65)) | (1L << (T__81 - 65)) | (1L << (T__82 - 65)) | (1L << (T__83 - 65)) | (1L << (T__84 - 65)) | (1L << (T__85 - 65)) | (1L << (T__86 - 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__94 - 65)) | (1L << (T__95 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) { { - setState(384); + setState(389); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -2589,13 +2629,13 @@ public class prog8Parser extends Parser { case T__95: case NAME: { - setState(382); + setState(387); statement(); } break; case EOL: { - setState(383); + setState(388); match(EOL); } break; @@ -2603,11 +2643,11 @@ public class prog8Parser extends Parser { throw new NoViableAltException(this); } } - setState(388); + setState(393); _errHandler.sync(this); _la = _input.LA(1); } - setState(389); + setState(394); match(T__77); } } @@ -2634,13 +2674,13 @@ public class prog8Parser extends Parser { public final Sub_addressContext sub_address() throws RecognitionException { Sub_addressContext _localctx = new Sub_addressContext(_ctx, getState()); - enterRule(_localctx, 78, RULE_sub_address); + enterRule(_localctx, 80, RULE_sub_address); try { enterOuterAlt(_localctx, 1); { - setState(391); + setState(396); match(T__13); - setState(392); + setState(397); integerliteral(); } } @@ -2670,26 +2710,26 @@ public class prog8Parser extends Parser { public final Sub_paramsContext sub_params() throws RecognitionException { Sub_paramsContext _localctx = new Sub_paramsContext(_ctx, getState()); - enterRule(_localctx, 80, RULE_sub_params); + enterRule(_localctx, 82, RULE_sub_params); int _la; try { enterOuterAlt(_localctx, 1); { - setState(394); - sub_param(); setState(399); + sub_param(); + setState(404); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(395); + setState(400); match(T__12); - setState(396); + setState(401); sub_param(); } } - setState(401); + setState(406); _errHandler.sync(this); _la = _input.LA(1); } @@ -2721,15 +2761,15 @@ public class prog8Parser extends Parser { public final Sub_paramContext sub_param() throws RecognitionException { Sub_paramContext _localctx = new Sub_paramContext(_ctx, getState()); - enterRule(_localctx, 82, RULE_sub_param); + enterRule(_localctx, 84, RULE_sub_param); try { enterOuterAlt(_localctx, 1); { - setState(402); + setState(407); identifier(); - setState(403); + setState(408); match(T__1); - setState(404); + setState(409); datatype(); } } @@ -2759,26 +2799,26 @@ public class prog8Parser extends Parser { public final Sub_returnsContext sub_returns() throws RecognitionException { Sub_returnsContext _localctx = new Sub_returnsContext(_ctx, getState()); - enterRule(_localctx, 84, RULE_sub_returns); + enterRule(_localctx, 86, RULE_sub_returns); int _la; try { enterOuterAlt(_localctx, 1); { - setState(406); - datatype(); setState(411); + datatype(); + setState(416); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__12) { { { - setState(407); + setState(412); match(T__12); - setState(408); + setState(413); datatype(); } } - setState(413); + setState(418); _errHandler.sync(this); _la = _input.LA(1); } @@ -2820,26 +2860,26 @@ public class prog8Parser extends Parser { public final If_stmtContext if_stmt() throws RecognitionException { If_stmtContext _localctx = new If_stmtContext(_ctx, getState()); - enterRule(_localctx, 86, RULE_if_stmt); + enterRule(_localctx, 88, RULE_if_stmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(414); + setState(419); match(T__78); - setState(415); + setState(420); expression(0); - setState(417); + setState(422); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(416); + setState(421); match(EOL); } } - setState(421); + setState(426); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -2890,40 +2930,40 @@ public class prog8Parser extends Parser { case T__95: case NAME: { - setState(419); + setState(424); statement(); } break; case T__76: { - setState(420); + setState(425); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(424); + setState(429); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) { case 1: { - setState(423); + setState(428); match(EOL); } break; } - setState(427); + setState(432); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__79) { { - setState(426); + setState(431); else_part(); } } - setState(429); + setState(434); match(EOL); } } @@ -2954,24 +2994,24 @@ public class prog8Parser extends Parser { public final Else_partContext else_part() throws RecognitionException { Else_partContext _localctx = new Else_partContext(_ctx, getState()); - enterRule(_localctx, 88, RULE_else_part); + enterRule(_localctx, 90, RULE_else_part); int _la; try { enterOuterAlt(_localctx, 1); { - setState(431); + setState(436); match(T__79); - setState(433); + setState(438); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(432); + setState(437); match(EOL); } } - setState(437); + setState(442); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3022,13 +3062,13 @@ public class prog8Parser extends Parser { case T__95: case NAME: { - setState(435); + setState(440); statement(); } break; case T__76: { - setState(436); + setState(441); statement_block(); } break; @@ -3073,24 +3113,24 @@ public class prog8Parser extends Parser { public final Branch_stmtContext branch_stmt() throws RecognitionException { Branch_stmtContext _localctx = new Branch_stmtContext(_ctx, getState()); - enterRule(_localctx, 90, RULE_branch_stmt); + enterRule(_localctx, 92, RULE_branch_stmt); int _la; try { enterOuterAlt(_localctx, 1); { - setState(439); + setState(444); branchcondition(); - setState(441); + setState(446); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(440); + setState(445); match(EOL); } } - setState(445); + setState(450); _errHandler.sync(this); switch (_input.LA(1)) { case T__2: @@ -3141,40 +3181,40 @@ public class prog8Parser extends Parser { case T__95: case NAME: { - setState(443); + setState(448); statement(); } break; case T__76: { - setState(444); + setState(449); statement_block(); } break; default: throw new NoViableAltException(this); } - setState(448); + setState(453); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,43,_ctx) ) { case 1: { - setState(447); + setState(452); match(EOL); } break; } - setState(451); + setState(456); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__79) { { - setState(450); + setState(455); else_part(); } } - setState(453); + setState(458); match(EOL); } } @@ -3198,12 +3238,12 @@ public class prog8Parser extends Parser { public final BranchconditionContext branchcondition() throws RecognitionException { BranchconditionContext _localctx = new BranchconditionContext(_ctx, getState()); - enterRule(_localctx, 92, RULE_branchcondition); + enterRule(_localctx, 94, RULE_branchcondition); int _la; try { enterOuterAlt(_localctx, 1); { - setState(455); + setState(460); _la = _input.LA(1); if ( !(((((_la - 81)) & ~0x3f) == 0 && ((1L << (_la - 81)) & ((1L << (T__80 - 81)) | (1L << (T__81 - 81)) | (1L << (T__82 - 81)) | (1L << (T__83 - 81)) | (1L << (T__84 - 81)) | (1L << (T__85 - 81)) | (1L << (T__86 - 81)) | (1L << (T__87 - 81)) | (1L << (T__88 - 81)) | (1L << (T__89 - 81)) | (1L << (T__90 - 81)) | (1L << (T__91 - 81)))) != 0)) ) { _errHandler.recoverInline(this); @@ -3248,14 +3288,14 @@ public class prog8Parser extends Parser { public final ForloopContext forloop() throws RecognitionException { ForloopContext _localctx = new ForloopContext(_ctx, getState()); - enterRule(_localctx, 94, RULE_forloop); + enterRule(_localctx, 96, RULE_forloop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(457); + setState(462); match(T__92); - setState(460); + setState(465); _errHandler.sync(this); switch (_input.LA(1)) { case T__64: @@ -3265,34 +3305,34 @@ public class prog8Parser extends Parser { case T__68: case T__69: { - setState(458); + setState(463); register(); } break; case NAME: { - setState(459); + setState(464); identifier(); } break; default: throw new NoViableAltException(this); } - setState(462); + setState(467); match(T__93); - setState(463); + setState(468); expression(0); - setState(465); + setState(470); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(464); + setState(469); match(EOL); } } - setState(467); + setState(472); statement_block(); } } @@ -3326,128 +3366,25 @@ public class prog8Parser extends Parser { public final WhileloopContext whileloop() throws RecognitionException { WhileloopContext _localctx = new WhileloopContext(_ctx, getState()); - enterRule(_localctx, 96, RULE_whileloop); + enterRule(_localctx, 98, RULE_whileloop); int _la; try { enterOuterAlt(_localctx, 1); { - setState(469); + setState(474); match(T__94); - setState(470); + setState(475); expression(0); - setState(472); + setState(477); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(471); + setState(476); match(EOL); } } - setState(476); - _errHandler.sync(this); - switch (_input.LA(1)) { - case T__2: - case T__3: - case T__4: - case T__5: - case T__6: - case T__7: - case T__8: - case T__9: - case T__10: - case T__11: - case T__14: - case T__15: - case T__16: - case T__17: - case T__18: - case T__19: - case T__20: - case T__21: - case T__22: - case T__60: - case T__61: - case T__62: - case T__64: - case T__65: - case T__66: - case T__67: - case T__68: - case T__69: - case T__73: - case T__74: - case T__78: - case T__80: - case T__81: - case T__82: - case T__83: - case T__84: - case T__85: - case T__86: - case T__87: - case T__88: - case T__89: - case T__90: - case T__91: - case T__92: - case T__94: - case T__95: - case NAME: - { - setState(474); - statement(); - } - break; - case T__76: - { - setState(475); - statement_block(); - } - break; - default: - throw new NoViableAltException(this); - } - } - } - catch (RecognitionException re) { - _localctx.exception = re; - _errHandler.reportError(this, re); - _errHandler.recover(this, re); - } - finally { - exitRule(); - } - return _localctx; - } - - public static class RepeatloopContext extends ParserRuleContext { - public ExpressionContext expression() { - return getRuleContext(ExpressionContext.class,0); - } - public StatementContext statement() { - return getRuleContext(StatementContext.class,0); - } - public Statement_blockContext statement_block() { - return getRuleContext(Statement_blockContext.class,0); - } - public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } - public RepeatloopContext(ParserRuleContext parent, int invokingState) { - super(parent, invokingState); - } - @Override public int getRuleIndex() { return RULE_repeatloop; } - } - - public final RepeatloopContext repeatloop() throws RecognitionException { - RepeatloopContext _localctx = new RepeatloopContext(_ctx, getState()); - enterRule(_localctx, 98, RULE_repeatloop); - int _la; - try { - enterOuterAlt(_localctx, 1); - { - setState(478); - match(T__95); setState(481); _errHandler.sync(this); switch (_input.LA(1)) { @@ -3512,19 +3449,122 @@ public class prog8Parser extends Parser { default: throw new NoViableAltException(this); } - setState(484); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class RepeatloopContext extends ParserRuleContext { + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public Statement_blockContext statement_block() { + return getRuleContext(Statement_blockContext.class,0); + } + public TerminalNode EOL() { return getToken(prog8Parser.EOL, 0); } + public RepeatloopContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_repeatloop; } + } + + public final RepeatloopContext repeatloop() throws RecognitionException { + RepeatloopContext _localctx = new RepeatloopContext(_ctx, getState()); + enterRule(_localctx, 100, RULE_repeatloop); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(483); + match(T__95); + setState(486); + _errHandler.sync(this); + switch (_input.LA(1)) { + case T__2: + case T__3: + case T__4: + case T__5: + case T__6: + case T__7: + case T__8: + case T__9: + case T__10: + case T__11: + case T__14: + case T__15: + case T__16: + case T__17: + case T__18: + case T__19: + case T__20: + case T__21: + case T__22: + case T__60: + case T__61: + case T__62: + case T__64: + case T__65: + case T__66: + case T__67: + case T__68: + case T__69: + case T__73: + case T__74: + case T__78: + case T__80: + case T__81: + case T__82: + case T__83: + case T__84: + case T__85: + case T__86: + case T__87: + case T__88: + case T__89: + case T__90: + case T__91: + case T__92: + case T__94: + case T__95: + case NAME: + { + setState(484); + statement(); + } + break; + case T__76: + { + setState(485); + statement_block(); + } + break; + default: + throw new NoViableAltException(this); + } + setState(489); _errHandler.sync(this); _la = _input.LA(1); if (_la==EOL) { { - setState(483); + setState(488); match(EOL); } } - setState(486); + setState(491); match(T__96); - setState(487); + setState(492); expression(0); } } @@ -3579,189 +3619,191 @@ public class prog8Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3n\u01ec\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3o\u01f1\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"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ - ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\3\2\3\2"+ - "\7\2i\n\2\f\2\16\2l\13\2\3\2\3\2\3\3\3\3\5\3r\n\3\3\4\3\4\3\4\5\4w\n\4"+ - "\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ - "\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u0091\n\5\3\6\3\6\3\6\3\7\3\7\3\7\3\7\5"+ - "\7\u009a\n\7\3\b\3\b\5\b\u009e\n\b\3\b\3\b\3\b\7\b\u00a3\n\b\f\b\16\b"+ - "\u00a6\13\b\5\b\u00a8\n\b\3\t\3\t\3\t\5\t\u00ad\n\t\3\n\3\n\5\n\u00b1"+ - "\n\n\3\n\3\n\3\13\3\13\5\13\u00b7\n\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f"+ - "\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\5\17\u00c9\n\17\3\17\3\17\3"+ - "\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\5\22\u00d8\n\22"+ - "\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\5\24\u00eb\n\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\3\2\3\2\7\2k\n\2\f\2\16\2n\13\2\3\2\3\2\3\3\3\3\5\3t\n\3\3\4\3\4\3"+ + "\4\5\4y\n\4\3\4\3\4\3\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3"+ + "\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\5\5\u0093\n\5\3\6\3\6\3\6\3\7\3"+ + "\7\3\7\3\7\5\7\u009c\n\7\3\b\3\b\5\b\u00a0\n\b\3\b\3\b\3\b\7\b\u00a5\n"+ + "\b\f\b\16\b\u00a8\13\b\5\b\u00aa\n\b\3\t\3\t\3\t\5\t\u00af\n\t\3\n\3\n"+ + "\5\n\u00b3\n\n\3\n\3\n\3\13\3\13\5\13\u00b9\n\13\3\13\3\13\3\13\3\13\3"+ + "\f\3\f\3\f\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\17\3\17\5\17\u00cb\n\17\3"+ + "\17\3\17\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\22\3\22\3\22\5\22\u00da"+ + "\n\22\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ + "\3\24\3\24\3\24\3\24\5\24\u00ed\n\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24"+ - "\3\24\3\24\3\24\3\24\5\24\u0115\n\24\7\24\u0117\n\24\f\24\16\24\u011a"+ - "\13\24\3\25\3\25\5\25\u011e\n\25\3\25\3\25\5\25\u0122\n\25\3\25\3\25\3"+ - "\26\3\26\5\26\u0128\n\26\3\26\3\26\5\26\u012c\n\26\3\26\3\26\3\27\3\27"+ - "\3\27\7\27\u0133\n\27\f\27\16\27\u0136\13\27\3\30\3\30\5\30\u013a\n\30"+ - "\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\6\34\u0145\n\34\r\34\16"+ - "\34\u0146\3\35\3\35\3\36\3\36\5\36\u014d\n\36\3\37\3\37\3 \3 \3!\3!\3"+ - "!\3!\7!\u0157\n!\f!\16!\u015a\13!\3!\3!\3\"\3\"\3#\3#\3$\3$\3$\3$\3$\5"+ - "$\u0167\n$\3%\3%\3%\3&\3&\3&\3&\5&\u0170\n&\3&\3&\5&\u0174\n&\3&\3&\3"+ - "&\3&\5&\u017a\n&\3\'\3\'\3\'\3(\3(\3(\3(\7(\u0183\n(\f(\16(\u0186\13("+ - "\3(\3(\3)\3)\3)\3*\3*\3*\7*\u0190\n*\f*\16*\u0193\13*\3+\3+\3+\3+\3,\3"+ - ",\3,\7,\u019c\n,\f,\16,\u019f\13,\3-\3-\3-\5-\u01a4\n-\3-\3-\5-\u01a8"+ - "\n-\3-\5-\u01ab\n-\3-\5-\u01ae\n-\3-\3-\3.\3.\5.\u01b4\n.\3.\3.\5.\u01b8"+ - "\n.\3/\3/\5/\u01bc\n/\3/\3/\5/\u01c0\n/\3/\5/\u01c3\n/\3/\5/\u01c6\n/"+ - "\3/\3/\3\60\3\60\3\61\3\61\3\61\5\61\u01cf\n\61\3\61\3\61\3\61\5\61\u01d4"+ - "\n\61\3\61\3\61\3\62\3\62\3\62\5\62\u01db\n\62\3\62\3\62\5\62\u01df\n"+ - "\62\3\63\3\63\3\63\5\63\u01e4\n\63\3\63\5\63\u01e7\n\63\3\63\3\63\3\63"+ - "\3\63\2\3&\64\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64"+ - "\668:<>@BDFHJLNPRTVXZ\\^`bd\2\17\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\2ik\3\2JK\3\2S^\2\u0216"+ - "\2j\3\2\2\2\4q\3\2\2\2\6s\3\2\2\2\b\u0090\3\2\2\2\n\u0092\3\2\2\2\f\u0095"+ - "\3\2\2\2\16\u009b\3\2\2\2\20\u00ac\3\2\2\2\22\u00ae\3\2\2\2\24\u00b4\3"+ - "\2\2\2\26\u00bc\3\2\2\2\30\u00bf\3\2\2\2\32\u00c2\3\2\2\2\34\u00c4\3\2"+ - "\2\2\36\u00cc\3\2\2\2 \u00d0\3\2\2\2\"\u00d7\3\2\2\2$\u00d9\3\2\2\2&\u00ea"+ - "\3\2\2\2(\u011d\3\2\2\2*\u0127\3\2\2\2,\u012f\3\2\2\2.\u0137\3\2\2\2\60"+ - "\u013b\3\2\2\2\62\u013d\3\2\2\2\64\u013f\3\2\2\2\66\u0141\3\2\2\28\u0148"+ - "\3\2\2\2:\u014a\3\2\2\2<\u014e\3\2\2\2>\u0150\3\2\2\2@\u0152\3\2\2\2B"+ - "\u015d\3\2\2\2D\u015f\3\2\2\2F\u0166\3\2\2\2H\u0168\3\2\2\2J\u016b\3\2"+ - "\2\2L\u017b\3\2\2\2N\u017e\3\2\2\2P\u0189\3\2\2\2R\u018c\3\2\2\2T\u0194"+ - "\3\2\2\2V\u0198\3\2\2\2X\u01a0\3\2\2\2Z\u01b1\3\2\2\2\\\u01b9\3\2\2\2"+ - "^\u01c9\3\2\2\2`\u01cb\3\2\2\2b\u01d7\3\2\2\2d\u01e0\3\2\2\2fi\5\4\3\2"+ - "gi\7g\2\2hf\3\2\2\2hg\3\2\2\2il\3\2\2\2jh\3\2\2\2jk\3\2\2\2km\3\2\2\2"+ - "lj\3\2\2\2mn\7\2\2\3n\3\3\2\2\2or\5\16\b\2pr\5\6\4\2qo\3\2\2\2qp\3\2\2"+ - "\2r\5\3\2\2\2st\7\3\2\2tv\5\64\33\2uw\5:\36\2vu\3\2\2\2vw\3\2\2\2wx\3"+ - "\2\2\2xy\5N(\2yz\7g\2\2z\7\3\2\2\2{\u0091\5\16\b\2|\u0091\5\24\13\2}\u0091"+ - "\5\22\n\2~\u0091\5\26\f\2\177\u0091\5\30\r\2\u0080\u0091\5\36\20\2\u0081"+ - "\u0091\5 \21\2\u0082\u0091\5\f\7\2\u0083\u0091\5$\23\2\u0084\u0091\5*"+ - "\26\2\u0085\u0091\5X-\2\u0086\u0091\5\\/\2\u0087\u0091\5J&\2\u0088\u0091"+ - "\5H%\2\u0089\u0091\5.\30\2\u008a\u0091\5`\61\2\u008b\u0091\5b\62\2\u008c"+ - "\u0091\5d\63\2\u008d\u0091\5\60\31\2\u008e\u0091\5\62\32\2\u008f\u0091"+ - "\5\n\6\2\u0090{\3\2\2\2\u0090|\3\2\2\2\u0090}\3\2\2\2\u0090~\3\2\2\2\u0090"+ - "\177\3\2\2\2\u0090\u0080\3\2\2\2\u0090\u0081\3\2\2\2\u0090\u0082\3\2\2"+ - "\2\u0090\u0083\3\2\2\2\u0090\u0084\3\2\2\2\u0090\u0085\3\2\2\2\u0090\u0086"+ - "\3\2\2\2\u0090\u0087\3\2\2\2\u0090\u0088\3\2\2\2\u0090\u0089\3\2\2\2\u0090"+ - "\u008a\3\2\2\2\u0090\u008b\3\2\2\2\u0090\u008c\3\2\2\2\u0090\u008d\3\2"+ - "\2\2\u0090\u008e\3\2\2\2\u0090\u008f\3\2\2\2\u0091\t\3\2\2\2\u0092\u0093"+ - "\5\64\33\2\u0093\u0094\7\4\2\2\u0094\13\3\2\2\2\u0095\u0099\7\5\2\2\u0096"+ - "\u009a\5:\36\2\u0097\u009a\5\64\33\2\u0098\u009a\5\66\34\2\u0099\u0096"+ - "\3\2\2\2\u0099\u0097\3\2\2\2\u0099\u0098\3\2\2\2\u009a\r\3\2\2\2\u009b"+ - "\u00a7\t\2\2\2\u009c\u009e\5\20\t\2\u009d\u009c\3\2\2\2\u009d\u009e\3"+ - "\2\2\2\u009e\u00a8\3\2\2\2\u009f\u00a4\5\20\t\2\u00a0\u00a1\7\17\2\2\u00a1"+ - "\u00a3\5\20\t\2\u00a2\u00a0\3\2\2\2\u00a3\u00a6\3\2\2\2\u00a4\u00a2\3"+ - "\2\2\2\u00a4\u00a5\3\2\2\2\u00a5\u00a8\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a7"+ - "\u009d\3\2\2\2\u00a7\u009f\3\2\2\2\u00a8\17\3\2\2\2\u00a9\u00ad\5B\"\2"+ - "\u00aa\u00ad\5\64\33\2\u00ab\u00ad\5:\36\2\u00ac\u00a9\3\2\2\2\u00ac\u00aa"+ - "\3\2\2\2\u00ac\u00ab\3\2\2\2\u00ad\21\3\2\2\2\u00ae\u00b0\5\32\16\2\u00af"+ - "\u00b1\5\34\17\2\u00b0\u00af\3\2\2\2\u00b0\u00b1\3\2\2\2\u00b1\u00b2\3"+ - "\2\2\2\u00b2\u00b3\5\64\33\2\u00b3\23\3\2\2\2\u00b4\u00b6\5\32\16\2\u00b5"+ - "\u00b7\5\34\17\2\u00b6\u00b5\3\2\2\2\u00b6\u00b7\3\2\2\2\u00b7\u00b8\3"+ - "\2\2\2\u00b8\u00b9\5\64\33\2\u00b9\u00ba\7\20\2\2\u00ba\u00bb\5&\24\2"+ - "\u00bb\25\3\2\2\2\u00bc\u00bd\7\21\2\2\u00bd\u00be\5\24\13\2\u00be\27"+ - "\3\2\2\2\u00bf\u00c0\7\22\2\2\u00c0\u00c1\5\24\13\2\u00c1\31\3\2\2\2\u00c2"+ - "\u00c3\t\3\2\2\u00c3\33\3\2\2\2\u00c4\u00c5\7\32\2\2\u00c5\u00c8\5&\24"+ - "\2\u00c6\u00c7\7\17\2\2\u00c7\u00c9\5&\24\2\u00c8\u00c6\3\2\2\2\u00c8"+ - "\u00c9\3\2\2\2\u00c9\u00ca\3\2\2\2\u00ca\u00cb\7\33\2\2\u00cb\35\3\2\2"+ - "\2\u00cc\u00cd\5\"\22\2\u00cd\u00ce\7\20\2\2\u00ce\u00cf\5&\24\2\u00cf"+ - "\37\3\2\2\2\u00d0\u00d1\5\"\22\2\u00d1\u00d2\t\4\2\2\u00d2\u00d3\5&\24"+ - "\2\u00d3!\3\2\2\2\u00d4\u00d8\58\35\2\u00d5\u00d8\5\64\33\2\u00d6\u00d8"+ - "\5\66\34\2\u00d7\u00d4\3\2\2\2\u00d7\u00d5\3\2\2\2\u00d7\u00d6\3\2\2\2"+ - "\u00d8#\3\2\2\2\u00d9\u00da\5\"\22\2\u00da\u00db\t\5\2\2\u00db%\3\2\2"+ - "\2\u00dc\u00dd\b\24\1\2\u00dd\u00de\7\'\2\2\u00de\u00df\5&\24\2\u00df"+ - "\u00e0\7(\2\2\u00e0\u00eb\3\2\2\2\u00e1\u00eb\5(\25\2\u00e2\u00e3\t\6"+ - "\2\2\u00e3\u00eb\5&\24\24\u00e4\u00e5\7>\2\2\u00e5\u00eb\5&\24\7\u00e6"+ - "\u00eb\5F$\2\u00e7\u00eb\58\35\2\u00e8\u00eb\5\64\33\2\u00e9\u00eb\5\66"+ - "\34\2\u00ea\u00dc\3\2\2\2\u00ea\u00e1\3\2\2\2\u00ea\u00e2\3\2\2\2\u00ea"+ - "\u00e4\3\2\2\2\u00ea\u00e6\3\2\2\2\u00ea\u00e7\3\2\2\2\u00ea\u00e8\3\2"+ - "\2\2\u00ea\u00e9\3\2\2\2\u00eb\u0118\3\2\2\2\u00ec\u00ed\f\23\2\2\u00ed"+ - "\u00ee\7+\2\2\u00ee\u0117\5&\24\24\u00ef\u00f0\f\22\2\2\u00f0\u00f1\t"+ - "\7\2\2\u00f1\u0117\5&\24\23\u00f2\u00f3\f\21\2\2\u00f3\u00f4\t\b\2\2\u00f4"+ - "\u0117\5&\24\22\u00f5\u00f6\f\20\2\2\u00f6\u00f7\t\t\2\2\u00f7\u0117\5"+ - "&\24\21\u00f8\u00f9\f\17\2\2\u00f9\u00fa\t\n\2\2\u00fa\u0117\5&\24\20"+ - "\u00fb\u00fc\f\16\2\2\u00fc\u00fd\7\66\2\2\u00fd\u0117\5&\24\17\u00fe"+ - "\u00ff\f\r\2\2\u00ff\u0100\7\67\2\2\u0100\u0117\5&\24\16\u0101\u0102\f"+ - "\f\2\2\u0102\u0103\78\2\2\u0103\u0117\5&\24\r\u0104\u0105\f\n\2\2\u0105"+ - "\u0106\7;\2\2\u0106\u0117\5&\24\13\u0107\u0108\f\t\2\2\u0108\u0109\7<"+ - "\2\2\u0109\u0117\5&\24\n\u010a\u010b\f\b\2\2\u010b\u010c\7=\2\2\u010c"+ - "\u0117\5&\24\t\u010d\u010e\f\26\2\2\u010e\u0117\5\34\17\2\u010f\u0110"+ - "\f\13\2\2\u0110\u0111\79\2\2\u0111\u0114\5&\24\2\u0112\u0113\7:\2\2\u0113"+ - "\u0115\5&\24\2\u0114\u0112\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0117\3\2"+ - "\2\2\u0116\u00ec\3\2\2\2\u0116\u00ef\3\2\2\2\u0116\u00f2\3\2\2\2\u0116"+ - "\u00f5\3\2\2\2\u0116\u00f8\3\2\2\2\u0116\u00fb\3\2\2\2\u0116\u00fe\3\2"+ - "\2\2\u0116\u0101\3\2\2\2\u0116\u0104\3\2\2\2\u0116\u0107\3\2\2\2\u0116"+ - "\u010a\3\2\2\2\u0116\u010d\3\2\2\2\u0116\u010f\3\2\2\2\u0117\u011a\3\2"+ - "\2\2\u0118\u0116\3\2\2\2\u0118\u0119\3\2\2\2\u0119\'\3\2\2\2\u011a\u0118"+ - "\3\2\2\2\u011b\u011e\5\64\33\2\u011c\u011e\5\66\34\2\u011d\u011b\3\2\2"+ - "\2\u011d\u011c\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0121\7\'\2\2\u0120\u0122"+ - "\5,\27\2\u0121\u0120\3\2\2\2\u0121\u0122\3\2\2\2\u0122\u0123\3\2\2\2\u0123"+ - "\u0124\7(\2\2\u0124)\3\2\2\2\u0125\u0128\5\64\33\2\u0126\u0128\5\66\34"+ - "\2\u0127\u0125\3\2\2\2\u0127\u0126\3\2\2\2\u0128\u0129\3\2\2\2\u0129\u012b"+ - "\7\'\2\2\u012a\u012c\5,\27\2\u012b\u012a\3\2\2\2\u012b\u012c\3\2\2\2\u012c"+ - "\u012d\3\2\2\2\u012d\u012e\7(\2\2\u012e+\3\2\2\2\u012f\u0134\5&\24\2\u0130"+ - "\u0131\7\17\2\2\u0131\u0133\5&\24\2\u0132\u0130\3\2\2\2\u0133\u0136\3"+ - "\2\2\2\u0134\u0132\3\2\2\2\u0134\u0135\3\2\2\2\u0135-\3\2\2\2\u0136\u0134"+ - "\3\2\2\2\u0137\u0139\7?\2\2\u0138\u013a\5,\27\2\u0139\u0138\3\2\2\2\u0139"+ - "\u013a\3\2\2\2\u013a/\3\2\2\2\u013b\u013c\7@\2\2\u013c\61\3\2\2\2\u013d"+ - "\u013e\7A\2\2\u013e\63\3\2\2\2\u013f\u0140\7h\2\2\u0140\65\3\2\2\2\u0141"+ - "\u0144\7h\2\2\u0142\u0143\7B\2\2\u0143\u0145\7h\2\2\u0144\u0142\3\2\2"+ - "\2\u0145\u0146\3\2\2\2\u0146\u0144\3\2\2\2\u0146\u0147\3\2\2\2\u0147\67"+ - "\3\2\2\2\u0148\u0149\t\13\2\2\u01499\3\2\2\2\u014a\u014c\t\f\2\2\u014b"+ - "\u014d\5<\37\2\u014c\u014b\3\2\2\2\u014c\u014d\3\2\2\2\u014d;\3\2\2\2"+ - "\u014e\u014f\7I\2\2\u014f=\3\2\2\2\u0150\u0151\t\r\2\2\u0151?\3\2\2\2"+ - "\u0152\u0153\7\32\2\2\u0153\u0158\5&\24\2\u0154\u0155\7\17\2\2\u0155\u0157"+ - "\5&\24\2\u0156\u0154\3\2\2\2\u0157\u015a\3\2\2\2\u0158\u0156\3\2\2\2\u0158"+ - "\u0159\3\2\2\2\u0159\u015b\3\2\2\2\u015a\u0158\3\2\2\2\u015b\u015c\7\33"+ - "\2\2\u015cA\3\2\2\2\u015d\u015e\7m\2\2\u015eC\3\2\2\2\u015f\u0160\7l\2"+ - "\2\u0160E\3\2\2\2\u0161\u0167\5:\36\2\u0162\u0167\5> \2\u0163\u0167\5"+ - "@!\2\u0164\u0167\5B\"\2\u0165\u0167\5D#\2\u0166\u0161\3\2\2\2\u0166\u0162"+ - "\3\2\2\2\u0166\u0163\3\2\2\2\u0166\u0164\3\2\2\2\u0166\u0165\3\2\2\2\u0167"+ - "G\3\2\2\2\u0168\u0169\7L\2\2\u0169\u016a\7n\2\2\u016aI\3\2\2\2\u016b\u016c"+ - "\7M\2\2\u016c\u016d\5\64\33\2\u016d\u016f\7\'\2\2\u016e\u0170\5R*\2\u016f"+ - "\u016e\3\2\2\2\u016f\u0170\3\2\2\2\u0170\u0171\3\2\2\2\u0171\u0173\7("+ - "\2\2\u0172\u0174\5L\'\2\u0173\u0172\3\2\2\2\u0173\u0174\3\2\2\2\u0174"+ - "\u0179\3\2\2\2\u0175\u017a\5P)\2\u0176\u0177\5N(\2\u0177\u0178\7g\2\2"+ - "\u0178\u017a\3\2\2\2\u0179\u0175\3\2\2\2\u0179\u0176\3\2\2\2\u017aK\3"+ - "\2\2\2\u017b\u017c\7N\2\2\u017c\u017d\5V,\2\u017dM\3\2\2\2\u017e\u017f"+ - "\7O\2\2\u017f\u0184\7g\2\2\u0180\u0183\5\b\5\2\u0181\u0183\7g\2\2\u0182"+ - "\u0180\3\2\2\2\u0182\u0181\3\2\2\2\u0183\u0186\3\2\2\2\u0184\u0182\3\2"+ - "\2\2\u0184\u0185\3\2\2\2\u0185\u0187\3\2\2\2\u0186\u0184\3\2\2\2\u0187"+ - "\u0188\7P\2\2\u0188O\3\2\2\2\u0189\u018a\7\20\2\2\u018a\u018b\5:\36\2"+ - "\u018bQ\3\2\2\2\u018c\u0191\5T+\2\u018d\u018e\7\17\2\2\u018e\u0190\5T"+ - "+\2\u018f\u018d\3\2\2\2\u0190\u0193\3\2\2\2\u0191\u018f\3\2\2\2\u0191"+ - "\u0192\3\2\2\2\u0192S\3\2\2\2\u0193\u0191\3\2\2\2\u0194\u0195\5\64\33"+ - "\2\u0195\u0196\7\4\2\2\u0196\u0197\5\32\16\2\u0197U\3\2\2\2\u0198\u019d"+ - "\5\32\16\2\u0199\u019a\7\17\2\2\u019a\u019c\5\32\16\2\u019b\u0199\3\2"+ - "\2\2\u019c\u019f\3\2\2\2\u019d\u019b\3\2\2\2\u019d\u019e\3\2\2\2\u019e"+ - "W\3\2\2\2\u019f\u019d\3\2\2\2\u01a0\u01a1\7Q\2\2\u01a1\u01a3\5&\24\2\u01a2"+ - "\u01a4\7g\2\2\u01a3\u01a2\3\2\2\2\u01a3\u01a4\3\2\2\2\u01a4\u01a7\3\2"+ - "\2\2\u01a5\u01a8\5\b\5\2\u01a6\u01a8\5N(\2\u01a7\u01a5\3\2\2\2\u01a7\u01a6"+ - "\3\2\2\2\u01a8\u01aa\3\2\2\2\u01a9\u01ab\7g\2\2\u01aa\u01a9\3\2\2\2\u01aa"+ - "\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01ae\5Z.\2\u01ad\u01ac\3\2\2"+ - "\2\u01ad\u01ae\3\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0\7g\2\2\u01b0Y\3"+ - "\2\2\2\u01b1\u01b3\7R\2\2\u01b2\u01b4\7g\2\2\u01b3\u01b2\3\2\2\2\u01b3"+ - "\u01b4\3\2\2\2\u01b4\u01b7\3\2\2\2\u01b5\u01b8\5\b\5\2\u01b6\u01b8\5N"+ - "(\2\u01b7\u01b5\3\2\2\2\u01b7\u01b6\3\2\2\2\u01b8[\3\2\2\2\u01b9\u01bb"+ - "\5^\60\2\u01ba\u01bc\7g\2\2\u01bb\u01ba\3\2\2\2\u01bb\u01bc\3\2\2\2\u01bc"+ - "\u01bf\3\2\2\2\u01bd\u01c0\5\b\5\2\u01be\u01c0\5N(\2\u01bf\u01bd\3\2\2"+ - "\2\u01bf\u01be\3\2\2\2\u01c0\u01c2\3\2\2\2\u01c1\u01c3\7g\2\2\u01c2\u01c1"+ - "\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3\u01c5\3\2\2\2\u01c4\u01c6\5Z.\2\u01c5"+ - "\u01c4\3\2\2\2\u01c5\u01c6\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\u01c8\7g"+ - "\2\2\u01c8]\3\2\2\2\u01c9\u01ca\t\16\2\2\u01ca_\3\2\2\2\u01cb\u01ce\7"+ - "_\2\2\u01cc\u01cf\58\35\2\u01cd\u01cf\5\64\33\2\u01ce\u01cc\3\2\2\2\u01ce"+ - "\u01cd\3\2\2\2\u01cf\u01d0\3\2\2\2\u01d0\u01d1\7`\2\2\u01d1\u01d3\5&\24"+ - "\2\u01d2\u01d4\7g\2\2\u01d3\u01d2\3\2\2\2\u01d3\u01d4\3\2\2\2\u01d4\u01d5"+ - "\3\2\2\2\u01d5\u01d6\5N(\2\u01d6a\3\2\2\2\u01d7\u01d8\7a\2\2\u01d8\u01da"+ - "\5&\24\2\u01d9\u01db\7g\2\2\u01da\u01d9\3\2\2\2\u01da\u01db\3\2\2\2\u01db"+ - "\u01de\3\2\2\2\u01dc\u01df\5\b\5\2\u01dd\u01df\5N(\2\u01de\u01dc\3\2\2"+ - "\2\u01de\u01dd\3\2\2\2\u01dfc\3\2\2\2\u01e0\u01e3\7b\2\2\u01e1\u01e4\5"+ - "\b\5\2\u01e2\u01e4\5N(\2\u01e3\u01e1\3\2\2\2\u01e3\u01e2\3\2\2\2\u01e4"+ - "\u01e6\3\2\2\2\u01e5\u01e7\7g\2\2\u01e6\u01e5\3\2\2\2\u01e6\u01e7\3\2"+ - "\2\2\u01e7\u01e8\3\2\2\2\u01e8\u01e9\7c\2\2\u01e9\u01ea\5&\24\2\u01ea"+ - "e\3\2\2\2\65hjqv\u0090\u0099\u009d\u00a4\u00a7\u00ac\u00b0\u00b6\u00c8"+ - "\u00d7\u00ea\u0114\u0116\u0118\u011d\u0121\u0127\u012b\u0134\u0139\u0146"+ - "\u014c\u0158\u0166\u016f\u0173\u0179\u0182\u0184\u0191\u019d\u01a3\u01a7"+ - "\u01aa\u01ad\u01b3\u01b7\u01bb\u01bf\u01c2\u01c5\u01ce\u01d3\u01da\u01de"+ - "\u01e3\u01e6"; + "\3\24\3\24\3\24\3\24\3\24\5\24\u0117\n\24\7\24\u0119\n\24\f\24\16\24\u011c"+ + "\13\24\3\25\3\25\5\25\u0120\n\25\3\25\3\25\5\25\u0124\n\25\3\25\3\25\3"+ + "\26\3\26\5\26\u012a\n\26\3\26\3\26\5\26\u012e\n\26\3\26\3\26\3\27\3\27"+ + "\3\27\7\27\u0135\n\27\f\27\16\27\u0138\13\27\3\30\3\30\5\30\u013c\n\30"+ + "\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\6\34\u0147\n\34\r\34\16"+ + "\34\u0148\3\35\3\35\3\36\3\36\5\36\u014f\n\36\3\37\3\37\3 \3 \3!\3!\3"+ + "!\3!\7!\u0159\n!\f!\16!\u015c\13!\3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3"+ + "%\3%\3%\5%\u016c\n%\3&\3&\3&\3\'\3\'\3\'\3\'\5\'\u0175\n\'\3\'\3\'\5\'"+ + "\u0179\n\'\3\'\3\'\3\'\3\'\5\'\u017f\n\'\3(\3(\3(\3)\3)\3)\3)\7)\u0188"+ + "\n)\f)\16)\u018b\13)\3)\3)\3*\3*\3*\3+\3+\3+\7+\u0195\n+\f+\16+\u0198"+ + "\13+\3,\3,\3,\3,\3-\3-\3-\7-\u01a1\n-\f-\16-\u01a4\13-\3.\3.\3.\5.\u01a9"+ + "\n.\3.\3.\5.\u01ad\n.\3.\5.\u01b0\n.\3.\5.\u01b3\n.\3.\3.\3/\3/\5/\u01b9"+ + "\n/\3/\3/\5/\u01bd\n/\3\60\3\60\5\60\u01c1\n\60\3\60\3\60\5\60\u01c5\n"+ + "\60\3\60\5\60\u01c8\n\60\3\60\5\60\u01cb\n\60\3\60\3\60\3\61\3\61\3\62"+ + "\3\62\3\62\5\62\u01d4\n\62\3\62\3\62\3\62\5\62\u01d9\n\62\3\62\3\62\3"+ + "\63\3\63\3\63\5\63\u01e0\n\63\3\63\3\63\5\63\u01e4\n\63\3\64\3\64\3\64"+ + "\5\64\u01e9\n\64\3\64\5\64\u01ec\n\64\3\64\3\64\3\64\3\64\2\3&\65\2\4"+ + "\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNP"+ + "RTVXZ\\^`bdf\2\17\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\2ik\3\2JK\3\2S^\2\u021b\2l\3\2\2\2\4s\3"+ + "\2\2\2\6u\3\2\2\2\b\u0092\3\2\2\2\n\u0094\3\2\2\2\f\u0097\3\2\2\2\16\u009d"+ + "\3\2\2\2\20\u00ae\3\2\2\2\22\u00b0\3\2\2\2\24\u00b6\3\2\2\2\26\u00be\3"+ + "\2\2\2\30\u00c1\3\2\2\2\32\u00c4\3\2\2\2\34\u00c6\3\2\2\2\36\u00ce\3\2"+ + "\2\2 \u00d2\3\2\2\2\"\u00d9\3\2\2\2$\u00db\3\2\2\2&\u00ec\3\2\2\2(\u011f"+ + "\3\2\2\2*\u0129\3\2\2\2,\u0131\3\2\2\2.\u0139\3\2\2\2\60\u013d\3\2\2\2"+ + "\62\u013f\3\2\2\2\64\u0141\3\2\2\2\66\u0143\3\2\2\28\u014a\3\2\2\2:\u014c"+ + "\3\2\2\2<\u0150\3\2\2\2>\u0152\3\2\2\2@\u0154\3\2\2\2B\u015f\3\2\2\2D"+ + "\u0161\3\2\2\2F\u0163\3\2\2\2H\u016b\3\2\2\2J\u016d\3\2\2\2L\u0170\3\2"+ + "\2\2N\u0180\3\2\2\2P\u0183\3\2\2\2R\u018e\3\2\2\2T\u0191\3\2\2\2V\u0199"+ + "\3\2\2\2X\u019d\3\2\2\2Z\u01a5\3\2\2\2\\\u01b6\3\2\2\2^\u01be\3\2\2\2"+ + "`\u01ce\3\2\2\2b\u01d0\3\2\2\2d\u01dc\3\2\2\2f\u01e5\3\2\2\2hk\5\4\3\2"+ + "ik\7g\2\2jh\3\2\2\2ji\3\2\2\2kn\3\2\2\2lj\3\2\2\2lm\3\2\2\2mo\3\2\2\2"+ + "nl\3\2\2\2op\7\2\2\3p\3\3\2\2\2qt\5\16\b\2rt\5\6\4\2sq\3\2\2\2sr\3\2\2"+ + "\2t\5\3\2\2\2uv\7\3\2\2vx\5\64\33\2wy\5:\36\2xw\3\2\2\2xy\3\2\2\2yz\3"+ + "\2\2\2z{\5P)\2{|\7g\2\2|\7\3\2\2\2}\u0093\5\16\b\2~\u0093\5\24\13\2\177"+ + "\u0093\5\22\n\2\u0080\u0093\5\26\f\2\u0081\u0093\5\30\r\2\u0082\u0093"+ + "\5\36\20\2\u0083\u0093\5 \21\2\u0084\u0093\5\f\7\2\u0085\u0093\5$\23\2"+ + "\u0086\u0093\5*\26\2\u0087\u0093\5Z.\2\u0088\u0093\5^\60\2\u0089\u0093"+ + "\5L\'\2\u008a\u0093\5J&\2\u008b\u0093\5.\30\2\u008c\u0093\5b\62\2\u008d"+ + "\u0093\5d\63\2\u008e\u0093\5f\64\2\u008f\u0093\5\60\31\2\u0090\u0093\5"+ + "\62\32\2\u0091\u0093\5\n\6\2\u0092}\3\2\2\2\u0092~\3\2\2\2\u0092\177\3"+ + "\2\2\2\u0092\u0080\3\2\2\2\u0092\u0081\3\2\2\2\u0092\u0082\3\2\2\2\u0092"+ + "\u0083\3\2\2\2\u0092\u0084\3\2\2\2\u0092\u0085\3\2\2\2\u0092\u0086\3\2"+ + "\2\2\u0092\u0087\3\2\2\2\u0092\u0088\3\2\2\2\u0092\u0089\3\2\2\2\u0092"+ + "\u008a\3\2\2\2\u0092\u008b\3\2\2\2\u0092\u008c\3\2\2\2\u0092\u008d\3\2"+ + "\2\2\u0092\u008e\3\2\2\2\u0092\u008f\3\2\2\2\u0092\u0090\3\2\2\2\u0092"+ + "\u0091\3\2\2\2\u0093\t\3\2\2\2\u0094\u0095\5\64\33\2\u0095\u0096\7\4\2"+ + "\2\u0096\13\3\2\2\2\u0097\u009b\7\5\2\2\u0098\u009c\5:\36\2\u0099\u009c"+ + "\5\64\33\2\u009a\u009c\5\66\34\2\u009b\u0098\3\2\2\2\u009b\u0099\3\2\2"+ + "\2\u009b\u009a\3\2\2\2\u009c\r\3\2\2\2\u009d\u00a9\t\2\2\2\u009e\u00a0"+ + "\5\20\t\2\u009f\u009e\3\2\2\2\u009f\u00a0\3\2\2\2\u00a0\u00aa\3\2\2\2"+ + "\u00a1\u00a6\5\20\t\2\u00a2\u00a3\7\17\2\2\u00a3\u00a5\5\20\t\2\u00a4"+ + "\u00a2\3\2\2\2\u00a5\u00a8\3\2\2\2\u00a6\u00a4\3\2\2\2\u00a6\u00a7\3\2"+ + "\2\2\u00a7\u00aa\3\2\2\2\u00a8\u00a6\3\2\2\2\u00a9\u009f\3\2\2\2\u00a9"+ + "\u00a1\3\2\2\2\u00aa\17\3\2\2\2\u00ab\u00af\5B\"\2\u00ac\u00af\5\64\33"+ + "\2\u00ad\u00af\5:\36\2\u00ae\u00ab\3\2\2\2\u00ae\u00ac\3\2\2\2\u00ae\u00ad"+ + "\3\2\2\2\u00af\21\3\2\2\2\u00b0\u00b2\5\32\16\2\u00b1\u00b3\5\34\17\2"+ + "\u00b2\u00b1\3\2\2\2\u00b2\u00b3\3\2\2\2\u00b3\u00b4\3\2\2\2\u00b4\u00b5"+ + "\5\64\33\2\u00b5\23\3\2\2\2\u00b6\u00b8\5\32\16\2\u00b7\u00b9\5\34\17"+ + "\2\u00b8\u00b7\3\2\2\2\u00b8\u00b9\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb"+ + "\5\64\33\2\u00bb\u00bc\7\20\2\2\u00bc\u00bd\5&\24\2\u00bd\25\3\2\2\2\u00be"+ + "\u00bf\7\21\2\2\u00bf\u00c0\5\24\13\2\u00c0\27\3\2\2\2\u00c1\u00c2\7\22"+ + "\2\2\u00c2\u00c3\5\24\13\2\u00c3\31\3\2\2\2\u00c4\u00c5\t\3\2\2\u00c5"+ + "\33\3\2\2\2\u00c6\u00c7\7\32\2\2\u00c7\u00ca\5&\24\2\u00c8\u00c9\7\17"+ + "\2\2\u00c9\u00cb\5&\24\2\u00ca\u00c8\3\2\2\2\u00ca\u00cb\3\2\2\2\u00cb"+ + "\u00cc\3\2\2\2\u00cc\u00cd\7\33\2\2\u00cd\35\3\2\2\2\u00ce\u00cf\5\"\22"+ + "\2\u00cf\u00d0\7\20\2\2\u00d0\u00d1\5&\24\2\u00d1\37\3\2\2\2\u00d2\u00d3"+ + "\5\"\22\2\u00d3\u00d4\t\4\2\2\u00d4\u00d5\5&\24\2\u00d5!\3\2\2\2\u00d6"+ + "\u00da\58\35\2\u00d7\u00da\5\64\33\2\u00d8\u00da\5\66\34\2\u00d9\u00d6"+ + "\3\2\2\2\u00d9\u00d7\3\2\2\2\u00d9\u00d8\3\2\2\2\u00da#\3\2\2\2\u00db"+ + "\u00dc\5\"\22\2\u00dc\u00dd\t\5\2\2\u00dd%\3\2\2\2\u00de\u00df\b\24\1"+ + "\2\u00df\u00e0\7\'\2\2\u00e0\u00e1\5&\24\2\u00e1\u00e2\7(\2\2\u00e2\u00ed"+ + "\3\2\2\2\u00e3\u00ed\5(\25\2\u00e4\u00e5\t\6\2\2\u00e5\u00ed\5&\24\24"+ + "\u00e6\u00e7\7>\2\2\u00e7\u00ed\5&\24\7\u00e8\u00ed\5H%\2\u00e9\u00ed"+ + "\58\35\2\u00ea\u00ed\5\64\33\2\u00eb\u00ed\5\66\34\2\u00ec\u00de\3\2\2"+ + "\2\u00ec\u00e3\3\2\2\2\u00ec\u00e4\3\2\2\2\u00ec\u00e6\3\2\2\2\u00ec\u00e8"+ + "\3\2\2\2\u00ec\u00e9\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ec\u00eb\3\2\2\2\u00ed"+ + "\u011a\3\2\2\2\u00ee\u00ef\f\23\2\2\u00ef\u00f0\7+\2\2\u00f0\u0119\5&"+ + "\24\24\u00f1\u00f2\f\22\2\2\u00f2\u00f3\t\7\2\2\u00f3\u0119\5&\24\23\u00f4"+ + "\u00f5\f\21\2\2\u00f5\u00f6\t\b\2\2\u00f6\u0119\5&\24\22\u00f7\u00f8\f"+ + "\20\2\2\u00f8\u00f9\t\t\2\2\u00f9\u0119\5&\24\21\u00fa\u00fb\f\17\2\2"+ + "\u00fb\u00fc\t\n\2\2\u00fc\u0119\5&\24\20\u00fd\u00fe\f\16\2\2\u00fe\u00ff"+ + "\7\66\2\2\u00ff\u0119\5&\24\17\u0100\u0101\f\r\2\2\u0101\u0102\7\67\2"+ + "\2\u0102\u0119\5&\24\16\u0103\u0104\f\f\2\2\u0104\u0105\78\2\2\u0105\u0119"+ + "\5&\24\r\u0106\u0107\f\n\2\2\u0107\u0108\7;\2\2\u0108\u0119\5&\24\13\u0109"+ + "\u010a\f\t\2\2\u010a\u010b\7<\2\2\u010b\u0119\5&\24\n\u010c\u010d\f\b"+ + "\2\2\u010d\u010e\7=\2\2\u010e\u0119\5&\24\t\u010f\u0110\f\26\2\2\u0110"+ + "\u0119\5\34\17\2\u0111\u0112\f\13\2\2\u0112\u0113\79\2\2\u0113\u0116\5"+ + "&\24\2\u0114\u0115\7:\2\2\u0115\u0117\5&\24\2\u0116\u0114\3\2\2\2\u0116"+ + "\u0117\3\2\2\2\u0117\u0119\3\2\2\2\u0118\u00ee\3\2\2\2\u0118\u00f1\3\2"+ + "\2\2\u0118\u00f4\3\2\2\2\u0118\u00f7\3\2\2\2\u0118\u00fa\3\2\2\2\u0118"+ + "\u00fd\3\2\2\2\u0118\u0100\3\2\2\2\u0118\u0103\3\2\2\2\u0118\u0106\3\2"+ + "\2\2\u0118\u0109\3\2\2\2\u0118\u010c\3\2\2\2\u0118\u010f\3\2\2\2\u0118"+ + "\u0111\3\2\2\2\u0119\u011c\3\2\2\2\u011a\u0118\3\2\2\2\u011a\u011b\3\2"+ + "\2\2\u011b\'\3\2\2\2\u011c\u011a\3\2\2\2\u011d\u0120\5\64\33\2\u011e\u0120"+ + "\5\66\34\2\u011f\u011d\3\2\2\2\u011f\u011e\3\2\2\2\u0120\u0121\3\2\2\2"+ + "\u0121\u0123\7\'\2\2\u0122\u0124\5,\27\2\u0123\u0122\3\2\2\2\u0123\u0124"+ + "\3\2\2\2\u0124\u0125\3\2\2\2\u0125\u0126\7(\2\2\u0126)\3\2\2\2\u0127\u012a"+ + "\5\64\33\2\u0128\u012a\5\66\34\2\u0129\u0127\3\2\2\2\u0129\u0128\3\2\2"+ + "\2\u012a\u012b\3\2\2\2\u012b\u012d\7\'\2\2\u012c\u012e\5,\27\2\u012d\u012c"+ + "\3\2\2\2\u012d\u012e\3\2\2\2\u012e\u012f\3\2\2\2\u012f\u0130\7(\2\2\u0130"+ + "+\3\2\2\2\u0131\u0136\5&\24\2\u0132\u0133\7\17\2\2\u0133\u0135\5&\24\2"+ + "\u0134\u0132\3\2\2\2\u0135\u0138\3\2\2\2\u0136\u0134\3\2\2\2\u0136\u0137"+ + "\3\2\2\2\u0137-\3\2\2\2\u0138\u0136\3\2\2\2\u0139\u013b\7?\2\2\u013a\u013c"+ + "\5,\27\2\u013b\u013a\3\2\2\2\u013b\u013c\3\2\2\2\u013c/\3\2\2\2\u013d"+ + "\u013e\7@\2\2\u013e\61\3\2\2\2\u013f\u0140\7A\2\2\u0140\63\3\2\2\2\u0141"+ + "\u0142\7h\2\2\u0142\65\3\2\2\2\u0143\u0146\7h\2\2\u0144\u0145\7B\2\2\u0145"+ + "\u0147\7h\2\2\u0146\u0144\3\2\2\2\u0147\u0148\3\2\2\2\u0148\u0146\3\2"+ + "\2\2\u0148\u0149\3\2\2\2\u0149\67\3\2\2\2\u014a\u014b\t\13\2\2\u014b9"+ + "\3\2\2\2\u014c\u014e\t\f\2\2\u014d\u014f\5<\37\2\u014e\u014d\3\2\2\2\u014e"+ + "\u014f\3\2\2\2\u014f;\3\2\2\2\u0150\u0151\7I\2\2\u0151=\3\2\2\2\u0152"+ + "\u0153\t\r\2\2\u0153?\3\2\2\2\u0154\u0155\7\32\2\2\u0155\u015a\5&\24\2"+ + "\u0156\u0157\7\17\2\2\u0157\u0159\5&\24\2\u0158\u0156\3\2\2\2\u0159\u015c"+ + "\3\2\2\2\u015a\u0158\3\2\2\2\u015a\u015b\3\2\2\2\u015b\u015d\3\2\2\2\u015c"+ + "\u015a\3\2\2\2\u015d\u015e\7\33\2\2\u015eA\3\2\2\2\u015f\u0160\7m\2\2"+ + "\u0160C\3\2\2\2\u0161\u0162\7o\2\2\u0162E\3\2\2\2\u0163\u0164\7l\2\2\u0164"+ + "G\3\2\2\2\u0165\u016c\5:\36\2\u0166\u016c\5> \2\u0167\u016c\5@!\2\u0168"+ + "\u016c\5B\"\2\u0169\u016c\5D#\2\u016a\u016c\5F$\2\u016b\u0165\3\2\2\2"+ + "\u016b\u0166\3\2\2\2\u016b\u0167\3\2\2\2\u016b\u0168\3\2\2\2\u016b\u0169"+ + "\3\2\2\2\u016b\u016a\3\2\2\2\u016cI\3\2\2\2\u016d\u016e\7L\2\2\u016e\u016f"+ + "\7n\2\2\u016fK\3\2\2\2\u0170\u0171\7M\2\2\u0171\u0172\5\64\33\2\u0172"+ + "\u0174\7\'\2\2\u0173\u0175\5T+\2\u0174\u0173\3\2\2\2\u0174\u0175\3\2\2"+ + "\2\u0175\u0176\3\2\2\2\u0176\u0178\7(\2\2\u0177\u0179\5N(\2\u0178\u0177"+ + "\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017e\3\2\2\2\u017a\u017f\5R*\2\u017b"+ + "\u017c\5P)\2\u017c\u017d\7g\2\2\u017d\u017f\3\2\2\2\u017e\u017a\3\2\2"+ + "\2\u017e\u017b\3\2\2\2\u017fM\3\2\2\2\u0180\u0181\7N\2\2\u0181\u0182\5"+ + "X-\2\u0182O\3\2\2\2\u0183\u0184\7O\2\2\u0184\u0189\7g\2\2\u0185\u0188"+ + "\5\b\5\2\u0186\u0188\7g\2\2\u0187\u0185\3\2\2\2\u0187\u0186\3\2\2\2\u0188"+ + "\u018b\3\2\2\2\u0189\u0187\3\2\2\2\u0189\u018a\3\2\2\2\u018a\u018c\3\2"+ + "\2\2\u018b\u0189\3\2\2\2\u018c\u018d\7P\2\2\u018dQ\3\2\2\2\u018e\u018f"+ + "\7\20\2\2\u018f\u0190\5:\36\2\u0190S\3\2\2\2\u0191\u0196\5V,\2\u0192\u0193"+ + "\7\17\2\2\u0193\u0195\5V,\2\u0194\u0192\3\2\2\2\u0195\u0198\3\2\2\2\u0196"+ + "\u0194\3\2\2\2\u0196\u0197\3\2\2\2\u0197U\3\2\2\2\u0198\u0196\3\2\2\2"+ + "\u0199\u019a\5\64\33\2\u019a\u019b\7\4\2\2\u019b\u019c\5\32\16\2\u019c"+ + "W\3\2\2\2\u019d\u01a2\5\32\16\2\u019e\u019f\7\17\2\2\u019f\u01a1\5\32"+ + "\16\2\u01a0\u019e\3\2\2\2\u01a1\u01a4\3\2\2\2\u01a2\u01a0\3\2\2\2\u01a2"+ + "\u01a3\3\2\2\2\u01a3Y\3\2\2\2\u01a4\u01a2\3\2\2\2\u01a5\u01a6\7Q\2\2\u01a6"+ + "\u01a8\5&\24\2\u01a7\u01a9\7g\2\2\u01a8\u01a7\3\2\2\2\u01a8\u01a9\3\2"+ + "\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01ad\5\b\5\2\u01ab\u01ad\5P)\2\u01ac\u01aa"+ + "\3\2\2\2\u01ac\u01ab\3\2\2\2\u01ad\u01af\3\2\2\2\u01ae\u01b0\7g\2\2\u01af"+ + "\u01ae\3\2\2\2\u01af\u01b0\3\2\2\2\u01b0\u01b2\3\2\2\2\u01b1\u01b3\5\\"+ + "/\2\u01b2\u01b1\3\2\2\2\u01b2\u01b3\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4"+ + "\u01b5\7g\2\2\u01b5[\3\2\2\2\u01b6\u01b8\7R\2\2\u01b7\u01b9\7g\2\2\u01b8"+ + "\u01b7\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9\u01bc\3\2\2\2\u01ba\u01bd\5\b"+ + "\5\2\u01bb\u01bd\5P)\2\u01bc\u01ba\3\2\2\2\u01bc\u01bb\3\2\2\2\u01bd]"+ + "\3\2\2\2\u01be\u01c0\5`\61\2\u01bf\u01c1\7g\2\2\u01c0\u01bf\3\2\2\2\u01c0"+ + "\u01c1\3\2\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c5\5\b\5\2\u01c3\u01c5\5P"+ + ")\2\u01c4\u01c2\3\2\2\2\u01c4\u01c3\3\2\2\2\u01c5\u01c7\3\2\2\2\u01c6"+ + "\u01c8\7g\2\2\u01c7\u01c6\3\2\2\2\u01c7\u01c8\3\2\2\2\u01c8\u01ca\3\2"+ + "\2\2\u01c9\u01cb\5\\/\2\u01ca\u01c9\3\2\2\2\u01ca\u01cb\3\2\2\2\u01cb"+ + "\u01cc\3\2\2\2\u01cc\u01cd\7g\2\2\u01cd_\3\2\2\2\u01ce\u01cf\t\16\2\2"+ + "\u01cfa\3\2\2\2\u01d0\u01d3\7_\2\2\u01d1\u01d4\58\35\2\u01d2\u01d4\5\64"+ + "\33\2\u01d3\u01d1\3\2\2\2\u01d3\u01d2\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5"+ + "\u01d6\7`\2\2\u01d6\u01d8\5&\24\2\u01d7\u01d9\7g\2\2\u01d8\u01d7\3\2\2"+ + "\2\u01d8\u01d9\3\2\2\2\u01d9\u01da\3\2\2\2\u01da\u01db\5P)\2\u01dbc\3"+ + "\2\2\2\u01dc\u01dd\7a\2\2\u01dd\u01df\5&\24\2\u01de\u01e0\7g\2\2\u01df"+ + "\u01de\3\2\2\2\u01df\u01e0\3\2\2\2\u01e0\u01e3\3\2\2\2\u01e1\u01e4\5\b"+ + "\5\2\u01e2\u01e4\5P)\2\u01e3\u01e1\3\2\2\2\u01e3\u01e2\3\2\2\2\u01e4e"+ + "\3\2\2\2\u01e5\u01e8\7b\2\2\u01e6\u01e9\5\b\5\2\u01e7\u01e9\5P)\2\u01e8"+ + "\u01e6\3\2\2\2\u01e8\u01e7\3\2\2\2\u01e9\u01eb\3\2\2\2\u01ea\u01ec\7g"+ + "\2\2\u01eb\u01ea\3\2\2\2\u01eb\u01ec\3\2\2\2\u01ec\u01ed\3\2\2\2\u01ed"+ + "\u01ee\7c\2\2\u01ee\u01ef\5&\24\2\u01efg\3\2\2\2\65jlsx\u0092\u009b\u009f"+ + "\u00a6\u00a9\u00ae\u00b2\u00b8\u00ca\u00d9\u00ec\u0116\u0118\u011a\u011f"+ + "\u0123\u0129\u012d\u0136\u013b\u0148\u014e\u015a\u016b\u0174\u0178\u017e"+ + "\u0187\u0189\u0196\u01a2\u01a8\u01ac\u01af\u01b2\u01b8\u01bc\u01c0\u01c4"+ + "\u01c7\u01ca\u01d3\u01d8\u01df\u01e3\u01e8\u01eb"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/compiler/src/prog8/stackvm/Program.kt b/compiler/src/prog8/stackvm/Program.kt index 72029d44e..dabaad6e1 100644 --- a/compiler/src/prog8/stackvm/Program.kt +++ b/compiler/src/prog8/stackvm/Program.kt @@ -2,6 +2,7 @@ package prog8.stackvm import prog8.ast.DataType import prog8.compiler.HeapValues +import prog8.compiler.unescape import java.io.File import java.io.PrintStream import java.util.* @@ -58,7 +59,7 @@ class Program (val name: String, DataType.STR, DataType.STR_P, DataType.STR_S, - DataType.STR_PS -> heap.add(it.second, unescape(it.third.substring(1, it.third.length-1))) + DataType.STR_PS -> heap.add(it.second, it.third.substring(1, it.third.length-1).unescape()) DataType.ARRAY, DataType.ARRAY_W, DataType.MATRIX -> { @@ -186,31 +187,6 @@ class Program (val name: String, } } - private fun unescape(st: String): String { - val result = mutableListOf() - val iter = st.iterator() - while(iter.hasNext()) { - val c = iter.nextChar() - if(c=='\\') { - val ec = iter.nextChar() - result.add(when(ec) { - '\\' -> '\\' - 'b' -> '\b' - 'n' -> '\n' - 'r' -> '\r' - 't' -> '\t' - 'u' -> { - "${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}${iter.nextChar()}".toInt(16).toChar() - } - else -> throw VmExecutionException("invalid escape char: $ec") - }) - } else { - result.add(c) - } - } - return result.joinToString("") - } - private fun loadMemory(lines: Iterator>, memory: MutableMap>): Map> { while(true) { val (lineNr, line) = lines.next() diff --git a/docs/source/programming.rst b/docs/source/programming.rst index b77301e12..0c7b7944a 100644 --- a/docs/source/programming.rst +++ b/docs/source/programming.rst @@ -174,6 +174,7 @@ Values will usually be part of an expression or assignment statement:: $aa43 ; hex integer number %100101 ; binary integer number "Hi, I am a string" ; text string + 'a' ; petscii value (byte) for the letter a -33.456e52 ; floating point number byte counter = 42 ; variable of size 8 bits, with initial value 42 @@ -236,6 +237,8 @@ Integers Integers are 8 or 16 bit numbers and can be written in normal decimal notation, in hexadecimal and in binary notation. +A single character in single quotes such as ``'a'`` is translated into a byte integer, +which is the Petscii value for that character. .. todo:: Right now only unsinged integers are supported (0-255 for byte types, 0-65535 for word types) diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index 8886995d7..0fa518e2c 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -252,6 +252,9 @@ type identifier type storage size example var declara **binary numbers:** you can use a percent prefix to write binary numbers: ``%10010011`` +**character values:** you can use a single character in quotes like this ``'a'`` for the Petscii byte value of that character. + + **``byte`` versus ``word`` values:** - When an integer value ranges from 0..255 the compiler sees it as a ``byte``.