diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java
index c63aa0e7e..c0e8b3084 100644
--- a/src/main/java/dk/camelot64/kickc/Compiler.java
+++ b/src/main/java/dk/camelot64/kickc/Compiler.java
@@ -154,6 +154,7 @@ public class Compiler {
new Pass1ResolveForwardReferences(program).execute();
new Pass1UnwindBlockScopes(program).execute();
new Pass1TypeInference(program).execute();
+ new Pass1TypeIdSimplification(program).execute();
if(getLog().isVerbosePass1CreateSsa()) {
getLog().append("SYMBOLS");
diff --git a/src/main/java/dk/camelot64/kickc/model/operators/OperatorSizeOf.java b/src/main/java/dk/camelot64/kickc/model/operators/OperatorSizeOf.java
index a824028b6..02d3e51e8 100644
--- a/src/main/java/dk/camelot64/kickc/model/operators/OperatorSizeOf.java
+++ b/src/main/java/dk/camelot64/kickc/model/operators/OperatorSizeOf.java
@@ -54,7 +54,7 @@ public class OperatorSizeOf extends OperatorUnary {
public static String getSizeofConstantName(SymbolType type) {
if(type instanceof SymbolTypeMulti) {
// Grab the first sub-type. It will be the smallest
- SymbolType subType = ((SymbolTypeMulti) type).getTypes().iterator().next();
+ SymbolType subType = OperatorTypeId.getSubTypeToUse((SymbolTypeMulti) type);
return getSizeofConstantName(subType);
} else if(type instanceof SymbolTypePointer) {
return "SIZEOF_POINTER";
diff --git a/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java b/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java
new file mode 100644
index 000000000..df22fc60d
--- /dev/null
+++ b/src/main/java/dk/camelot64/kickc/model/operators/OperatorTypeId.java
@@ -0,0 +1,145 @@
+package dk.camelot64.kickc.model.operators;
+
+import dk.camelot64.kickc.model.symbols.ConstantVar;
+import dk.camelot64.kickc.model.symbols.ProgramScope;
+import dk.camelot64.kickc.model.types.*;
+import dk.camelot64.kickc.model.values.ConstantInteger;
+import dk.camelot64.kickc.model.values.ConstantLiteral;
+import dk.camelot64.kickc.model.values.ConstantRef;
+
+/**
+ * TypeId operator typeid(expr) returns byte value representing the type of the expression.
+ * Will be resolved into a constant as soon as the expression has been resolved enough.
+ */
+public class OperatorTypeId extends OperatorUnary {
+
+ public OperatorTypeId(int precedence) {
+ super("typeid ", "_typeid_", precedence);
+ }
+
+ @Override
+ public ConstantLiteral calculateLiteral(ConstantLiteral operand, ProgramScope scope) {
+ SymbolType type = operand.getType(scope);
+ return new ConstantInteger((long) getTypeId(type));
+ }
+
+ @Override
+ public SymbolType inferType(SymbolTypeSimple operandType) {
+ return SymbolType.BYTE;
+ }
+
+ /**
+ * Get the constant variable containing the type ID of a specific type
+ *
+ * @param programScope The program scope (used for finding/adding the constant).
+ * @param type The type to get the variable for
+ * @return The constant variable
+ */
+ public static ConstantRef getTypeIdConstantVar(ProgramScope programScope, SymbolType type) {
+ String typeConstName = "TYPEID_"+getTypeIdConstantName(type);
+ ConstantVar typeIdConstant = programScope.getConstant(typeConstName);
+ if(typeIdConstant == null) {
+ // Constant not found - create it
+ long typeSize = getTypeId(type);
+ typeIdConstant = new ConstantVar(typeConstName, programScope, SymbolType.BYTE, new ConstantInteger(typeSize));
+ programScope.add(typeIdConstant);
+ }
+ return typeIdConstant.getRef();
+ }
+
+ /**
+ * Get the name of the constant variable containing the type id of a specific type
+ *
+ * @param type The type to get the variable for
+ * @return The name of the constant
+ */
+ private static String getTypeIdConstantName(SymbolType type) {
+ if(type instanceof SymbolTypeMulti) {
+ // Grab the first sub-type. It will be the smallest
+ SymbolType subType = getSubTypeToUse((SymbolTypeMulti) type);
+ if(subType==null) {
+ return "VOID";
+ } else {
+ return getTypeIdConstantName(subType);
+ }
+ } else if(type instanceof SymbolTypeProcedure) {
+ return "PROCEDURE";
+ } else if(type instanceof SymbolTypePointer) {
+ return "POINTER_" + getTypeIdConstantName(((SymbolTypePointer) type).getElementType());
+ } else {
+ return type.getTypeName().toUpperCase().replace(" ", "_");
+ }
+ }
+
+ /**
+ * Get the type ID of a type.
+ *
+ * Simple Types:
+ * - void : 0
+ * - unsigned byte: 1
+ * - signed byte: 2
+ * - unsigned word: 3
+ * - signed word: 4
+ * - unsigned dword: 5
+ * - signed dword: 6
+ * - bool: 7
+ * - procedure: 0xf
+ *
+ * Pointers:
+ * - 0x10 + type ID of pointed to sub-type
+ * - Arrays? Strings?
+ *
+ * @param type The type
+ * @return The ID
+ */
+ public static int getTypeId(SymbolType type) {
+ if(SymbolTypeNamed.VOID.equals(type)) {
+ return 0;
+ } else if(SymbolTypeNamed.BYTE.equals(type)) {
+ return 1;
+ } else if(SymbolTypeNamed.SBYTE.equals(type)) {
+ return 2;
+ } else if(SymbolTypeNamed.WORD.equals(type)) {
+ return 3;
+ } else if(SymbolTypeNamed.SWORD.equals(type)) {
+ return 4;
+ } else if(SymbolTypeNamed.DWORD.equals(type)) {
+ return 5;
+ } else if(SymbolTypeNamed.SDWORD.equals(type)) {
+ return 6;
+ } else if(SymbolTypeNamed.BOOLEAN.equals(type)) {
+ return 7;
+ } else if(type instanceof SymbolTypeProcedure) {
+ return 0x0f;
+ } else if(type instanceof SymbolTypePointer) {
+ return 0x10 + getTypeId(((SymbolTypePointer) type).getElementType());
+ } else if(type instanceof SymbolTypeMulti) {
+ // Return the smallest type ID
+ SymbolType useType = getSubTypeToUse((SymbolTypeMulti) type);
+ if(useType==null) return 0;
+ return getTypeId(useType);
+ } else {
+ return 0;
+ }
+ }
+
+ /**
+ * Find the sub-type to use for typeid()
+ * @param type The multi type
+ * @return The sub-type to use
+ */
+ public static SymbolType getSubTypeToUse(SymbolTypeMulti type) {
+ SymbolType useType = null;
+ Integer useID = null;
+ for(SymbolType subType : type.getTypes()) {
+ int subId = getTypeId(subType);
+ if(useType==null || subId < useID) {
+ useType = subType;
+ useID = subId;
+ }
+ }
+ return useType;
+ }
+
+
+}
diff --git a/src/main/java/dk/camelot64/kickc/model/operators/Operators.java b/src/main/java/dk/camelot64/kickc/model/operators/Operators.java
index c0fa62d06..b9470a3c8 100644
--- a/src/main/java/dk/camelot64/kickc/model/operators/Operators.java
+++ b/src/main/java/dk/camelot64/kickc/model/operators/Operators.java
@@ -27,6 +27,7 @@ public class Operators {
public static final OperatorUnary CAST_SDWORD = new OperatorCastSDWord(2);
public static final OperatorUnary CAST_BOOL= new OperatorCastBool(2);
public static final OperatorUnary SIZEOF = new OperatorSizeOf(2);
+ public static final OperatorUnary TYPEID = new OperatorTypeId(2);
public static final OperatorBinary MULTIPLY = new OperatorMultiply(3);
public static final OperatorBinary DIVIDE = new OperatorDivide(3);
public static final OperatorBinary MODULO = new OperatorModulo(3);
diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolType.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolType.java
index c08d7adbf..9bf23a2f8 100644
--- a/src/main/java/dk/camelot64/kickc/model/types/SymbolType.java
+++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolType.java
@@ -107,8 +107,6 @@ public interface SymbolType {
*/
int getSizeBytes();
-
-
/**
* Is the type {@link #BYTE} or compatible {@link SymbolTypeMulti}
*
diff --git a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java
index cd403a5a3..d80e44138 100644
--- a/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java
+++ b/src/main/java/dk/camelot64/kickc/model/types/SymbolTypeInference.java
@@ -6,6 +6,7 @@ import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.operators.Operator;
import dk.camelot64.kickc.model.operators.OperatorBinary;
import dk.camelot64.kickc.model.operators.OperatorUnary;
+import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.statements.*;
import dk.camelot64.kickc.model.symbols.*;
import dk.camelot64.kickc.model.values.*;
@@ -29,6 +30,11 @@ public class SymbolTypeInference {
* @return The type of the resulting value
*/
public static SymbolType inferType(ProgramScope programScope, OperatorUnary operator, RValue rValue) {
+ if(Operators.TYPEID.equals(operator)) {
+ return SymbolType.BYTE;
+ } else if(Operators.SIZEOF.equals(operator)) {
+ return SymbolType.BYTE;
+ }
if(rValue instanceof ConstantValue) {
// Calculate resulting constant literal
try {
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.g4 b/src/main/java/dk/camelot64/kickc/parser/KickC.g4
index df032ce51..dbc6688a9 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickC.g4
+++ b/src/main/java/dk/camelot64/kickc/parser/KickC.g4
@@ -123,6 +123,7 @@ expr
: '(' commaExpr ')' #exprPar
| expr '(' parameterList? ')' #exprCall
| 'sizeof' '(' ( typeDecl | expr ) ')' #exprSizeOf
+ | 'typeid' '(' ( typeDecl | expr ) ')' #exprTypeId
| expr '[' commaExpr ']' #exprArray
| '(' typeDecl ')' expr #exprCast
| ('--' | '++' ) expr #exprPreMod
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
index 53bc237cd..c69744d23 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
+++ b/src/main/java/dk/camelot64/kickc/parser/KickC.tokens
@@ -73,26 +73,27 @@ T__71=72
T__72=73
T__73=74
T__74=75
-MNEMONIC=76
-KICKASM=77
-SIMPLETYPE=78
-STRING=79
-CHAR=80
-BOOLEAN=81
-NUMBER=82
-NUMFLOAT=83
-BINFLOAT=84
-DECFLOAT=85
-HEXFLOAT=86
-NUMINT=87
-BININTEGER=88
-DECINTEGER=89
-HEXINTEGER=90
-NAME=91
-ASMREL=92
-WS=93
-COMMENT_LINE=94
-COMMENT_BLOCK=95
+T__75=76
+MNEMONIC=77
+KICKASM=78
+SIMPLETYPE=79
+STRING=80
+CHAR=81
+BOOLEAN=82
+NUMBER=83
+NUMFLOAT=84
+BINFLOAT=85
+DECFLOAT=86
+HEXFLOAT=87
+NUMINT=88
+BININTEGER=89
+DECINTEGER=90
+HEXINTEGER=91
+NAME=92
+ASMREL=93
+WS=94
+COMMENT_LINE=95
+COMMENT_BLOCK=96
'import'=1
';'=2
','=3
@@ -126,45 +127,46 @@ COMMENT_BLOCK=95
'['=31
']'=32
'sizeof'=33
-'--'=34
-'++'=35
-'+'=36
-'-'=37
-'!'=38
-'&'=39
-'~'=40
-'>>'=41
-'<<'=42
-'/'=43
-'%'=44
-'<'=45
-'>'=46
-'=='=47
-'!='=48
-'<='=49
-'>='=50
-'^'=51
-'|'=52
-'&&'=53
-'||'=54
-'?'=55
-'+='=56
-'-='=57
-'*='=58
-'/='=59
-'%='=60
-'<<='=61
-'>>='=62
-'&='=63
-'|='=64
-'^='=65
-'kickasm'=66
-'resource'=67
-'uses'=68
-'clobbers'=69
-'bytes'=70
-'cycles'=71
-'pc'=72
-'.byte'=73
-'#'=74
-'.'=75
+'typeid'=34
+'--'=35
+'++'=36
+'+'=37
+'-'=38
+'!'=39
+'&'=40
+'~'=41
+'>>'=42
+'<<'=43
+'/'=44
+'%'=45
+'<'=46
+'>'=47
+'=='=48
+'!='=49
+'<='=50
+'>='=51
+'^'=52
+'|'=53
+'&&'=54
+'||'=55
+'?'=56
+'+='=57
+'-='=58
+'*='=59
+'/='=60
+'%='=61
+'<<='=62
+'>>='=63
+'&='=64
+'|='=65
+'^='=66
+'kickasm'=67
+'resource'=68
+'uses'=69
+'clobbers'=70
+'bytes'=71
+'cycles'=72
+'pc'=73
+'.byte'=74
+'#'=75
+'.'=76
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
index b4a28c897..64996623d 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseListener.java
@@ -635,6 +635,18 @@ public class KickCBaseListener implements KickCListener {
*
The default implementation does nothing.
*/
@Override public void exitExprBinary(KickCParser.ExprBinaryContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void enterExprTypeId(KickCParser.ExprTypeIdContext ctx) { }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation does nothing.
+ */
+ @Override public void exitExprTypeId(KickCParser.ExprTypeIdContext ctx) { }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
index aba9baec4..984232061 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCBaseVisitor.java
@@ -375,6 +375,13 @@ public class KickCBaseVisitor extends AbstractParseTreeVisitor implements
* {@link #visitChildren} on {@code ctx}.
*/
@Override public T visitExprBinary(KickCParser.ExprBinaryContext ctx) { return visitChildren(ctx); }
+ /**
+ * {@inheritDoc}
+ *
+ * The default implementation returns the result of calling
+ * {@link #visitChildren} on {@code ctx}.
+ */
+ @Override public T visitExprTypeId(KickCParser.ExprTypeIdContext ctx) { return visitChildren(ctx); }
/**
* {@inheritDoc}
*
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
index 4905c5b54..c628f18ce 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.java
@@ -27,10 +27,10 @@ public class KickCLexer extends Lexer {
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
- T__73=74, T__74=75, MNEMONIC=76, KICKASM=77, SIMPLETYPE=78, STRING=79,
- CHAR=80, BOOLEAN=81, NUMBER=82, NUMFLOAT=83, BINFLOAT=84, DECFLOAT=85,
- HEXFLOAT=86, NUMINT=87, BININTEGER=88, DECINTEGER=89, HEXINTEGER=90, NAME=91,
- ASMREL=92, WS=93, COMMENT_LINE=94, COMMENT_BLOCK=95;
+ T__73=74, T__74=75, T__75=76, MNEMONIC=77, KICKASM=78, SIMPLETYPE=79,
+ STRING=80, CHAR=81, BOOLEAN=82, NUMBER=83, NUMFLOAT=84, BINFLOAT=85, DECFLOAT=86,
+ HEXFLOAT=87, NUMINT=88, BININTEGER=89, DECINTEGER=90, HEXINTEGER=91, NAME=92,
+ ASMREL=93, WS=94, COMMENT_LINE=95, COMMENT_BLOCK=96;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@@ -49,10 +49,11 @@ public class KickCLexer extends Lexer {
"T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56",
"T__57", "T__58", "T__59", "T__60", "T__61", "T__62", "T__63", "T__64",
"T__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
- "T__73", "T__74", "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING", "CHAR",
- "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT", "NUMINT",
- "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT", "HEXDIGIT",
- "NAME", "NAME_START", "NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE", "COMMENT_BLOCK"
+ "T__73", "T__74", "T__75", "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING",
+ "CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT",
+ "NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "BINDIGIT", "DECDIGIT",
+ "HEXDIGIT", "NAME", "NAME_START", "NAME_CHAR", "ASMREL", "WS", "COMMENT_LINE",
+ "COMMENT_BLOCK"
};
private static final String[] _LITERAL_NAMES = {
@@ -60,10 +61,10 @@ public class KickCLexer extends Lexer {
"'extern'", "'align'", "'register'", "'inline'", "'volatile'", "'interrupt'",
"'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'",
"'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", "'unsigned'",
- "'*'", "'['", "']'", "'sizeof'", "'--'", "'++'", "'+'", "'-'", "'!'",
- "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='",
- "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='", "'*='",
- "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'",
+ "'*'", "'['", "']'", "'sizeof'", "'typeid'", "'--'", "'++'", "'+'", "'-'",
+ "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='",
+ "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='",
+ "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'",
"'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'pc'", "'.byte'",
"'#'", "'.'"
};
@@ -74,7 +75,7 @@ public class KickCLexer extends Lexer {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING",
+ null, null, null, null, null, "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING",
"CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT",
"NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL",
"WS", "COMMENT_LINE", "COMMENT_BLOCK"
@@ -137,7 +138,7 @@ public class KickCLexer extends Lexer {
public ATN getATN() { return _ATN; }
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2a\u03ce\b\1\4\2\t"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2b\u03d7\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"+
@@ -148,345 +149,348 @@ public class KickCLexer extends Lexer {
"\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\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\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3\3\3\3"+
- "\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3"+
- "\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r"+
- "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\17\3"+
- "\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+
- "\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3"+
- "\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3"+
- "\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3"+
- "\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\32\3"+
- "\32\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3"+
- "\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3 \3 \3!\3"+
- "!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3$\3$\3$\3%\3%\3&\3&\3\'\3\'\3"+
- "(\3(\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3\60\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\65\3\65\3\66\3"+
- "\66\3\66\3\67\3\67\3\67\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3<\3=\3"+
- "=\3=\3>\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3A\3A\3A\3B\3B\3B\3C\3C\3C\3C\3"+
- "C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3"+
- "F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3H\3I\3I\3I\3J\3J\3J\3"+
- "J\3J\3J\3K\3K\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3"+
- "M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\5M\u02dd"+
- "\nM\3N\3N\3N\3N\7N\u02e3\nN\fN\16N\u02e6\13N\3N\3N\3N\3O\3O\3O\3O\3O\3"+
- "O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3"+
- "O\3O\3O\3O\3O\3O\3O\3O\3O\5O\u0310\nO\3P\3P\3P\3P\7P\u0316\nP\fP\16P\u0319"+
- "\13P\3P\3P\5P\u031d\nP\3Q\3Q\3Q\3Q\5Q\u0323\nQ\3Q\3Q\3R\3R\3R\3R\3R\3"+
- "R\3R\3R\3R\5R\u0330\nR\3S\3S\5S\u0334\nS\3T\3T\3T\5T\u0339\nT\3U\3U\3"+
- "U\3U\3U\5U\u0340\nU\3U\7U\u0343\nU\fU\16U\u0346\13U\3U\3U\6U\u034a\nU"+
- "\rU\16U\u034b\3V\7V\u034f\nV\fV\16V\u0352\13V\3V\3V\6V\u0356\nV\rV\16"+
- "V\u0357\3W\3W\3W\3W\3W\5W\u035f\nW\3W\7W\u0362\nW\fW\16W\u0365\13W\3W"+
- "\3W\6W\u0369\nW\rW\16W\u036a\3X\3X\3X\5X\u0370\nX\3Y\3Y\3Y\6Y\u0375\n"+
- "Y\rY\16Y\u0376\3Y\3Y\6Y\u037b\nY\rY\16Y\u037c\5Y\u037f\nY\3Z\6Z\u0382"+
- "\nZ\rZ\16Z\u0383\3[\3[\3[\3[\3[\5[\u038b\n[\3[\6[\u038e\n[\r[\16[\u038f"+
- "\3\\\3\\\3]\3]\3^\3^\3_\3_\7_\u039a\n_\f_\16_\u039d\13_\3`\3`\3a\3a\3"+
- "b\3b\7b\u03a5\nb\fb\16b\u03a8\13b\3b\6b\u03ab\nb\rb\16b\u03ac\3c\6c\u03b0"+
- "\nc\rc\16c\u03b1\3c\3c\3d\3d\3d\3d\7d\u03ba\nd\fd\16d\u03bd\13d\3d\3d"+
- "\3e\3e\3e\3e\7e\u03c5\ne\fe\16e\u03c8\13e\3e\3e\3e\3e\3e\4\u02e4\u03c6"+
- "\2f\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\67"+
- "m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008d"+
- "H\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1"+
- "R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5"+
- "\\\u00b7\2\u00b9\2\u00bb\2\u00bd]\u00bf\2\u00c1\2\u00c3^\u00c5_\u00c7"+
- "`\u00c9a\3\2\r\3\2$$\3\2))\4\2DDdd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C"+
- "\\aac|\6\2\62;C\\aac|\4\2--//\6\2\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17"+
- "\17\2\u043b\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\u00bd\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\3\u00cb\3\2\2"+
- "\2\5\u00d2\3\2\2\2\7\u00d4\3\2\2\2\t\u00d6\3\2\2\2\13\u00d8\3\2\2\2\r"+
- "\u00da\3\2\2\2\17\u00dc\3\2\2\2\21\u00de\3\2\2\2\23\u00e0\3\2\2\2\25\u00e6"+
- "\3\2\2\2\27\u00ed\3\2\2\2\31\u00f3\3\2\2\2\33\u00fc\3\2\2\2\35\u0103\3"+
- "\2\2\2\37\u010c\3\2\2\2!\u0116\3\2\2\2#\u011e\3\2\2\2%\u0121\3\2\2\2\'"+
- "\u0126\3\2\2\2)\u012c\3\2\2\2+\u012f\3\2\2\2-\u0133\3\2\2\2/\u013a\3\2"+
- "\2\2\61\u0140\3\2\2\2\63\u0149\3\2\2\2\65\u014d\3\2\2\2\67\u014f\3\2\2"+
- "\29\u0152\3\2\2\2;\u0159\3\2\2\2=\u0162\3\2\2\2?\u0164\3\2\2\2A\u0166"+
- "\3\2\2\2C\u0168\3\2\2\2E\u016f\3\2\2\2G\u0172\3\2\2\2I\u0175\3\2\2\2K"+
- "\u0177\3\2\2\2M\u0179\3\2\2\2O\u017b\3\2\2\2Q\u017d\3\2\2\2S\u017f\3\2"+
- "\2\2U\u0182\3\2\2\2W\u0185\3\2\2\2Y\u0187\3\2\2\2[\u0189\3\2\2\2]\u018b"+
- "\3\2\2\2_\u018d\3\2\2\2a\u0190\3\2\2\2c\u0193\3\2\2\2e\u0196\3\2\2\2g"+
- "\u0199\3\2\2\2i\u019b\3\2\2\2k\u019d\3\2\2\2m\u01a0\3\2\2\2o\u01a3\3\2"+
- "\2\2q\u01a5\3\2\2\2s\u01a8\3\2\2\2u\u01ab\3\2\2\2w\u01ae\3\2\2\2y\u01b1"+
- "\3\2\2\2{\u01b4\3\2\2\2}\u01b8\3\2\2\2\177\u01bc\3\2\2\2\u0081\u01bf\3"+
- "\2\2\2\u0083\u01c2\3\2\2\2\u0085\u01c5\3\2\2\2\u0087\u01cd\3\2\2\2\u0089"+
- "\u01d6\3\2\2\2\u008b\u01db\3\2\2\2\u008d\u01e4\3\2\2\2\u008f\u01ea\3\2"+
- "\2\2\u0091\u01f1\3\2\2\2\u0093\u01f4\3\2\2\2\u0095\u01fa\3\2\2\2\u0097"+
- "\u01fc\3\2\2\2\u0099\u02dc\3\2\2\2\u009b\u02de\3\2\2\2\u009d\u030f\3\2"+
- "\2\2\u009f\u0311\3\2\2\2\u00a1\u031e\3\2\2\2\u00a3\u032f\3\2\2\2\u00a5"+
- "\u0333\3\2\2\2\u00a7\u0338\3\2\2\2\u00a9\u033f\3\2\2\2\u00ab\u0350\3\2"+
- "\2\2\u00ad\u035e\3\2\2\2\u00af\u036f\3\2\2\2\u00b1\u037e\3\2\2\2\u00b3"+
- "\u0381\3\2\2\2\u00b5\u038a\3\2\2\2\u00b7\u0391\3\2\2\2\u00b9\u0393\3\2"+
- "\2\2\u00bb\u0395\3\2\2\2\u00bd\u0397\3\2\2\2\u00bf\u039e\3\2\2\2\u00c1"+
- "\u03a0\3\2\2\2\u00c3\u03a2\3\2\2\2\u00c5\u03af\3\2\2\2\u00c7\u03b5\3\2"+
- "\2\2\u00c9\u03c0\3\2\2\2\u00cb\u00cc\7k\2\2\u00cc\u00cd\7o\2\2\u00cd\u00ce"+
- "\7r\2\2\u00ce\u00cf\7q\2\2\u00cf\u00d0\7t\2\2\u00d0\u00d1\7v\2\2\u00d1"+
- "\4\3\2\2\2\u00d2\u00d3\7=\2\2\u00d3\6\3\2\2\2\u00d4\u00d5\7.\2\2\u00d5"+
- "\b\3\2\2\2\u00d6\u00d7\7?\2\2\u00d7\n\3\2\2\2\u00d8\u00d9\7*\2\2\u00d9"+
- "\f\3\2\2\2\u00da\u00db\7+\2\2\u00db\16\3\2\2\2\u00dc\u00dd\7}\2\2\u00dd"+
- "\20\3\2\2\2\u00de\u00df\7\177\2\2\u00df\22\3\2\2\2\u00e0\u00e1\7e\2\2"+
- "\u00e1\u00e2\7q\2\2\u00e2\u00e3\7p\2\2\u00e3\u00e4\7u\2\2\u00e4\u00e5"+
- "\7v\2\2\u00e5\24\3\2\2\2\u00e6\u00e7\7g\2\2\u00e7\u00e8\7z\2\2\u00e8\u00e9"+
- "\7v\2\2\u00e9\u00ea\7g\2\2\u00ea\u00eb\7t\2\2\u00eb\u00ec\7p\2\2\u00ec"+
- "\26\3\2\2\2\u00ed\u00ee\7c\2\2\u00ee\u00ef\7n\2\2\u00ef\u00f0\7k\2\2\u00f0"+
- "\u00f1\7i\2\2\u00f1\u00f2\7p\2\2\u00f2\30\3\2\2\2\u00f3\u00f4\7t\2\2\u00f4"+
- "\u00f5\7g\2\2\u00f5\u00f6\7i\2\2\u00f6\u00f7\7k\2\2\u00f7\u00f8\7u\2\2"+
- "\u00f8\u00f9\7v\2\2\u00f9\u00fa\7g\2\2\u00fa\u00fb\7t\2\2\u00fb\32\3\2"+
- "\2\2\u00fc\u00fd\7k\2\2\u00fd\u00fe\7p\2\2\u00fe\u00ff\7n\2\2\u00ff\u0100"+
- "\7k\2\2\u0100\u0101\7p\2\2\u0101\u0102\7g\2\2\u0102\34\3\2\2\2\u0103\u0104"+
- "\7x\2\2\u0104\u0105\7q\2\2\u0105\u0106\7n\2\2\u0106\u0107\7c\2\2\u0107"+
- "\u0108\7v\2\2\u0108\u0109\7k\2\2\u0109\u010a\7n\2\2\u010a\u010b\7g\2\2"+
- "\u010b\36\3\2\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f\7"+
- "v\2\2\u010f\u0110\7g\2\2\u0110\u0111\7t\2\2\u0111\u0112\7t\2\2\u0112\u0113"+
- "\7w\2\2\u0113\u0114\7r\2\2\u0114\u0115\7v\2\2\u0115 \3\2\2\2\u0116\u0117"+
- "\7t\2\2\u0117\u0118\7g\2\2\u0118\u0119\7u\2\2\u0119\u011a\7g\2\2\u011a"+
- "\u011b\7t\2\2\u011b\u011c\7x\2\2\u011c\u011d\7g\2\2\u011d\"\3\2\2\2\u011e"+
- "\u011f\7k\2\2\u011f\u0120\7h\2\2\u0120$\3\2\2\2\u0121\u0122\7g\2\2\u0122"+
- "\u0123\7n\2\2\u0123\u0124\7u\2\2\u0124\u0125\7g\2\2\u0125&\3\2\2\2\u0126"+
- "\u0127\7y\2\2\u0127\u0128\7j\2\2\u0128\u0129\7k\2\2\u0129\u012a\7n\2\2"+
- "\u012a\u012b\7g\2\2\u012b(\3\2\2\2\u012c\u012d\7f\2\2\u012d\u012e\7q\2"+
- "\2\u012e*\3\2\2\2\u012f\u0130\7h\2\2\u0130\u0131\7q\2\2\u0131\u0132\7"+
- "t\2\2\u0132,\3\2\2\2\u0133\u0134\7t\2\2\u0134\u0135\7g\2\2\u0135\u0136"+
- "\7v\2\2\u0136\u0137\7w\2\2\u0137\u0138\7t\2\2\u0138\u0139\7p\2\2\u0139"+
- ".\3\2\2\2\u013a\u013b\7d\2\2\u013b\u013c\7t\2\2\u013c\u013d\7g\2\2\u013d"+
- "\u013e\7c\2\2\u013e\u013f\7m\2\2\u013f\60\3\2\2\2\u0140\u0141\7e\2\2\u0141"+
- "\u0142\7q\2\2\u0142\u0143\7p\2\2\u0143\u0144\7v\2\2\u0144\u0145\7k\2\2"+
- "\u0145\u0146\7p\2\2\u0146\u0147\7w\2\2\u0147\u0148\7g\2\2\u0148\62\3\2"+
- "\2\2\u0149\u014a\7c\2\2\u014a\u014b\7u\2\2\u014b\u014c\7o\2\2\u014c\64"+
- "\3\2\2\2\u014d\u014e\7<\2\2\u014e\66\3\2\2\2\u014f\u0150\7\60\2\2\u0150"+
- "\u0151\7\60\2\2\u01518\3\2\2\2\u0152\u0153\7u\2\2\u0153\u0154\7k\2\2\u0154"+
- "\u0155\7i\2\2\u0155\u0156\7p\2\2\u0156\u0157\7g\2\2\u0157\u0158\7f\2\2"+
- "\u0158:\3\2\2\2\u0159\u015a\7w\2\2\u015a\u015b\7p\2\2\u015b\u015c\7u\2"+
- "\2\u015c\u015d\7k\2\2\u015d\u015e\7i\2\2\u015e\u015f\7p\2\2\u015f\u0160"+
- "\7g\2\2\u0160\u0161\7f\2\2\u0161<\3\2\2\2\u0162\u0163\7,\2\2\u0163>\3"+
- "\2\2\2\u0164\u0165\7]\2\2\u0165@\3\2\2\2\u0166\u0167\7_\2\2\u0167B\3\2"+
- "\2\2\u0168\u0169\7u\2\2\u0169\u016a\7k\2\2\u016a\u016b\7|\2\2\u016b\u016c"+
- "\7g\2\2\u016c\u016d\7q\2\2\u016d\u016e\7h\2\2\u016eD\3\2\2\2\u016f\u0170"+
- "\7/\2\2\u0170\u0171\7/\2\2\u0171F\3\2\2\2\u0172\u0173\7-\2\2\u0173\u0174"+
- "\7-\2\2\u0174H\3\2\2\2\u0175\u0176\7-\2\2\u0176J\3\2\2\2\u0177\u0178\7"+
- "/\2\2\u0178L\3\2\2\2\u0179\u017a\7#\2\2\u017aN\3\2\2\2\u017b\u017c\7("+
- "\2\2\u017cP\3\2\2\2\u017d\u017e\7\u0080\2\2\u017eR\3\2\2\2\u017f\u0180"+
- "\7@\2\2\u0180\u0181\7@\2\2\u0181T\3\2\2\2\u0182\u0183\7>\2\2\u0183\u0184"+
- "\7>\2\2\u0184V\3\2\2\2\u0185\u0186\7\61\2\2\u0186X\3\2\2\2\u0187\u0188"+
- "\7\'\2\2\u0188Z\3\2\2\2\u0189\u018a\7>\2\2\u018a\\\3\2\2\2\u018b\u018c"+
- "\7@\2\2\u018c^\3\2\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\u019ah\3\2\2\2\u019b\u019c\7"+
- "~\2\2\u019cj\3\2\2\2\u019d\u019e\7(\2\2\u019e\u019f\7(\2\2\u019fl\3\2"+
- "\2\2\u01a0\u01a1\7~\2\2\u01a1\u01a2\7~\2\2\u01a2n\3\2\2\2\u01a3\u01a4"+
- "\7A\2\2\u01a4p\3\2\2\2\u01a5\u01a6\7-\2\2\u01a6\u01a7\7?\2\2\u01a7r\3"+
- "\2\2\2\u01a8\u01a9\7/\2\2\u01a9\u01aa\7?\2\2\u01aat\3\2\2\2\u01ab\u01ac"+
- "\7,\2\2\u01ac\u01ad\7?\2\2\u01adv\3\2\2\2\u01ae\u01af\7\61\2\2\u01af\u01b0"+
- "\7?\2\2\u01b0x\3\2\2\2\u01b1\u01b2\7\'\2\2\u01b2\u01b3\7?\2\2\u01b3z\3"+
- "\2\2\2\u01b4\u01b5\7>\2\2\u01b5\u01b6\7>\2\2\u01b6\u01b7\7?\2\2\u01b7"+
- "|\3\2\2\2\u01b8\u01b9\7@\2\2\u01b9\u01ba\7@\2\2\u01ba\u01bb\7?\2\2\u01bb"+
- "~\3\2\2\2\u01bc\u01bd\7(\2\2\u01bd\u01be\7?\2\2\u01be\u0080\3\2\2\2\u01bf"+
- "\u01c0\7~\2\2\u01c0\u01c1\7?\2\2\u01c1\u0082\3\2\2\2\u01c2\u01c3\7`\2"+
- "\2\u01c3\u01c4\7?\2\2\u01c4\u0084\3\2\2\2\u01c5\u01c6\7m\2\2\u01c6\u01c7"+
- "\7k\2\2\u01c7\u01c8\7e\2\2\u01c8\u01c9\7m\2\2\u01c9\u01ca\7c\2\2\u01ca"+
- "\u01cb\7u\2\2\u01cb\u01cc\7o\2\2\u01cc\u0086\3\2\2\2\u01cd\u01ce\7t\2"+
- "\2\u01ce\u01cf\7g\2\2\u01cf\u01d0\7u\2\2\u01d0\u01d1\7q\2\2\u01d1\u01d2"+
- "\7w\2\2\u01d2\u01d3\7t\2\2\u01d3\u01d4\7e\2\2\u01d4\u01d5\7g\2\2\u01d5"+
- "\u0088\3\2\2\2\u01d6\u01d7\7w\2\2\u01d7\u01d8\7u\2\2\u01d8\u01d9\7g\2"+
- "\2\u01d9\u01da\7u\2\2\u01da\u008a\3\2\2\2\u01db\u01dc\7e\2\2\u01dc\u01dd"+
- "\7n\2\2\u01dd\u01de\7q\2\2\u01de\u01df\7d\2\2\u01df\u01e0\7d\2\2\u01e0"+
- "\u01e1\7g\2\2\u01e1\u01e2\7t\2\2\u01e2\u01e3\7u\2\2\u01e3\u008c\3\2\2"+
- "\2\u01e4\u01e5\7d\2\2\u01e5\u01e6\7{\2\2\u01e6\u01e7\7v\2\2\u01e7\u01e8"+
- "\7g\2\2\u01e8\u01e9\7u\2\2\u01e9\u008e\3\2\2\2\u01ea\u01eb\7e\2\2\u01eb"+
- "\u01ec\7{\2\2\u01ec\u01ed\7e\2\2\u01ed\u01ee\7n\2\2\u01ee\u01ef\7g\2\2"+
- "\u01ef\u01f0\7u\2\2\u01f0\u0090\3\2\2\2\u01f1\u01f2\7r\2\2\u01f2\u01f3"+
- "\7e\2\2\u01f3\u0092\3\2\2\2\u01f4\u01f5\7\60\2\2\u01f5\u01f6\7d\2\2\u01f6"+
- "\u01f7\7{\2\2\u01f7\u01f8\7v\2\2\u01f8\u01f9\7g\2\2\u01f9\u0094\3\2\2"+
- "\2\u01fa\u01fb\7%\2\2\u01fb\u0096\3\2\2\2\u01fc\u01fd\7\60\2\2\u01fd\u0098"+
- "\3\2\2\2\u01fe\u01ff\7d\2\2\u01ff\u0200\7t\2\2\u0200\u02dd\7m\2\2\u0201"+
- "\u0202\7q\2\2\u0202\u0203\7t\2\2\u0203\u02dd\7c\2\2\u0204\u0205\7m\2\2"+
- "\u0205\u0206\7k\2\2\u0206\u02dd\7n\2\2\u0207\u0208\7u\2\2\u0208\u0209"+
- "\7n\2\2\u0209\u02dd\7q\2\2\u020a\u020b\7p\2\2\u020b\u020c\7q\2\2\u020c"+
- "\u02dd\7r\2\2\u020d\u020e\7c\2\2\u020e\u020f\7u\2\2\u020f\u02dd\7n\2\2"+
- "\u0210\u0211\7r\2\2\u0211\u0212\7j\2\2\u0212\u02dd\7r\2\2\u0213\u0214"+
- "\7c\2\2\u0214\u0215\7p\2\2\u0215\u02dd\7e\2\2\u0216\u0217\7d\2\2\u0217"+
- "\u0218\7r\2\2\u0218\u02dd\7n\2\2\u0219\u021a\7e\2\2\u021a\u021b\7n\2\2"+
- "\u021b\u02dd\7e\2\2\u021c\u021d\7l\2\2\u021d\u021e\7u\2\2\u021e\u02dd"+
- "\7t\2\2\u021f\u0220\7c\2\2\u0220\u0221\7p\2\2\u0221\u02dd\7f\2\2\u0222"+
- "\u0223\7t\2\2\u0223\u0224\7n\2\2\u0224\u02dd\7c\2\2\u0225\u0226\7d\2\2"+
- "\u0226\u0227\7k\2\2\u0227\u02dd\7v\2\2\u0228\u0229\7t\2\2\u0229\u022a"+
- "\7q\2\2\u022a\u02dd\7n\2\2\u022b\u022c\7r\2\2\u022c\u022d\7n\2\2\u022d"+
- "\u02dd\7c\2\2\u022e\u022f\7r\2\2\u022f\u0230\7n\2\2\u0230\u02dd\7r\2\2"+
- "\u0231\u0232\7d\2\2\u0232\u0233\7o\2\2\u0233\u02dd\7k\2\2\u0234\u0235"+
- "\7u\2\2\u0235\u0236\7g\2\2\u0236\u02dd\7e\2\2\u0237\u0238\7t\2\2\u0238"+
- "\u0239\7v\2\2\u0239\u02dd\7k\2\2\u023a\u023b\7g\2\2\u023b\u023c\7q\2\2"+
- "\u023c\u02dd\7t\2\2\u023d\u023e\7u\2\2\u023e\u023f\7t\2\2\u023f\u02dd"+
- "\7g\2\2\u0240\u0241\7n\2\2\u0241\u0242\7u\2\2\u0242\u02dd\7t\2\2\u0243"+
- "\u0244\7r\2\2\u0244\u0245\7j\2\2\u0245\u02dd\7c\2\2\u0246\u0247\7c\2\2"+
- "\u0247\u0248\7n\2\2\u0248\u02dd\7t\2\2\u0249\u024a\7l\2\2\u024a\u024b"+
- "\7o\2\2\u024b\u02dd\7r\2\2\u024c\u024d\7d\2\2\u024d\u024e\7x\2\2\u024e"+
- "\u02dd\7e\2\2\u024f\u0250\7e\2\2\u0250\u0251\7n\2\2\u0251\u02dd\7k\2\2"+
- "\u0252\u0253\7t\2\2\u0253\u0254\7v\2\2\u0254\u02dd\7u\2\2\u0255\u0256"+
- "\7c\2\2\u0256\u0257\7f\2\2\u0257\u02dd\7e\2\2\u0258\u0259\7t\2\2\u0259"+
- "\u025a\7t\2\2\u025a\u02dd\7c\2\2\u025b\u025c\7d\2\2\u025c\u025d\7x\2\2"+
- "\u025d\u02dd\7u\2\2\u025e\u025f\7u\2\2\u025f\u0260\7g\2\2\u0260\u02dd"+
- "\7k\2\2\u0261\u0262\7u\2\2\u0262\u0263\7c\2\2\u0263\u02dd\7z\2\2\u0264"+
- "\u0265\7u\2\2\u0265\u0266\7v\2\2\u0266\u02dd\7{\2\2\u0267\u0268\7u\2\2"+
- "\u0268\u0269\7v\2\2\u0269\u02dd\7c\2\2\u026a\u026b\7u\2\2\u026b\u026c"+
- "\7v\2\2\u026c\u02dd\7z\2\2\u026d\u026e\7f\2\2\u026e\u026f\7g\2\2\u026f"+
- "\u02dd\7{\2\2\u0270\u0271\7v\2\2\u0271\u0272\7z\2\2\u0272\u02dd\7c\2\2"+
- "\u0273\u0274\7z\2\2\u0274\u0275\7c\2\2\u0275\u02dd\7c\2\2\u0276\u0277"+
- "\7d\2\2\u0277\u0278\7e\2\2\u0278\u02dd\7e\2\2\u0279\u027a\7c\2\2\u027a"+
- "\u027b\7j\2\2\u027b\u02dd\7z\2\2\u027c\u027d\7v\2\2\u027d\u027e\7{\2\2"+
- "\u027e\u02dd\7c\2\2\u027f\u0280\7v\2\2\u0280\u0281\7z\2\2\u0281\u02dd"+
- "\7u\2\2\u0282\u0283\7v\2\2\u0283\u0284\7c\2\2\u0284\u02dd\7u\2\2\u0285"+
- "\u0286\7u\2\2\u0286\u0287\7j\2\2\u0287\u02dd\7{\2\2\u0288\u0289\7u\2\2"+
- "\u0289\u028a\7j\2\2\u028a\u02dd\7z\2\2\u028b\u028c\7n\2\2\u028c\u028d"+
- "\7f\2\2\u028d\u02dd\7{\2\2\u028e\u028f\7n\2\2\u028f\u0290\7f\2\2\u0290"+
- "\u02dd\7c\2\2\u0291\u0292\7n\2\2\u0292\u0293\7f\2\2\u0293\u02dd\7z\2\2"+
- "\u0294\u0295\7n\2\2\u0295\u0296\7c\2\2\u0296\u02dd\7z\2\2\u0297\u0298"+
- "\7v\2\2\u0298\u0299\7c\2\2\u0299\u02dd\7{\2\2\u029a\u029b\7v\2\2\u029b"+
- "\u029c\7c\2\2\u029c\u02dd\7z\2\2\u029d\u029e\7d\2\2\u029e\u029f\7e\2\2"+
- "\u029f\u02dd\7u\2\2\u02a0\u02a1\7e\2\2\u02a1\u02a2\7n\2\2\u02a2\u02dd"+
- "\7x\2\2\u02a3\u02a4\7v\2\2\u02a4\u02a5\7u\2\2\u02a5\u02dd\7z\2\2\u02a6"+
- "\u02a7\7n\2\2\u02a7\u02a8\7c\2\2\u02a8\u02dd\7u\2\2\u02a9\u02aa\7e\2\2"+
- "\u02aa\u02ab\7r\2\2\u02ab\u02dd\7{\2\2\u02ac\u02ad\7e\2\2\u02ad\u02ae"+
- "\7o\2\2\u02ae\u02dd\7r\2\2\u02af\u02b0\7e\2\2\u02b0\u02b1\7r\2\2\u02b1"+
- "\u02dd\7z\2\2\u02b2\u02b3\7f\2\2\u02b3\u02b4\7e\2\2\u02b4\u02dd\7r\2\2"+
- "\u02b5\u02b6\7f\2\2\u02b6\u02b7\7g\2\2\u02b7\u02dd\7e\2\2\u02b8\u02b9"+
- "\7k\2\2\u02b9\u02ba\7p\2\2\u02ba\u02dd\7e\2\2\u02bb\u02bc\7c\2\2\u02bc"+
- "\u02bd\7z\2\2\u02bd\u02dd\7u\2\2\u02be\u02bf\7d\2\2\u02bf\u02c0\7p\2\2"+
- "\u02c0\u02dd\7g\2\2\u02c1\u02c2\7e\2\2\u02c2\u02c3\7n\2\2\u02c3\u02dd"+
- "\7f\2\2\u02c4\u02c5\7u\2\2\u02c5\u02c6\7d\2\2\u02c6\u02dd\7e\2\2\u02c7"+
- "\u02c8\7k\2\2\u02c8\u02c9\7u\2\2\u02c9\u02dd\7e\2\2\u02ca\u02cb\7k\2\2"+
- "\u02cb\u02cc\7p\2\2\u02cc\u02dd\7z\2\2\u02cd\u02ce\7d\2\2\u02ce\u02cf"+
- "\7g\2\2\u02cf\u02dd\7s\2\2\u02d0\u02d1\7u\2\2\u02d1\u02d2\7g\2\2\u02d2"+
- "\u02dd\7f\2\2\u02d3\u02d4\7f\2\2\u02d4\u02d5\7g\2\2\u02d5\u02dd\7z\2\2"+
- "\u02d6\u02d7\7k\2\2\u02d7\u02d8\7p\2\2\u02d8\u02dd\7{\2\2\u02d9\u02da"+
- "\7t\2\2\u02da\u02db\7q\2\2\u02db\u02dd\7t\2\2\u02dc\u01fe\3\2\2\2\u02dc"+
- "\u0201\3\2\2\2\u02dc\u0204\3\2\2\2\u02dc\u0207\3\2\2\2\u02dc\u020a\3\2"+
- "\2\2\u02dc\u020d\3\2\2\2\u02dc\u0210\3\2\2\2\u02dc\u0213\3\2\2\2\u02dc"+
- "\u0216\3\2\2\2\u02dc\u0219\3\2\2\2\u02dc\u021c\3\2\2\2\u02dc\u021f\3\2"+
- "\2\2\u02dc\u0222\3\2\2\2\u02dc\u0225\3\2\2\2\u02dc\u0228\3\2\2\2\u02dc"+
- "\u022b\3\2\2\2\u02dc\u022e\3\2\2\2\u02dc\u0231\3\2\2\2\u02dc\u0234\3\2"+
- "\2\2\u02dc\u0237\3\2\2\2\u02dc\u023a\3\2\2\2\u02dc\u023d\3\2\2\2\u02dc"+
- "\u0240\3\2\2\2\u02dc\u0243\3\2\2\2\u02dc\u0246\3\2\2\2\u02dc\u0249\3\2"+
- "\2\2\u02dc\u024c\3\2\2\2\u02dc\u024f\3\2\2\2\u02dc\u0252\3\2\2\2\u02dc"+
- "\u0255\3\2\2\2\u02dc\u0258\3\2\2\2\u02dc\u025b\3\2\2\2\u02dc\u025e\3\2"+
- "\2\2\u02dc\u0261\3\2\2\2\u02dc\u0264\3\2\2\2\u02dc\u0267\3\2\2\2\u02dc"+
- "\u026a\3\2\2\2\u02dc\u026d\3\2\2\2\u02dc\u0270\3\2\2\2\u02dc\u0273\3\2"+
- "\2\2\u02dc\u0276\3\2\2\2\u02dc\u0279\3\2\2\2\u02dc\u027c\3\2\2\2\u02dc"+
- "\u027f\3\2\2\2\u02dc\u0282\3\2\2\2\u02dc\u0285\3\2\2\2\u02dc\u0288\3\2"+
- "\2\2\u02dc\u028b\3\2\2\2\u02dc\u028e\3\2\2\2\u02dc\u0291\3\2\2\2\u02dc"+
- "\u0294\3\2\2\2\u02dc\u0297\3\2\2\2\u02dc\u029a\3\2\2\2\u02dc\u029d\3\2"+
- "\2\2\u02dc\u02a0\3\2\2\2\u02dc\u02a3\3\2\2\2\u02dc\u02a6\3\2\2\2\u02dc"+
- "\u02a9\3\2\2\2\u02dc\u02ac\3\2\2\2\u02dc\u02af\3\2\2\2\u02dc\u02b2\3\2"+
- "\2\2\u02dc\u02b5\3\2\2\2\u02dc\u02b8\3\2\2\2\u02dc\u02bb\3\2\2\2\u02dc"+
- "\u02be\3\2\2\2\u02dc\u02c1\3\2\2\2\u02dc\u02c4\3\2\2\2\u02dc\u02c7\3\2"+
- "\2\2\u02dc\u02ca\3\2\2\2\u02dc\u02cd\3\2\2\2\u02dc\u02d0\3\2\2\2\u02dc"+
- "\u02d3\3\2\2\2\u02dc\u02d6\3\2\2\2\u02dc\u02d9\3\2\2\2\u02dd\u009a\3\2"+
- "\2\2\u02de\u02df\7}\2\2\u02df\u02e0\7}\2\2\u02e0\u02e4\3\2\2\2\u02e1\u02e3"+
- "\13\2\2\2\u02e2\u02e1\3\2\2\2\u02e3\u02e6\3\2\2\2\u02e4\u02e5\3\2\2\2"+
- "\u02e4\u02e2\3\2\2\2\u02e5\u02e7\3\2\2\2\u02e6\u02e4\3\2\2\2\u02e7\u02e8"+
- "\7\177\2\2\u02e8\u02e9\7\177\2\2\u02e9\u009c\3\2\2\2\u02ea\u02eb\7d\2"+
- "\2\u02eb\u02ec\7{\2\2\u02ec\u02ed\7v\2\2\u02ed\u0310\7g\2\2\u02ee\u02ef"+
- "\7y\2\2\u02ef\u02f0\7q\2\2\u02f0\u02f1\7t\2\2\u02f1\u0310\7f\2\2\u02f2"+
- "\u02f3\7f\2\2\u02f3\u02f4\7y\2\2\u02f4\u02f5\7q\2\2\u02f5\u02f6\7t\2\2"+
- "\u02f6\u0310\7f\2\2\u02f7\u02f8\7d\2\2\u02f8\u02f9\7q\2\2\u02f9\u02fa"+
- "\7q\2\2\u02fa\u0310\7n\2\2\u02fb\u02fc\7e\2\2\u02fc\u02fd\7j\2\2\u02fd"+
- "\u02fe\7c\2\2\u02fe\u0310\7t\2\2\u02ff\u0300\7u\2\2\u0300\u0301\7j\2\2"+
- "\u0301\u0302\7q\2\2\u0302\u0303\7t\2\2\u0303\u0310\7v\2\2\u0304\u0305"+
- "\7k\2\2\u0305\u0306\7p\2\2\u0306\u0310\7v\2\2\u0307\u0308\7n\2\2\u0308"+
- "\u0309\7q\2\2\u0309\u030a\7p\2\2\u030a\u0310\7i\2\2\u030b\u030c\7x\2\2"+
- "\u030c\u030d\7q\2\2\u030d\u030e\7k\2\2\u030e\u0310\7f\2\2\u030f\u02ea"+
- "\3\2\2\2\u030f\u02ee\3\2\2\2\u030f\u02f2\3\2\2\2\u030f\u02f7\3\2\2\2\u030f"+
- "\u02fb\3\2\2\2\u030f\u02ff\3\2\2\2\u030f\u0304\3\2\2\2\u030f\u0307\3\2"+
- "\2\2\u030f\u030b\3\2\2\2\u0310\u009e\3\2\2\2\u0311\u0317\7$\2\2\u0312"+
- "\u0313\7^\2\2\u0313\u0316\7$\2\2\u0314\u0316\n\2\2\2\u0315\u0312\3\2\2"+
- "\2\u0315\u0314\3\2\2\2\u0316\u0319\3\2\2\2\u0317\u0315\3\2\2\2\u0317\u0318"+
- "\3\2\2\2\u0318\u031a\3\2\2\2\u0319\u0317\3\2\2\2\u031a\u031c\7$\2\2\u031b"+
- "\u031d\7|\2\2\u031c\u031b\3\2\2\2\u031c\u031d\3\2\2\2\u031d\u00a0\3\2"+
- "\2\2\u031e\u0322\7)\2\2\u031f\u0320\7^\2\2\u0320\u0323\7)\2\2\u0321\u0323"+
- "\n\3\2\2\u0322\u031f\3\2\2\2\u0322\u0321\3\2\2\2\u0323\u0324\3\2\2\2\u0324"+
- "\u0325\7)\2\2\u0325\u00a2\3\2\2\2\u0326\u0327\7v\2\2\u0327\u0328\7t\2"+
- "\2\u0328\u0329\7w\2\2\u0329\u0330\7g\2\2\u032a\u032b\7h\2\2\u032b\u032c"+
- "\7c\2\2\u032c\u032d\7n\2\2\u032d\u032e\7u\2\2\u032e\u0330\7g\2\2\u032f"+
- "\u0326\3\2\2\2\u032f\u032a\3\2\2\2\u0330\u00a4\3\2\2\2\u0331\u0334\5\u00a7"+
- "T\2\u0332\u0334\5\u00afX\2\u0333\u0331\3\2\2\2\u0333\u0332\3\2\2\2\u0334"+
- "\u00a6\3\2\2\2\u0335\u0339\5\u00a9U\2\u0336\u0339\5\u00abV\2\u0337\u0339"+
- "\5\u00adW\2\u0338\u0335\3\2\2\2\u0338\u0336\3\2\2\2\u0338\u0337\3\2\2"+
- "\2\u0339\u00a8\3\2\2\2\u033a\u0340\7\'\2\2\u033b\u033c\7\62\2\2\u033c"+
- "\u0340\7d\2\2\u033d\u033e\7\62\2\2\u033e\u0340\7D\2\2\u033f\u033a\3\2"+
- "\2\2\u033f\u033b\3\2\2\2\u033f\u033d\3\2\2\2\u0340\u0344\3\2\2\2\u0341"+
- "\u0343\5\u00b7\\\2\u0342\u0341\3\2\2\2\u0343\u0346\3\2\2\2\u0344\u0342"+
- "\3\2\2\2\u0344\u0345\3\2\2\2\u0345\u0347\3\2\2\2\u0346\u0344\3\2\2\2\u0347"+
- "\u0349\7\60\2\2\u0348\u034a\5\u00b7\\\2\u0349\u0348\3\2\2\2\u034a\u034b"+
- "\3\2\2\2\u034b\u0349\3\2\2\2\u034b\u034c\3\2\2\2\u034c\u00aa\3\2\2\2\u034d"+
- "\u034f\5\u00b9]\2\u034e\u034d\3\2\2\2\u034f\u0352\3\2\2\2\u0350\u034e"+
- "\3\2\2\2\u0350\u0351\3\2\2\2\u0351\u0353\3\2\2\2\u0352\u0350\3\2\2\2\u0353"+
- "\u0355\7\60\2\2\u0354\u0356\5\u00b9]\2\u0355\u0354\3\2\2\2\u0356\u0357"+
- "\3\2\2\2\u0357\u0355\3\2\2\2\u0357\u0358\3\2\2\2\u0358\u00ac\3\2\2\2\u0359"+
- "\u035f\7&\2\2\u035a\u035b\7\62\2\2\u035b\u035f\7z\2\2\u035c\u035d\7\62"+
- "\2\2\u035d\u035f\7Z\2\2\u035e\u0359\3\2\2\2\u035e\u035a\3\2\2\2\u035e"+
- "\u035c\3\2\2\2\u035f\u0363\3\2\2\2\u0360\u0362\5\u00bb^\2\u0361\u0360"+
- "\3\2\2\2\u0362\u0365\3\2\2\2\u0363\u0361\3\2\2\2\u0363\u0364\3\2\2\2\u0364"+
- "\u0366\3\2\2\2\u0365\u0363\3\2\2\2\u0366\u0368\7\60\2\2\u0367\u0369\5"+
- "\u00bb^\2\u0368\u0367\3\2\2\2\u0369\u036a\3\2\2\2\u036a\u0368\3\2\2\2"+
- "\u036a\u036b\3\2\2\2\u036b\u00ae\3\2\2\2\u036c\u0370\5\u00b3Z\2\u036d"+
- "\u0370\5\u00b5[\2\u036e\u0370\5\u00b1Y\2\u036f\u036c\3\2\2\2\u036f\u036d"+
- "\3\2\2\2\u036f\u036e\3\2\2\2\u0370\u00b0\3\2\2\2\u0371\u0372\7\62\2\2"+
- "\u0372\u0374\t\4\2\2\u0373\u0375\5\u00b7\\\2\u0374\u0373\3\2\2\2\u0375"+
- "\u0376\3\2\2\2\u0376\u0374\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u037f\3\2"+
- "\2\2\u0378\u037a\7\'\2\2\u0379\u037b\5\u00b7\\\2\u037a\u0379\3\2\2\2\u037b"+
- "\u037c\3\2\2\2\u037c\u037a\3\2\2\2\u037c\u037d\3\2\2\2\u037d\u037f\3\2"+
- "\2\2\u037e\u0371\3\2\2\2\u037e\u0378\3\2\2\2\u037f\u00b2\3\2\2\2\u0380"+
- "\u0382\5\u00b9]\2\u0381\u0380\3\2\2\2\u0382\u0383\3\2\2\2\u0383\u0381"+
- "\3\2\2\2\u0383\u0384\3\2\2\2\u0384\u00b4\3\2\2\2\u0385\u038b\7&\2\2\u0386"+
- "\u0387\7\62\2\2\u0387\u038b\7z\2\2\u0388\u0389\7\62\2\2\u0389\u038b\7"+
- "Z\2\2\u038a\u0385\3\2\2\2\u038a\u0386\3\2\2\2\u038a\u0388\3\2\2\2\u038b"+
- "\u038d\3\2\2\2\u038c\u038e\5\u00bb^\2\u038d\u038c\3\2\2\2\u038e\u038f"+
- "\3\2\2\2\u038f\u038d\3\2\2\2\u038f\u0390\3\2\2\2\u0390\u00b6\3\2\2\2\u0391"+
- "\u0392\t\5\2\2\u0392\u00b8\3\2\2\2\u0393\u0394\t\6\2\2\u0394\u00ba\3\2"+
- "\2\2\u0395\u0396\t\7\2\2\u0396\u00bc\3\2\2\2\u0397\u039b\5\u00bf`\2\u0398"+
- "\u039a\5\u00c1a\2\u0399\u0398\3\2\2\2\u039a\u039d\3\2\2\2\u039b\u0399"+
- "\3\2\2\2\u039b\u039c\3\2\2\2\u039c\u00be\3\2\2\2\u039d\u039b\3\2\2\2\u039e"+
- "\u039f\t\b\2\2\u039f\u00c0\3\2\2\2\u03a0\u03a1\t\t\2\2\u03a1\u00c2\3\2"+
- "\2\2\u03a2\u03a6\7#\2\2\u03a3\u03a5\5\u00c1a\2\u03a4\u03a3\3\2\2\2\u03a5"+
- "\u03a8\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a6\u03a7\3\2\2\2\u03a7\u03aa\3\2"+
- "\2\2\u03a8\u03a6\3\2\2\2\u03a9\u03ab\t\n\2\2\u03aa\u03a9\3\2\2\2\u03ab"+
- "\u03ac\3\2\2\2\u03ac\u03aa\3\2\2\2\u03ac\u03ad\3\2\2\2\u03ad\u00c4\3\2"+
- "\2\2\u03ae\u03b0\t\13\2\2\u03af\u03ae\3\2\2\2\u03b0\u03b1\3\2\2\2\u03b1"+
- "\u03af\3\2\2\2\u03b1\u03b2\3\2\2\2\u03b2\u03b3\3\2\2\2\u03b3\u03b4\bc"+
- "\2\2\u03b4\u00c6\3\2\2\2\u03b5\u03b6\7\61\2\2\u03b6\u03b7\7\61\2\2\u03b7"+
- "\u03bb\3\2\2\2\u03b8\u03ba\n\f\2\2\u03b9\u03b8\3\2\2\2\u03ba\u03bd\3\2"+
- "\2\2\u03bb\u03b9\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03be\3\2\2\2\u03bd"+
- "\u03bb\3\2\2\2\u03be\u03bf\bd\3\2\u03bf\u00c8\3\2\2\2\u03c0\u03c1\7\61"+
- "\2\2\u03c1\u03c2\7,\2\2\u03c2\u03c6\3\2\2\2\u03c3\u03c5\13\2\2\2\u03c4"+
- "\u03c3\3\2\2\2\u03c5\u03c8\3\2\2\2\u03c6\u03c7\3\2\2\2\u03c6\u03c4\3\2"+
- "\2\2\u03c7\u03c9\3\2\2\2\u03c8\u03c6\3\2\2\2\u03c9\u03ca\7,\2\2\u03ca"+
- "\u03cb\7\61\2\2\u03cb\u03cc\3\2\2\2\u03cc\u03cd\be\3\2\u03cd\u00ca\3\2"+
- "\2\2\"\2\u02dc\u02e4\u030f\u0315\u0317\u031c\u0322\u032f\u0333\u0338\u033f"+
- "\u0344\u034b\u0350\u0357\u035e\u0363\u036a\u036f\u0376\u037c\u037e\u0383"+
- "\u038a\u038f\u039b\u03a6\u03ac\u03b1\u03bb\u03c6\4\2\3\2\2\4\2";
+ "`\t`\4a\ta\4b\tb\4c\tc\4d\td\4e\te\4f\tf\3\2\3\2\3\2\3\2\3\2\3\2\3\2\3"+
+ "\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\7\3\7\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n"+
+ "\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3"+
+ "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+
+ "\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20"+
+ "\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\22"+
+ "\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25"+
+ "\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30"+
+ "\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31\3\31"+
+ "\3\32\3\32\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\35"+
+ "\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3 \3"+
+ " \3!\3!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3#\3$\3$\3$\3%\3"+
+ "%\3%\3&\3&\3\'\3\'\3(\3(\3)\3)\3*\3*\3+\3+\3+\3,\3,\3,\3-\3-\3.\3.\3/"+
+ "\3/\3\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\3\67\38\38\38\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@\3A\3A\3A\3B\3B\3"+
+ "B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3E\3E\3F\3F\3"+
+ "F\3F\3F\3G\3G\3G\3G\3G\3G\3G\3G\3G\3H\3H\3H\3H\3H\3H\3I\3I\3I\3I\3I\3"+
+ "I\3I\3J\3J\3J\3K\3K\3K\3K\3K\3K\3L\3L\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+
+ "N\3N\3N\3N\3N\3N\3N\5N\u02e6\nN\3O\3O\3O\3O\7O\u02ec\nO\fO\16O\u02ef\13"+
+ "O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3"+
+ "P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\3P\5P\u0319\nP\3Q\3"+
+ "Q\3Q\3Q\7Q\u031f\nQ\fQ\16Q\u0322\13Q\3Q\3Q\5Q\u0326\nQ\3R\3R\3R\3R\5R"+
+ "\u032c\nR\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S\u0339\nS\3T\3T\5T\u033d"+
+ "\nT\3U\3U\3U\5U\u0342\nU\3V\3V\3V\3V\3V\5V\u0349\nV\3V\7V\u034c\nV\fV"+
+ "\16V\u034f\13V\3V\3V\6V\u0353\nV\rV\16V\u0354\3W\7W\u0358\nW\fW\16W\u035b"+
+ "\13W\3W\3W\6W\u035f\nW\rW\16W\u0360\3X\3X\3X\3X\3X\5X\u0368\nX\3X\7X\u036b"+
+ "\nX\fX\16X\u036e\13X\3X\3X\6X\u0372\nX\rX\16X\u0373\3Y\3Y\3Y\5Y\u0379"+
+ "\nY\3Z\3Z\3Z\6Z\u037e\nZ\rZ\16Z\u037f\3Z\3Z\6Z\u0384\nZ\rZ\16Z\u0385\5"+
+ "Z\u0388\nZ\3[\6[\u038b\n[\r[\16[\u038c\3\\\3\\\3\\\3\\\3\\\5\\\u0394\n"+
+ "\\\3\\\6\\\u0397\n\\\r\\\16\\\u0398\3]\3]\3^\3^\3_\3_\3`\3`\7`\u03a3\n"+
+ "`\f`\16`\u03a6\13`\3a\3a\3b\3b\3c\3c\7c\u03ae\nc\fc\16c\u03b1\13c\3c\6"+
+ "c\u03b4\nc\rc\16c\u03b5\3d\6d\u03b9\nd\rd\16d\u03ba\3d\3d\3e\3e\3e\3e"+
+ "\7e\u03c3\ne\fe\16e\u03c6\13e\3e\3e\3f\3f\3f\3f\7f\u03ce\nf\ff\16f\u03d1"+
+ "\13f\3f\3f\3f\3f\3f\4\u02ed\u03cf\2g\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\u0083"+
+ "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+
+ "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+
+ "W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9\2\u00bb\2\u00bd\2\u00bf"+
+ "^\u00c1\2\u00c3\2\u00c5_\u00c7`\u00c9a\u00cbb\3\2\r\3\2$$\3\2))\4\2DD"+
+ "dd\3\2\62\63\3\2\62;\5\2\62;CHch\5\2C\\aac|\6\2\62;C\\aac|\4\2--//\6\2"+
+ "\13\f\17\17\"\"\u00a2\u00a2\4\2\f\f\17\17\2\u0444\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\2"+
+ "Y\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\u00bf\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\3\u00cd\3\2\2\2\5\u00d4\3\2\2"+
+ "\2\7\u00d6\3\2\2\2\t\u00d8\3\2\2\2\13\u00da\3\2\2\2\r\u00dc\3\2\2\2\17"+
+ "\u00de\3\2\2\2\21\u00e0\3\2\2\2\23\u00e2\3\2\2\2\25\u00e8\3\2\2\2\27\u00ef"+
+ "\3\2\2\2\31\u00f5\3\2\2\2\33\u00fe\3\2\2\2\35\u0105\3\2\2\2\37\u010e\3"+
+ "\2\2\2!\u0118\3\2\2\2#\u0120\3\2\2\2%\u0123\3\2\2\2\'\u0128\3\2\2\2)\u012e"+
+ "\3\2\2\2+\u0131\3\2\2\2-\u0135\3\2\2\2/\u013c\3\2\2\2\61\u0142\3\2\2\2"+
+ "\63\u014b\3\2\2\2\65\u014f\3\2\2\2\67\u0151\3\2\2\29\u0154\3\2\2\2;\u015b"+
+ "\3\2\2\2=\u0164\3\2\2\2?\u0166\3\2\2\2A\u0168\3\2\2\2C\u016a\3\2\2\2E"+
+ "\u0171\3\2\2\2G\u0178\3\2\2\2I\u017b\3\2\2\2K\u017e\3\2\2\2M\u0180\3\2"+
+ "\2\2O\u0182\3\2\2\2Q\u0184\3\2\2\2S\u0186\3\2\2\2U\u0188\3\2\2\2W\u018b"+
+ "\3\2\2\2Y\u018e\3\2\2\2[\u0190\3\2\2\2]\u0192\3\2\2\2_\u0194\3\2\2\2a"+
+ "\u0196\3\2\2\2c\u0199\3\2\2\2e\u019c\3\2\2\2g\u019f\3\2\2\2i\u01a2\3\2"+
+ "\2\2k\u01a4\3\2\2\2m\u01a6\3\2\2\2o\u01a9\3\2\2\2q\u01ac\3\2\2\2s\u01ae"+
+ "\3\2\2\2u\u01b1\3\2\2\2w\u01b4\3\2\2\2y\u01b7\3\2\2\2{\u01ba\3\2\2\2}"+
+ "\u01bd\3\2\2\2\177\u01c1\3\2\2\2\u0081\u01c5\3\2\2\2\u0083\u01c8\3\2\2"+
+ "\2\u0085\u01cb\3\2\2\2\u0087\u01ce\3\2\2\2\u0089\u01d6\3\2\2\2\u008b\u01df"+
+ "\3\2\2\2\u008d\u01e4\3\2\2\2\u008f\u01ed\3\2\2\2\u0091\u01f3\3\2\2\2\u0093"+
+ "\u01fa\3\2\2\2\u0095\u01fd\3\2\2\2\u0097\u0203\3\2\2\2\u0099\u0205\3\2"+
+ "\2\2\u009b\u02e5\3\2\2\2\u009d\u02e7\3\2\2\2\u009f\u0318\3\2\2\2\u00a1"+
+ "\u031a\3\2\2\2\u00a3\u0327\3\2\2\2\u00a5\u0338\3\2\2\2\u00a7\u033c\3\2"+
+ "\2\2\u00a9\u0341\3\2\2\2\u00ab\u0348\3\2\2\2\u00ad\u0359\3\2\2\2\u00af"+
+ "\u0367\3\2\2\2\u00b1\u0378\3\2\2\2\u00b3\u0387\3\2\2\2\u00b5\u038a\3\2"+
+ "\2\2\u00b7\u0393\3\2\2\2\u00b9\u039a\3\2\2\2\u00bb\u039c\3\2\2\2\u00bd"+
+ "\u039e\3\2\2\2\u00bf\u03a0\3\2\2\2\u00c1\u03a7\3\2\2\2\u00c3\u03a9\3\2"+
+ "\2\2\u00c5\u03ab\3\2\2\2\u00c7\u03b8\3\2\2\2\u00c9\u03be\3\2\2\2\u00cb"+
+ "\u03c9\3\2\2\2\u00cd\u00ce\7k\2\2\u00ce\u00cf\7o\2\2\u00cf\u00d0\7r\2"+
+ "\2\u00d0\u00d1\7q\2\2\u00d1\u00d2\7t\2\2\u00d2\u00d3\7v\2\2\u00d3\4\3"+
+ "\2\2\2\u00d4\u00d5\7=\2\2\u00d5\6\3\2\2\2\u00d6\u00d7\7.\2\2\u00d7\b\3"+
+ "\2\2\2\u00d8\u00d9\7?\2\2\u00d9\n\3\2\2\2\u00da\u00db\7*\2\2\u00db\f\3"+
+ "\2\2\2\u00dc\u00dd\7+\2\2\u00dd\16\3\2\2\2\u00de\u00df\7}\2\2\u00df\20"+
+ "\3\2\2\2\u00e0\u00e1\7\177\2\2\u00e1\22\3\2\2\2\u00e2\u00e3\7e\2\2\u00e3"+
+ "\u00e4\7q\2\2\u00e4\u00e5\7p\2\2\u00e5\u00e6\7u\2\2\u00e6\u00e7\7v\2\2"+
+ "\u00e7\24\3\2\2\2\u00e8\u00e9\7g\2\2\u00e9\u00ea\7z\2\2\u00ea\u00eb\7"+
+ "v\2\2\u00eb\u00ec\7g\2\2\u00ec\u00ed\7t\2\2\u00ed\u00ee\7p\2\2\u00ee\26"+
+ "\3\2\2\2\u00ef\u00f0\7c\2\2\u00f0\u00f1\7n\2\2\u00f1\u00f2\7k\2\2\u00f2"+
+ "\u00f3\7i\2\2\u00f3\u00f4\7p\2\2\u00f4\30\3\2\2\2\u00f5\u00f6\7t\2\2\u00f6"+
+ "\u00f7\7g\2\2\u00f7\u00f8\7i\2\2\u00f8\u00f9\7k\2\2\u00f9\u00fa\7u\2\2"+
+ "\u00fa\u00fb\7v\2\2\u00fb\u00fc\7g\2\2\u00fc\u00fd\7t\2\2\u00fd\32\3\2"+
+ "\2\2\u00fe\u00ff\7k\2\2\u00ff\u0100\7p\2\2\u0100\u0101\7n\2\2\u0101\u0102"+
+ "\7k\2\2\u0102\u0103\7p\2\2\u0103\u0104\7g\2\2\u0104\34\3\2\2\2\u0105\u0106"+
+ "\7x\2\2\u0106\u0107\7q\2\2\u0107\u0108\7n\2\2\u0108\u0109\7c\2\2\u0109"+
+ "\u010a\7v\2\2\u010a\u010b\7k\2\2\u010b\u010c\7n\2\2\u010c\u010d\7g\2\2"+
+ "\u010d\36\3\2\2\2\u010e\u010f\7k\2\2\u010f\u0110\7p\2\2\u0110\u0111\7"+
+ "v\2\2\u0111\u0112\7g\2\2\u0112\u0113\7t\2\2\u0113\u0114\7t\2\2\u0114\u0115"+
+ "\7w\2\2\u0115\u0116\7r\2\2\u0116\u0117\7v\2\2\u0117 \3\2\2\2\u0118\u0119"+
+ "\7t\2\2\u0119\u011a\7g\2\2\u011a\u011b\7u\2\2\u011b\u011c\7g\2\2\u011c"+
+ "\u011d\7t\2\2\u011d\u011e\7x\2\2\u011e\u011f\7g\2\2\u011f\"\3\2\2\2\u0120"+
+ "\u0121\7k\2\2\u0121\u0122\7h\2\2\u0122$\3\2\2\2\u0123\u0124\7g\2\2\u0124"+
+ "\u0125\7n\2\2\u0125\u0126\7u\2\2\u0126\u0127\7g\2\2\u0127&\3\2\2\2\u0128"+
+ "\u0129\7y\2\2\u0129\u012a\7j\2\2\u012a\u012b\7k\2\2\u012b\u012c\7n\2\2"+
+ "\u012c\u012d\7g\2\2\u012d(\3\2\2\2\u012e\u012f\7f\2\2\u012f\u0130\7q\2"+
+ "\2\u0130*\3\2\2\2\u0131\u0132\7h\2\2\u0132\u0133\7q\2\2\u0133\u0134\7"+
+ "t\2\2\u0134,\3\2\2\2\u0135\u0136\7t\2\2\u0136\u0137\7g\2\2\u0137\u0138"+
+ "\7v\2\2\u0138\u0139\7w\2\2\u0139\u013a\7t\2\2\u013a\u013b\7p\2\2\u013b"+
+ ".\3\2\2\2\u013c\u013d\7d\2\2\u013d\u013e\7t\2\2\u013e\u013f\7g\2\2\u013f"+
+ "\u0140\7c\2\2\u0140\u0141\7m\2\2\u0141\60\3\2\2\2\u0142\u0143\7e\2\2\u0143"+
+ "\u0144\7q\2\2\u0144\u0145\7p\2\2\u0145\u0146\7v\2\2\u0146\u0147\7k\2\2"+
+ "\u0147\u0148\7p\2\2\u0148\u0149\7w\2\2\u0149\u014a\7g\2\2\u014a\62\3\2"+
+ "\2\2\u014b\u014c\7c\2\2\u014c\u014d\7u\2\2\u014d\u014e\7o\2\2\u014e\64"+
+ "\3\2\2\2\u014f\u0150\7<\2\2\u0150\66\3\2\2\2\u0151\u0152\7\60\2\2\u0152"+
+ "\u0153\7\60\2\2\u01538\3\2\2\2\u0154\u0155\7u\2\2\u0155\u0156\7k\2\2\u0156"+
+ "\u0157\7i\2\2\u0157\u0158\7p\2\2\u0158\u0159\7g\2\2\u0159\u015a\7f\2\2"+
+ "\u015a:\3\2\2\2\u015b\u015c\7w\2\2\u015c\u015d\7p\2\2\u015d\u015e\7u\2"+
+ "\2\u015e\u015f\7k\2\2\u015f\u0160\7i\2\2\u0160\u0161\7p\2\2\u0161\u0162"+
+ "\7g\2\2\u0162\u0163\7f\2\2\u0163<\3\2\2\2\u0164\u0165\7,\2\2\u0165>\3"+
+ "\2\2\2\u0166\u0167\7]\2\2\u0167@\3\2\2\2\u0168\u0169\7_\2\2\u0169B\3\2"+
+ "\2\2\u016a\u016b\7u\2\2\u016b\u016c\7k\2\2\u016c\u016d\7|\2\2\u016d\u016e"+
+ "\7g\2\2\u016e\u016f\7q\2\2\u016f\u0170\7h\2\2\u0170D\3\2\2\2\u0171\u0172"+
+ "\7v\2\2\u0172\u0173\7{\2\2\u0173\u0174\7r\2\2\u0174\u0175\7g\2\2\u0175"+
+ "\u0176\7k\2\2\u0176\u0177\7f\2\2\u0177F\3\2\2\2\u0178\u0179\7/\2\2\u0179"+
+ "\u017a\7/\2\2\u017aH\3\2\2\2\u017b\u017c\7-\2\2\u017c\u017d\7-\2\2\u017d"+
+ "J\3\2\2\2\u017e\u017f\7-\2\2\u017fL\3\2\2\2\u0180\u0181\7/\2\2\u0181N"+
+ "\3\2\2\2\u0182\u0183\7#\2\2\u0183P\3\2\2\2\u0184\u0185\7(\2\2\u0185R\3"+
+ "\2\2\2\u0186\u0187\7\u0080\2\2\u0187T\3\2\2\2\u0188\u0189\7@\2\2\u0189"+
+ "\u018a\7@\2\2\u018aV\3\2\2\2\u018b\u018c\7>\2\2\u018c\u018d\7>\2\2\u018d"+
+ "X\3\2\2\2\u018e\u018f\7\61\2\2\u018fZ\3\2\2\2\u0190\u0191\7\'\2\2\u0191"+
+ "\\\3\2\2\2\u0192\u0193\7>\2\2\u0193^\3\2\2\2\u0194\u0195\7@\2\2\u0195"+
+ "`\3\2\2\2\u0196\u0197\7?\2\2\u0197\u0198\7?\2\2\u0198b\3\2\2\2\u0199\u019a"+
+ "\7#\2\2\u019a\u019b\7?\2\2\u019bd\3\2\2\2\u019c\u019d\7>\2\2\u019d\u019e"+
+ "\7?\2\2\u019ef\3\2\2\2\u019f\u01a0\7@\2\2\u01a0\u01a1\7?\2\2\u01a1h\3"+
+ "\2\2\2\u01a2\u01a3\7`\2\2\u01a3j\3\2\2\2\u01a4\u01a5\7~\2\2\u01a5l\3\2"+
+ "\2\2\u01a6\u01a7\7(\2\2\u01a7\u01a8\7(\2\2\u01a8n\3\2\2\2\u01a9\u01aa"+
+ "\7~\2\2\u01aa\u01ab\7~\2\2\u01abp\3\2\2\2\u01ac\u01ad\7A\2\2\u01adr\3"+
+ "\2\2\2\u01ae\u01af\7-\2\2\u01af\u01b0\7?\2\2\u01b0t\3\2\2\2\u01b1\u01b2"+
+ "\7/\2\2\u01b2\u01b3\7?\2\2\u01b3v\3\2\2\2\u01b4\u01b5\7,\2\2\u01b5\u01b6"+
+ "\7?\2\2\u01b6x\3\2\2\2\u01b7\u01b8\7\61\2\2\u01b8\u01b9\7?\2\2\u01b9z"+
+ "\3\2\2\2\u01ba\u01bb\7\'\2\2\u01bb\u01bc\7?\2\2\u01bc|\3\2\2\2\u01bd\u01be"+
+ "\7>\2\2\u01be\u01bf\7>\2\2\u01bf\u01c0\7?\2\2\u01c0~\3\2\2\2\u01c1\u01c2"+
+ "\7@\2\2\u01c2\u01c3\7@\2\2\u01c3\u01c4\7?\2\2\u01c4\u0080\3\2\2\2\u01c5"+
+ "\u01c6\7(\2\2\u01c6\u01c7\7?\2\2\u01c7\u0082\3\2\2\2\u01c8\u01c9\7~\2"+
+ "\2\u01c9\u01ca\7?\2\2\u01ca\u0084\3\2\2\2\u01cb\u01cc\7`\2\2\u01cc\u01cd"+
+ "\7?\2\2\u01cd\u0086\3\2\2\2\u01ce\u01cf\7m\2\2\u01cf\u01d0\7k\2\2\u01d0"+
+ "\u01d1\7e\2\2\u01d1\u01d2\7m\2\2\u01d2\u01d3\7c\2\2\u01d3\u01d4\7u\2\2"+
+ "\u01d4\u01d5\7o\2\2\u01d5\u0088\3\2\2\2\u01d6\u01d7\7t\2\2\u01d7\u01d8"+
+ "\7g\2\2\u01d8\u01d9\7u\2\2\u01d9\u01da\7q\2\2\u01da\u01db\7w\2\2\u01db"+
+ "\u01dc\7t\2\2\u01dc\u01dd\7e\2\2\u01dd\u01de\7g\2\2\u01de\u008a\3\2\2"+
+ "\2\u01df\u01e0\7w\2\2\u01e0\u01e1\7u\2\2\u01e1\u01e2\7g\2\2\u01e2\u01e3"+
+ "\7u\2\2\u01e3\u008c\3\2\2\2\u01e4\u01e5\7e\2\2\u01e5\u01e6\7n\2\2\u01e6"+
+ "\u01e7\7q\2\2\u01e7\u01e8\7d\2\2\u01e8\u01e9\7d\2\2\u01e9\u01ea\7g\2\2"+
+ "\u01ea\u01eb\7t\2\2\u01eb\u01ec\7u\2\2\u01ec\u008e\3\2\2\2\u01ed\u01ee"+
+ "\7d\2\2\u01ee\u01ef\7{\2\2\u01ef\u01f0\7v\2\2\u01f0\u01f1\7g\2\2\u01f1"+
+ "\u01f2\7u\2\2\u01f2\u0090\3\2\2\2\u01f3\u01f4\7e\2\2\u01f4\u01f5\7{\2"+
+ "\2\u01f5\u01f6\7e\2\2\u01f6\u01f7\7n\2\2\u01f7\u01f8\7g\2\2\u01f8\u01f9"+
+ "\7u\2\2\u01f9\u0092\3\2\2\2\u01fa\u01fb\7r\2\2\u01fb\u01fc\7e\2\2\u01fc"+
+ "\u0094\3\2\2\2\u01fd\u01fe\7\60\2\2\u01fe\u01ff\7d\2\2\u01ff\u0200\7{"+
+ "\2\2\u0200\u0201\7v\2\2\u0201\u0202\7g\2\2\u0202\u0096\3\2\2\2\u0203\u0204"+
+ "\7%\2\2\u0204\u0098\3\2\2\2\u0205\u0206\7\60\2\2\u0206\u009a\3\2\2\2\u0207"+
+ "\u0208\7d\2\2\u0208\u0209\7t\2\2\u0209\u02e6\7m\2\2\u020a\u020b\7q\2\2"+
+ "\u020b\u020c\7t\2\2\u020c\u02e6\7c\2\2\u020d\u020e\7m\2\2\u020e\u020f"+
+ "\7k\2\2\u020f\u02e6\7n\2\2\u0210\u0211\7u\2\2\u0211\u0212\7n\2\2\u0212"+
+ "\u02e6\7q\2\2\u0213\u0214\7p\2\2\u0214\u0215\7q\2\2\u0215\u02e6\7r\2\2"+
+ "\u0216\u0217\7c\2\2\u0217\u0218\7u\2\2\u0218\u02e6\7n\2\2\u0219\u021a"+
+ "\7r\2\2\u021a\u021b\7j\2\2\u021b\u02e6\7r\2\2\u021c\u021d\7c\2\2\u021d"+
+ "\u021e\7p\2\2\u021e\u02e6\7e\2\2\u021f\u0220\7d\2\2\u0220\u0221\7r\2\2"+
+ "\u0221\u02e6\7n\2\2\u0222\u0223\7e\2\2\u0223\u0224\7n\2\2\u0224\u02e6"+
+ "\7e\2\2\u0225\u0226\7l\2\2\u0226\u0227\7u\2\2\u0227\u02e6\7t\2\2\u0228"+
+ "\u0229\7c\2\2\u0229\u022a\7p\2\2\u022a\u02e6\7f\2\2\u022b\u022c\7t\2\2"+
+ "\u022c\u022d\7n\2\2\u022d\u02e6\7c\2\2\u022e\u022f\7d\2\2\u022f\u0230"+
+ "\7k\2\2\u0230\u02e6\7v\2\2\u0231\u0232\7t\2\2\u0232\u0233\7q\2\2\u0233"+
+ "\u02e6\7n\2\2\u0234\u0235\7r\2\2\u0235\u0236\7n\2\2\u0236\u02e6\7c\2\2"+
+ "\u0237\u0238\7r\2\2\u0238\u0239\7n\2\2\u0239\u02e6\7r\2\2\u023a\u023b"+
+ "\7d\2\2\u023b\u023c\7o\2\2\u023c\u02e6\7k\2\2\u023d\u023e\7u\2\2\u023e"+
+ "\u023f\7g\2\2\u023f\u02e6\7e\2\2\u0240\u0241\7t\2\2\u0241\u0242\7v\2\2"+
+ "\u0242\u02e6\7k\2\2\u0243\u0244\7g\2\2\u0244\u0245\7q\2\2\u0245\u02e6"+
+ "\7t\2\2\u0246\u0247\7u\2\2\u0247\u0248\7t\2\2\u0248\u02e6\7g\2\2\u0249"+
+ "\u024a\7n\2\2\u024a\u024b\7u\2\2\u024b\u02e6\7t\2\2\u024c\u024d\7r\2\2"+
+ "\u024d\u024e\7j\2\2\u024e\u02e6\7c\2\2\u024f\u0250\7c\2\2\u0250\u0251"+
+ "\7n\2\2\u0251\u02e6\7t\2\2\u0252\u0253\7l\2\2\u0253\u0254\7o\2\2\u0254"+
+ "\u02e6\7r\2\2\u0255\u0256\7d\2\2\u0256\u0257\7x\2\2\u0257\u02e6\7e\2\2"+
+ "\u0258\u0259\7e\2\2\u0259\u025a\7n\2\2\u025a\u02e6\7k\2\2\u025b\u025c"+
+ "\7t\2\2\u025c\u025d\7v\2\2\u025d\u02e6\7u\2\2\u025e\u025f\7c\2\2\u025f"+
+ "\u0260\7f\2\2\u0260\u02e6\7e\2\2\u0261\u0262\7t\2\2\u0262\u0263\7t\2\2"+
+ "\u0263\u02e6\7c\2\2\u0264\u0265\7d\2\2\u0265\u0266\7x\2\2\u0266\u02e6"+
+ "\7u\2\2\u0267\u0268\7u\2\2\u0268\u0269\7g\2\2\u0269\u02e6\7k\2\2\u026a"+
+ "\u026b\7u\2\2\u026b\u026c\7c\2\2\u026c\u02e6\7z\2\2\u026d\u026e\7u\2\2"+
+ "\u026e\u026f\7v\2\2\u026f\u02e6\7{\2\2\u0270\u0271\7u\2\2\u0271\u0272"+
+ "\7v\2\2\u0272\u02e6\7c\2\2\u0273\u0274\7u\2\2\u0274\u0275\7v\2\2\u0275"+
+ "\u02e6\7z\2\2\u0276\u0277\7f\2\2\u0277\u0278\7g\2\2\u0278\u02e6\7{\2\2"+
+ "\u0279\u027a\7v\2\2\u027a\u027b\7z\2\2\u027b\u02e6\7c\2\2\u027c\u027d"+
+ "\7z\2\2\u027d\u027e\7c\2\2\u027e\u02e6\7c\2\2\u027f\u0280\7d\2\2\u0280"+
+ "\u0281\7e\2\2\u0281\u02e6\7e\2\2\u0282\u0283\7c\2\2\u0283\u0284\7j\2\2"+
+ "\u0284\u02e6\7z\2\2\u0285\u0286\7v\2\2\u0286\u0287\7{\2\2\u0287\u02e6"+
+ "\7c\2\2\u0288\u0289\7v\2\2\u0289\u028a\7z\2\2\u028a\u02e6\7u\2\2\u028b"+
+ "\u028c\7v\2\2\u028c\u028d\7c\2\2\u028d\u02e6\7u\2\2\u028e\u028f\7u\2\2"+
+ "\u028f\u0290\7j\2\2\u0290\u02e6\7{\2\2\u0291\u0292\7u\2\2\u0292\u0293"+
+ "\7j\2\2\u0293\u02e6\7z\2\2\u0294\u0295\7n\2\2\u0295\u0296\7f\2\2\u0296"+
+ "\u02e6\7{\2\2\u0297\u0298\7n\2\2\u0298\u0299\7f\2\2\u0299\u02e6\7c\2\2"+
+ "\u029a\u029b\7n\2\2\u029b\u029c\7f\2\2\u029c\u02e6\7z\2\2\u029d\u029e"+
+ "\7n\2\2\u029e\u029f\7c\2\2\u029f\u02e6\7z\2\2\u02a0\u02a1\7v\2\2\u02a1"+
+ "\u02a2\7c\2\2\u02a2\u02e6\7{\2\2\u02a3\u02a4\7v\2\2\u02a4\u02a5\7c\2\2"+
+ "\u02a5\u02e6\7z\2\2\u02a6\u02a7\7d\2\2\u02a7\u02a8\7e\2\2\u02a8\u02e6"+
+ "\7u\2\2\u02a9\u02aa\7e\2\2\u02aa\u02ab\7n\2\2\u02ab\u02e6\7x\2\2\u02ac"+
+ "\u02ad\7v\2\2\u02ad\u02ae\7u\2\2\u02ae\u02e6\7z\2\2\u02af\u02b0\7n\2\2"+
+ "\u02b0\u02b1\7c\2\2\u02b1\u02e6\7u\2\2\u02b2\u02b3\7e\2\2\u02b3\u02b4"+
+ "\7r\2\2\u02b4\u02e6\7{\2\2\u02b5\u02b6\7e\2\2\u02b6\u02b7\7o\2\2\u02b7"+
+ "\u02e6\7r\2\2\u02b8\u02b9\7e\2\2\u02b9\u02ba\7r\2\2\u02ba\u02e6\7z\2\2"+
+ "\u02bb\u02bc\7f\2\2\u02bc\u02bd\7e\2\2\u02bd\u02e6\7r\2\2\u02be\u02bf"+
+ "\7f\2\2\u02bf\u02c0\7g\2\2\u02c0\u02e6\7e\2\2\u02c1\u02c2\7k\2\2\u02c2"+
+ "\u02c3\7p\2\2\u02c3\u02e6\7e\2\2\u02c4\u02c5\7c\2\2\u02c5\u02c6\7z\2\2"+
+ "\u02c6\u02e6\7u\2\2\u02c7\u02c8\7d\2\2\u02c8\u02c9\7p\2\2\u02c9\u02e6"+
+ "\7g\2\2\u02ca\u02cb\7e\2\2\u02cb\u02cc\7n\2\2\u02cc\u02e6\7f\2\2\u02cd"+
+ "\u02ce\7u\2\2\u02ce\u02cf\7d\2\2\u02cf\u02e6\7e\2\2\u02d0\u02d1\7k\2\2"+
+ "\u02d1\u02d2\7u\2\2\u02d2\u02e6\7e\2\2\u02d3\u02d4\7k\2\2\u02d4\u02d5"+
+ "\7p\2\2\u02d5\u02e6\7z\2\2\u02d6\u02d7\7d\2\2\u02d7\u02d8\7g\2\2\u02d8"+
+ "\u02e6\7s\2\2\u02d9\u02da\7u\2\2\u02da\u02db\7g\2\2\u02db\u02e6\7f\2\2"+
+ "\u02dc\u02dd\7f\2\2\u02dd\u02de\7g\2\2\u02de\u02e6\7z\2\2\u02df\u02e0"+
+ "\7k\2\2\u02e0\u02e1\7p\2\2\u02e1\u02e6\7{\2\2\u02e2\u02e3\7t\2\2\u02e3"+
+ "\u02e4\7q\2\2\u02e4\u02e6\7t\2\2\u02e5\u0207\3\2\2\2\u02e5\u020a\3\2\2"+
+ "\2\u02e5\u020d\3\2\2\2\u02e5\u0210\3\2\2\2\u02e5\u0213\3\2\2\2\u02e5\u0216"+
+ "\3\2\2\2\u02e5\u0219\3\2\2\2\u02e5\u021c\3\2\2\2\u02e5\u021f\3\2\2\2\u02e5"+
+ "\u0222\3\2\2\2\u02e5\u0225\3\2\2\2\u02e5\u0228\3\2\2\2\u02e5\u022b\3\2"+
+ "\2\2\u02e5\u022e\3\2\2\2\u02e5\u0231\3\2\2\2\u02e5\u0234\3\2\2\2\u02e5"+
+ "\u0237\3\2\2\2\u02e5\u023a\3\2\2\2\u02e5\u023d\3\2\2\2\u02e5\u0240\3\2"+
+ "\2\2\u02e5\u0243\3\2\2\2\u02e5\u0246\3\2\2\2\u02e5\u0249\3\2\2\2\u02e5"+
+ "\u024c\3\2\2\2\u02e5\u024f\3\2\2\2\u02e5\u0252\3\2\2\2\u02e5\u0255\3\2"+
+ "\2\2\u02e5\u0258\3\2\2\2\u02e5\u025b\3\2\2\2\u02e5\u025e\3\2\2\2\u02e5"+
+ "\u0261\3\2\2\2\u02e5\u0264\3\2\2\2\u02e5\u0267\3\2\2\2\u02e5\u026a\3\2"+
+ "\2\2\u02e5\u026d\3\2\2\2\u02e5\u0270\3\2\2\2\u02e5\u0273\3\2\2\2\u02e5"+
+ "\u0276\3\2\2\2\u02e5\u0279\3\2\2\2\u02e5\u027c\3\2\2\2\u02e5\u027f\3\2"+
+ "\2\2\u02e5\u0282\3\2\2\2\u02e5\u0285\3\2\2\2\u02e5\u0288\3\2\2\2\u02e5"+
+ "\u028b\3\2\2\2\u02e5\u028e\3\2\2\2\u02e5\u0291\3\2\2\2\u02e5\u0294\3\2"+
+ "\2\2\u02e5\u0297\3\2\2\2\u02e5\u029a\3\2\2\2\u02e5\u029d\3\2\2\2\u02e5"+
+ "\u02a0\3\2\2\2\u02e5\u02a3\3\2\2\2\u02e5\u02a6\3\2\2\2\u02e5\u02a9\3\2"+
+ "\2\2\u02e5\u02ac\3\2\2\2\u02e5\u02af\3\2\2\2\u02e5\u02b2\3\2\2\2\u02e5"+
+ "\u02b5\3\2\2\2\u02e5\u02b8\3\2\2\2\u02e5\u02bb\3\2\2\2\u02e5\u02be\3\2"+
+ "\2\2\u02e5\u02c1\3\2\2\2\u02e5\u02c4\3\2\2\2\u02e5\u02c7\3\2\2\2\u02e5"+
+ "\u02ca\3\2\2\2\u02e5\u02cd\3\2\2\2\u02e5\u02d0\3\2\2\2\u02e5\u02d3\3\2"+
+ "\2\2\u02e5\u02d6\3\2\2\2\u02e5\u02d9\3\2\2\2\u02e5\u02dc\3\2\2\2\u02e5"+
+ "\u02df\3\2\2\2\u02e5\u02e2\3\2\2\2\u02e6\u009c\3\2\2\2\u02e7\u02e8\7}"+
+ "\2\2\u02e8\u02e9\7}\2\2\u02e9\u02ed\3\2\2\2\u02ea\u02ec\13\2\2\2\u02eb"+
+ "\u02ea\3\2\2\2\u02ec\u02ef\3\2\2\2\u02ed\u02ee\3\2\2\2\u02ed\u02eb\3\2"+
+ "\2\2\u02ee\u02f0\3\2\2\2\u02ef\u02ed\3\2\2\2\u02f0\u02f1\7\177\2\2\u02f1"+
+ "\u02f2\7\177\2\2\u02f2\u009e\3\2\2\2\u02f3\u02f4\7d\2\2\u02f4\u02f5\7"+
+ "{\2\2\u02f5\u02f6\7v\2\2\u02f6\u0319\7g\2\2\u02f7\u02f8\7y\2\2\u02f8\u02f9"+
+ "\7q\2\2\u02f9\u02fa\7t\2\2\u02fa\u0319\7f\2\2\u02fb\u02fc\7f\2\2\u02fc"+
+ "\u02fd\7y\2\2\u02fd\u02fe\7q\2\2\u02fe\u02ff\7t\2\2\u02ff\u0319\7f\2\2"+
+ "\u0300\u0301\7d\2\2\u0301\u0302\7q\2\2\u0302\u0303\7q\2\2\u0303\u0319"+
+ "\7n\2\2\u0304\u0305\7e\2\2\u0305\u0306\7j\2\2\u0306\u0307\7c\2\2\u0307"+
+ "\u0319\7t\2\2\u0308\u0309\7u\2\2\u0309\u030a\7j\2\2\u030a\u030b\7q\2\2"+
+ "\u030b\u030c\7t\2\2\u030c\u0319\7v\2\2\u030d\u030e\7k\2\2\u030e\u030f"+
+ "\7p\2\2\u030f\u0319\7v\2\2\u0310\u0311\7n\2\2\u0311\u0312\7q\2\2\u0312"+
+ "\u0313\7p\2\2\u0313\u0319\7i\2\2\u0314\u0315\7x\2\2\u0315\u0316\7q\2\2"+
+ "\u0316\u0317\7k\2\2\u0317\u0319\7f\2\2\u0318\u02f3\3\2\2\2\u0318\u02f7"+
+ "\3\2\2\2\u0318\u02fb\3\2\2\2\u0318\u0300\3\2\2\2\u0318\u0304\3\2\2\2\u0318"+
+ "\u0308\3\2\2\2\u0318\u030d\3\2\2\2\u0318\u0310\3\2\2\2\u0318\u0314\3\2"+
+ "\2\2\u0319\u00a0\3\2\2\2\u031a\u0320\7$\2\2\u031b\u031c\7^\2\2\u031c\u031f"+
+ "\7$\2\2\u031d\u031f\n\2\2\2\u031e\u031b\3\2\2\2\u031e\u031d\3\2\2\2\u031f"+
+ "\u0322\3\2\2\2\u0320\u031e\3\2\2\2\u0320\u0321\3\2\2\2\u0321\u0323\3\2"+
+ "\2\2\u0322\u0320\3\2\2\2\u0323\u0325\7$\2\2\u0324\u0326\7|\2\2\u0325\u0324"+
+ "\3\2\2\2\u0325\u0326\3\2\2\2\u0326\u00a2\3\2\2\2\u0327\u032b\7)\2\2\u0328"+
+ "\u0329\7^\2\2\u0329\u032c\7)\2\2\u032a\u032c\n\3\2\2\u032b\u0328\3\2\2"+
+ "\2\u032b\u032a\3\2\2\2\u032c\u032d\3\2\2\2\u032d\u032e\7)\2\2\u032e\u00a4"+
+ "\3\2\2\2\u032f\u0330\7v\2\2\u0330\u0331\7t\2\2\u0331\u0332\7w\2\2\u0332"+
+ "\u0339\7g\2\2\u0333\u0334\7h\2\2\u0334\u0335\7c\2\2\u0335\u0336\7n\2\2"+
+ "\u0336\u0337\7u\2\2\u0337\u0339\7g\2\2\u0338\u032f\3\2\2\2\u0338\u0333"+
+ "\3\2\2\2\u0339\u00a6\3\2\2\2\u033a\u033d\5\u00a9U\2\u033b\u033d\5\u00b1"+
+ "Y\2\u033c\u033a\3\2\2\2\u033c\u033b\3\2\2\2\u033d\u00a8\3\2\2\2\u033e"+
+ "\u0342\5\u00abV\2\u033f\u0342\5\u00adW\2\u0340\u0342\5\u00afX\2\u0341"+
+ "\u033e\3\2\2\2\u0341\u033f\3\2\2\2\u0341\u0340\3\2\2\2\u0342\u00aa\3\2"+
+ "\2\2\u0343\u0349\7\'\2\2\u0344\u0345\7\62\2\2\u0345\u0349\7d\2\2\u0346"+
+ "\u0347\7\62\2\2\u0347\u0349\7D\2\2\u0348\u0343\3\2\2\2\u0348\u0344\3\2"+
+ "\2\2\u0348\u0346\3\2\2\2\u0349\u034d\3\2\2\2\u034a\u034c\5\u00b9]\2\u034b"+
+ "\u034a\3\2\2\2\u034c\u034f\3\2\2\2\u034d\u034b\3\2\2\2\u034d\u034e\3\2"+
+ "\2\2\u034e\u0350\3\2\2\2\u034f\u034d\3\2\2\2\u0350\u0352\7\60\2\2\u0351"+
+ "\u0353\5\u00b9]\2\u0352\u0351\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0352"+
+ "\3\2\2\2\u0354\u0355\3\2\2\2\u0355\u00ac\3\2\2\2\u0356\u0358\5\u00bb^"+
+ "\2\u0357\u0356\3\2\2\2\u0358\u035b\3\2\2\2\u0359\u0357\3\2\2\2\u0359\u035a"+
+ "\3\2\2\2\u035a\u035c\3\2\2\2\u035b\u0359\3\2\2\2\u035c\u035e\7\60\2\2"+
+ "\u035d\u035f\5\u00bb^\2\u035e\u035d\3\2\2\2\u035f\u0360\3\2\2\2\u0360"+
+ "\u035e\3\2\2\2\u0360\u0361\3\2\2\2\u0361\u00ae\3\2\2\2\u0362\u0368\7&"+
+ "\2\2\u0363\u0364\7\62\2\2\u0364\u0368\7z\2\2\u0365\u0366\7\62\2\2\u0366"+
+ "\u0368\7Z\2\2\u0367\u0362\3\2\2\2\u0367\u0363\3\2\2\2\u0367\u0365\3\2"+
+ "\2\2\u0368\u036c\3\2\2\2\u0369\u036b\5\u00bd_\2\u036a\u0369\3\2\2\2\u036b"+
+ "\u036e\3\2\2\2\u036c\u036a\3\2\2\2\u036c\u036d\3\2\2\2\u036d\u036f\3\2"+
+ "\2\2\u036e\u036c\3\2\2\2\u036f\u0371\7\60\2\2\u0370\u0372\5\u00bd_\2\u0371"+
+ "\u0370\3\2\2\2\u0372\u0373\3\2\2\2\u0373\u0371\3\2\2\2\u0373\u0374\3\2"+
+ "\2\2\u0374\u00b0\3\2\2\2\u0375\u0379\5\u00b5[\2\u0376\u0379\5\u00b7\\"+
+ "\2\u0377\u0379\5\u00b3Z\2\u0378\u0375\3\2\2\2\u0378\u0376\3\2\2\2\u0378"+
+ "\u0377\3\2\2\2\u0379\u00b2\3\2\2\2\u037a\u037b\7\62\2\2\u037b\u037d\t"+
+ "\4\2\2\u037c\u037e\5\u00b9]\2\u037d\u037c\3\2\2\2\u037e\u037f\3\2\2\2"+
+ "\u037f\u037d\3\2\2\2\u037f\u0380\3\2\2\2\u0380\u0388\3\2\2\2\u0381\u0383"+
+ "\7\'\2\2\u0382\u0384\5\u00b9]\2\u0383\u0382\3\2\2\2\u0384\u0385\3\2\2"+
+ "\2\u0385\u0383\3\2\2\2\u0385\u0386\3\2\2\2\u0386\u0388\3\2\2\2\u0387\u037a"+
+ "\3\2\2\2\u0387\u0381\3\2\2\2\u0388\u00b4\3\2\2\2\u0389\u038b\5\u00bb^"+
+ "\2\u038a\u0389\3\2\2\2\u038b\u038c\3\2\2\2\u038c\u038a\3\2\2\2\u038c\u038d"+
+ "\3\2\2\2\u038d\u00b6\3\2\2\2\u038e\u0394\7&\2\2\u038f\u0390\7\62\2\2\u0390"+
+ "\u0394\7z\2\2\u0391\u0392\7\62\2\2\u0392\u0394\7Z\2\2\u0393\u038e\3\2"+
+ "\2\2\u0393\u038f\3\2\2\2\u0393\u0391\3\2\2\2\u0394\u0396\3\2\2\2\u0395"+
+ "\u0397\5\u00bd_\2\u0396\u0395\3\2\2\2\u0397\u0398\3\2\2\2\u0398\u0396"+
+ "\3\2\2\2\u0398\u0399\3\2\2\2\u0399\u00b8\3\2\2\2\u039a\u039b\t\5\2\2\u039b"+
+ "\u00ba\3\2\2\2\u039c\u039d\t\6\2\2\u039d\u00bc\3\2\2\2\u039e\u039f\t\7"+
+ "\2\2\u039f\u00be\3\2\2\2\u03a0\u03a4\5\u00c1a\2\u03a1\u03a3\5\u00c3b\2"+
+ "\u03a2\u03a1\3\2\2\2\u03a3\u03a6\3\2\2\2\u03a4\u03a2\3\2\2\2\u03a4\u03a5"+
+ "\3\2\2\2\u03a5\u00c0\3\2\2\2\u03a6\u03a4\3\2\2\2\u03a7\u03a8\t\b\2\2\u03a8"+
+ "\u00c2\3\2\2\2\u03a9\u03aa\t\t\2\2\u03aa\u00c4\3\2\2\2\u03ab\u03af\7#"+
+ "\2\2\u03ac\u03ae\5\u00c3b\2\u03ad\u03ac\3\2\2\2\u03ae\u03b1\3\2\2\2\u03af"+
+ "\u03ad\3\2\2\2\u03af\u03b0\3\2\2\2\u03b0\u03b3\3\2\2\2\u03b1\u03af\3\2"+
+ "\2\2\u03b2\u03b4\t\n\2\2\u03b3\u03b2\3\2\2\2\u03b4\u03b5\3\2\2\2\u03b5"+
+ "\u03b3\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u00c6\3\2\2\2\u03b7\u03b9\t\13"+
+ "\2\2\u03b8\u03b7\3\2\2\2\u03b9\u03ba\3\2\2\2\u03ba\u03b8\3\2\2\2\u03ba"+
+ "\u03bb\3\2\2\2\u03bb\u03bc\3\2\2\2\u03bc\u03bd\bd\2\2\u03bd\u00c8\3\2"+
+ "\2\2\u03be\u03bf\7\61\2\2\u03bf\u03c0\7\61\2\2\u03c0\u03c4\3\2\2\2\u03c1"+
+ "\u03c3\n\f\2\2\u03c2\u03c1\3\2\2\2\u03c3\u03c6\3\2\2\2\u03c4\u03c2\3\2"+
+ "\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c7\3\2\2\2\u03c6\u03c4\3\2\2\2\u03c7"+
+ "\u03c8\be\3\2\u03c8\u00ca\3\2\2\2\u03c9\u03ca\7\61\2\2\u03ca\u03cb\7,"+
+ "\2\2\u03cb\u03cf\3\2\2\2\u03cc\u03ce\13\2\2\2\u03cd\u03cc\3\2\2\2\u03ce"+
+ "\u03d1\3\2\2\2\u03cf\u03d0\3\2\2\2\u03cf\u03cd\3\2\2\2\u03d0\u03d2\3\2"+
+ "\2\2\u03d1\u03cf\3\2\2\2\u03d2\u03d3\7,\2\2\u03d3\u03d4\7\61\2\2\u03d4"+
+ "\u03d5\3\2\2\2\u03d5\u03d6\bf\3\2\u03d6\u00cc\3\2\2\2\"\2\u02e5\u02ed"+
+ "\u0318\u031e\u0320\u0325\u032b\u0338\u033c\u0341\u0348\u034d\u0354\u0359"+
+ "\u0360\u0367\u036c\u0373\u0378\u037f\u0385\u0387\u038c\u0393\u0398\u03a4"+
+ "\u03af\u03b5\u03ba\u03c4\u03cf\4\2\3\2\2\4\2";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
index 53bc237cd..c69744d23 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCLexer.tokens
@@ -73,26 +73,27 @@ T__71=72
T__72=73
T__73=74
T__74=75
-MNEMONIC=76
-KICKASM=77
-SIMPLETYPE=78
-STRING=79
-CHAR=80
-BOOLEAN=81
-NUMBER=82
-NUMFLOAT=83
-BINFLOAT=84
-DECFLOAT=85
-HEXFLOAT=86
-NUMINT=87
-BININTEGER=88
-DECINTEGER=89
-HEXINTEGER=90
-NAME=91
-ASMREL=92
-WS=93
-COMMENT_LINE=94
-COMMENT_BLOCK=95
+T__75=76
+MNEMONIC=77
+KICKASM=78
+SIMPLETYPE=79
+STRING=80
+CHAR=81
+BOOLEAN=82
+NUMBER=83
+NUMFLOAT=84
+BINFLOAT=85
+DECFLOAT=86
+HEXFLOAT=87
+NUMINT=88
+BININTEGER=89
+DECINTEGER=90
+HEXINTEGER=91
+NAME=92
+ASMREL=93
+WS=94
+COMMENT_LINE=95
+COMMENT_BLOCK=96
'import'=1
';'=2
','=3
@@ -126,45 +127,46 @@ COMMENT_BLOCK=95
'['=31
']'=32
'sizeof'=33
-'--'=34
-'++'=35
-'+'=36
-'-'=37
-'!'=38
-'&'=39
-'~'=40
-'>>'=41
-'<<'=42
-'/'=43
-'%'=44
-'<'=45
-'>'=46
-'=='=47
-'!='=48
-'<='=49
-'>='=50
-'^'=51
-'|'=52
-'&&'=53
-'||'=54
-'?'=55
-'+='=56
-'-='=57
-'*='=58
-'/='=59
-'%='=60
-'<<='=61
-'>>='=62
-'&='=63
-'|='=64
-'^='=65
-'kickasm'=66
-'resource'=67
-'uses'=68
-'clobbers'=69
-'bytes'=70
-'cycles'=71
-'pc'=72
-'.byte'=73
-'#'=74
-'.'=75
+'typeid'=34
+'--'=35
+'++'=36
+'+'=37
+'-'=38
+'!'=39
+'&'=40
+'~'=41
+'>>'=42
+'<<'=43
+'/'=44
+'%'=45
+'<'=46
+'>'=47
+'=='=48
+'!='=49
+'<='=50
+'>='=51
+'^'=52
+'|'=53
+'&&'=54
+'||'=55
+'?'=56
+'+='=57
+'-='=58
+'*='=59
+'/='=60
+'%='=61
+'<<='=62
+'>>='=63
+'&='=64
+'|='=65
+'^='=66
+'kickasm'=67
+'resource'=68
+'uses'=69
+'clobbers'=70
+'bytes'=71
+'cycles'=72
+'pc'=73
+'.byte'=74
+'#'=75
+'.'=76
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
index aa2727885..aef2c95a7 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCListener.java
@@ -601,6 +601,18 @@ public interface KickCListener extends ParseTreeListener {
* @param ctx the parse tree
*/
void exitExprBinary(KickCParser.ExprBinaryContext ctx);
+ /**
+ * Enter a parse tree produced by the {@code exprTypeId}
+ * labeled alternative in {@link KickCParser#expr}.
+ * @param ctx the parse tree
+ */
+ void enterExprTypeId(KickCParser.ExprTypeIdContext ctx);
+ /**
+ * Exit a parse tree produced by the {@code exprTypeId}
+ * labeled alternative in {@link KickCParser#expr}.
+ * @param ctx the parse tree
+ */
+ void exitExprTypeId(KickCParser.ExprTypeIdContext ctx);
/**
* Enter a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
index 8a9c292a4..383fd8a0a 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCParser.java
@@ -27,10 +27,10 @@ public class KickCParser extends Parser {
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
- T__73=74, T__74=75, MNEMONIC=76, KICKASM=77, SIMPLETYPE=78, STRING=79,
- CHAR=80, BOOLEAN=81, NUMBER=82, NUMFLOAT=83, BINFLOAT=84, DECFLOAT=85,
- HEXFLOAT=86, NUMINT=87, BININTEGER=88, DECINTEGER=89, HEXINTEGER=90, NAME=91,
- ASMREL=92, WS=93, COMMENT_LINE=94, COMMENT_BLOCK=95;
+ T__73=74, T__74=75, T__75=76, MNEMONIC=77, KICKASM=78, SIMPLETYPE=79,
+ STRING=80, CHAR=81, BOOLEAN=82, NUMBER=83, NUMFLOAT=84, BINFLOAT=85, DECFLOAT=86,
+ HEXFLOAT=87, NUMINT=88, BININTEGER=89, DECINTEGER=90, HEXINTEGER=91, NAME=92,
+ ASMREL=93, WS=94, COMMENT_LINE=95, COMMENT_BLOCK=96;
public static final int
RULE_file = 0, RULE_asmFile = 1, RULE_importSeq = 2, RULE_importDecl = 3,
RULE_declSeq = 4, RULE_decl = 5, RULE_declTypes = 6, RULE_declVariables = 7,
@@ -57,10 +57,10 @@ public class KickCParser extends Parser {
"'extern'", "'align'", "'register'", "'inline'", "'volatile'", "'interrupt'",
"'reserve'", "'if'", "'else'", "'while'", "'do'", "'for'", "'return'",
"'break'", "'continue'", "'asm'", "':'", "'..'", "'signed'", "'unsigned'",
- "'*'", "'['", "']'", "'sizeof'", "'--'", "'++'", "'+'", "'-'", "'!'",
- "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='", "'!='",
- "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='", "'*='",
- "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'",
+ "'*'", "'['", "']'", "'sizeof'", "'typeid'", "'--'", "'++'", "'+'", "'-'",
+ "'!'", "'&'", "'~'", "'>>'", "'<<'", "'/'", "'%'", "'<'", "'>'", "'=='",
+ "'!='", "'<='", "'>='", "'^'", "'|'", "'&&'", "'||'", "'?'", "'+='", "'-='",
+ "'*='", "'/='", "'%='", "'<<='", "'>>='", "'&='", "'|='", "'^='", "'kickasm'",
"'resource'", "'uses'", "'clobbers'", "'bytes'", "'cycles'", "'pc'", "'.byte'",
"'#'", "'.'"
};
@@ -71,7 +71,7 @@ public class KickCParser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
- null, null, null, null, "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING",
+ null, null, null, null, null, "MNEMONIC", "KICKASM", "SIMPLETYPE", "STRING",
"CHAR", "BOOLEAN", "NUMBER", "NUMFLOAT", "BINFLOAT", "DECFLOAT", "HEXFLOAT",
"NUMINT", "BININTEGER", "DECINTEGER", "HEXINTEGER", "NAME", "ASMREL",
"WS", "COMMENT_LINE", "COMMENT_BLOCK"
@@ -374,7 +374,7 @@ public class KickCParser extends Parser {
setState(87);
_errHandler.sync(this);
_la = _input.LA(1);
- } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28))) != 0) || _la==T__65 || _la==SIMPLETYPE );
+ } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__27) | (1L << T__28))) != 0) || _la==T__66 || _la==SIMPLETYPE );
}
}
catch (RecognitionException re) {
@@ -798,7 +798,7 @@ public class KickCParser extends Parser {
setState(138);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (SIMPLETYPE - 66)) | (1L << (STRING - 66)) | (1L << (CHAR - 66)) | (1L << (BOOLEAN - 66)) | (1L << (NUMBER - 66)) | (1L << (NAME - 66)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (SIMPLETYPE - 67)) | (1L << (STRING - 67)) | (1L << (CHAR - 67)) | (1L << (BOOLEAN - 67)) | (1L << (NUMBER - 67)) | (1L << (NAME - 67)))) != 0)) {
{
setState(137);
stmtSeq();
@@ -1389,7 +1389,7 @@ public class KickCParser extends Parser {
setState(195);
_errHandler.sync(this);
_la = _input.LA(1);
- } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (SIMPLETYPE - 66)) | (1L << (STRING - 66)) | (1L << (CHAR - 66)) | (1L << (BOOLEAN - 66)) | (1L << (NUMBER - 66)) | (1L << (NAME - 66)))) != 0) );
+ } while ( (((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (SIMPLETYPE - 67)) | (1L << (STRING - 67)) | (1L << (CHAR - 67)) | (1L << (BOOLEAN - 67)) | (1L << (NUMBER - 67)) | (1L << (NAME - 67)))) != 0) );
}
}
catch (RecognitionException re) {
@@ -1700,7 +1700,7 @@ public class KickCParser extends Parser {
setState(202);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 66)) & ~0x3f) == 0 && ((1L << (_la - 66)) & ((1L << (T__65 - 66)) | (1L << (SIMPLETYPE - 66)) | (1L << (STRING - 66)) | (1L << (CHAR - 66)) | (1L << (BOOLEAN - 66)) | (1L << (NUMBER - 66)) | (1L << (NAME - 66)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23) | (1L << T__24) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (SIMPLETYPE - 67)) | (1L << (STRING - 67)) | (1L << (CHAR - 67)) | (1L << (BOOLEAN - 67)) | (1L << (NUMBER - 67)) | (1L << (NAME - 67)))) != 0)) {
{
setState(201);
stmtSeq();
@@ -1852,7 +1852,7 @@ public class KickCParser extends Parser {
setState(257);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (STRING - 79)) | (1L << (CHAR - 79)) | (1L << (BOOLEAN - 79)) | (1L << (NUMBER - 79)) | (1L << (NAME - 79)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) {
{
setState(256);
commaExpr(0);
@@ -2014,7 +2014,7 @@ public class KickCParser extends Parser {
setState(280);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (STRING - 79)) | (1L << (CHAR - 79)) | (1L << (BOOLEAN - 79)) | (1L << (NUMBER - 79)) | (1L << (NAME - 79)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) {
{
setState(279);
commaExpr(0);
@@ -2390,7 +2390,7 @@ public class KickCParser extends Parser {
setState(316);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (STRING - 79)) | (1L << (CHAR - 79)) | (1L << (BOOLEAN - 79)) | (1L << (NUMBER - 79)) | (1L << (NAME - 79)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) {
{
setState(315);
expr(0);
@@ -2618,6 +2618,28 @@ public class KickCParser extends Parser {
else return visitor.visitChildren(this);
}
}
+ public static class ExprTypeIdContext extends ExprContext {
+ public TypeDeclContext typeDecl() {
+ return getRuleContext(TypeDeclContext.class,0);
+ }
+ public ExprContext expr() {
+ return getRuleContext(ExprContext.class,0);
+ }
+ public ExprTypeIdContext(ExprContext ctx) { copyFrom(ctx); }
+ @Override
+ public void enterRule(ParseTreeListener listener) {
+ if ( listener instanceof KickCListener ) ((KickCListener)listener).enterExprTypeId(this);
+ }
+ @Override
+ public void exitRule(ParseTreeListener listener) {
+ if ( listener instanceof KickCListener ) ((KickCListener)listener).exitExprTypeId(this);
+ }
+ @Override
+ public T accept(ParseTreeVisitor extends T> visitor) {
+ if ( visitor instanceof KickCVisitor ) return ((KickCVisitor extends T>)visitor).visitExprTypeId(this);
+ else return visitor.visitChildren(this);
+ }
+ }
public static class ExprPostModContext extends ExprContext {
public ExprContext expr() {
return getRuleContext(ExprContext.class,0);
@@ -2953,9 +2975,9 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(380);
+ setState(388);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,36,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,37,_ctx) ) {
case 1:
{
_localctx = new ExprParContext(_localctx);
@@ -3001,57 +3023,56 @@ public class KickCParser extends Parser {
break;
case 3:
{
- _localctx = new ExprCastContext(_localctx);
+ _localctx = new ExprTypeIdContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
setState(351);
- match(T__4);
+ match(T__33);
setState(352);
- typeDecl(0);
- setState(353);
+ match(T__4);
+ setState(355);
+ _errHandler.sync(this);
+ switch ( getInterpreter().adaptivePredict(_input,35,_ctx) ) {
+ case 1:
+ {
+ setState(353);
+ typeDecl(0);
+ }
+ break;
+ case 2:
+ {
+ setState(354);
+ expr(0);
+ }
+ break;
+ }
+ setState(357);
match(T__5);
- setState(354);
- expr(24);
}
break;
case 4:
{
- _localctx = new ExprPreModContext(_localctx);
+ _localctx = new ExprCastContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(356);
- _la = _input.LA(1);
- if ( !(_la==T__33 || _la==T__34) ) {
- _errHandler.recoverInline(this);
- }
- else {
- if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
- _errHandler.reportMatch(this);
- consume();
- }
- setState(357);
- expr(23);
+ setState(359);
+ match(T__4);
+ setState(360);
+ typeDecl(0);
+ setState(361);
+ match(T__5);
+ setState(362);
+ expr(24);
}
break;
case 5:
{
- _localctx = new ExprPtrContext(_localctx);
+ _localctx = new ExprPreModContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(358);
- match(T__29);
- setState(359);
- expr(21);
- }
- break;
- case 6:
- {
- _localctx = new ExprUnaryContext(_localctx);
- _ctx = _localctx;
- _prevctx = _localctx;
- setState(360);
+ setState(364);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39))) != 0)) ) {
+ if ( !(_la==T__34 || _la==T__35) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3059,8 +3080,19 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(361);
- expr(20);
+ setState(365);
+ expr(23);
+ }
+ break;
+ case 6:
+ {
+ _localctx = new ExprPtrContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(366);
+ match(T__29);
+ setState(367);
+ expr(21);
}
break;
case 7:
@@ -3068,9 +3100,9 @@ public class KickCParser extends Parser {
_localctx = new ExprUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(362);
+ setState(368);
_la = _input.LA(1);
- if ( !(_la==T__44 || _la==T__45) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3078,106 +3110,125 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(363);
- expr(16);
+ setState(369);
+ expr(20);
}
break;
case 8:
+ {
+ _localctx = new ExprUnaryContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(370);
+ _la = _input.LA(1);
+ if ( !(_la==T__45 || _la==T__46) ) {
+ _errHandler.recoverInline(this);
+ }
+ else {
+ if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
+ _errHandler.reportMatch(this);
+ consume();
+ }
+ setState(371);
+ expr(16);
+ }
+ break;
+ case 9:
{
_localctx = new InitListContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(364);
+ setState(372);
match(T__6);
- setState(365);
+ setState(373);
expr(0);
- setState(370);
+ setState(378);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(366);
+ setState(374);
match(T__2);
- setState(367);
+ setState(375);
expr(0);
}
}
- setState(372);
+ setState(380);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(373);
+ setState(381);
match(T__7);
}
break;
- case 9:
- {
- _localctx = new ExprIdContext(_localctx);
- _ctx = _localctx;
- _prevctx = _localctx;
- setState(375);
- match(NAME);
- }
- break;
case 10:
{
- _localctx = new ExprNumberContext(_localctx);
+ _localctx = new ExprIdContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(376);
- match(NUMBER);
+ setState(383);
+ match(NAME);
}
break;
case 11:
{
- _localctx = new ExprStringContext(_localctx);
+ _localctx = new ExprNumberContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(377);
- match(STRING);
+ setState(384);
+ match(NUMBER);
}
break;
case 12:
{
- _localctx = new ExprCharContext(_localctx);
+ _localctx = new ExprStringContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(378);
- match(CHAR);
+ setState(385);
+ match(STRING);
}
break;
case 13:
+ {
+ _localctx = new ExprCharContext(_localctx);
+ _ctx = _localctx;
+ _prevctx = _localctx;
+ setState(386);
+ match(CHAR);
+ }
+ break;
+ case 14:
{
_localctx = new ExprBoolContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(379);
+ setState(387);
match(BOOLEAN);
}
break;
}
_ctx.stop = _input.LT(-1);
- setState(436);
+ setState(444);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,39,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,40,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(434);
+ setState(442);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,38,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,39,_ctx) ) {
case 1:
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(382);
+ setState(390);
if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)");
- setState(383);
+ setState(391);
_la = _input.LA(1);
- if ( !(_la==T__40 || _la==T__41) ) {
+ if ( !(_la==T__41 || _la==T__42) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3185,7 +3236,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(384);
+ setState(392);
expr(20);
}
break;
@@ -3193,11 +3244,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(385);
+ setState(393);
if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)");
- setState(386);
+ setState(394);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__29) | (1L << T__42) | (1L << T__43))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__29) | (1L << T__43) | (1L << T__44))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3205,7 +3256,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(387);
+ setState(395);
expr(19);
}
break;
@@ -3213,11 +3264,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(388);
+ setState(396);
if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)");
- setState(389);
+ setState(397);
_la = _input.LA(1);
- if ( !(_la==T__35 || _la==T__36) ) {
+ if ( !(_la==T__36 || _la==T__37) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3225,7 +3276,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(390);
+ setState(398);
expr(18);
}
break;
@@ -3233,11 +3284,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(391);
+ setState(399);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
- setState(392);
+ setState(400);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3245,7 +3296,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(393);
+ setState(401);
expr(16);
}
break;
@@ -3253,13 +3304,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(394);
+ setState(402);
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
{
- setState(395);
- match(T__38);
+ setState(403);
+ match(T__39);
}
- setState(396);
+ setState(404);
expr(15);
}
break;
@@ -3267,13 +3318,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(397);
+ setState(405);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
{
- setState(398);
- match(T__50);
+ setState(406);
+ match(T__51);
}
- setState(399);
+ setState(407);
expr(14);
}
break;
@@ -3281,13 +3332,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(400);
+ setState(408);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
{
- setState(401);
- match(T__51);
+ setState(409);
+ match(T__52);
}
- setState(402);
+ setState(410);
expr(13);
}
break;
@@ -3295,13 +3346,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(403);
+ setState(411);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
{
- setState(404);
- match(T__52);
+ setState(412);
+ match(T__53);
}
- setState(405);
+ setState(413);
expr(12);
}
break;
@@ -3309,13 +3360,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprBinaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(406);
+ setState(414);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
{
- setState(407);
- match(T__53);
+ setState(415);
+ match(T__54);
}
- setState(408);
+ setState(416);
expr(11);
}
break;
@@ -3323,15 +3374,15 @@ public class KickCParser extends Parser {
{
_localctx = new ExprTernaryContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(409);
+ setState(417);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(410);
- match(T__54);
- setState(411);
+ setState(418);
+ match(T__55);
+ setState(419);
expr(0);
- setState(412);
+ setState(420);
match(T__25);
- setState(413);
+ setState(421);
expr(10);
}
break;
@@ -3339,11 +3390,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprAssignmentContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(415);
+ setState(423);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
- setState(416);
+ setState(424);
match(T__3);
- setState(417);
+ setState(425);
expr(8);
}
break;
@@ -3351,11 +3402,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprAssignmentCompoundContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(418);
+ setState(426);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(419);
+ setState(427);
_la = _input.LA(1);
- if ( !(((((_la - 56)) & ~0x3f) == 0 && ((1L << (_la - 56)) & ((1L << (T__55 - 56)) | (1L << (T__56 - 56)) | (1L << (T__57 - 56)) | (1L << (T__58 - 56)) | (1L << (T__59 - 56)) | (1L << (T__60 - 56)) | (1L << (T__61 - 56)) | (1L << (T__62 - 56)) | (1L << (T__63 - 56)) | (1L << (T__64 - 56)))) != 0)) ) {
+ if ( !(((((_la - 57)) & ~0x3f) == 0 && ((1L << (_la - 57)) & ((1L << (T__56 - 57)) | (1L << (T__57 - 57)) | (1L << (T__58 - 57)) | (1L << (T__59 - 57)) | (1L << (T__60 - 57)) | (1L << (T__61 - 57)) | (1L << (T__62 - 57)) | (1L << (T__63 - 57)) | (1L << (T__64 - 57)) | (1L << (T__65 - 57)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3363,7 +3414,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(420);
+ setState(428);
expr(7);
}
break;
@@ -3371,21 +3422,21 @@ public class KickCParser extends Parser {
{
_localctx = new ExprCallContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(421);
- if (!(precpred(_ctx, 27))) throw new FailedPredicateException(this, "precpred(_ctx, 27)");
- setState(422);
+ setState(429);
+ if (!(precpred(_ctx, 28))) throw new FailedPredicateException(this, "precpred(_ctx, 28)");
+ setState(430);
match(T__4);
- setState(424);
+ setState(432);
_errHandler.sync(this);
_la = _input.LA(1);
- if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 79)) & ~0x3f) == 0 && ((1L << (_la - 79)) & ((1L << (STRING - 79)) | (1L << (CHAR - 79)) | (1L << (BOOLEAN - 79)) | (1L << (NUMBER - 79)) | (1L << (NAME - 79)))) != 0)) {
+ if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__6) | (1L << T__29) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__45) | (1L << T__46))) != 0) || ((((_la - 80)) & ~0x3f) == 0 && ((1L << (_la - 80)) & ((1L << (STRING - 80)) | (1L << (CHAR - 80)) | (1L << (BOOLEAN - 80)) | (1L << (NUMBER - 80)) | (1L << (NAME - 80)))) != 0)) {
{
- setState(423);
+ setState(431);
parameterList();
}
}
- setState(426);
+ setState(434);
match(T__5);
}
break;
@@ -3393,13 +3444,13 @@ public class KickCParser extends Parser {
{
_localctx = new ExprArrayContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(427);
+ setState(435);
if (!(precpred(_ctx, 25))) throw new FailedPredicateException(this, "precpred(_ctx, 25)");
- setState(428);
+ setState(436);
match(T__30);
- setState(429);
+ setState(437);
commaExpr(0);
- setState(430);
+ setState(438);
match(T__31);
}
break;
@@ -3407,11 +3458,11 @@ public class KickCParser extends Parser {
{
_localctx = new ExprPostModContext(new ExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_expr);
- setState(432);
+ setState(440);
if (!(precpred(_ctx, 22))) throw new FailedPredicateException(this, "precpred(_ctx, 22)");
- setState(433);
+ setState(441);
_la = _input.LA(1);
- if ( !(_la==T__33 || _la==T__34) ) {
+ if ( !(_la==T__34 || _la==T__35) ) {
_errHandler.recoverInline(this);
}
else {
@@ -3424,9 +3475,9 @@ public class KickCParser extends Parser {
}
}
}
- setState(438);
+ setState(446);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,39,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,40,_ctx);
}
}
}
@@ -3474,21 +3525,21 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(439);
+ setState(447);
expr(0);
- setState(444);
+ setState(452);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(440);
+ setState(448);
match(T__2);
- setState(441);
+ setState(449);
expr(0);
}
}
- setState(446);
+ setState(454);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3536,19 +3587,19 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(447);
- match(T__65);
- setState(449);
+ setState(455);
+ match(T__66);
+ setState(457);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__4) {
{
- setState(448);
+ setState(456);
asmDirectives();
}
}
- setState(451);
+ setState(459);
match(KICKASM);
}
}
@@ -3596,27 +3647,27 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(453);
+ setState(461);
match(T__4);
- setState(454);
+ setState(462);
asmDirective();
- setState(459);
+ setState(467);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(455);
+ setState(463);
match(T__2);
- setState(456);
+ setState(464);
asmDirective();
}
}
- setState(461);
+ setState(469);
_errHandler.sync(this);
_la = _input.LA(1);
}
- setState(462);
+ setState(470);
match(T__5);
}
}
@@ -3755,71 +3806,71 @@ public class KickCParser extends Parser {
AsmDirectiveContext _localctx = new AsmDirectiveContext(_ctx, getState());
enterRule(_localctx, 52, RULE_asmDirective);
try {
- setState(479);
+ setState(487);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__66:
+ case T__67:
_localctx = new AsmDirectiveResourceContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(464);
- match(T__66);
- setState(465);
- match(STRING);
- }
- break;
- case T__67:
- _localctx = new AsmDirectiveUsesContext(_localctx);
- enterOuterAlt(_localctx, 2);
- {
- setState(466);
+ setState(472);
match(T__67);
- setState(467);
- match(NAME);
+ setState(473);
+ match(STRING);
}
break;
case T__68:
- _localctx = new AsmDirectiveClobberContext(_localctx);
- enterOuterAlt(_localctx, 3);
+ _localctx = new AsmDirectiveUsesContext(_localctx);
+ enterOuterAlt(_localctx, 2);
{
- setState(468);
+ setState(474);
match(T__68);
- setState(469);
- match(STRING);
+ setState(475);
+ match(NAME);
}
break;
case T__69:
- _localctx = new AsmDirectiveBytesContext(_localctx);
- enterOuterAlt(_localctx, 4);
+ _localctx = new AsmDirectiveClobberContext(_localctx);
+ enterOuterAlt(_localctx, 3);
{
- setState(470);
+ setState(476);
match(T__69);
- setState(471);
- expr(0);
+ setState(477);
+ match(STRING);
}
break;
case T__70:
- _localctx = new AsmDirectiveCyclesContext(_localctx);
- enterOuterAlt(_localctx, 5);
+ _localctx = new AsmDirectiveBytesContext(_localctx);
+ enterOuterAlt(_localctx, 4);
{
- setState(472);
+ setState(478);
match(T__70);
- setState(473);
+ setState(479);
expr(0);
}
break;
case T__71:
+ _localctx = new AsmDirectiveCyclesContext(_localctx);
+ enterOuterAlt(_localctx, 5);
+ {
+ setState(480);
+ match(T__71);
+ setState(481);
+ expr(0);
+ }
+ break;
+ case T__72:
_localctx = new AsmDirectiveAddressContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(474);
- match(T__71);
- setState(477);
+ setState(482);
+ match(T__72);
+ setState(485);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__12:
{
- setState(475);
+ setState(483);
match(T__12);
}
break;
@@ -3834,15 +3885,16 @@ public class KickCParser extends Parser {
case T__37:
case T__38:
case T__39:
- case T__44:
+ case T__40:
case T__45:
+ case T__46:
case STRING:
case CHAR:
case BOOLEAN:
case NUMBER:
case NAME:
{
- setState(476);
+ setState(484);
expr(0);
}
break;
@@ -3899,17 +3951,17 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(484);
+ setState(492);
_errHandler.sync(this);
_la = _input.LA(1);
- while (((((_la - 38)) & ~0x3f) == 0 && ((1L << (_la - 38)) & ((1L << (T__37 - 38)) | (1L << (T__72 - 38)) | (1L << (MNEMONIC - 38)) | (1L << (NAME - 38)))) != 0)) {
+ while (((((_la - 39)) & ~0x3f) == 0 && ((1L << (_la - 39)) & ((1L << (T__38 - 39)) | (1L << (T__73 - 39)) | (1L << (MNEMONIC - 39)) | (1L << (NAME - 39)))) != 0)) {
{
{
- setState(481);
+ setState(489);
asmLine();
}
}
- setState(486);
+ setState(494);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -3959,28 +4011,28 @@ public class KickCParser extends Parser {
AsmLineContext _localctx = new AsmLineContext(_ctx, getState());
enterRule(_localctx, 56, RULE_asmLine);
try {
- setState(490);
+ setState(498);
_errHandler.sync(this);
switch (_input.LA(1)) {
- case T__37:
+ case T__38:
case NAME:
enterOuterAlt(_localctx, 1);
{
- setState(487);
+ setState(495);
asmLabel();
}
break;
case MNEMONIC:
enterOuterAlt(_localctx, 2);
{
- setState(488);
+ setState(496);
asmInstruction();
}
break;
- case T__72:
+ case T__73:
enterOuterAlt(_localctx, 3);
{
- setState(489);
+ setState(497);
asmBytes();
}
break;
@@ -4050,36 +4102,36 @@ public class KickCParser extends Parser {
enterRule(_localctx, 58, RULE_asmLabel);
int _la;
try {
- setState(499);
+ setState(507);
_errHandler.sync(this);
switch (_input.LA(1)) {
case NAME:
_localctx = new AsmLabelNameContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(492);
+ setState(500);
match(NAME);
- setState(493);
+ setState(501);
match(T__25);
}
break;
- case T__37:
+ case T__38:
_localctx = new AsmLabelMultiContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(494);
- match(T__37);
- setState(496);
+ setState(502);
+ match(T__38);
+ setState(504);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==NAME) {
{
- setState(495);
+ setState(503);
match(NAME);
}
}
- setState(498);
+ setState(506);
match(T__25);
}
break;
@@ -4128,14 +4180,14 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(501);
+ setState(509);
match(MNEMONIC);
- setState(503);
+ setState(511);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,49,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,50,_ctx) ) {
case 1:
{
- setState(502);
+ setState(510);
asmParamMode();
}
break;
@@ -4186,23 +4238,23 @@ public class KickCParser extends Parser {
try {
enterOuterAlt(_localctx, 1);
{
- setState(505);
- match(T__72);
- setState(506);
+ setState(513);
+ match(T__73);
+ setState(514);
asmExpr(0);
- setState(511);
+ setState(519);
_errHandler.sync(this);
_la = _input.LA(1);
while (_la==T__2) {
{
{
- setState(507);
+ setState(515);
match(T__2);
- setState(508);
+ setState(516);
asmExpr(0);
}
}
- setState(513);
+ setState(521);
_errHandler.sync(this);
_la = _input.LA(1);
}
@@ -4352,14 +4404,14 @@ public class KickCParser extends Parser {
AsmParamModeContext _localctx = new AsmParamModeContext(_ctx, getState());
enterRule(_localctx, 64, RULE_asmParamMode);
try {
- setState(537);
+ setState(545);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,51,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,52,_ctx) ) {
case 1:
_localctx = new AsmModeAbsContext(_localctx);
enterOuterAlt(_localctx, 1);
{
- setState(514);
+ setState(522);
asmExpr(0);
}
break;
@@ -4367,9 +4419,9 @@ public class KickCParser extends Parser {
_localctx = new AsmModeImmContext(_localctx);
enterOuterAlt(_localctx, 2);
{
- setState(515);
- match(T__73);
- setState(516);
+ setState(523);
+ match(T__74);
+ setState(524);
asmExpr(0);
}
break;
@@ -4377,11 +4429,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeAbsXYContext(_localctx);
enterOuterAlt(_localctx, 3);
{
- setState(517);
+ setState(525);
asmExpr(0);
- setState(518);
+ setState(526);
match(T__2);
- setState(519);
+ setState(527);
match(NAME);
}
break;
@@ -4389,15 +4441,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndIdxXYContext(_localctx);
enterOuterAlt(_localctx, 4);
{
- setState(521);
+ setState(529);
match(T__4);
- setState(522);
+ setState(530);
asmExpr(0);
- setState(523);
+ setState(531);
match(T__5);
- setState(524);
+ setState(532);
match(T__2);
- setState(525);
+ setState(533);
match(NAME);
}
break;
@@ -4405,15 +4457,15 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIdxIndXYContext(_localctx);
enterOuterAlt(_localctx, 5);
{
- setState(527);
+ setState(535);
match(T__4);
- setState(528);
+ setState(536);
asmExpr(0);
- setState(529);
+ setState(537);
match(T__2);
- setState(530);
+ setState(538);
match(NAME);
- setState(531);
+ setState(539);
match(T__5);
}
break;
@@ -4421,11 +4473,11 @@ public class KickCParser extends Parser {
_localctx = new AsmModeIndContext(_localctx);
enterOuterAlt(_localctx, 6);
{
- setState(533);
+ setState(541);
match(T__4);
- setState(534);
+ setState(542);
asmExpr(0);
- setState(535);
+ setState(543);
match(T__5);
}
break;
@@ -4615,7 +4667,7 @@ public class KickCParser extends Parser {
int _alt;
enterOuterAlt(_localctx, 1);
{
- setState(553);
+ setState(561);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__30:
@@ -4624,25 +4676,25 @@ public class KickCParser extends Parser {
_ctx = _localctx;
_prevctx = _localctx;
- setState(540);
+ setState(548);
match(T__30);
- setState(541);
+ setState(549);
asmExpr(0);
- setState(542);
+ setState(550);
match(T__31);
}
break;
- case T__35:
case T__36:
- case T__44:
+ case T__37:
case T__45:
+ case T__46:
{
_localctx = new AsmExprUnaryContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(544);
+ setState(552);
_la = _input.LA(1);
- if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__35) | (1L << T__36) | (1L << T__44) | (1L << T__45))) != 0)) ) {
+ if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__36) | (1L << T__37) | (1L << T__45) | (1L << T__46))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@@ -4650,7 +4702,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(545);
+ setState(553);
asmExpr(8);
}
break;
@@ -4659,7 +4711,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(546);
+ setState(554);
match(NAME);
}
break;
@@ -4668,7 +4720,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprLabelRelContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(547);
+ setState(555);
match(ASMREL);
}
break;
@@ -4677,11 +4729,11 @@ public class KickCParser extends Parser {
_localctx = new AsmExprReplaceContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(548);
+ setState(556);
match(T__6);
- setState(549);
+ setState(557);
match(NAME);
- setState(550);
+ setState(558);
match(T__7);
}
break;
@@ -4690,7 +4742,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprIntContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(551);
+ setState(559);
match(NUMBER);
}
break;
@@ -4699,7 +4751,7 @@ public class KickCParser extends Parser {
_localctx = new AsmExprCharContext(_localctx);
_ctx = _localctx;
_prevctx = _localctx;
- setState(552);
+ setState(560);
match(CHAR);
}
break;
@@ -4707,28 +4759,28 @@ public class KickCParser extends Parser {
throw new NoViableAltException(this);
}
_ctx.stop = _input.LT(-1);
- setState(569);
+ setState(577);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,54,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,55,_ctx);
while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) {
if ( _alt==1 ) {
if ( _parseListeners!=null ) triggerExitRuleEvent();
_prevctx = _localctx;
{
- setState(567);
+ setState(575);
_errHandler.sync(this);
- switch ( getInterpreter().adaptivePredict(_input,53,_ctx) ) {
+ switch ( getInterpreter().adaptivePredict(_input,54,_ctx) ) {
case 1:
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(555);
+ setState(563);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
{
- setState(556);
- match(T__74);
+ setState(564);
+ match(T__75);
}
- setState(557);
+ setState(565);
asmExpr(11);
}
break;
@@ -4736,11 +4788,11 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(558);
+ setState(566);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
- setState(559);
+ setState(567);
_la = _input.LA(1);
- if ( !(_la==T__40 || _la==T__41) ) {
+ if ( !(_la==T__41 || _la==T__42) ) {
_errHandler.recoverInline(this);
}
else {
@@ -4748,7 +4800,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(560);
+ setState(568);
asmExpr(10);
}
break;
@@ -4756,11 +4808,11 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(561);
+ setState(569);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
- setState(562);
+ setState(570);
_la = _input.LA(1);
- if ( !(_la==T__29 || _la==T__42) ) {
+ if ( !(_la==T__29 || _la==T__43) ) {
_errHandler.recoverInline(this);
}
else {
@@ -4768,7 +4820,7 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(563);
+ setState(571);
asmExpr(8);
}
break;
@@ -4776,11 +4828,11 @@ public class KickCParser extends Parser {
{
_localctx = new AsmExprBinaryContext(new AsmExprContext(_parentctx, _parentState));
pushNewRecursionContext(_localctx, _startState, RULE_asmExpr);
- setState(564);
+ setState(572);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
- setState(565);
+ setState(573);
_la = _input.LA(1);
- if ( !(_la==T__35 || _la==T__36) ) {
+ if ( !(_la==T__36 || _la==T__37) ) {
_errHandler.recoverInline(this);
}
else {
@@ -4788,16 +4840,16 @@ public class KickCParser extends Parser {
_errHandler.reportMatch(this);
consume();
}
- setState(566);
+ setState(574);
asmExpr(7);
}
break;
}
}
}
- setState(571);
+ setState(579);
_errHandler.sync(this);
- _alt = getInterpreter().adaptivePredict(_input,54,_ctx);
+ _alt = getInterpreter().adaptivePredict(_input,55,_ctx);
}
}
}
@@ -4879,7 +4931,7 @@ public class KickCParser extends Parser {
case 16:
return precpred(_ctx, 7);
case 17:
- return precpred(_ctx, 27);
+ return precpred(_ctx, 28);
case 18:
return precpred(_ctx, 25);
case 19:
@@ -4902,7 +4954,7 @@ public class KickCParser extends Parser {
}
public static final String _serializedATN =
- "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3a\u023f\4\2\t\2\4"+
+ "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3b\u0247\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"+
@@ -4930,201 +4982,205 @@ public class KickCParser extends Parser {
"\u013f\n\26\3\26\3\26\3\26\3\26\7\26\u0145\n\26\f\26\16\26\u0148\13\26"+
"\3\27\3\27\3\27\3\27\3\27\3\27\7\27\u0150\n\27\f\27\16\27\u0153\13\27"+
"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u015e\n\30\3\30\3\30"+
- "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
- "\3\30\3\30\3\30\7\30\u0173\n\30\f\30\16\30\u0176\13\30\3\30\3\30\3\30"+
- "\3\30\3\30\3\30\3\30\5\30\u017f\n\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
+ "\3\30\3\30\3\30\3\30\5\30\u0166\n\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
+ "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u017b"+
+ "\n\30\f\30\16\30\u017e\13\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u0187"+
+ "\n\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+
- "\3\30\3\30\3\30\3\30\3\30\3\30\3\30\5\30\u01ab\n\30\3\30\3\30\3\30\3\30"+
- "\3\30\3\30\3\30\3\30\7\30\u01b5\n\30\f\30\16\30\u01b8\13\30\3\31\3\31"+
- "\3\31\7\31\u01bd\n\31\f\31\16\31\u01c0\13\31\3\32\3\32\5\32\u01c4\n\32"+
- "\3\32\3\32\3\33\3\33\3\33\3\33\7\33\u01cc\n\33\f\33\16\33\u01cf\13\33"+
- "\3\33\3\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34"+
- "\3\34\5\34\u01e0\n\34\5\34\u01e2\n\34\3\35\7\35\u01e5\n\35\f\35\16\35"+
- "\u01e8\13\35\3\36\3\36\3\36\5\36\u01ed\n\36\3\37\3\37\3\37\3\37\5\37\u01f3"+
- "\n\37\3\37\5\37\u01f6\n\37\3 \3 \5 \u01fa\n \3!\3!\3!\3!\7!\u0200\n!\f"+
- "!\16!\u0203\13!\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3"+
- "\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\5\"\u021c\n\"\3#\3#\3#\3#\3#\3"+
- "#\3#\3#\3#\3#\3#\3#\3#\3#\5#\u022c\n#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3"+
- "#\3#\7#\u023a\n#\f#\16#\u023d\13#\3#\2\7\22*,.D$\2\4\6\b\n\f\16\20\22"+
- "\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BD\2\r\3\2\36\37\3\2$%\3\2"+
- "&*\3\2/\60\3\2+,\4\2 -.\3\2&\'\3\2/\64\3\2:C\4\2&\'/\60\4\2 --\2\u028f"+
- "\2F\3\2\2\2\4J\3\2\2\2\6P\3\2\2\2\bS\3\2\2\2\nW\3\2\2\2\fa\3\2\2\2\16"+
- "f\3\2\2\2\20p\3\2\2\2\22s\3\2\2\2\24~\3\2\2\2\26\u0083\3\2\2\2\30\u0090"+
- "\3\2\2\2\32\u009c\3\2\2\2\34\u009e\3\2\2\2\36\u00b4\3\2\2\2 \u00b6\3\2"+
- "\2\2\"\u00c3\3\2\2\2$\u0113\3\2\2\2&\u0125\3\2\2\2(\u012b\3\2\2\2*\u0137"+
- "\3\2\2\2,\u0149\3\2\2\2.\u017e\3\2\2\2\60\u01b9\3\2\2\2\62\u01c1\3\2\2"+
- "\2\64\u01c7\3\2\2\2\66\u01e1\3\2\2\28\u01e6\3\2\2\2:\u01ec\3\2\2\2<\u01f5"+
- "\3\2\2\2>\u01f7\3\2\2\2@\u01fb\3\2\2\2B\u021b\3\2\2\2D\u022b\3\2\2\2F"+
- "G\5\6\4\2GH\5\n\6\2HI\7\2\2\3I\3\3\2\2\2JK\58\35\2KL\7\2\2\3L\5\3\2\2"+
- "\2MO\5\b\5\2NM\3\2\2\2OR\3\2\2\2PN\3\2\2\2PQ\3\2\2\2Q\7\3\2\2\2RP\3\2"+
- "\2\2ST\7\3\2\2TU\7Q\2\2U\t\3\2\2\2VX\5\f\7\2WV\3\2\2\2XY\3\2\2\2YW\3\2"+
- "\2\2YZ\3\2\2\2Z\13\3\2\2\2[\\\5\20\t\2\\]\7\4\2\2]b\3\2\2\2^b\5\26\f\2"+
- "_b\5\62\32\2`b\5\34\17\2a[\3\2\2\2a^\3\2\2\2a_\3\2\2\2a`\3\2\2\2b\r\3"+
- "\2\2\2ce\5\36\20\2dc\3\2\2\2eh\3\2\2\2fd\3\2\2\2fg\3\2\2\2gi\3\2\2\2h"+
- "f\3\2\2\2im\5*\26\2jl\5\36\20\2kj\3\2\2\2lo\3\2\2\2mk\3\2\2\2mn\3\2\2"+
- "\2n\17\3\2\2\2om\3\2\2\2pq\5\16\b\2qr\5\22\n\2r\21\3\2\2\2st\b\n\1\2t"+
- "u\5\24\13\2u{\3\2\2\2vw\f\3\2\2wx\7\5\2\2xz\5\24\13\2yv\3\2\2\2z}\3\2"+
- "\2\2{y\3\2\2\2{|\3\2\2\2|\23\3\2\2\2}{\3\2\2\2~\u0081\7]\2\2\177\u0080"+
- "\7\6\2\2\u0080\u0082\5.\30\2\u0081\177\3\2\2\2\u0081\u0082\3\2\2\2\u0082"+
- "\25\3\2\2\2\u0083\u0084\5\16\b\2\u0084\u0085\7]\2\2\u0085\u0087\7\7\2"+
- "\2\u0086\u0088\5\30\r\2\u0087\u0086\3\2\2\2\u0087\u0088\3\2\2\2\u0088"+
- "\u0089\3\2\2\2\u0089\u008a\7\b\2\2\u008a\u008c\7\t\2\2\u008b\u008d\5\""+
- "\22\2\u008c\u008b\3\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e"+
- "\u008f\7\n\2\2\u008f\27\3\2\2\2\u0090\u0095\5\32\16\2\u0091\u0092\7\5"+
- "\2\2\u0092\u0094\5\32\16\2\u0093\u0091\3\2\2\2\u0094\u0097\3\2\2\2\u0095"+
- "\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096\31\3\2\2\2\u0097\u0095\3\2\2"+
- "\2\u0098\u0099\5\16\b\2\u0099\u009a\7]\2\2\u009a\u009d\3\2\2\2\u009b\u009d"+
- "\7P\2\2\u009c\u0098\3\2\2\2\u009c\u009b\3\2\2\2\u009d\33\3\2\2\2\u009e"+
- "\u009f\5 \21\2\u009f\u00a0\7\4\2\2\u00a0\35\3\2\2\2\u00a1\u00b5\7\13\2"+
- "\2\u00a2\u00b5\7\f\2\2\u00a3\u00a4\7\r\2\2\u00a4\u00a5\7\7\2\2\u00a5\u00a6"+
- "\7T\2\2\u00a6\u00b5\7\b\2\2\u00a7\u00a8\7\16\2\2\u00a8\u00a9\7\7\2\2\u00a9"+
- "\u00aa\7]\2\2\u00aa\u00b5\7\b\2\2\u00ab\u00b5\7\17\2\2\u00ac\u00b5\7\20"+
- "\2\2\u00ad\u00b1\7\21\2\2\u00ae\u00af\7\7\2\2\u00af\u00b0\7]\2\2\u00b0"+
- "\u00b2\7\b\2\2\u00b1\u00ae\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b5\3\2"+
- "\2\2\u00b3\u00b5\5 \21\2\u00b4\u00a1\3\2\2\2\u00b4\u00a2\3\2\2\2\u00b4"+
- "\u00a3\3\2\2\2\u00b4\u00a7\3\2\2\2\u00b4\u00ab\3\2\2\2\u00b4\u00ac\3\2"+
- "\2\2\u00b4\u00ad\3\2\2\2\u00b4\u00b3\3\2\2\2\u00b5\37\3\2\2\2\u00b6\u00b7"+
- "\7\22\2\2\u00b7\u00b8\7\7\2\2\u00b8\u00bd\7T\2\2\u00b9\u00ba\7\5\2\2\u00ba"+
- "\u00bc\7T\2\2\u00bb\u00b9\3\2\2\2\u00bc\u00bf\3\2\2\2\u00bd\u00bb\3\2"+
- "\2\2\u00bd\u00be\3\2\2\2\u00be\u00c0\3\2\2\2\u00bf\u00bd\3\2\2\2\u00c0"+
- "\u00c1\7\b\2\2\u00c1!\3\2\2\2\u00c2\u00c4\5$\23\2\u00c3\u00c2\3\2\2\2"+
- "\u00c4\u00c5\3\2\2\2\u00c5\u00c3\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6#\3"+
- "\2\2\2\u00c7\u00c8\5\20\t\2\u00c8\u00c9\7\4\2\2\u00c9\u0114\3\2\2\2\u00ca"+
- "\u00cc\7\t\2\2\u00cb\u00cd\5\"\22\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3"+
- "\2\2\2\u00cd\u00ce\3\2\2\2\u00ce\u0114\7\n\2\2\u00cf\u00d0\5,\27\2\u00d0"+
- "\u00d1\7\4\2\2\u00d1\u0114\3\2\2\2\u00d2\u00d3\7\23\2\2\u00d3\u00d4\7"+
- "\7\2\2\u00d4\u00d5\5,\27\2\u00d5\u00d6\7\b\2\2\u00d6\u00d9\5$\23\2\u00d7"+
- "\u00d8\7\24\2\2\u00d8\u00da\5$\23\2\u00d9\u00d7\3\2\2\2\u00d9\u00da\3"+
- "\2\2\2\u00da\u0114\3\2\2\2\u00db\u00dd\5\36\20\2\u00dc\u00db\3\2\2\2\u00dd"+
- "\u00e0\3\2\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\u00e1\3\2"+
- "\2\2\u00e0\u00de\3\2\2\2\u00e1\u00e2\7\25\2\2\u00e2\u00e3\7\7\2\2\u00e3"+
- "\u00e4\5,\27\2\u00e4\u00e5\7\b\2\2\u00e5\u00e6\5$\23\2\u00e6\u0114\3\2"+
- "\2\2\u00e7\u00e9\5\36\20\2\u00e8\u00e7\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea"+
- "\u00e8\3\2\2\2\u00ea\u00eb\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ea\3\2"+
- "\2\2\u00ed\u00ee\7\26\2\2\u00ee\u00ef\5$\23\2\u00ef\u00f0\7\25\2\2\u00f0"+
- "\u00f1\7\7\2\2\u00f1\u00f2\5,\27\2\u00f2\u00f3\7\b\2\2\u00f3\u00f4\7\4"+
- "\2\2\u00f4\u0114\3\2\2\2\u00f5\u00f7\5\36\20\2\u00f6\u00f5\3\2\2\2\u00f7"+
- "\u00fa\3\2\2\2\u00f8\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\3\2"+
- "\2\2\u00fa\u00f8\3\2\2\2\u00fb\u00fc\7\27\2\2\u00fc\u00fd\7\7\2\2\u00fd"+
- "\u00fe\5&\24\2\u00fe\u00ff\7\b\2\2\u00ff\u0100\5$\23\2\u0100\u0114\3\2"+
- "\2\2\u0101\u0103\7\30\2\2\u0102\u0104\5,\27\2\u0103\u0102\3\2\2\2\u0103"+
- "\u0104\3\2\2\2\u0104\u0105\3\2\2\2\u0105\u0114\7\4\2\2\u0106\u0107\7\31"+
- "\2\2\u0107\u0114\7\4\2\2\u0108\u0109\7\32\2\2\u0109\u0114\7\4\2\2\u010a"+
- "\u010c\7\33\2\2\u010b\u010d\5\64\33\2\u010c\u010b\3\2\2\2\u010c\u010d"+
- "\3\2\2\2\u010d\u010e\3\2\2\2\u010e\u010f\7\t\2\2\u010f\u0110\58\35\2\u0110"+
- "\u0111\7\n\2\2\u0111\u0114\3\2\2\2\u0112\u0114\5\62\32\2\u0113\u00c7\3"+
- "\2\2\2\u0113\u00ca\3\2\2\2\u0113\u00cf\3\2\2\2\u0113\u00d2\3\2\2\2\u0113"+
- "\u00de\3\2\2\2\u0113\u00ea\3\2\2\2\u0113\u00f8\3\2\2\2\u0113\u0101\3\2"+
- "\2\2\u0113\u0106\3\2\2\2\u0113\u0108\3\2\2\2\u0113\u010a\3\2\2\2\u0113"+
- "\u0112\3\2\2\2\u0114%\3\2\2\2\u0115\u0116\5(\25\2\u0116\u0117\7\4\2\2"+
- "\u0117\u0118\5,\27\2\u0118\u011a\7\4\2\2\u0119\u011b\5,\27\2\u011a\u0119"+
- "\3\2\2\2\u011a\u011b\3\2\2\2\u011b\u0126\3\2\2\2\u011c\u011e\5\16\b\2"+
- "\u011d\u011c\3\2\2\2\u011d\u011e\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120"+
- "\7]\2\2\u0120\u0121\7\34\2\2\u0121\u0122\5.\30\2\u0122\u0123\7\35\2\2"+
- "\u0123\u0124\5.\30\2\u0124\u0126\3\2\2\2\u0125\u0115\3\2\2\2\u0125\u011d"+
- "\3\2\2\2\u0126\'\3\2\2\2\u0127\u0129\5\20\t\2\u0128\u0127\3\2\2\2\u0128"+
- "\u0129\3\2\2\2\u0129\u012c\3\2\2\2\u012a\u012c\5,\27\2\u012b\u0128\3\2"+
- "\2\2\u012b\u012a\3\2\2\2\u012c)\3\2\2\2\u012d\u012e\b\26\1\2\u012e\u012f"+
- "\7\7\2\2\u012f\u0130\5*\26\2\u0130\u0131\7\b\2\2\u0131\u0138\3\2\2\2\u0132"+
- "\u0138\7P\2\2\u0133\u0135\t\2\2\2\u0134\u0136\7P\2\2\u0135\u0134\3\2\2"+
- "\2\u0135\u0136\3\2\2\2\u0136\u0138\3\2\2\2\u0137\u012d\3\2\2\2\u0137\u0132"+
- "\3\2\2\2\u0137\u0133\3\2\2\2\u0138\u0146\3\2\2\2\u0139\u013a\f\5\2\2\u013a"+
- "\u0145\7 \2\2\u013b\u013c\f\4\2\2\u013c\u013e\7!\2\2\u013d\u013f\5.\30"+
- "\2\u013e\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0145"+
- "\7\"\2\2\u0141\u0142\f\3\2\2\u0142\u0143\7\7\2\2\u0143\u0145\7\b\2\2\u0144"+
+ "\3\30\5\30\u01b3\n\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\7\30\u01bd"+
+ "\n\30\f\30\16\30\u01c0\13\30\3\31\3\31\3\31\7\31\u01c5\n\31\f\31\16\31"+
+ "\u01c8\13\31\3\32\3\32\5\32\u01cc\n\32\3\32\3\32\3\33\3\33\3\33\3\33\7"+
+ "\33\u01d4\n\33\f\33\16\33\u01d7\13\33\3\33\3\33\3\34\3\34\3\34\3\34\3"+
+ "\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\5\34\u01e8\n\34\5\34\u01ea"+
+ "\n\34\3\35\7\35\u01ed\n\35\f\35\16\35\u01f0\13\35\3\36\3\36\3\36\5\36"+
+ "\u01f5\n\36\3\37\3\37\3\37\3\37\5\37\u01fb\n\37\3\37\5\37\u01fe\n\37\3"+
+ " \3 \5 \u0202\n \3!\3!\3!\3!\7!\u0208\n!\f!\16!\u020b\13!\3\"\3\"\3\""+
+ "\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3\"\3"+
+ "\"\3\"\3\"\5\"\u0224\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\5#"+
+ "\u0234\n#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\3#\7#\u0242\n#\f#\16#\u0245"+
+ "\13#\3#\2\7\22*,.D$\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60"+
+ "\62\64\668:<>@BD\2\r\3\2\36\37\3\2%&\3\2\'+\3\2\60\61\3\2,-\4\2 ./\3"+
+ "\2\'(\3\2\60\65\3\2;D\4\2\'(\60\61\4\2 ..\2\u0299\2F\3\2\2\2\4J\3\2\2"+
+ "\2\6P\3\2\2\2\bS\3\2\2\2\nW\3\2\2\2\fa\3\2\2\2\16f\3\2\2\2\20p\3\2\2\2"+
+ "\22s\3\2\2\2\24~\3\2\2\2\26\u0083\3\2\2\2\30\u0090\3\2\2\2\32\u009c\3"+
+ "\2\2\2\34\u009e\3\2\2\2\36\u00b4\3\2\2\2 \u00b6\3\2\2\2\"\u00c3\3\2\2"+
+ "\2$\u0113\3\2\2\2&\u0125\3\2\2\2(\u012b\3\2\2\2*\u0137\3\2\2\2,\u0149"+
+ "\3\2\2\2.\u0186\3\2\2\2\60\u01c1\3\2\2\2\62\u01c9\3\2\2\2\64\u01cf\3\2"+
+ "\2\2\66\u01e9\3\2\2\28\u01ee\3\2\2\2:\u01f4\3\2\2\2<\u01fd\3\2\2\2>\u01ff"+
+ "\3\2\2\2@\u0203\3\2\2\2B\u0223\3\2\2\2D\u0233\3\2\2\2FG\5\6\4\2GH\5\n"+
+ "\6\2HI\7\2\2\3I\3\3\2\2\2JK\58\35\2KL\7\2\2\3L\5\3\2\2\2MO\5\b\5\2NM\3"+
+ "\2\2\2OR\3\2\2\2PN\3\2\2\2PQ\3\2\2\2Q\7\3\2\2\2RP\3\2\2\2ST\7\3\2\2TU"+
+ "\7R\2\2U\t\3\2\2\2VX\5\f\7\2WV\3\2\2\2XY\3\2\2\2YW\3\2\2\2YZ\3\2\2\2Z"+
+ "\13\3\2\2\2[\\\5\20\t\2\\]\7\4\2\2]b\3\2\2\2^b\5\26\f\2_b\5\62\32\2`b"+
+ "\5\34\17\2a[\3\2\2\2a^\3\2\2\2a_\3\2\2\2a`\3\2\2\2b\r\3\2\2\2ce\5\36\20"+
+ "\2dc\3\2\2\2eh\3\2\2\2fd\3\2\2\2fg\3\2\2\2gi\3\2\2\2hf\3\2\2\2im\5*\26"+
+ "\2jl\5\36\20\2kj\3\2\2\2lo\3\2\2\2mk\3\2\2\2mn\3\2\2\2n\17\3\2\2\2om\3"+
+ "\2\2\2pq\5\16\b\2qr\5\22\n\2r\21\3\2\2\2st\b\n\1\2tu\5\24\13\2u{\3\2\2"+
+ "\2vw\f\3\2\2wx\7\5\2\2xz\5\24\13\2yv\3\2\2\2z}\3\2\2\2{y\3\2\2\2{|\3\2"+
+ "\2\2|\23\3\2\2\2}{\3\2\2\2~\u0081\7^\2\2\177\u0080\7\6\2\2\u0080\u0082"+
+ "\5.\30\2\u0081\177\3\2\2\2\u0081\u0082\3\2\2\2\u0082\25\3\2\2\2\u0083"+
+ "\u0084\5\16\b\2\u0084\u0085\7^\2\2\u0085\u0087\7\7\2\2\u0086\u0088\5\30"+
+ "\r\2\u0087\u0086\3\2\2\2\u0087\u0088\3\2\2\2\u0088\u0089\3\2\2\2\u0089"+
+ "\u008a\7\b\2\2\u008a\u008c\7\t\2\2\u008b\u008d\5\"\22\2\u008c\u008b\3"+
+ "\2\2\2\u008c\u008d\3\2\2\2\u008d\u008e\3\2\2\2\u008e\u008f\7\n\2\2\u008f"+
+ "\27\3\2\2\2\u0090\u0095\5\32\16\2\u0091\u0092\7\5\2\2\u0092\u0094\5\32"+
+ "\16\2\u0093\u0091\3\2\2\2\u0094\u0097\3\2\2\2\u0095\u0093\3\2\2\2\u0095"+
+ "\u0096\3\2\2\2\u0096\31\3\2\2\2\u0097\u0095\3\2\2\2\u0098\u0099\5\16\b"+
+ "\2\u0099\u009a\7^\2\2\u009a\u009d\3\2\2\2\u009b\u009d\7Q\2\2\u009c\u0098"+
+ "\3\2\2\2\u009c\u009b\3\2\2\2\u009d\33\3\2\2\2\u009e\u009f\5 \21\2\u009f"+
+ "\u00a0\7\4\2\2\u00a0\35\3\2\2\2\u00a1\u00b5\7\13\2\2\u00a2\u00b5\7\f\2"+
+ "\2\u00a3\u00a4\7\r\2\2\u00a4\u00a5\7\7\2\2\u00a5\u00a6\7U\2\2\u00a6\u00b5"+
+ "\7\b\2\2\u00a7\u00a8\7\16\2\2\u00a8\u00a9\7\7\2\2\u00a9\u00aa\7^\2\2\u00aa"+
+ "\u00b5\7\b\2\2\u00ab\u00b5\7\17\2\2\u00ac\u00b5\7\20\2\2\u00ad\u00b1\7"+
+ "\21\2\2\u00ae\u00af\7\7\2\2\u00af\u00b0\7^\2\2\u00b0\u00b2\7\b\2\2\u00b1"+
+ "\u00ae\3\2\2\2\u00b1\u00b2\3\2\2\2\u00b2\u00b5\3\2\2\2\u00b3\u00b5\5 "+
+ "\21\2\u00b4\u00a1\3\2\2\2\u00b4\u00a2\3\2\2\2\u00b4\u00a3\3\2\2\2\u00b4"+
+ "\u00a7\3\2\2\2\u00b4\u00ab\3\2\2\2\u00b4\u00ac\3\2\2\2\u00b4\u00ad\3\2"+
+ "\2\2\u00b4\u00b3\3\2\2\2\u00b5\37\3\2\2\2\u00b6\u00b7\7\22\2\2\u00b7\u00b8"+
+ "\7\7\2\2\u00b8\u00bd\7U\2\2\u00b9\u00ba\7\5\2\2\u00ba\u00bc\7U\2\2\u00bb"+
+ "\u00b9\3\2\2\2\u00bc\u00bf\3\2\2\2\u00bd\u00bb\3\2\2\2\u00bd\u00be\3\2"+
+ "\2\2\u00be\u00c0\3\2\2\2\u00bf\u00bd\3\2\2\2\u00c0\u00c1\7\b\2\2\u00c1"+
+ "!\3\2\2\2\u00c2\u00c4\5$\23\2\u00c3\u00c2\3\2\2\2\u00c4\u00c5\3\2\2\2"+
+ "\u00c5\u00c3\3\2\2\2\u00c5\u00c6\3\2\2\2\u00c6#\3\2\2\2\u00c7\u00c8\5"+
+ "\20\t\2\u00c8\u00c9\7\4\2\2\u00c9\u0114\3\2\2\2\u00ca\u00cc\7\t\2\2\u00cb"+
+ "\u00cd\5\"\22\2\u00cc\u00cb\3\2\2\2\u00cc\u00cd\3\2\2\2\u00cd\u00ce\3"+
+ "\2\2\2\u00ce\u0114\7\n\2\2\u00cf\u00d0\5,\27\2\u00d0\u00d1\7\4\2\2\u00d1"+
+ "\u0114\3\2\2\2\u00d2\u00d3\7\23\2\2\u00d3\u00d4\7\7\2\2\u00d4\u00d5\5"+
+ ",\27\2\u00d5\u00d6\7\b\2\2\u00d6\u00d9\5$\23\2\u00d7\u00d8\7\24\2\2\u00d8"+
+ "\u00da\5$\23\2\u00d9\u00d7\3\2\2\2\u00d9\u00da\3\2\2\2\u00da\u0114\3\2"+
+ "\2\2\u00db\u00dd\5\36\20\2\u00dc\u00db\3\2\2\2\u00dd\u00e0\3\2\2\2\u00de"+
+ "\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\u00e1\3\2\2\2\u00e0\u00de\3\2"+
+ "\2\2\u00e1\u00e2\7\25\2\2\u00e2\u00e3\7\7\2\2\u00e3\u00e4\5,\27\2\u00e4"+
+ "\u00e5\7\b\2\2\u00e5\u00e6\5$\23\2\u00e6\u0114\3\2\2\2\u00e7\u00e9\5\36"+
+ "\20\2\u00e8\u00e7\3\2\2\2\u00e9\u00ec\3\2\2\2\u00ea\u00e8\3\2\2\2\u00ea"+
+ "\u00eb\3\2\2\2\u00eb\u00ed\3\2\2\2\u00ec\u00ea\3\2\2\2\u00ed\u00ee\7\26"+
+ "\2\2\u00ee\u00ef\5$\23\2\u00ef\u00f0\7\25\2\2\u00f0\u00f1\7\7\2\2\u00f1"+
+ "\u00f2\5,\27\2\u00f2\u00f3\7\b\2\2\u00f3\u00f4\7\4\2\2\u00f4\u0114\3\2"+
+ "\2\2\u00f5\u00f7\5\36\20\2\u00f6\u00f5\3\2\2\2\u00f7\u00fa\3\2\2\2\u00f8"+
+ "\u00f6\3\2\2\2\u00f8\u00f9\3\2\2\2\u00f9\u00fb\3\2\2\2\u00fa\u00f8\3\2"+
+ "\2\2\u00fb\u00fc\7\27\2\2\u00fc\u00fd\7\7\2\2\u00fd\u00fe\5&\24\2\u00fe"+
+ "\u00ff\7\b\2\2\u00ff\u0100\5$\23\2\u0100\u0114\3\2\2\2\u0101\u0103\7\30"+
+ "\2\2\u0102\u0104\5,\27\2\u0103\u0102\3\2\2\2\u0103\u0104\3\2\2\2\u0104"+
+ "\u0105\3\2\2\2\u0105\u0114\7\4\2\2\u0106\u0107\7\31\2\2\u0107\u0114\7"+
+ "\4\2\2\u0108\u0109\7\32\2\2\u0109\u0114\7\4\2\2\u010a\u010c\7\33\2\2\u010b"+
+ "\u010d\5\64\33\2\u010c\u010b\3\2\2\2\u010c\u010d\3\2\2\2\u010d\u010e\3"+
+ "\2\2\2\u010e\u010f\7\t\2\2\u010f\u0110\58\35\2\u0110\u0111\7\n\2\2\u0111"+
+ "\u0114\3\2\2\2\u0112\u0114\5\62\32\2\u0113\u00c7\3\2\2\2\u0113\u00ca\3"+
+ "\2\2\2\u0113\u00cf\3\2\2\2\u0113\u00d2\3\2\2\2\u0113\u00de\3\2\2\2\u0113"+
+ "\u00ea\3\2\2\2\u0113\u00f8\3\2\2\2\u0113\u0101\3\2\2\2\u0113\u0106\3\2"+
+ "\2\2\u0113\u0108\3\2\2\2\u0113\u010a\3\2\2\2\u0113\u0112\3\2\2\2\u0114"+
+ "%\3\2\2\2\u0115\u0116\5(\25\2\u0116\u0117\7\4\2\2\u0117\u0118\5,\27\2"+
+ "\u0118\u011a\7\4\2\2\u0119\u011b\5,\27\2\u011a\u0119\3\2\2\2\u011a\u011b"+
+ "\3\2\2\2\u011b\u0126\3\2\2\2\u011c\u011e\5\16\b\2\u011d\u011c\3\2\2\2"+
+ "\u011d\u011e\3\2\2\2\u011e\u011f\3\2\2\2\u011f\u0120\7^\2\2\u0120\u0121"+
+ "\7\34\2\2\u0121\u0122\5.\30\2\u0122\u0123\7\35\2\2\u0123\u0124\5.\30\2"+
+ "\u0124\u0126\3\2\2\2\u0125\u0115\3\2\2\2\u0125\u011d\3\2\2\2\u0126\'\3"+
+ "\2\2\2\u0127\u0129\5\20\t\2\u0128\u0127\3\2\2\2\u0128\u0129\3\2\2\2\u0129"+
+ "\u012c\3\2\2\2\u012a\u012c\5,\27\2\u012b\u0128\3\2\2\2\u012b\u012a\3\2"+
+ "\2\2\u012c)\3\2\2\2\u012d\u012e\b\26\1\2\u012e\u012f\7\7\2\2\u012f\u0130"+
+ "\5*\26\2\u0130\u0131\7\b\2\2\u0131\u0138\3\2\2\2\u0132\u0138\7Q\2\2\u0133"+
+ "\u0135\t\2\2\2\u0134\u0136\7Q\2\2\u0135\u0134\3\2\2\2\u0135\u0136\3\2"+
+ "\2\2\u0136\u0138\3\2\2\2\u0137\u012d\3\2\2\2\u0137\u0132\3\2\2\2\u0137"+
+ "\u0133\3\2\2\2\u0138\u0146\3\2\2\2\u0139\u013a\f\5\2\2\u013a\u0145\7 "+
+ "\2\2\u013b\u013c\f\4\2\2\u013c\u013e\7!\2\2\u013d\u013f\5.\30\2\u013e"+
+ "\u013d\3\2\2\2\u013e\u013f\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0145\7\""+
+ "\2\2\u0141\u0142\f\3\2\2\u0142\u0143\7\7\2\2\u0143\u0145\7\b\2\2\u0144"+
"\u0139\3\2\2\2\u0144\u013b\3\2\2\2\u0144\u0141\3\2\2\2\u0145\u0148\3\2"+
"\2\2\u0146\u0144\3\2\2\2\u0146\u0147\3\2\2\2\u0147+\3\2\2\2\u0148\u0146"+
"\3\2\2\2\u0149\u014a\b\27\1\2\u014a\u014b\5.\30\2\u014b\u0151\3\2\2\2"+
"\u014c\u014d\f\3\2\2\u014d\u014e\7\5\2\2\u014e\u0150\5.\30\2\u014f\u014c"+
"\3\2\2\2\u0150\u0153\3\2\2\2\u0151\u014f\3\2\2\2\u0151\u0152\3\2\2\2\u0152"+
"-\3\2\2\2\u0153\u0151\3\2\2\2\u0154\u0155\b\30\1\2\u0155\u0156\7\7\2\2"+
- "\u0156\u0157\5,\27\2\u0157\u0158\7\b\2\2\u0158\u017f\3\2\2\2\u0159\u015a"+
+ "\u0156\u0157\5,\27\2\u0157\u0158\7\b\2\2\u0158\u0187\3\2\2\2\u0159\u015a"+
"\7#\2\2\u015a\u015d\7\7\2\2\u015b\u015e\5*\26\2\u015c\u015e\5.\30\2\u015d"+
"\u015b\3\2\2\2\u015d\u015c\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0160\7\b"+
- "\2\2\u0160\u017f\3\2\2\2\u0161\u0162\7\7\2\2\u0162\u0163\5*\26\2\u0163"+
- "\u0164\7\b\2\2\u0164\u0165\5.\30\32\u0165\u017f\3\2\2\2\u0166\u0167\t"+
- "\3\2\2\u0167\u017f\5.\30\31\u0168\u0169\7 \2\2\u0169\u017f\5.\30\27\u016a"+
- "\u016b\t\4\2\2\u016b\u017f\5.\30\26\u016c\u016d\t\5\2\2\u016d\u017f\5"+
- ".\30\22\u016e\u016f\7\t\2\2\u016f\u0174\5.\30\2\u0170\u0171\7\5\2\2\u0171"+
- "\u0173\5.\30\2\u0172\u0170\3\2\2\2\u0173\u0176\3\2\2\2\u0174\u0172\3\2"+
- "\2\2\u0174\u0175\3\2\2\2\u0175\u0177\3\2\2\2\u0176\u0174\3\2\2\2\u0177"+
- "\u0178\7\n\2\2\u0178\u017f\3\2\2\2\u0179\u017f\7]\2\2\u017a\u017f\7T\2"+
- "\2\u017b\u017f\7Q\2\2\u017c\u017f\7R\2\2\u017d\u017f\7S\2\2\u017e\u0154"+
- "\3\2\2\2\u017e\u0159\3\2\2\2\u017e\u0161\3\2\2\2\u017e\u0166\3\2\2\2\u017e"+
- "\u0168\3\2\2\2\u017e\u016a\3\2\2\2\u017e\u016c\3\2\2\2\u017e\u016e\3\2"+
- "\2\2\u017e\u0179\3\2\2\2\u017e\u017a\3\2\2\2\u017e\u017b\3\2\2\2\u017e"+
- "\u017c\3\2\2\2\u017e\u017d\3\2\2\2\u017f\u01b6\3\2\2\2\u0180\u0181\f\25"+
- "\2\2\u0181\u0182\t\6\2\2\u0182\u01b5\5.\30\26\u0183\u0184\f\24\2\2\u0184"+
- "\u0185\t\7\2\2\u0185\u01b5\5.\30\25\u0186\u0187\f\23\2\2\u0187\u0188\t"+
- "\b\2\2\u0188\u01b5\5.\30\24\u0189\u018a\f\21\2\2\u018a\u018b\t\t\2\2\u018b"+
- "\u01b5\5.\30\22\u018c\u018d\f\20\2\2\u018d\u018e\7)\2\2\u018e\u01b5\5"+
- ".\30\21\u018f\u0190\f\17\2\2\u0190\u0191\7\65\2\2\u0191\u01b5\5.\30\20"+
- "\u0192\u0193\f\16\2\2\u0193\u0194\7\66\2\2\u0194\u01b5\5.\30\17\u0195"+
- "\u0196\f\r\2\2\u0196\u0197\7\67\2\2\u0197\u01b5\5.\30\16\u0198\u0199\f"+
- "\f\2\2\u0199\u019a\78\2\2\u019a\u01b5\5.\30\r\u019b\u019c\f\13\2\2\u019c"+
- "\u019d\79\2\2\u019d\u019e\5.\30\2\u019e\u019f\7\34\2\2\u019f\u01a0\5."+
- "\30\f\u01a0\u01b5\3\2\2\2\u01a1\u01a2\f\n\2\2\u01a2\u01a3\7\6\2\2\u01a3"+
- "\u01b5\5.\30\n\u01a4\u01a5\f\t\2\2\u01a5\u01a6\t\n\2\2\u01a6\u01b5\5."+
- "\30\t\u01a7\u01a8\f\35\2\2\u01a8\u01aa\7\7\2\2\u01a9\u01ab\5\60\31\2\u01aa"+
- "\u01a9\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ac\3\2\2\2\u01ac\u01b5\7\b"+
- "\2\2\u01ad\u01ae\f\33\2\2\u01ae\u01af\7!\2\2\u01af\u01b0\5,\27\2\u01b0"+
- "\u01b1\7\"\2\2\u01b1\u01b5\3\2\2\2\u01b2\u01b3\f\30\2\2\u01b3\u01b5\t"+
- "\3\2\2\u01b4\u0180\3\2\2\2\u01b4\u0183\3\2\2\2\u01b4\u0186\3\2\2\2\u01b4"+
- "\u0189\3\2\2\2\u01b4\u018c\3\2\2\2\u01b4\u018f\3\2\2\2\u01b4\u0192\3\2"+
- "\2\2\u01b4\u0195\3\2\2\2\u01b4\u0198\3\2\2\2\u01b4\u019b\3\2\2\2\u01b4"+
- "\u01a1\3\2\2\2\u01b4\u01a4\3\2\2\2\u01b4\u01a7\3\2\2\2\u01b4\u01ad\3\2"+
- "\2\2\u01b4\u01b2\3\2\2\2\u01b5\u01b8\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b6"+
- "\u01b7\3\2\2\2\u01b7/\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b9\u01be\5.\30\2"+
- "\u01ba\u01bb\7\5\2\2\u01bb\u01bd\5.\30\2\u01bc\u01ba\3\2\2\2\u01bd\u01c0"+
- "\3\2\2\2\u01be\u01bc\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\61\3\2\2\2\u01c0"+
- "\u01be\3\2\2\2\u01c1\u01c3\7D\2\2\u01c2\u01c4\5\64\33\2\u01c3\u01c2\3"+
- "\2\2\2\u01c3\u01c4\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c6\7O\2\2\u01c6"+
- "\63\3\2\2\2\u01c7\u01c8\7\7\2\2\u01c8\u01cd\5\66\34\2\u01c9\u01ca\7\5"+
- "\2\2\u01ca\u01cc\5\66\34\2\u01cb\u01c9\3\2\2\2\u01cc\u01cf\3\2\2\2\u01cd"+
- "\u01cb\3\2\2\2\u01cd\u01ce\3\2\2\2\u01ce\u01d0\3\2\2\2\u01cf\u01cd\3\2"+
- "\2\2\u01d0\u01d1\7\b\2\2\u01d1\65\3\2\2\2\u01d2\u01d3\7E\2\2\u01d3\u01e2"+
- "\7Q\2\2\u01d4\u01d5\7F\2\2\u01d5\u01e2\7]\2\2\u01d6\u01d7\7G\2\2\u01d7"+
- "\u01e2\7Q\2\2\u01d8\u01d9\7H\2\2\u01d9\u01e2\5.\30\2\u01da\u01db\7I\2"+
- "\2\u01db\u01e2\5.\30\2\u01dc\u01df\7J\2\2\u01dd\u01e0\7\17\2\2\u01de\u01e0"+
- "\5.\30\2\u01df\u01dd\3\2\2\2\u01df\u01de\3\2\2\2\u01e0\u01e2\3\2\2\2\u01e1"+
- "\u01d2\3\2\2\2\u01e1\u01d4\3\2\2\2\u01e1\u01d6\3\2\2\2\u01e1\u01d8\3\2"+
- "\2\2\u01e1\u01da\3\2\2\2\u01e1\u01dc\3\2\2\2\u01e2\67\3\2\2\2\u01e3\u01e5"+
- "\5:\36\2\u01e4\u01e3\3\2\2\2\u01e5\u01e8\3\2\2\2\u01e6\u01e4\3\2\2\2\u01e6"+
- "\u01e7\3\2\2\2\u01e79\3\2\2\2\u01e8\u01e6\3\2\2\2\u01e9\u01ed\5<\37\2"+
- "\u01ea\u01ed\5> \2\u01eb\u01ed\5@!\2\u01ec\u01e9\3\2\2\2\u01ec\u01ea\3"+
- "\2\2\2\u01ec\u01eb\3\2\2\2\u01ed;\3\2\2\2\u01ee\u01ef\7]\2\2\u01ef\u01f6"+
- "\7\34\2\2\u01f0\u01f2\7(\2\2\u01f1\u01f3\7]\2\2\u01f2\u01f1\3\2\2\2\u01f2"+
- "\u01f3\3\2\2\2\u01f3\u01f4\3\2\2\2\u01f4\u01f6\7\34\2\2\u01f5\u01ee\3"+
- "\2\2\2\u01f5\u01f0\3\2\2\2\u01f6=\3\2\2\2\u01f7\u01f9\7N\2\2\u01f8\u01fa"+
- "\5B\"\2\u01f9\u01f8\3\2\2\2\u01f9\u01fa\3\2\2\2\u01fa?\3\2\2\2\u01fb\u01fc"+
- "\7K\2\2\u01fc\u0201\5D#\2\u01fd\u01fe\7\5\2\2\u01fe\u0200\5D#\2\u01ff"+
- "\u01fd\3\2\2\2\u0200\u0203\3\2\2\2\u0201\u01ff\3\2\2\2\u0201\u0202\3\2"+
- "\2\2\u0202A\3\2\2\2\u0203\u0201\3\2\2\2\u0204\u021c\5D#\2\u0205\u0206"+
- "\7L\2\2\u0206\u021c\5D#\2\u0207\u0208\5D#\2\u0208\u0209\7\5\2\2\u0209"+
- "\u020a\7]\2\2\u020a\u021c\3\2\2\2\u020b\u020c\7\7\2\2\u020c\u020d\5D#"+
- "\2\u020d\u020e\7\b\2\2\u020e\u020f\7\5\2\2\u020f\u0210\7]\2\2\u0210\u021c"+
- "\3\2\2\2\u0211\u0212\7\7\2\2\u0212\u0213\5D#\2\u0213\u0214\7\5\2\2\u0214"+
- "\u0215\7]\2\2\u0215\u0216\7\b\2\2\u0216\u021c\3\2\2\2\u0217\u0218\7\7"+
- "\2\2\u0218\u0219\5D#\2\u0219\u021a\7\b\2\2\u021a\u021c\3\2\2\2\u021b\u0204"+
- "\3\2\2\2\u021b\u0205\3\2\2\2\u021b\u0207\3\2\2\2\u021b\u020b\3\2\2\2\u021b"+
- "\u0211\3\2\2\2\u021b\u0217\3\2\2\2\u021cC\3\2\2\2\u021d\u021e\b#\1\2\u021e"+
- "\u021f\7!\2\2\u021f\u0220\5D#\2\u0220\u0221\7\"\2\2\u0221\u022c\3\2\2"+
- "\2\u0222\u0223\t\13\2\2\u0223\u022c\5D#\n\u0224\u022c\7]\2\2\u0225\u022c"+
- "\7^\2\2\u0226\u0227\7\t\2\2\u0227\u0228\7]\2\2\u0228\u022c\7\n\2\2\u0229"+
- "\u022c\7T\2\2\u022a\u022c\7R\2\2\u022b\u021d\3\2\2\2\u022b\u0222\3\2\2"+
- "\2\u022b\u0224\3\2\2\2\u022b\u0225\3\2\2\2\u022b\u0226\3\2\2\2\u022b\u0229"+
- "\3\2\2\2\u022b\u022a\3\2\2\2\u022c\u023b\3\2\2\2\u022d\u022e\f\f\2\2\u022e"+
- "\u022f\7M\2\2\u022f\u023a\5D#\r\u0230\u0231\f\13\2\2\u0231\u0232\t\6\2"+
- "\2\u0232\u023a\5D#\f\u0233\u0234\f\t\2\2\u0234\u0235\t\f\2\2\u0235\u023a"+
- "\5D#\n\u0236\u0237\f\b\2\2\u0237\u0238\t\b\2\2\u0238\u023a\5D#\t\u0239"+
- "\u022d\3\2\2\2\u0239\u0230\3\2\2\2\u0239\u0233\3\2\2\2\u0239\u0236\3\2"+
- "\2\2\u023a\u023d\3\2\2\2\u023b\u0239\3\2\2\2\u023b\u023c\3\2\2\2\u023c"+
- "E\3\2\2\2\u023d\u023b\3\2\2\29PYafm{\u0081\u0087\u008c\u0095\u009c\u00b1"+
+ "\2\2\u0160\u0187\3\2\2\2\u0161\u0162\7$\2\2\u0162\u0165\7\7\2\2\u0163"+
+ "\u0166\5*\26\2\u0164\u0166\5.\30\2\u0165\u0163\3\2\2\2\u0165\u0164\3\2"+
+ "\2\2\u0166\u0167\3\2\2\2\u0167\u0168\7\b\2\2\u0168\u0187\3\2\2\2\u0169"+
+ "\u016a\7\7\2\2\u016a\u016b\5*\26\2\u016b\u016c\7\b\2\2\u016c\u016d\5."+
+ "\30\32\u016d\u0187\3\2\2\2\u016e\u016f\t\3\2\2\u016f\u0187\5.\30\31\u0170"+
+ "\u0171\7 \2\2\u0171\u0187\5.\30\27\u0172\u0173\t\4\2\2\u0173\u0187\5."+
+ "\30\26\u0174\u0175\t\5\2\2\u0175\u0187\5.\30\22\u0176\u0177\7\t\2\2\u0177"+
+ "\u017c\5.\30\2\u0178\u0179\7\5\2\2\u0179\u017b\5.\30\2\u017a\u0178\3\2"+
+ "\2\2\u017b\u017e\3\2\2\2\u017c\u017a\3\2\2\2\u017c\u017d\3\2\2\2\u017d"+
+ "\u017f\3\2\2\2\u017e\u017c\3\2\2\2\u017f\u0180\7\n\2\2\u0180\u0187\3\2"+
+ "\2\2\u0181\u0187\7^\2\2\u0182\u0187\7U\2\2\u0183\u0187\7R\2\2\u0184\u0187"+
+ "\7S\2\2\u0185\u0187\7T\2\2\u0186\u0154\3\2\2\2\u0186\u0159\3\2\2\2\u0186"+
+ "\u0161\3\2\2\2\u0186\u0169\3\2\2\2\u0186\u016e\3\2\2\2\u0186\u0170\3\2"+
+ "\2\2\u0186\u0172\3\2\2\2\u0186\u0174\3\2\2\2\u0186\u0176\3\2\2\2\u0186"+
+ "\u0181\3\2\2\2\u0186\u0182\3\2\2\2\u0186\u0183\3\2\2\2\u0186\u0184\3\2"+
+ "\2\2\u0186\u0185\3\2\2\2\u0187\u01be\3\2\2\2\u0188\u0189\f\25\2\2\u0189"+
+ "\u018a\t\6\2\2\u018a\u01bd\5.\30\26\u018b\u018c\f\24\2\2\u018c\u018d\t"+
+ "\7\2\2\u018d\u01bd\5.\30\25\u018e\u018f\f\23\2\2\u018f\u0190\t\b\2\2\u0190"+
+ "\u01bd\5.\30\24\u0191\u0192\f\21\2\2\u0192\u0193\t\t\2\2\u0193\u01bd\5"+
+ ".\30\22\u0194\u0195\f\20\2\2\u0195\u0196\7*\2\2\u0196\u01bd\5.\30\21\u0197"+
+ "\u0198\f\17\2\2\u0198\u0199\7\66\2\2\u0199\u01bd\5.\30\20\u019a\u019b"+
+ "\f\16\2\2\u019b\u019c\7\67\2\2\u019c\u01bd\5.\30\17\u019d\u019e\f\r\2"+
+ "\2\u019e\u019f\78\2\2\u019f\u01bd\5.\30\16\u01a0\u01a1\f\f\2\2\u01a1\u01a2"+
+ "\79\2\2\u01a2\u01bd\5.\30\r\u01a3\u01a4\f\13\2\2\u01a4\u01a5\7:\2\2\u01a5"+
+ "\u01a6\5.\30\2\u01a6\u01a7\7\34\2\2\u01a7\u01a8\5.\30\f\u01a8\u01bd\3"+
+ "\2\2\2\u01a9\u01aa\f\n\2\2\u01aa\u01ab\7\6\2\2\u01ab\u01bd\5.\30\n\u01ac"+
+ "\u01ad\f\t\2\2\u01ad\u01ae\t\n\2\2\u01ae\u01bd\5.\30\t\u01af\u01b0\f\36"+
+ "\2\2\u01b0\u01b2\7\7\2\2\u01b1\u01b3\5\60\31\2\u01b2\u01b1\3\2\2\2\u01b2"+
+ "\u01b3\3\2\2\2\u01b3\u01b4\3\2\2\2\u01b4\u01bd\7\b\2\2\u01b5\u01b6\f\33"+
+ "\2\2\u01b6\u01b7\7!\2\2\u01b7\u01b8\5,\27\2\u01b8\u01b9\7\"\2\2\u01b9"+
+ "\u01bd\3\2\2\2\u01ba\u01bb\f\30\2\2\u01bb\u01bd\t\3\2\2\u01bc\u0188\3"+
+ "\2\2\2\u01bc\u018b\3\2\2\2\u01bc\u018e\3\2\2\2\u01bc\u0191\3\2\2\2\u01bc"+
+ "\u0194\3\2\2\2\u01bc\u0197\3\2\2\2\u01bc\u019a\3\2\2\2\u01bc\u019d\3\2"+
+ "\2\2\u01bc\u01a0\3\2\2\2\u01bc\u01a3\3\2\2\2\u01bc\u01a9\3\2\2\2\u01bc"+
+ "\u01ac\3\2\2\2\u01bc\u01af\3\2\2\2\u01bc\u01b5\3\2\2\2\u01bc\u01ba\3\2"+
+ "\2\2\u01bd\u01c0\3\2\2\2\u01be\u01bc\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf"+
+ "/\3\2\2\2\u01c0\u01be\3\2\2\2\u01c1\u01c6\5.\30\2\u01c2\u01c3\7\5\2\2"+
+ "\u01c3\u01c5\5.\30\2\u01c4\u01c2\3\2\2\2\u01c5\u01c8\3\2\2\2\u01c6\u01c4"+
+ "\3\2\2\2\u01c6\u01c7\3\2\2\2\u01c7\61\3\2\2\2\u01c8\u01c6\3\2\2\2\u01c9"+
+ "\u01cb\7E\2\2\u01ca\u01cc\5\64\33\2\u01cb\u01ca\3\2\2\2\u01cb\u01cc\3"+
+ "\2\2\2\u01cc\u01cd\3\2\2\2\u01cd\u01ce\7P\2\2\u01ce\63\3\2\2\2\u01cf\u01d0"+
+ "\7\7\2\2\u01d0\u01d5\5\66\34\2\u01d1\u01d2\7\5\2\2\u01d2\u01d4\5\66\34"+
+ "\2\u01d3\u01d1\3\2\2\2\u01d4\u01d7\3\2\2\2\u01d5\u01d3\3\2\2\2\u01d5\u01d6"+
+ "\3\2\2\2\u01d6\u01d8\3\2\2\2\u01d7\u01d5\3\2\2\2\u01d8\u01d9\7\b\2\2\u01d9"+
+ "\65\3\2\2\2\u01da\u01db\7F\2\2\u01db\u01ea\7R\2\2\u01dc\u01dd\7G\2\2\u01dd"+
+ "\u01ea\7^\2\2\u01de\u01df\7H\2\2\u01df\u01ea\7R\2\2\u01e0\u01e1\7I\2\2"+
+ "\u01e1\u01ea\5.\30\2\u01e2\u01e3\7J\2\2\u01e3\u01ea\5.\30\2\u01e4\u01e7"+
+ "\7K\2\2\u01e5\u01e8\7\17\2\2\u01e6\u01e8\5.\30\2\u01e7\u01e5\3\2\2\2\u01e7"+
+ "\u01e6\3\2\2\2\u01e8\u01ea\3\2\2\2\u01e9\u01da\3\2\2\2\u01e9\u01dc\3\2"+
+ "\2\2\u01e9\u01de\3\2\2\2\u01e9\u01e0\3\2\2\2\u01e9\u01e2\3\2\2\2\u01e9"+
+ "\u01e4\3\2\2\2\u01ea\67\3\2\2\2\u01eb\u01ed\5:\36\2\u01ec\u01eb\3\2\2"+
+ "\2\u01ed\u01f0\3\2\2\2\u01ee\u01ec\3\2\2\2\u01ee\u01ef\3\2\2\2\u01ef9"+
+ "\3\2\2\2\u01f0\u01ee\3\2\2\2\u01f1\u01f5\5<\37\2\u01f2\u01f5\5> \2\u01f3"+
+ "\u01f5\5@!\2\u01f4\u01f1\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4\u01f3\3\2\2"+
+ "\2\u01f5;\3\2\2\2\u01f6\u01f7\7^\2\2\u01f7\u01fe\7\34\2\2\u01f8\u01fa"+
+ "\7)\2\2\u01f9\u01fb\7^\2\2\u01fa\u01f9\3\2\2\2\u01fa\u01fb\3\2\2\2\u01fb"+
+ "\u01fc\3\2\2\2\u01fc\u01fe\7\34\2\2\u01fd\u01f6\3\2\2\2\u01fd\u01f8\3"+
+ "\2\2\2\u01fe=\3\2\2\2\u01ff\u0201\7O\2\2\u0200\u0202\5B\"\2\u0201\u0200"+
+ "\3\2\2\2\u0201\u0202\3\2\2\2\u0202?\3\2\2\2\u0203\u0204\7L\2\2\u0204\u0209"+
+ "\5D#\2\u0205\u0206\7\5\2\2\u0206\u0208\5D#\2\u0207\u0205\3\2\2\2\u0208"+
+ "\u020b\3\2\2\2\u0209\u0207\3\2\2\2\u0209\u020a\3\2\2\2\u020aA\3\2\2\2"+
+ "\u020b\u0209\3\2\2\2\u020c\u0224\5D#\2\u020d\u020e\7M\2\2\u020e\u0224"+
+ "\5D#\2\u020f\u0210\5D#\2\u0210\u0211\7\5\2\2\u0211\u0212\7^\2\2\u0212"+
+ "\u0224\3\2\2\2\u0213\u0214\7\7\2\2\u0214\u0215\5D#\2\u0215\u0216\7\b\2"+
+ "\2\u0216\u0217\7\5\2\2\u0217\u0218\7^\2\2\u0218\u0224\3\2\2\2\u0219\u021a"+
+ "\7\7\2\2\u021a\u021b\5D#\2\u021b\u021c\7\5\2\2\u021c\u021d\7^\2\2\u021d"+
+ "\u021e\7\b\2\2\u021e\u0224\3\2\2\2\u021f\u0220\7\7\2\2\u0220\u0221\5D"+
+ "#\2\u0221\u0222\7\b\2\2\u0222\u0224\3\2\2\2\u0223\u020c\3\2\2\2\u0223"+
+ "\u020d\3\2\2\2\u0223\u020f\3\2\2\2\u0223\u0213\3\2\2\2\u0223\u0219\3\2"+
+ "\2\2\u0223\u021f\3\2\2\2\u0224C\3\2\2\2\u0225\u0226\b#\1\2\u0226\u0227"+
+ "\7!\2\2\u0227\u0228\5D#\2\u0228\u0229\7\"\2\2\u0229\u0234\3\2\2\2\u022a"+
+ "\u022b\t\13\2\2\u022b\u0234\5D#\n\u022c\u0234\7^\2\2\u022d\u0234\7_\2"+
+ "\2\u022e\u022f\7\t\2\2\u022f\u0230\7^\2\2\u0230\u0234\7\n\2\2\u0231\u0234"+
+ "\7U\2\2\u0232\u0234\7S\2\2\u0233\u0225\3\2\2\2\u0233\u022a\3\2\2\2\u0233"+
+ "\u022c\3\2\2\2\u0233\u022d\3\2\2\2\u0233\u022e\3\2\2\2\u0233\u0231\3\2"+
+ "\2\2\u0233\u0232\3\2\2\2\u0234\u0243\3\2\2\2\u0235\u0236\f\f\2\2\u0236"+
+ "\u0237\7N\2\2\u0237\u0242\5D#\r\u0238\u0239\f\13\2\2\u0239\u023a\t\6\2"+
+ "\2\u023a\u0242\5D#\f\u023b\u023c\f\t\2\2\u023c\u023d\t\f\2\2\u023d\u0242"+
+ "\5D#\n\u023e\u023f\f\b\2\2\u023f\u0240\t\b\2\2\u0240\u0242\5D#\t\u0241"+
+ "\u0235\3\2\2\2\u0241\u0238\3\2\2\2\u0241\u023b\3\2\2\2\u0241\u023e\3\2"+
+ "\2\2\u0242\u0245\3\2\2\2\u0243\u0241\3\2\2\2\u0243\u0244\3\2\2\2\u0244"+
+ "E\3\2\2\2\u0245\u0243\3\2\2\2:PYafm{\u0081\u0087\u008c\u0095\u009c\u00b1"+
"\u00b4\u00bd\u00c5\u00cc\u00d9\u00de\u00ea\u00f8\u0103\u010c\u0113\u011a"+
- "\u011d\u0125\u0128\u012b\u0135\u0137\u013e\u0144\u0146\u0151\u015d\u0174"+
- "\u017e\u01aa\u01b4\u01b6\u01be\u01c3\u01cd\u01df\u01e1\u01e6\u01ec\u01f2"+
- "\u01f5\u01f9\u0201\u021b\u022b\u0239\u023b";
+ "\u011d\u0125\u0128\u012b\u0135\u0137\u013e\u0144\u0146\u0151\u015d\u0165"+
+ "\u017c\u0186\u01b2\u01bc\u01be\u01c6\u01cb\u01d5\u01e7\u01e9\u01ee\u01f4"+
+ "\u01fa\u01fd\u0201\u0209\u0223\u0233\u0241\u0243";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {
diff --git a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
index d06001a66..84d1ddcb7 100644
--- a/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
+++ b/src/main/java/dk/camelot64/kickc/parser/KickCVisitor.java
@@ -359,6 +359,13 @@ public interface KickCVisitor extends ParseTreeVisitor {
* @return the visitor result
*/
T visitExprBinary(KickCParser.ExprBinaryContext ctx);
+ /**
+ * Visit a parse tree produced by the {@code exprTypeId}
+ * labeled alternative in {@link KickCParser#expr}.
+ * @param ctx the parse tree
+ * @return the visitor result
+ */
+ T visitExprTypeId(KickCParser.ExprTypeIdContext ctx);
/**
* Visit a parse tree produced by the {@code exprPostMod}
* labeled alternative in {@link KickCParser#expr}.
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java
index 6e32acac4..d060c9682 100644
--- a/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass0GenerateStatementSequence.java
@@ -6,6 +6,7 @@ import dk.camelot64.kickc.asm.AsmClobber;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.operators.Operator;
import dk.camelot64.kickc.model.operators.OperatorSizeOf;
+import dk.camelot64.kickc.model.operators.OperatorTypeId;
import dk.camelot64.kickc.model.operators.Operators;
import dk.camelot64.kickc.model.statements.*;
import dk.camelot64.kickc.model.symbols.*;
@@ -1238,6 +1239,23 @@ public class Pass0GenerateStatementSequence extends KickCBaseVisitor {
}
}
+ @Override
+ public Object visitExprTypeId(KickCParser.ExprTypeIdContext ctx) {
+ if(ctx.typeDecl()!=null) {
+ // typeid(type) - add directly
+ SymbolType type = (SymbolType) this.visit(ctx.typeDecl());
+ return OperatorTypeId.getTypeIdConstantVar(program.getScope(), type);
+ } else {
+ // typeid(expression) - add a unary expression to be resolved later
+ RValue child = (RValue) this.visit(ctx.expr());
+ VariableIntermediate tmpVar = getCurrentScope().addVariableIntermediate();
+ VariableRef tmpVarRef = tmpVar.getRef();
+ Statement stmt = new StatementAssignment(tmpVarRef, Operators.TYPEID, child, new StatementSource(ctx), ensureUnusedComments(getCommentsSymbol(ctx)));
+ sequence.addStatement(stmt);
+ return tmpVarRef;
+ }
+ }
+
@Override
public Object visitExprCall(KickCParser.ExprCallContext ctx) {
List parameters;
diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1TypeIdSimplification.java b/src/main/java/dk/camelot64/kickc/passes/Pass1TypeIdSimplification.java
new file mode 100644
index 000000000..736cb21ca
--- /dev/null
+++ b/src/main/java/dk/camelot64/kickc/passes/Pass1TypeIdSimplification.java
@@ -0,0 +1,44 @@
+package dk.camelot64.kickc.passes;
+
+import dk.camelot64.kickc.model.ControlFlowBlock;
+import dk.camelot64.kickc.model.Program;
+import dk.camelot64.kickc.model.operators.OperatorTypeId;
+import dk.camelot64.kickc.model.operators.Operators;
+import dk.camelot64.kickc.model.statements.Statement;
+import dk.camelot64.kickc.model.statements.StatementAssignment;
+import dk.camelot64.kickc.model.types.SymbolType;
+import dk.camelot64.kickc.model.types.SymbolTypeInference;
+import dk.camelot64.kickc.model.values.ConstantRef;
+import dk.camelot64.kickc.model.values.RValue;
+
+/**
+ * Converts typeid() operators to constants
+ */
+public class Pass1TypeIdSimplification extends Pass1Base {
+
+ public Pass1TypeIdSimplification(Program program) {
+ super(program);
+ }
+
+ @Override
+ public boolean step() {
+ boolean modified = false;
+ for(ControlFlowBlock block : getGraph().getAllBlocks()) {
+ for(Statement statement : block.getStatements()) {
+ if(statement instanceof StatementAssignment) {
+ StatementAssignment assignment = (StatementAssignment) statement;
+ if(Operators.TYPEID.equals(assignment.getOperator())) {
+ RValue rValue = assignment.getrValue2();
+ SymbolType symbolType = SymbolTypeInference.inferType(getScope(), rValue);
+ getLog().append("Resolving typeid() " + assignment.toString(getProgram(), false));
+ ConstantRef typeIDConstantVar = OperatorTypeId.getTypeIdConstantVar(getScope(), symbolType);
+ assignment.setrValue2(typeIDConstantVar);
+ assignment.setOperator(null);
+ modified = true;
+ }
+ }
+ }
+ }
+ return modified;
+ }
+}
diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
index 9fb33fed3..f68487357 100644
--- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
+++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java
@@ -37,6 +37,16 @@ public class TestPrograms {
// compileAndCompare("pointer-cast-3");
//}
+ @Test
+ public void testTypeIdSimple() throws IOException, URISyntaxException {
+ compileAndCompare("typeid-simple");
+ }
+
+ @Test
+ public void testTypeIdPlusBytes() throws IOException, URISyntaxException {
+ compileAndCompare("typeid-plus-bytes");
+ }
+
@Test
public void testTypeSigned() throws IOException, URISyntaxException {
compileAndCompare("type-signed");
diff --git a/src/test/kc/typeid-plus-bytes.kc b/src/test/kc/typeid-plus-bytes.kc
new file mode 100644
index 000000000..b6493b12d
--- /dev/null
+++ b/src/test/kc/typeid-plus-bytes.kc
@@ -0,0 +1,36 @@
+// Test that plus creates the expected type for all legal combinations of bytes (signed/unsigned - constant/variable)
+
+const byte* SCREEN = $400;
+byte idx = 0;
+
+void main() {
+ idx = 0;
+ testUnsigned();
+ idx = $28;
+ testSigned();
+}
+
+
+void testUnsigned() {
+ volatile unsigned byte ubv1 = 91;
+ SCREEN[idx++] = typeid(123);
+ SCREEN[idx++] = typeid(ubv1);
+ SCREEN[idx++] = typeid(121+71);
+ SCREEN[idx++] = typeid(ubv1+12);
+ SCREEN[idx++] = typeid(21+ubv1);
+ SCREEN[idx++] = typeid(ubv1+ubv1);
+}
+
+void testSigned() {
+ volatile signed byte sbv1 = 19;
+ SCREEN[idx++] = typeid(-12);
+ SCREEN[idx++] = typeid(sbv1);
+ SCREEN[idx++] = typeid(-41+-12);
+ SCREEN[idx++] = typeid(-41+12);
+ SCREEN[idx++] = typeid(-14+sbv1);
+ SCREEN[idx++] = typeid(sbv1+-31);
+ SCREEN[idx++] = typeid(sbv1+31);
+ SCREEN[idx++] = typeid(sbv1+sbv1);
+}
+
+
diff --git a/src/test/kc/typeid-simple.kc b/src/test/kc/typeid-simple.kc
new file mode 100644
index 000000000..48f6b5796
--- /dev/null
+++ b/src/test/kc/typeid-simple.kc
@@ -0,0 +1,26 @@
+// Test typeid() of the different types
+void main() {
+ const byte* SCREEN = $400;
+ byte idx = 0;
+ // Simple types
+ SCREEN[idx++] = typeid(void);
+ SCREEN[idx++] = typeid(byte);
+ SCREEN[idx++] = typeid(signed byte);
+ SCREEN[idx++] = typeid(word);
+ SCREEN[idx++] = typeid(signed word);
+ SCREEN[idx++] = typeid(dword);
+ SCREEN[idx++] = typeid(signed dword);
+ SCREEN[idx++] = typeid(bool);
+ // Pointer types
+ SCREEN[idx++] = typeid(byte*);
+ SCREEN[idx++] = typeid(signed byte*);
+ SCREEN[idx++] = typeid(word*);
+ SCREEN[idx++] = typeid(signed word*);
+ SCREEN[idx++] = typeid(dword*);
+ SCREEN[idx++] = typeid(signed dword*);
+ SCREEN[idx++] = typeid(bool*);
+ // Pointer to procedure
+ SCREEN[idx++] = typeid(byte()*);
+ // Pointer to pointer
+ SCREEN[idx++] = typeid(byte**);
+}
diff --git a/src/test/ref/typeid-plus-bytes.asm b/src/test/ref/typeid-plus-bytes.asm
new file mode 100644
index 000000000..3678d2e5c
--- /dev/null
+++ b/src/test/ref/typeid-plus-bytes.asm
@@ -0,0 +1,40 @@
+// Test that plus creates the expected type for all legal combinations of bytes (signed/unsigned - constant/variable)
+.pc = $801 "Basic"
+:BasicUpstart(main)
+.pc = $80d "Program"
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .label SCREEN = $400
+main: {
+ jsr testUnsigned
+ jsr testSigned
+ rts
+}
+testSigned: {
+ .label sbv1 = 3
+ lda #$13
+ sta sbv1
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$28
+ sta SCREEN+$29
+ sta SCREEN+$2a
+ sta SCREEN+$2b
+ sta SCREEN+$2c
+ sta SCREEN+$2d
+ sta SCREEN+$2e
+ sta SCREEN+$2f
+ rts
+}
+testUnsigned: {
+ .label ubv1 = 2
+ lda #$5b
+ sta ubv1
+ lda #TYPEID_BYTE
+ sta SCREEN
+ sta SCREEN+1
+ sta SCREEN+2
+ sta SCREEN+3
+ sta SCREEN+4
+ sta SCREEN+5
+ rts
+}
diff --git a/src/test/ref/typeid-plus-bytes.cfg b/src/test/ref/typeid-plus-bytes.cfg
new file mode 100644
index 000000000..08fe3cd8c
--- /dev/null
+++ b/src/test/ref/typeid-plus-bytes.cfg
@@ -0,0 +1,46 @@
+@begin: scope:[] from
+ [0] phi()
+ to:@1
+@1: scope:[] from @begin
+ [1] phi()
+ [2] call main
+ to:@end
+@end: scope:[] from @1
+ [3] phi()
+main: scope:[main] from @1
+ [4] phi()
+ [5] call testUnsigned
+ to:main::@1
+main::@1: scope:[main] from main
+ [6] phi()
+ [7] call testSigned
+ to:main::@return
+main::@return: scope:[main] from main::@1
+ [8] return
+ to:@return
+testSigned: scope:[testSigned] from main::@1
+ [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13
+ [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE
+ [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE
+ [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE
+ [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE
+ [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE
+ [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE
+ [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE
+ [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE
+ to:testSigned::@return
+testSigned::@return: scope:[testSigned] from testSigned
+ [18] return
+ to:@return
+testUnsigned: scope:[testUnsigned] from main
+ [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b
+ [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE
+ [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE
+ [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE
+ [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE
+ [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE
+ [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE
+ to:testUnsigned::@return
+testUnsigned::@return: scope:[testUnsigned] from testUnsigned
+ [26] return
+ to:@return
diff --git a/src/test/ref/typeid-plus-bytes.log b/src/test/ref/typeid-plus-bytes.log
new file mode 100644
index 000000000..50e29a4f1
--- /dev/null
+++ b/src/test/ref/typeid-plus-bytes.log
@@ -0,0 +1,811 @@
+Resolving typeid() (byte~) testUnsigned::$0 ← typeid (byte/signed byte/word/signed word/dword/signed dword) $7b
+Resolving typeid() (byte~) testUnsigned::$1 ← typeid (byte) testUnsigned::ubv1
+Resolving typeid() (byte~) testUnsigned::$3 ← typeid (byte/word/signed word/dword/signed dword~) testUnsigned::$2
+Resolving typeid() (byte~) testUnsigned::$5 ← typeid (byte/signed word/word/dword/signed dword~) testUnsigned::$4
+Resolving typeid() (byte~) testUnsigned::$7 ← typeid (byte/signed word/word/dword/signed dword~) testUnsigned::$6
+Resolving typeid() (byte~) testUnsigned::$9 ← typeid (byte~) testUnsigned::$8
+Resolving typeid() (byte~) testSigned::$1 ← typeid (signed byte/signed word/signed dword~) testSigned::$0
+Resolving typeid() (byte~) testSigned::$2 ← typeid (signed byte) testSigned::sbv1
+Resolving typeid() (byte~) testSigned::$6 ← typeid (signed byte/signed word/signed dword~) testSigned::$5
+Resolving typeid() (byte~) testSigned::$9 ← typeid (signed word/signed byte/signed dword~) testSigned::$8
+Resolving typeid() (byte~) testSigned::$12 ← typeid (signed byte/signed word/signed dword~) testSigned::$11
+Resolving typeid() (byte~) testSigned::$15 ← typeid (signed byte/signed word/signed dword~) testSigned::$14
+Resolving typeid() (byte~) testSigned::$17 ← typeid (signed word/signed byte/signed dword~) testSigned::$16
+Resolving typeid() (byte~) testSigned::$19 ← typeid (signed byte~) testSigned::$18
+
+CONTROL FLOW GRAPH SSA
+@begin: scope:[] from
+ (byte*) SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
+ (byte) idx#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
+ to:@3
+main: scope:[main] from @3
+ (byte) idx#1 ← (byte/signed byte/word/signed word/dword/signed dword) 0
+ call testUnsigned
+ to:main::@1
+main::@1: scope:[main] from main
+ (byte) idx#23 ← phi( main/(byte) idx#12 )
+ (byte) idx#2 ← (byte) idx#23
+ (byte) idx#3 ← (byte/signed byte/word/signed word/dword/signed dword) $28
+ call testSigned
+ to:main::@2
+main::@2: scope:[main] from main::@1
+ (byte) idx#24 ← phi( main::@1/(byte) idx#21 )
+ (byte) idx#4 ← (byte) idx#24
+ to:main::@return
+main::@return: scope:[main] from main::@2
+ (byte) idx#25 ← phi( main::@2/(byte) idx#4 )
+ (byte) idx#5 ← (byte) idx#25
+ return
+ to:@return
+testUnsigned: scope:[testUnsigned] from main
+ (byte) idx#26 ← phi( main/(byte) idx#1 )
+ (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b
+ (byte~) testUnsigned::$0 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#26) ← (byte~) testUnsigned::$0
+ (byte) idx#6 ← ++ (byte) idx#26
+ (byte~) testUnsigned::$1 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#6) ← (byte~) testUnsigned::$1
+ (byte) idx#7 ← ++ (byte) idx#6
+ (byte~) testUnsigned::$3 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#7) ← (byte~) testUnsigned::$3
+ (byte) idx#8 ← ++ (byte) idx#7
+ (byte~) testUnsigned::$5 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#8) ← (byte~) testUnsigned::$5
+ (byte) idx#9 ← ++ (byte) idx#8
+ (byte~) testUnsigned::$7 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#9) ← (byte~) testUnsigned::$7
+ (byte) idx#10 ← ++ (byte) idx#9
+ (byte~) testUnsigned::$9 ← (const byte) TYPEID_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#10) ← (byte~) testUnsigned::$9
+ (byte) idx#11 ← ++ (byte) idx#10
+ to:testUnsigned::@return
+testUnsigned::@return: scope:[testUnsigned] from testUnsigned
+ (byte) idx#27 ← phi( testUnsigned/(byte) idx#11 )
+ (byte) idx#12 ← (byte) idx#27
+ return
+ to:@return
+testSigned: scope:[testSigned] from main::@1
+ (byte) idx#28 ← phi( main::@1/(byte) idx#3 )
+ (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13
+ (byte~) testSigned::$1 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#28) ← (byte~) testSigned::$1
+ (byte) idx#13 ← ++ (byte) idx#28
+ (byte~) testSigned::$2 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#13) ← (byte~) testSigned::$2
+ (byte) idx#14 ← ++ (byte) idx#13
+ (byte~) testSigned::$6 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#14) ← (byte~) testSigned::$6
+ (byte) idx#15 ← ++ (byte) idx#14
+ (byte~) testSigned::$9 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#15) ← (byte~) testSigned::$9
+ (byte) idx#16 ← ++ (byte) idx#15
+ (byte~) testSigned::$12 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#16) ← (byte~) testSigned::$12
+ (byte) idx#17 ← ++ (byte) idx#16
+ (byte~) testSigned::$15 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#17) ← (byte~) testSigned::$15
+ (byte) idx#18 ← ++ (byte) idx#17
+ (byte~) testSigned::$17 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#18) ← (byte~) testSigned::$17
+ (byte) idx#19 ← ++ (byte) idx#18
+ (byte~) testSigned::$19 ← (const byte) TYPEID_SIGNED_BYTE
+ *((byte*) SCREEN#0 + (byte) idx#19) ← (byte~) testSigned::$19
+ (byte) idx#20 ← ++ (byte) idx#19
+ to:testSigned::@return
+testSigned::@return: scope:[testSigned] from testSigned
+ (byte) idx#29 ← phi( testSigned/(byte) idx#20 )
+ (byte) idx#21 ← (byte) idx#29
+ return
+ to:@return
+@3: scope:[] from @begin
+ (byte) idx#31 ← phi( @begin/(byte) idx#0 )
+ call main
+ to:@4
+@4: scope:[] from @3
+ (byte) idx#30 ← phi( @3/(byte) idx#5 )
+ (byte) idx#22 ← (byte) idx#30
+ to:@end
+@end: scope:[] from @4
+
+SYMBOL TABLE SSA
+(label) @3
+(label) @4
+(label) @begin
+(label) @end
+(byte*) SCREEN
+(byte*) SCREEN#0
+(const byte) TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(byte) idx
+(byte) idx#0
+(byte) idx#1
+(byte) idx#10
+(byte) idx#11
+(byte) idx#12
+(byte) idx#13
+(byte) idx#14
+(byte) idx#15
+(byte) idx#16
+(byte) idx#17
+(byte) idx#18
+(byte) idx#19
+(byte) idx#2
+(byte) idx#20
+(byte) idx#21
+(byte) idx#22
+(byte) idx#23
+(byte) idx#24
+(byte) idx#25
+(byte) idx#26
+(byte) idx#27
+(byte) idx#28
+(byte) idx#29
+(byte) idx#3
+(byte) idx#30
+(byte) idx#31
+(byte) idx#4
+(byte) idx#5
+(byte) idx#6
+(byte) idx#7
+(byte) idx#8
+(byte) idx#9
+(void()) main()
+(label) main::@1
+(label) main::@2
+(label) main::@return
+(void()) testSigned()
+(byte~) testSigned::$1
+(byte~) testSigned::$12
+(byte~) testSigned::$15
+(byte~) testSigned::$17
+(byte~) testSigned::$19
+(byte~) testSigned::$2
+(byte~) testSigned::$6
+(byte~) testSigned::$9
+(label) testSigned::@return
+(signed byte) testSigned::sbv1
+(signed byte) testSigned::sbv1#0
+(void()) testUnsigned()
+(byte~) testUnsigned::$0
+(byte~) testUnsigned::$1
+(byte~) testUnsigned::$3
+(byte~) testUnsigned::$5
+(byte~) testUnsigned::$7
+(byte~) testUnsigned::$9
+(label) testUnsigned::@return
+(byte) testUnsigned::ubv1
+(byte) testUnsigned::ubv1#0
+
+Alias (byte) idx#2 = (byte) idx#23
+Alias (byte) idx#24 = (byte) idx#4 (byte) idx#25 (byte) idx#5
+Alias (byte) idx#11 = (byte) idx#27 (byte) idx#12
+Alias (byte) idx#20 = (byte) idx#29 (byte) idx#21
+Alias (byte) idx#0 = (byte) idx#31
+Alias (byte) idx#22 = (byte) idx#30
+Successful SSA optimization Pass2AliasElimination
+Redundant Phi (byte) idx#2 (byte) idx#11
+Redundant Phi (byte) idx#24 (byte) idx#20
+Redundant Phi (byte) idx#26 (byte) idx#1
+Redundant Phi (byte) idx#28 (byte) idx#3
+Redundant Phi (byte) idx#22 (byte) idx#24
+Successful SSA optimization Pass2RedundantPhiElimination
+Constant (const byte*) SCREEN#0 = ((byte*))$400
+Constant (const byte) idx#0 = 0
+Constant (const byte) idx#1 = 0
+Constant (const byte) idx#3 = $28
+Constant (const byte) testUnsigned::$0 = TYPEID_BYTE
+Constant (const byte) testUnsigned::$1 = TYPEID_BYTE
+Constant (const byte) testUnsigned::$3 = TYPEID_BYTE
+Constant (const byte) testUnsigned::$5 = TYPEID_BYTE
+Constant (const byte) testUnsigned::$7 = TYPEID_BYTE
+Constant (const byte) testUnsigned::$9 = TYPEID_BYTE
+Constant (const byte) testSigned::$1 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$2 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$6 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$9 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$12 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$15 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$17 = TYPEID_SIGNED_BYTE
+Constant (const byte) testSigned::$19 = TYPEID_SIGNED_BYTE
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#6 = ++idx#1
+Constant (const byte) idx#13 = ++idx#3
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#7 = ++idx#6
+Constant (const byte) idx#14 = ++idx#13
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#8 = ++idx#7
+Constant (const byte) idx#15 = ++idx#14
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#9 = ++idx#8
+Constant (const byte) idx#16 = ++idx#15
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#10 = ++idx#9
+Constant (const byte) idx#17 = ++idx#16
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#11 = ++idx#10
+Constant (const byte) idx#18 = ++idx#17
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#19 = ++idx#18
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) idx#20 = ++idx#19
+Successful SSA optimization Pass2ConstantIdentification
+Consolidated array index constant in *(SCREEN#0+idx#1)
+Consolidated array index constant in *(SCREEN#0+idx#6)
+Consolidated array index constant in *(SCREEN#0+idx#7)
+Consolidated array index constant in *(SCREEN#0+idx#8)
+Consolidated array index constant in *(SCREEN#0+idx#9)
+Consolidated array index constant in *(SCREEN#0+idx#10)
+Consolidated array index constant in *(SCREEN#0+idx#3)
+Consolidated array index constant in *(SCREEN#0+idx#13)
+Consolidated array index constant in *(SCREEN#0+idx#14)
+Consolidated array index constant in *(SCREEN#0+idx#15)
+Consolidated array index constant in *(SCREEN#0+idx#16)
+Consolidated array index constant in *(SCREEN#0+idx#17)
+Consolidated array index constant in *(SCREEN#0+idx#18)
+Consolidated array index constant in *(SCREEN#0+idx#19)
+Successful SSA optimization Pass2ConstantAdditionElimination
+Eliminating unused constant (const byte) idx#0
+Eliminating unused constant (const byte) idx#11
+Eliminating unused constant (const byte) idx#20
+Successful SSA optimization PassNEliminateUnusedVars
+Culled Empty Block (label) main::@2
+Culled Empty Block (label) @4
+Successful SSA optimization Pass2CullEmptyBlocks
+Inlining constant with different constant siblings (const byte) idx#1
+Inlining constant with different constant siblings (const byte) idx#3
+Inlining constant with different constant siblings (const byte) idx#6
+Inlining constant with different constant siblings (const byte) idx#13
+Inlining constant with different constant siblings (const byte) idx#7
+Inlining constant with different constant siblings (const byte) idx#14
+Inlining constant with different constant siblings (const byte) idx#8
+Inlining constant with different constant siblings (const byte) idx#15
+Inlining constant with different constant siblings (const byte) idx#9
+Inlining constant with different constant siblings (const byte) idx#16
+Inlining constant with different constant siblings (const byte) idx#10
+Inlining constant with different constant siblings (const byte) idx#17
+Inlining constant with different constant siblings (const byte) idx#18
+Inlining constant with different constant siblings (const byte) idx#19
+Constant inlined testUnsigned::$3 = (const byte) TYPEID_BYTE
+Constant inlined idx#10 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined testUnsigned::$1 = (const byte) TYPEID_BYTE
+Constant inlined idx#8 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined testUnsigned::$0 = (const byte) TYPEID_BYTE
+Constant inlined idx#9 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined idx#6 = ++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined idx#7 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined idx#18 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined idx#17 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined testUnsigned::$9 = (const byte) TYPEID_BYTE
+Constant inlined idx#19 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined testUnsigned::$7 = (const byte) TYPEID_BYTE
+Constant inlined idx#14 = ++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined idx#13 = ++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined testUnsigned::$5 = (const byte) TYPEID_BYTE
+Constant inlined idx#16 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined idx#15 = ++++++(byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined idx#3 = (byte/signed byte/word/signed word/dword/signed dword) $28
+Constant inlined testSigned::$6 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined idx#1 = (byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined testSigned::$9 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$2 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$17 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$19 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$1 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$15 = (const byte) TYPEID_SIGNED_BYTE
+Constant inlined testSigned::$12 = (const byte) TYPEID_SIGNED_BYTE
+Successful SSA optimization Pass2ConstantInlining
+Simplifying constant plus zero SCREEN#0+0
+Simplifying constant integer increment ++0
+Simplifying constant integer increment ++0
+Simplifying constant integer increment ++1
+Simplifying constant integer increment ++2
+Simplifying constant integer increment ++3
+Simplifying constant integer increment ++$28
+Simplifying constant integer increment ++$28
+Simplifying constant integer increment ++$29
+Simplifying constant integer increment ++$2a
+Simplifying constant integer increment ++$2b
+Simplifying constant integer increment ++$2c
+Simplifying constant integer increment ++$2d
+Successful SSA optimization Pass2ConstantSimplification
+Simplifying constant integer increment ++1
+Simplifying constant integer increment ++2
+Simplifying constant integer increment ++3
+Simplifying constant integer increment ++4
+Simplifying constant integer increment ++$29
+Simplifying constant integer increment ++$2a
+Simplifying constant integer increment ++$2b
+Simplifying constant integer increment ++$2c
+Simplifying constant integer increment ++$2d
+Simplifying constant integer increment ++$2e
+Successful SSA optimization Pass2ConstantSimplification
+Adding NOP phi() at start of @begin
+Adding NOP phi() at start of @3
+Adding NOP phi() at start of @end
+Adding NOP phi() at start of main
+Adding NOP phi() at start of main::@1
+CALL GRAPH
+Calls in [] to main:2
+Calls in [main] to testUnsigned:5 testSigned:7
+
+Created 0 initial phi equivalence classes
+Coalesced down to 0 phi equivalence classes
+Renumbering block @3 to @1
+Adding NOP phi() at start of @begin
+Adding NOP phi() at start of @1
+Adding NOP phi() at start of @end
+Adding NOP phi() at start of main
+Adding NOP phi() at start of main::@1
+
+FINAL CONTROL FLOW GRAPH
+@begin: scope:[] from
+ [0] phi()
+ to:@1
+@1: scope:[] from @begin
+ [1] phi()
+ [2] call main
+ to:@end
+@end: scope:[] from @1
+ [3] phi()
+main: scope:[main] from @1
+ [4] phi()
+ [5] call testUnsigned
+ to:main::@1
+main::@1: scope:[main] from main
+ [6] phi()
+ [7] call testSigned
+ to:main::@return
+main::@return: scope:[main] from main::@1
+ [8] return
+ to:@return
+testSigned: scope:[testSigned] from main::@1
+ [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13
+ [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE
+ [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE
+ [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE
+ [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE
+ [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE
+ [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE
+ [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE
+ [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE
+ to:testSigned::@return
+testSigned::@return: scope:[testSigned] from testSigned
+ [18] return
+ to:@return
+testUnsigned: scope:[testUnsigned] from main
+ [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b
+ [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE
+ [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE
+ [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE
+ [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE
+ [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE
+ [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE
+ to:testUnsigned::@return
+testUnsigned::@return: scope:[testUnsigned] from testUnsigned
+ [26] return
+ to:@return
+
+
+VARIABLE REGISTER WEIGHTS
+(byte*) SCREEN
+(byte) idx
+(void()) main()
+(void()) testSigned()
+(signed byte) testSigned::sbv1
+(signed byte) testSigned::sbv1#0 20.0
+(void()) testUnsigned()
+(byte) testUnsigned::ubv1
+(byte) testUnsigned::ubv1#0 20.0
+
+Initial phi equivalence classes
+Complete equivalence classes
+[ testUnsigned::ubv1#0 ]
+[ testSigned::sbv1#0 ]
+Allocated zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+Allocated zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+
+INITIAL ASM
+//SEG0 File Comments
+// Test that plus creates the expected type for all legal combinations of bytes (signed/unsigned - constant/variable)
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(bbegin)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .label SCREEN = $400
+//SEG3 @begin
+bbegin:
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+b1_from_bbegin:
+ jmp b1
+//SEG5 @1
+b1:
+//SEG6 [2] call main
+//SEG7 [4] phi from @1 to main [phi:@1->main]
+main_from_b1:
+ jsr main
+//SEG8 [3] phi from @1 to @end [phi:@1->@end]
+bend_from_b1:
+ jmp bend
+//SEG9 @end
+bend:
+//SEG10 main
+main: {
+ //SEG11 [5] call testUnsigned
+ jsr testUnsigned
+ //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
+ b1_from_main:
+ jmp b1
+ //SEG13 main::@1
+ b1:
+ //SEG14 [7] call testSigned
+ jsr testSigned
+ jmp breturn
+ //SEG15 main::@return
+ breturn:
+ //SEG16 [8] return
+ rts
+}
+//SEG17 testSigned
+testSigned: {
+ .label sbv1 = 3
+ //SEG18 [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13 -- vbsz1=vbuc1
+ lda #$13
+ sta sbv1
+ //SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$28
+ //SEG20 [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$29
+ //SEG21 [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2a
+ //SEG22 [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2b
+ //SEG23 [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2c
+ //SEG24 [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2d
+ //SEG25 [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2e
+ //SEG26 [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2f
+ jmp breturn
+ //SEG27 testSigned::@return
+ breturn:
+ //SEG28 [18] return
+ rts
+}
+//SEG29 testUnsigned
+testUnsigned: {
+ .label ubv1 = 2
+ //SEG30 [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b -- vbuz1=vbuc1
+ lda #$5b
+ sta ubv1
+ //SEG31 [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN
+ //SEG32 [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ //SEG33 [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+2
+ //SEG34 [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+3
+ //SEG35 [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+4
+ //SEG36 [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+5
+ jmp breturn
+ //SEG37 testUnsigned::@return
+ breturn:
+ //SEG38 [26] return
+ rts
+}
+
+REGISTER UPLIFT POTENTIAL REGISTERS
+Statement [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13 [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2::testSigned:7 [ ] ) always clobbers reg byte a
+Statement [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Statement [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE [ ] ( main:2::testUnsigned:5 [ ] ) always clobbers reg byte a
+Potential registers zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ] : zp ZP_BYTE:2 ,
+Potential registers zp ZP_BYTE:3 [ testSigned::sbv1#0 ] : zp ZP_BYTE:3 ,
+
+REGISTER UPLIFT SCOPES
+Uplift Scope [testUnsigned] 20: zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+Uplift Scope [testSigned] 20: zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+Uplift Scope [main]
+Uplift Scope []
+
+Uplifting [testUnsigned] best 148 combination zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+Uplifting [testSigned] best 148 combination zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+Uplifting [main] best 148 combination
+Uplifting [] best 148 combination
+Attempting to uplift remaining variables inzp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+Uplifting [testUnsigned] best 148 combination zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+Attempting to uplift remaining variables inzp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+Uplifting [testSigned] best 148 combination zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+
+ASSEMBLER BEFORE OPTIMIZATION
+//SEG0 File Comments
+// Test that plus creates the expected type for all legal combinations of bytes (signed/unsigned - constant/variable)
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(bbegin)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .label SCREEN = $400
+//SEG3 @begin
+bbegin:
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+b1_from_bbegin:
+ jmp b1
+//SEG5 @1
+b1:
+//SEG6 [2] call main
+//SEG7 [4] phi from @1 to main [phi:@1->main]
+main_from_b1:
+ jsr main
+//SEG8 [3] phi from @1 to @end [phi:@1->@end]
+bend_from_b1:
+ jmp bend
+//SEG9 @end
+bend:
+//SEG10 main
+main: {
+ //SEG11 [5] call testUnsigned
+ jsr testUnsigned
+ //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
+ b1_from_main:
+ jmp b1
+ //SEG13 main::@1
+ b1:
+ //SEG14 [7] call testSigned
+ jsr testSigned
+ jmp breturn
+ //SEG15 main::@return
+ breturn:
+ //SEG16 [8] return
+ rts
+}
+//SEG17 testSigned
+testSigned: {
+ .label sbv1 = 3
+ //SEG18 [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13 -- vbsz1=vbuc1
+ lda #$13
+ sta sbv1
+ //SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$28
+ //SEG20 [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$29
+ //SEG21 [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2a
+ //SEG22 [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2b
+ //SEG23 [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2c
+ //SEG24 [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2d
+ //SEG25 [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2e
+ //SEG26 [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$2f
+ jmp breturn
+ //SEG27 testSigned::@return
+ breturn:
+ //SEG28 [18] return
+ rts
+}
+//SEG29 testUnsigned
+testUnsigned: {
+ .label ubv1 = 2
+ //SEG30 [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b -- vbuz1=vbuc1
+ lda #$5b
+ sta ubv1
+ //SEG31 [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN
+ //SEG32 [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ //SEG33 [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+2
+ //SEG34 [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+3
+ //SEG35 [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+4
+ //SEG36 [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+5
+ jmp breturn
+ //SEG37 testUnsigned::@return
+ breturn:
+ //SEG38 [26] return
+ rts
+}
+
+ASSEMBLER OPTIMIZATIONS
+Removing instruction jmp b1
+Removing instruction jmp bend
+Removing instruction jmp b1
+Removing instruction jmp breturn
+Removing instruction jmp breturn
+Removing instruction jmp breturn
+Succesful ASM optimization Pass5NextJumpElimination
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_SIGNED_BYTE
+Removing instruction lda #TYPEID_BYTE
+Removing instruction lda #TYPEID_BYTE
+Removing instruction lda #TYPEID_BYTE
+Removing instruction lda #TYPEID_BYTE
+Removing instruction lda #TYPEID_BYTE
+Succesful ASM optimization Pass5UnnecesaryLoadElimination
+Removing instruction b1_from_bbegin:
+Removing instruction b1:
+Removing instruction main_from_b1:
+Removing instruction bend_from_b1:
+Removing instruction b1_from_main:
+Succesful ASM optimization Pass5RedundantLabelElimination
+Removing instruction bend:
+Removing instruction b1:
+Removing instruction breturn:
+Removing instruction breturn:
+Removing instruction breturn:
+Succesful ASM optimization Pass5UnusedLabelElimination
+Updating BasicUpstart to call main directly
+Removing instruction jsr main
+Succesful ASM optimization Pass5SkipBegin
+Removing instruction bbegin:
+Succesful ASM optimization Pass5UnusedLabelElimination
+
+FINAL SYMBOL TABLE
+(label) @1
+(label) @begin
+(label) @end
+(byte*) SCREEN
+(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
+(const byte) TYPEID_BYTE TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_SIGNED_BYTE TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(byte) idx
+(void()) main()
+(label) main::@1
+(label) main::@return
+(void()) testSigned()
+(label) testSigned::@return
+(signed byte) testSigned::sbv1
+(signed byte) testSigned::sbv1#0 sbv1 zp ZP_BYTE:3 20.0
+(void()) testUnsigned()
+(label) testUnsigned::@return
+(byte) testUnsigned::ubv1
+(byte) testUnsigned::ubv1#0 ubv1 zp ZP_BYTE:2 20.0
+
+zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
+
+
+FINAL ASSEMBLER
+Score: 100
+
+//SEG0 File Comments
+// Test that plus creates the expected type for all legal combinations of bytes (signed/unsigned - constant/variable)
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(main)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .label SCREEN = $400
+//SEG3 @begin
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+//SEG5 @1
+//SEG6 [2] call main
+//SEG7 [4] phi from @1 to main [phi:@1->main]
+//SEG8 [3] phi from @1 to @end [phi:@1->@end]
+//SEG9 @end
+//SEG10 main
+main: {
+ //SEG11 [5] call testUnsigned
+ jsr testUnsigned
+ //SEG12 [6] phi from main to main::@1 [phi:main->main::@1]
+ //SEG13 main::@1
+ //SEG14 [7] call testSigned
+ jsr testSigned
+ //SEG15 main::@return
+ //SEG16 [8] return
+ rts
+}
+//SEG17 testSigned
+testSigned: {
+ .label sbv1 = 3
+ //SEG18 [9] (signed byte) testSigned::sbv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $13 -- vbsz1=vbuc1
+ lda #$13
+ sta sbv1
+ //SEG19 [10] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $28) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+$28
+ //SEG20 [11] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $29) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$29
+ //SEG21 [12] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2a) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2a
+ //SEG22 [13] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2b) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2b
+ //SEG23 [14] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2c) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2c
+ //SEG24 [15] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2d) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2d
+ //SEG25 [16] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2e) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2e
+ //SEG26 [17] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $2f) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+$2f
+ //SEG27 testSigned::@return
+ //SEG28 [18] return
+ rts
+}
+//SEG29 testUnsigned
+testUnsigned: {
+ .label ubv1 = 2
+ //SEG30 [19] (byte) testUnsigned::ubv1#0 ← (byte/signed byte/word/signed word/dword/signed dword) $5b -- vbuz1=vbuc1
+ lda #$5b
+ sta ubv1
+ //SEG31 [20] *((const byte*) SCREEN#0) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN
+ //SEG32 [21] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+1
+ //SEG33 [22] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+2
+ //SEG34 [23] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+3
+ //SEG35 [24] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+4
+ //SEG36 [25] *((const byte*) SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ sta SCREEN+5
+ //SEG37 testUnsigned::@return
+ //SEG38 [26] return
+ rts
+}
+
diff --git a/src/test/ref/typeid-plus-bytes.sym b/src/test/ref/typeid-plus-bytes.sym
new file mode 100644
index 000000000..611ec3f6b
--- /dev/null
+++ b/src/test/ref/typeid-plus-bytes.sym
@@ -0,0 +1,22 @@
+(label) @1
+(label) @begin
+(label) @end
+(byte*) SCREEN
+(const byte*) SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
+(const byte) TYPEID_BYTE TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_SIGNED_BYTE TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(byte) idx
+(void()) main()
+(label) main::@1
+(label) main::@return
+(void()) testSigned()
+(label) testSigned::@return
+(signed byte) testSigned::sbv1
+(signed byte) testSigned::sbv1#0 sbv1 zp ZP_BYTE:3 20.0
+(void()) testUnsigned()
+(label) testUnsigned::@return
+(byte) testUnsigned::ubv1
+(byte) testUnsigned::ubv1#0 ubv1 zp ZP_BYTE:2 20.0
+
+zp ZP_BYTE:2 [ testUnsigned::ubv1#0 ]
+zp ZP_BYTE:3 [ testSigned::sbv1#0 ]
diff --git a/src/test/ref/typeid-simple.asm b/src/test/ref/typeid-simple.asm
new file mode 100644
index 000000000..9623609f6
--- /dev/null
+++ b/src/test/ref/typeid-simple.asm
@@ -0,0 +1,63 @@
+// Test typeid() of the different types
+.pc = $801 "Basic"
+:BasicUpstart(main)
+.pc = $80d "Program"
+ .const TYPEID_VOID = 0
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .const TYPEID_WORD = 3
+ .const TYPEID_SIGNED_WORD = 4
+ .const TYPEID_DWORD = 5
+ .const TYPEID_SIGNED_DWORD = 6
+ .const TYPEID_BOOL = 7
+ .const TYPEID_POINTER_BYTE = $11
+ .const TYPEID_POINTER_SIGNED_BYTE = $12
+ .const TYPEID_POINTER_WORD = $13
+ .const TYPEID_POINTER_SIGNED_WORD = $14
+ .const TYPEID_POINTER_DWORD = $15
+ .const TYPEID_POINTER_SIGNED_DWORD = $16
+ .const TYPEID_POINTER_BOOL = $17
+ .const TYPEID_POINTER_PROCEDURE = $1f
+ .const TYPEID_POINTER_POINTER_BYTE = $21
+main: {
+ .label SCREEN = $400
+ // Simple types
+ lda #TYPEID_VOID
+ sta SCREEN
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+2
+ lda #TYPEID_WORD
+ sta SCREEN+3
+ lda #TYPEID_SIGNED_WORD
+ sta SCREEN+4
+ lda #TYPEID_DWORD
+ sta SCREEN+5
+ lda #TYPEID_SIGNED_DWORD
+ sta SCREEN+6
+ lda #TYPEID_BOOL
+ sta SCREEN+7
+ // Pointer types
+ lda #TYPEID_POINTER_BYTE
+ sta SCREEN+8
+ lda #TYPEID_POINTER_SIGNED_BYTE
+ sta SCREEN+9
+ lda #TYPEID_POINTER_WORD
+ sta SCREEN+$a
+ lda #TYPEID_POINTER_SIGNED_WORD
+ sta SCREEN+$b
+ lda #TYPEID_POINTER_DWORD
+ sta SCREEN+$c
+ lda #TYPEID_POINTER_SIGNED_DWORD
+ sta SCREEN+$d
+ lda #TYPEID_POINTER_BOOL
+ sta SCREEN+$e
+ // Pointer to procedure
+ lda #TYPEID_POINTER_PROCEDURE
+ sta SCREEN+$f
+ // Pointer to pointer
+ lda #TYPEID_POINTER_POINTER_BYTE
+ sta SCREEN+$10
+ rts
+}
diff --git a/src/test/ref/typeid-simple.cfg b/src/test/ref/typeid-simple.cfg
new file mode 100644
index 000000000..b090de780
--- /dev/null
+++ b/src/test/ref/typeid-simple.cfg
@@ -0,0 +1,31 @@
+@begin: scope:[] from
+ [0] phi()
+ to:@1
+@1: scope:[] from @begin
+ [1] phi()
+ [2] call main
+ to:@end
+@end: scope:[] from @1
+ [3] phi()
+main: scope:[main] from @1
+ [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID
+ [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE
+ [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE
+ [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD
+ [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD
+ [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD
+ [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD
+ [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL
+ [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE
+ [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE
+ [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD
+ [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD
+ [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD
+ [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD
+ [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL
+ [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE
+ [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE
+ to:main::@return
+main::@return: scope:[main] from main
+ [21] return
+ to:@return
diff --git a/src/test/ref/typeid-simple.log b/src/test/ref/typeid-simple.log
new file mode 100644
index 000000000..0bac5bd38
--- /dev/null
+++ b/src/test/ref/typeid-simple.log
@@ -0,0 +1,657 @@
+
+CONTROL FLOW GRAPH SSA
+@begin: scope:[] from
+ to:@1
+main: scope:[main] from @1
+ (byte*) main::SCREEN#0 ← ((byte*)) (word/signed word/dword/signed dword) $400
+ (byte) main::idx#0 ← (byte/signed byte/word/signed word/dword/signed dword) 0
+ *((byte*) main::SCREEN#0 + (byte) main::idx#0) ← (const byte) TYPEID_VOID
+ (byte) main::idx#1 ← ++ (byte) main::idx#0
+ *((byte*) main::SCREEN#0 + (byte) main::idx#1) ← (const byte) TYPEID_BYTE
+ (byte) main::idx#2 ← ++ (byte) main::idx#1
+ *((byte*) main::SCREEN#0 + (byte) main::idx#2) ← (const byte) TYPEID_SIGNED_BYTE
+ (byte) main::idx#3 ← ++ (byte) main::idx#2
+ *((byte*) main::SCREEN#0 + (byte) main::idx#3) ← (const byte) TYPEID_WORD
+ (byte) main::idx#4 ← ++ (byte) main::idx#3
+ *((byte*) main::SCREEN#0 + (byte) main::idx#4) ← (const byte) TYPEID_SIGNED_WORD
+ (byte) main::idx#5 ← ++ (byte) main::idx#4
+ *((byte*) main::SCREEN#0 + (byte) main::idx#5) ← (const byte) TYPEID_DWORD
+ (byte) main::idx#6 ← ++ (byte) main::idx#5
+ *((byte*) main::SCREEN#0 + (byte) main::idx#6) ← (const byte) TYPEID_SIGNED_DWORD
+ (byte) main::idx#7 ← ++ (byte) main::idx#6
+ *((byte*) main::SCREEN#0 + (byte) main::idx#7) ← (const byte) TYPEID_BOOL
+ (byte) main::idx#8 ← ++ (byte) main::idx#7
+ *((byte*) main::SCREEN#0 + (byte) main::idx#8) ← (const byte) TYPEID_POINTER_BYTE
+ (byte) main::idx#9 ← ++ (byte) main::idx#8
+ *((byte*) main::SCREEN#0 + (byte) main::idx#9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE
+ (byte) main::idx#10 ← ++ (byte) main::idx#9
+ *((byte*) main::SCREEN#0 + (byte) main::idx#10) ← (const byte) TYPEID_POINTER_WORD
+ (byte) main::idx#11 ← ++ (byte) main::idx#10
+ *((byte*) main::SCREEN#0 + (byte) main::idx#11) ← (const byte) TYPEID_POINTER_SIGNED_WORD
+ (byte) main::idx#12 ← ++ (byte) main::idx#11
+ *((byte*) main::SCREEN#0 + (byte) main::idx#12) ← (const byte) TYPEID_POINTER_DWORD
+ (byte) main::idx#13 ← ++ (byte) main::idx#12
+ *((byte*) main::SCREEN#0 + (byte) main::idx#13) ← (const byte) TYPEID_POINTER_SIGNED_DWORD
+ (byte) main::idx#14 ← ++ (byte) main::idx#13
+ *((byte*) main::SCREEN#0 + (byte) main::idx#14) ← (const byte) TYPEID_POINTER_BOOL
+ (byte) main::idx#15 ← ++ (byte) main::idx#14
+ *((byte*) main::SCREEN#0 + (byte) main::idx#15) ← (const byte) TYPEID_POINTER_PROCEDURE
+ (byte) main::idx#16 ← ++ (byte) main::idx#15
+ *((byte*) main::SCREEN#0 + (byte) main::idx#16) ← (const byte) TYPEID_POINTER_POINTER_BYTE
+ (byte) main::idx#17 ← ++ (byte) main::idx#16
+ to:main::@return
+main::@return: scope:[main] from main
+ return
+ to:@return
+@1: scope:[] from @begin
+ call main
+ to:@2
+@2: scope:[] from @1
+ to:@end
+@end: scope:[] from @2
+
+SYMBOL TABLE SSA
+(label) @1
+(label) @2
+(label) @begin
+(label) @end
+(const byte) TYPEID_BOOL = (byte/signed byte/word/signed word/dword/signed dword) 7
+(const byte) TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 5
+(const byte) TYPEID_POINTER_BOOL = (byte/signed byte/word/signed word/dword/signed dword) $17
+(const byte) TYPEID_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $11
+(const byte) TYPEID_POINTER_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $15
+(const byte) TYPEID_POINTER_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $21
+(const byte) TYPEID_POINTER_PROCEDURE = (byte/signed byte/word/signed word/dword/signed dword) $1f
+(const byte) TYPEID_POINTER_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $12
+(const byte) TYPEID_POINTER_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $16
+(const byte) TYPEID_POINTER_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) $14
+(const byte) TYPEID_POINTER_WORD = (byte/signed byte/word/signed word/dword/signed dword) $13
+(const byte) TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(const byte) TYPEID_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 6
+(const byte) TYPEID_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) 4
+(const byte) TYPEID_VOID = (byte/signed byte/word/signed word/dword/signed dword) 0
+(const byte) TYPEID_WORD = (byte/signed byte/word/signed word/dword/signed dword) 3
+(void()) main()
+(label) main::@return
+(byte*) main::SCREEN
+(byte*) main::SCREEN#0
+(byte) main::idx
+(byte) main::idx#0
+(byte) main::idx#1
+(byte) main::idx#10
+(byte) main::idx#11
+(byte) main::idx#12
+(byte) main::idx#13
+(byte) main::idx#14
+(byte) main::idx#15
+(byte) main::idx#16
+(byte) main::idx#17
+(byte) main::idx#2
+(byte) main::idx#3
+(byte) main::idx#4
+(byte) main::idx#5
+(byte) main::idx#6
+(byte) main::idx#7
+(byte) main::idx#8
+(byte) main::idx#9
+
+Culled Empty Block (label) @2
+Successful SSA optimization Pass2CullEmptyBlocks
+Constant (const byte*) main::SCREEN#0 = ((byte*))$400
+Constant (const byte) main::idx#0 = 0
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#1 = ++main::idx#0
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#2 = ++main::idx#1
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#3 = ++main::idx#2
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#4 = ++main::idx#3
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#5 = ++main::idx#4
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#6 = ++main::idx#5
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#7 = ++main::idx#6
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#8 = ++main::idx#7
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#9 = ++main::idx#8
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#10 = ++main::idx#9
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#11 = ++main::idx#10
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#12 = ++main::idx#11
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#13 = ++main::idx#12
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#14 = ++main::idx#13
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#15 = ++main::idx#14
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#16 = ++main::idx#15
+Successful SSA optimization Pass2ConstantIdentification
+Constant (const byte) main::idx#17 = ++main::idx#16
+Successful SSA optimization Pass2ConstantIdentification
+Consolidated array index constant in *(main::SCREEN#0+main::idx#0)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#1)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#2)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#3)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#4)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#5)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#6)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#7)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#8)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#9)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#10)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#11)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#12)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#13)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#14)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#15)
+Consolidated array index constant in *(main::SCREEN#0+main::idx#16)
+Successful SSA optimization Pass2ConstantAdditionElimination
+Eliminating unused constant (const byte) main::idx#17
+Successful SSA optimization PassNEliminateUnusedVars
+Inlining constant with different constant siblings (const byte) main::idx#0
+Inlining constant with different constant siblings (const byte) main::idx#1
+Inlining constant with different constant siblings (const byte) main::idx#2
+Inlining constant with different constant siblings (const byte) main::idx#3
+Inlining constant with different constant siblings (const byte) main::idx#4
+Inlining constant with different constant siblings (const byte) main::idx#5
+Inlining constant with different constant siblings (const byte) main::idx#6
+Inlining constant with different constant siblings (const byte) main::idx#7
+Inlining constant with different constant siblings (const byte) main::idx#8
+Inlining constant with different constant siblings (const byte) main::idx#9
+Inlining constant with different constant siblings (const byte) main::idx#10
+Inlining constant with different constant siblings (const byte) main::idx#11
+Inlining constant with different constant siblings (const byte) main::idx#12
+Inlining constant with different constant siblings (const byte) main::idx#13
+Inlining constant with different constant siblings (const byte) main::idx#14
+Inlining constant with different constant siblings (const byte) main::idx#15
+Inlining constant with different constant siblings (const byte) main::idx#16
+Constant inlined main::idx#16 = ++++++++++++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#12 = ++++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#13 = ++++++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#14 = ++++++++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#15 = ++++++++++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#0 = (byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#1 = ++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#2 = ++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#3 = ++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#4 = ++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#5 = ++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#6 = ++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#7 = ++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#8 = ++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#9 = ++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#10 = ++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Constant inlined main::idx#11 = ++++++++++++++++++++++(byte/signed byte/word/signed word/dword/signed dword) 0
+Successful SSA optimization Pass2ConstantInlining
+Simplifying constant plus zero main::SCREEN#0+0
+Simplifying constant integer increment ++0
+Simplifying constant integer increment ++0
+Simplifying constant integer increment ++1
+Simplifying constant integer increment ++2
+Simplifying constant integer increment ++3
+Simplifying constant integer increment ++4
+Simplifying constant integer increment ++5
+Simplifying constant integer increment ++6
+Simplifying constant integer increment ++7
+Simplifying constant integer increment ++8
+Simplifying constant integer increment ++9
+Simplifying constant integer increment ++$a
+Simplifying constant integer increment ++$b
+Simplifying constant integer increment ++$c
+Simplifying constant integer increment ++$d
+Simplifying constant integer increment ++$e
+Successful SSA optimization Pass2ConstantSimplification
+Simplifying constant integer increment ++1
+Simplifying constant integer increment ++2
+Simplifying constant integer increment ++3
+Simplifying constant integer increment ++4
+Simplifying constant integer increment ++5
+Simplifying constant integer increment ++6
+Simplifying constant integer increment ++7
+Simplifying constant integer increment ++8
+Simplifying constant integer increment ++9
+Simplifying constant integer increment ++$a
+Simplifying constant integer increment ++$b
+Simplifying constant integer increment ++$c
+Simplifying constant integer increment ++$d
+Simplifying constant integer increment ++$e
+Simplifying constant integer increment ++$f
+Successful SSA optimization Pass2ConstantSimplification
+Adding NOP phi() at start of @begin
+Adding NOP phi() at start of @1
+Adding NOP phi() at start of @end
+CALL GRAPH
+Calls in [] to main:2
+
+Created 0 initial phi equivalence classes
+Coalesced down to 0 phi equivalence classes
+Adding NOP phi() at start of @begin
+Adding NOP phi() at start of @1
+Adding NOP phi() at start of @end
+
+FINAL CONTROL FLOW GRAPH
+@begin: scope:[] from
+ [0] phi()
+ to:@1
+@1: scope:[] from @begin
+ [1] phi()
+ [2] call main
+ to:@end
+@end: scope:[] from @1
+ [3] phi()
+main: scope:[main] from @1
+ [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID
+ [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE
+ [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE
+ [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD
+ [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD
+ [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD
+ [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD
+ [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL
+ [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE
+ [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE
+ [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD
+ [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD
+ [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD
+ [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD
+ [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL
+ [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE
+ [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE
+ to:main::@return
+main::@return: scope:[main] from main
+ [21] return
+ to:@return
+
+
+VARIABLE REGISTER WEIGHTS
+(void()) main()
+(byte*) main::SCREEN
+(byte) main::idx
+
+Initial phi equivalence classes
+Complete equivalence classes
+
+INITIAL ASM
+//SEG0 File Comments
+// Test typeid() of the different types
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(bbegin)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_VOID = 0
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .const TYPEID_WORD = 3
+ .const TYPEID_SIGNED_WORD = 4
+ .const TYPEID_DWORD = 5
+ .const TYPEID_SIGNED_DWORD = 6
+ .const TYPEID_BOOL = 7
+ .const TYPEID_POINTER_BYTE = $11
+ .const TYPEID_POINTER_SIGNED_BYTE = $12
+ .const TYPEID_POINTER_WORD = $13
+ .const TYPEID_POINTER_SIGNED_WORD = $14
+ .const TYPEID_POINTER_DWORD = $15
+ .const TYPEID_POINTER_SIGNED_DWORD = $16
+ .const TYPEID_POINTER_BOOL = $17
+ .const TYPEID_POINTER_PROCEDURE = $1f
+ .const TYPEID_POINTER_POINTER_BYTE = $21
+//SEG3 @begin
+bbegin:
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+b1_from_bbegin:
+ jmp b1
+//SEG5 @1
+b1:
+//SEG6 [2] call main
+ jsr main
+//SEG7 [3] phi from @1 to @end [phi:@1->@end]
+bend_from_b1:
+ jmp bend
+//SEG8 @end
+bend:
+//SEG9 main
+main: {
+ .label SCREEN = $400
+ //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID -- _deref_pbuc1=vbuc2
+ // Simple types
+ lda #TYPEID_VOID
+ sta SCREEN
+ //SEG11 [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ //SEG12 [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+2
+ //SEG13 [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_WORD
+ sta SCREEN+3
+ //SEG14 [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_WORD
+ sta SCREEN+4
+ //SEG15 [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_DWORD
+ sta SCREEN+5
+ //SEG16 [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_DWORD
+ sta SCREEN+6
+ //SEG17 [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BOOL
+ sta SCREEN+7
+ //SEG18 [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer types
+ lda #TYPEID_POINTER_BYTE
+ sta SCREEN+8
+ //SEG19 [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_BYTE
+ sta SCREEN+9
+ //SEG20 [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_WORD
+ sta SCREEN+$a
+ //SEG21 [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_WORD
+ sta SCREEN+$b
+ //SEG22 [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_DWORD
+ sta SCREEN+$c
+ //SEG23 [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_DWORD
+ sta SCREEN+$d
+ //SEG24 [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_BOOL
+ sta SCREEN+$e
+ //SEG25 [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE -- _deref_pbuc1=vbuc2
+ // Pointer to procedure
+ lda #TYPEID_POINTER_PROCEDURE
+ sta SCREEN+$f
+ //SEG26 [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer to pointer
+ lda #TYPEID_POINTER_POINTER_BYTE
+ sta SCREEN+$10
+ jmp breturn
+ //SEG27 main::@return
+ breturn:
+ //SEG28 [21] return
+ rts
+}
+
+REGISTER UPLIFT POTENTIAL REGISTERS
+Statement [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE [ ] ( main:2 [ ] ) always clobbers reg byte a
+Statement [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE [ ] ( main:2 [ ] ) always clobbers reg byte a
+
+REGISTER UPLIFT SCOPES
+Uplift Scope [main]
+Uplift Scope []
+
+Uplifting [main] best 123 combination
+Uplifting [] best 123 combination
+
+ASSEMBLER BEFORE OPTIMIZATION
+//SEG0 File Comments
+// Test typeid() of the different types
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(bbegin)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_VOID = 0
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .const TYPEID_WORD = 3
+ .const TYPEID_SIGNED_WORD = 4
+ .const TYPEID_DWORD = 5
+ .const TYPEID_SIGNED_DWORD = 6
+ .const TYPEID_BOOL = 7
+ .const TYPEID_POINTER_BYTE = $11
+ .const TYPEID_POINTER_SIGNED_BYTE = $12
+ .const TYPEID_POINTER_WORD = $13
+ .const TYPEID_POINTER_SIGNED_WORD = $14
+ .const TYPEID_POINTER_DWORD = $15
+ .const TYPEID_POINTER_SIGNED_DWORD = $16
+ .const TYPEID_POINTER_BOOL = $17
+ .const TYPEID_POINTER_PROCEDURE = $1f
+ .const TYPEID_POINTER_POINTER_BYTE = $21
+//SEG3 @begin
+bbegin:
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+b1_from_bbegin:
+ jmp b1
+//SEG5 @1
+b1:
+//SEG6 [2] call main
+ jsr main
+//SEG7 [3] phi from @1 to @end [phi:@1->@end]
+bend_from_b1:
+ jmp bend
+//SEG8 @end
+bend:
+//SEG9 main
+main: {
+ .label SCREEN = $400
+ //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID -- _deref_pbuc1=vbuc2
+ // Simple types
+ lda #TYPEID_VOID
+ sta SCREEN
+ //SEG11 [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ //SEG12 [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+2
+ //SEG13 [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_WORD
+ sta SCREEN+3
+ //SEG14 [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_WORD
+ sta SCREEN+4
+ //SEG15 [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_DWORD
+ sta SCREEN+5
+ //SEG16 [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_DWORD
+ sta SCREEN+6
+ //SEG17 [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BOOL
+ sta SCREEN+7
+ //SEG18 [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer types
+ lda #TYPEID_POINTER_BYTE
+ sta SCREEN+8
+ //SEG19 [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_BYTE
+ sta SCREEN+9
+ //SEG20 [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_WORD
+ sta SCREEN+$a
+ //SEG21 [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_WORD
+ sta SCREEN+$b
+ //SEG22 [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_DWORD
+ sta SCREEN+$c
+ //SEG23 [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_DWORD
+ sta SCREEN+$d
+ //SEG24 [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_BOOL
+ sta SCREEN+$e
+ //SEG25 [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE -- _deref_pbuc1=vbuc2
+ // Pointer to procedure
+ lda #TYPEID_POINTER_PROCEDURE
+ sta SCREEN+$f
+ //SEG26 [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer to pointer
+ lda #TYPEID_POINTER_POINTER_BYTE
+ sta SCREEN+$10
+ jmp breturn
+ //SEG27 main::@return
+ breturn:
+ //SEG28 [21] return
+ rts
+}
+
+ASSEMBLER OPTIMIZATIONS
+Removing instruction jmp b1
+Removing instruction jmp bend
+Removing instruction jmp breturn
+Succesful ASM optimization Pass5NextJumpElimination
+Removing instruction b1_from_bbegin:
+Removing instruction b1:
+Removing instruction bend_from_b1:
+Succesful ASM optimization Pass5RedundantLabelElimination
+Removing instruction bend:
+Removing instruction breturn:
+Succesful ASM optimization Pass5UnusedLabelElimination
+Updating BasicUpstart to call main directly
+Removing instruction jsr main
+Succesful ASM optimization Pass5SkipBegin
+Removing instruction bbegin:
+Succesful ASM optimization Pass5UnusedLabelElimination
+
+FINAL SYMBOL TABLE
+(label) @1
+(label) @begin
+(label) @end
+(const byte) TYPEID_BOOL TYPEID_BOOL = (byte/signed byte/word/signed word/dword/signed dword) 7
+(const byte) TYPEID_BYTE TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_DWORD TYPEID_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 5
+(const byte) TYPEID_POINTER_BOOL TYPEID_POINTER_BOOL = (byte/signed byte/word/signed word/dword/signed dword) $17
+(const byte) TYPEID_POINTER_BYTE TYPEID_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $11
+(const byte) TYPEID_POINTER_DWORD TYPEID_POINTER_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $15
+(const byte) TYPEID_POINTER_POINTER_BYTE TYPEID_POINTER_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $21
+(const byte) TYPEID_POINTER_PROCEDURE TYPEID_POINTER_PROCEDURE = (byte/signed byte/word/signed word/dword/signed dword) $1f
+(const byte) TYPEID_POINTER_SIGNED_BYTE TYPEID_POINTER_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $12
+(const byte) TYPEID_POINTER_SIGNED_DWORD TYPEID_POINTER_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $16
+(const byte) TYPEID_POINTER_SIGNED_WORD TYPEID_POINTER_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) $14
+(const byte) TYPEID_POINTER_WORD TYPEID_POINTER_WORD = (byte/signed byte/word/signed word/dword/signed dword) $13
+(const byte) TYPEID_SIGNED_BYTE TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(const byte) TYPEID_SIGNED_DWORD TYPEID_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 6
+(const byte) TYPEID_SIGNED_WORD TYPEID_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) 4
+(const byte) TYPEID_VOID TYPEID_VOID = (byte/signed byte/word/signed word/dword/signed dword) 0
+(const byte) TYPEID_WORD TYPEID_WORD = (byte/signed byte/word/signed word/dword/signed dword) 3
+(void()) main()
+(label) main::@return
+(byte*) main::SCREEN
+(const byte*) main::SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
+(byte) main::idx
+
+
+
+FINAL ASSEMBLER
+Score: 108
+
+//SEG0 File Comments
+// Test typeid() of the different types
+//SEG1 Basic Upstart
+.pc = $801 "Basic"
+:BasicUpstart(main)
+.pc = $80d "Program"
+//SEG2 Global Constants & labels
+ .const TYPEID_VOID = 0
+ .const TYPEID_BYTE = 1
+ .const TYPEID_SIGNED_BYTE = 2
+ .const TYPEID_WORD = 3
+ .const TYPEID_SIGNED_WORD = 4
+ .const TYPEID_DWORD = 5
+ .const TYPEID_SIGNED_DWORD = 6
+ .const TYPEID_BOOL = 7
+ .const TYPEID_POINTER_BYTE = $11
+ .const TYPEID_POINTER_SIGNED_BYTE = $12
+ .const TYPEID_POINTER_WORD = $13
+ .const TYPEID_POINTER_SIGNED_WORD = $14
+ .const TYPEID_POINTER_DWORD = $15
+ .const TYPEID_POINTER_SIGNED_DWORD = $16
+ .const TYPEID_POINTER_BOOL = $17
+ .const TYPEID_POINTER_PROCEDURE = $1f
+ .const TYPEID_POINTER_POINTER_BYTE = $21
+//SEG3 @begin
+//SEG4 [1] phi from @begin to @1 [phi:@begin->@1]
+//SEG5 @1
+//SEG6 [2] call main
+//SEG7 [3] phi from @1 to @end [phi:@1->@end]
+//SEG8 @end
+//SEG9 main
+main: {
+ .label SCREEN = $400
+ //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) TYPEID_VOID -- _deref_pbuc1=vbuc2
+ // Simple types
+ lda #TYPEID_VOID
+ sta SCREEN
+ //SEG11 [5] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 1) ← (const byte) TYPEID_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BYTE
+ sta SCREEN+1
+ //SEG12 [6] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 2) ← (const byte) TYPEID_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_BYTE
+ sta SCREEN+2
+ //SEG13 [7] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 3) ← (const byte) TYPEID_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_WORD
+ sta SCREEN+3
+ //SEG14 [8] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 4) ← (const byte) TYPEID_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_WORD
+ sta SCREEN+4
+ //SEG15 [9] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 5) ← (const byte) TYPEID_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_DWORD
+ sta SCREEN+5
+ //SEG16 [10] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 6) ← (const byte) TYPEID_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_SIGNED_DWORD
+ sta SCREEN+6
+ //SEG17 [11] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 7) ← (const byte) TYPEID_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_BOOL
+ sta SCREEN+7
+ //SEG18 [12] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 8) ← (const byte) TYPEID_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer types
+ lda #TYPEID_POINTER_BYTE
+ sta SCREEN+8
+ //SEG19 [13] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) 9) ← (const byte) TYPEID_POINTER_SIGNED_BYTE -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_BYTE
+ sta SCREEN+9
+ //SEG20 [14] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $a) ← (const byte) TYPEID_POINTER_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_WORD
+ sta SCREEN+$a
+ //SEG21 [15] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $b) ← (const byte) TYPEID_POINTER_SIGNED_WORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_WORD
+ sta SCREEN+$b
+ //SEG22 [16] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $c) ← (const byte) TYPEID_POINTER_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_DWORD
+ sta SCREEN+$c
+ //SEG23 [17] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $d) ← (const byte) TYPEID_POINTER_SIGNED_DWORD -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_SIGNED_DWORD
+ sta SCREEN+$d
+ //SEG24 [18] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $e) ← (const byte) TYPEID_POINTER_BOOL -- _deref_pbuc1=vbuc2
+ lda #TYPEID_POINTER_BOOL
+ sta SCREEN+$e
+ //SEG25 [19] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $f) ← (const byte) TYPEID_POINTER_PROCEDURE -- _deref_pbuc1=vbuc2
+ // Pointer to procedure
+ lda #TYPEID_POINTER_PROCEDURE
+ sta SCREEN+$f
+ //SEG26 [20] *((const byte*) main::SCREEN#0+(byte/signed byte/word/signed word/dword/signed dword) $10) ← (const byte) TYPEID_POINTER_POINTER_BYTE -- _deref_pbuc1=vbuc2
+ // Pointer to pointer
+ lda #TYPEID_POINTER_POINTER_BYTE
+ sta SCREEN+$10
+ //SEG27 main::@return
+ //SEG28 [21] return
+ rts
+}
+
diff --git a/src/test/ref/typeid-simple.sym b/src/test/ref/typeid-simple.sym
new file mode 100644
index 000000000..248ff36f1
--- /dev/null
+++ b/src/test/ref/typeid-simple.sym
@@ -0,0 +1,26 @@
+(label) @1
+(label) @begin
+(label) @end
+(const byte) TYPEID_BOOL TYPEID_BOOL = (byte/signed byte/word/signed word/dword/signed dword) 7
+(const byte) TYPEID_BYTE TYPEID_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 1
+(const byte) TYPEID_DWORD TYPEID_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 5
+(const byte) TYPEID_POINTER_BOOL TYPEID_POINTER_BOOL = (byte/signed byte/word/signed word/dword/signed dword) $17
+(const byte) TYPEID_POINTER_BYTE TYPEID_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $11
+(const byte) TYPEID_POINTER_DWORD TYPEID_POINTER_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $15
+(const byte) TYPEID_POINTER_POINTER_BYTE TYPEID_POINTER_POINTER_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $21
+(const byte) TYPEID_POINTER_PROCEDURE TYPEID_POINTER_PROCEDURE = (byte/signed byte/word/signed word/dword/signed dword) $1f
+(const byte) TYPEID_POINTER_SIGNED_BYTE TYPEID_POINTER_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) $12
+(const byte) TYPEID_POINTER_SIGNED_DWORD TYPEID_POINTER_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) $16
+(const byte) TYPEID_POINTER_SIGNED_WORD TYPEID_POINTER_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) $14
+(const byte) TYPEID_POINTER_WORD TYPEID_POINTER_WORD = (byte/signed byte/word/signed word/dword/signed dword) $13
+(const byte) TYPEID_SIGNED_BYTE TYPEID_SIGNED_BYTE = (byte/signed byte/word/signed word/dword/signed dword) 2
+(const byte) TYPEID_SIGNED_DWORD TYPEID_SIGNED_DWORD = (byte/signed byte/word/signed word/dword/signed dword) 6
+(const byte) TYPEID_SIGNED_WORD TYPEID_SIGNED_WORD = (byte/signed byte/word/signed word/dword/signed dword) 4
+(const byte) TYPEID_VOID TYPEID_VOID = (byte/signed byte/word/signed word/dword/signed dword) 0
+(const byte) TYPEID_WORD TYPEID_WORD = (byte/signed byte/word/signed word/dword/signed dword) 3
+(void()) main()
+(label) main::@return
+(byte*) main::SCREEN
+(const byte*) main::SCREEN#0 SCREEN = ((byte*))(word/signed word/dword/signed dword) $400
+(byte) main::idx
+