This commit is contained in:
Irmen de Jong 2018-09-01 19:28:11 +02:00
parent 3e11d45883
commit 640457f35a
14 changed files with 505 additions and 962 deletions

View File

@ -27,20 +27,20 @@ This software is licensed under the GNU GPL 3.0, see https://www.gnu.org/license
Design principles
-----------------
- It is a cross-compilation toolkit running on a modern machine.
The resulting output is a machine code program runnable on actual 8-bit 6502 hardware.
- It is a cross-compiler running on modern machines (Linux, MacOS, Windows, ...)
The generated output is a machine code program runnable on actual 8-bit 6502 hardware.
- Based on simple and familiar imperative structured programming paradigm.
- Allowing modular programming: modules, code blocks, subroutines.
- Modular programming and scoping via modules, code blocks, and subroutines.
- Provide high level programming constructs but stay close to the metal;
still able to directly use memory addresses, CPU registers and ROM subroutines
- No dynamic memory allocation. All variables stay fixed size as determined at compile time.
- Provide various quality of life language features specifically for the target platform.
- Provide a convenient edit/compile/run cycle by being able to directly launch
the compiled program in an emulator and provide debugging information to the emulator.
- The compiler outputs a regular 6502 assembly code file, it doesn't assemble this itself.
- The compiler outputs a regular 6502 assembly source code file, it doesn't assemble this itself.
The '64tass' third party cross-assembler tool is used to do this final step.
- Goto is considered harmful, but not here; arbitrary control flow jumps are allowed.
- No complicated error handling or overflow checks that would slow things down.
- Goto is usually considered harmful, but not here: arbitrary control flow jumps are possible.
- There are no complicated built-in error handling or overflow checks.
Required tools

View File

@ -290,7 +290,7 @@ The following names are reserved, they have a special meaning::
A X Y ; 6502 hardware registers
AX AY XY ; 16-bit pseudo register pairs
Pc Pi Pz Pn Pv ; bits of the 6502 hardware status register
Pc Pz Pn Pv ; bits of the 6502 hardware status register
Operators

View File

@ -127,19 +127,17 @@ The following 6502 CPU hardware registers are directly usable in program code (a
- ``A``, ``X``, ``Y`` the three main cpu registers (8 bits)
- ``AX``, ``AY``, ``XY`` surrogate 16-bit registers: LSB-order (lo/hi) combined register pairs
- ``SC`` status register's Carry flag
- ``SI`` status register's Interrupt Disable flag
The other status bits of the status register are not directly accessible,
but can be acted upon via conditional statements.
The stack pointer and program counter registers are not accessible.
- ``Pc`` status register (P) Carry flag (read-only, use ``P_carry()`` pseudo-function to write it)
- ``Pz`` status register (P) Zero flag (read-only)
- ``Pn`` status register (P) Negative flag (read-only)
- ``Pv`` status register (P) Overflow flag (read-only)
- the status register (P) Interrupt flag is not accessible, but can be set with the ``P_irqd()`` pseudo-function.
Subroutine Calling Conventions
------------------------------
Subroutine arguments and results are passed via registers.
Sometimes the status register's Carry flag is used as well (as a boolean flag).
Sometimes the status register's Carry flag (``Pc``) is used as well (as a boolean flag).
Additional arguments can be passed via memory locations as well ofcourse.
But you'll have to be careful when dealing with chained or even recursive calls then,
because there's a big risk of overwriting those memory locations.

View File

@ -152,7 +152,7 @@ identifier : NAME ;
scoped_identifier : NAME ('.' NAME)+ ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'Pc' | 'Pi' | 'Pz' | 'Pn' | 'Pv' ;
register : 'A' | 'X' | 'Y' | 'AX' | 'AY' | 'XY' | 'Pc' | 'Pz' | 'Pn' | 'Pv' ;
integerliteral : DEC_INTEGER | HEX_INTEGER | BIN_INTEGER ;

View File

@ -36,6 +36,9 @@
byte equalQQ = 4==4
const byte equalQQ2 = (4+hopla)>0
P_carry(1)
P_irqd(0)
equalQQ = foo(33)
equalQQ = main.foo(33)
XY = hopla*2+hopla1

View File

@ -288,6 +288,12 @@ data class Module(override val name: String,
override fun usedNames(): Set<String> = scopedNamesUsed
override fun lookup(scopedName: List<String>, statement: Node): IStatement? {
if(PseudoFunctionNames.contains(scopedName.last())) {
// pseudo functions always exist, return a dummy statement for them
val pseudo = Label("pseudo::${scopedName.last()}")
pseudo.position = statement.position
return pseudo
}
val stmt = super.lookup(scopedName, statement)
if(stmt!=null) {
val targetScopedName = when(stmt) {
@ -817,31 +823,28 @@ private fun il65Parser.Statement_blockContext.toAst(withPosition: Boolean): Muta
private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement {
val vardecl = vardecl()
if(vardecl!=null) {
vardecl()?.let {
val decl= VarDecl(VarDeclType.VAR,
vardecl.datatype().toAst(),
vardecl.arrayspec()?.toAst(withPosition),
vardecl.identifier().text,
it.datatype().toAst(),
it.arrayspec()?.toAst(withPosition),
it.identifier().text,
null)
decl.position = vardecl.toPosition(withPosition)
decl.position = it.toPosition(withPosition)
return decl
}
val varinit = varinitializer()
if(varinit!=null) {
varinitializer()?.let {
val decl= VarDecl(VarDeclType.VAR,
varinit.datatype().toAst(),
varinit.arrayspec()?.toAst(withPosition),
varinit.identifier().text,
varinit.expression().toAst(withPosition))
decl.position = varinit.toPosition(withPosition)
it.datatype().toAst(),
it.arrayspec()?.toAst(withPosition),
it.identifier().text,
it.expression().toAst(withPosition))
decl.position = it.toPosition(withPosition)
return decl
}
val constdecl = constdecl()
if(constdecl!=null) {
val cvarinit = constdecl.varinitializer()
constdecl()?.let {
val cvarinit = it.varinitializer()
val decl = VarDecl(VarDeclType.CONST,
cvarinit.datatype().toAst(),
cvarinit.arrayspec()?.toAst(withPosition),
@ -851,9 +854,8 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
return decl
}
val memdecl = memoryvardecl()
if(memdecl!=null) {
val mvarinit = memdecl.varinitializer()
memoryvardecl()?.let {
val mvarinit = it.varinitializer()
val decl = VarDecl(VarDeclType.MEMORY,
mvarinit.datatype().toAst(),
mvarinit.arrayspec()?.toAst(withPosition),
@ -863,27 +865,24 @@ private fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatemen
return decl
}
val assign = assignment()
if (assign!=null) {
val ast =Assignment(assign.assign_target().toAst(withPosition),
null, assign.expression().toAst(withPosition))
ast.position = assign.toPosition(withPosition)
assignment()?.let {
val ast =Assignment(it.assign_target().toAst(withPosition),
null, it.expression().toAst(withPosition))
ast.position = it.toPosition(withPosition)
return ast
}
val augassign = augassignment()
if (augassign!=null) {
val aug= Assignment(augassign.assign_target().toAst(withPosition),
augassign.operator.text,
augassign.expression().toAst(withPosition))
aug.position = augassign.toPosition(withPosition)
augassignment()?.let {
val aug= Assignment(it.assign_target().toAst(withPosition),
it.operator.text,
it.expression().toAst(withPosition))
aug.position = it.toPosition(withPosition)
return aug
}
val post = postincrdecr()
if(post!=null) {
val ast = PostIncrDecr(post.assign_target().toAst(withPosition), post.operator.text)
ast.position = post.toPosition(withPosition)
postincrdecr()?.let {
val ast = PostIncrDecr(it.assign_target().toAst(withPosition), it.operator.text)
ast.position = it.toPosition(withPosition)
return ast
}

View File

@ -20,6 +20,9 @@ fun Module.checkIdentifiers(globalNamespace: INameScope): MutableMap<String, ISt
}
val PseudoFunctionNames = setOf("P_carry", "P_irqd")
class AstIdentifiersChecker(private val globalNamespace: INameScope) : IAstProcessor {
private val checkResult: MutableList<AstException> = mutableListOf()
@ -57,23 +60,33 @@ class AstIdentifiersChecker(private val globalNamespace: INameScope) : IAstProce
}
override fun process(subroutine: Subroutine): IStatement {
val scopedName = subroutine.makeScopedName(subroutine.name).joinToString(".")
val existing = symbols[scopedName]
if(existing!=null) {
nameError(subroutine.name, subroutine.position, existing)
if(PseudoFunctionNames.contains(subroutine.name)) {
// the special pseudo-functions can't be redefined
checkResult.add(NameError("subroutine cannot have the name of a builtin pseudo-function", subroutine.position))
} else {
symbols[scopedName] = subroutine
val scopedName = subroutine.makeScopedName(subroutine.name).joinToString(".")
val existing = symbols[scopedName]
if (existing != null) {
nameError(subroutine.name, subroutine.position, existing)
} else {
symbols[scopedName] = subroutine
}
}
return super.process(subroutine)
}
override fun process(label: Label): IStatement {
val scopedName = label.makeScopedName(label.name).joinToString(".")
val existing = symbols[scopedName]
if(existing!=null) {
nameError(label.name, label.position, existing)
if(PseudoFunctionNames.contains(label.name)) {
// the special pseudo-functions can't be redefined
checkResult.add(NameError("label cannot have the name of a builtin pseudo-function", label.position))
} else {
symbols[scopedName] = label
val scopedName = label.makeScopedName(label.name).joinToString(".")
val existing = symbols[scopedName]
if (existing != null) {
nameError(label.name, label.position, existing)
} else {
symbols[scopedName] = label
}
}
return super.process(label)
}

File diff suppressed because one or more lines are too long

View File

@ -84,18 +84,17 @@ T__82=83
T__83=84
T__84=85
T__85=86
T__86=87
LINECOMMENT=88
COMMENT=89
WS=90
EOL=91
NAME=92
DEC_INTEGER=93
HEX_INTEGER=94
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
'~'=1
':'=2
'goto'=3
@ -169,17 +168,16 @@ INLINEASMBLOCK=98
'AY'=71
'XY'=72
'Pc'=73
'Pi'=74
'Pz'=75
'Pn'=76
'Pv'=77
'true'=78
'false'=79
'%asm'=80
'sub'=81
'->'=82
'{'=83
'}'=84
'?'=85
'if'=86
'else'=87
'Pz'=74
'Pn'=75
'Pv'=76
'true'=77
'false'=78
'%asm'=79
'sub'=80
'->'=81
'{'=82
'}'=83
'?'=84
'if'=85
'else'=86

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,4 @@
// Generated from il65.g4 by ANTLR 4.7.1
// Generated from /home/irmen/Projects/il65/il65/antlr/il65.g4 by ANTLR 4.7
package il65.parser;
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
@ -11,7 +11,7 @@ import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class il65Lexer extends Lexer {
static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); }
static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@ -28,9 +28,9 @@ public class il65Lexer extends Lexer {
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, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
LINECOMMENT=88, COMMENT=89, WS=90, EOL=91, NAME=92, DEC_INTEGER=93, HEX_INTEGER=94,
BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98;
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, LINECOMMENT=87,
COMMENT=88, WS=89, EOL=90, NAME=91, DEC_INTEGER=92, HEX_INTEGER=93, BIN_INTEGER=94,
FLOAT_NUMBER=95, STRING=96, INLINEASMBLOCK=97;
public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN"
};
@ -50,7 +50,7 @@ public class il65Lexer extends Lexer {
"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", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80",
"T__81", "T__82", "T__83", "T__84", "T__85", "T__86", "LINECOMMENT", "COMMENT",
"T__81", "T__82", "T__83", "T__84", "T__85", "LINECOMMENT", "COMMENT",
"WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
};
@ -65,7 +65,7 @@ public class il65Lexer extends Lexer {
"'*'", "'/'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'",
"'XY'", "'Pc'", "'Pi'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
};
private static final String[] _SYMBOLIC_NAMES = {
@ -76,9 +76,8 @@ public class il65Lexer 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, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK"
null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -140,10 +139,10 @@ public class il65Lexer extends Lexer {
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 98:
case 97:
STRING_action((RuleContext)_localctx, actionIndex);
break;
case 99:
case 98:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break;
}
@ -172,7 +171,7 @@ public class il65Lexer extends Lexer {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2d\u0296\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2c\u0291\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"+
@ -183,215 +182,213 @@ public class il65Lexer 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\3\3\3\3\4\3\4\3\4\3\4\3\4"+
"\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3"+
"\6\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b"+
"\3\b\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3"+
"\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
"\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23"+
"\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26"+
"\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35"+
"\3\35\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3!"+
"\3\"\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'"+
"\3\'\3(\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3"+
"\60\3\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\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\38\39\39\39\3:\3:\3;\3;\3"+
"<\3<\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3B\3B\3B\3"+
"B\3B\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3"+
"J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3"+
"P\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3S\3S\3S\3T\3T\3U\3U\3V\3V\3W\3W\3W\3X\3"+
"X\3X\3X\3X\3Y\3Y\7Y\u022d\nY\fY\16Y\u0230\13Y\3Y\3Y\3Y\3Y\3Z\3Z\7Z\u0238"+
"\nZ\fZ\16Z\u023b\13Z\3Z\3Z\3[\3[\3[\3[\3\\\6\\\u0244\n\\\r\\\16\\\u0245"+
"\3]\3]\7]\u024a\n]\f]\16]\u024d\13]\3^\3^\3^\6^\u0252\n^\r^\16^\u0253"+
"\5^\u0256\n^\3_\3_\6_\u025a\n_\r_\16_\u025b\3`\3`\6`\u0260\n`\r`\16`\u0261"+
"\3a\3a\3a\5a\u0267\na\3a\5a\u026a\na\3b\6b\u026d\nb\rb\16b\u026e\3b\3"+
"b\6b\u0273\nb\rb\16b\u0274\5b\u0277\nb\3c\3c\3c\3c\5c\u027d\nc\3d\3d\3"+
"d\7d\u0282\nd\fd\16d\u0285\13d\3d\3d\3d\3e\3e\3e\3e\6e\u028e\ne\re\16"+
"e\u028f\3e\3e\3e\3e\3e\3\u028f\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\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085"+
"D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099"+
"N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00ad"+
"X\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1"+
"b\u00c3\2\u00c5\2\u00c7c\u00c9d\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2"+
"C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2"+
"\u02a4\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2"+
"\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3"+
"\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2"+
"\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2"+
"/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2"+
"\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2"+
"G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+
"\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2"+
"\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2"+
"m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3"+
"\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2"+
"\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2"+
"\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095"+
"\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2"+
"\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7"+
"\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2"+
"\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9"+
"\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2"+
"\2\2\u00c7\3\2\2\2\2\u00c9\3\2\2\2\3\u00cb\3\2\2\2\5\u00cd\3\2\2\2\7\u00cf"+
"\3\2\2\2\t\u00d4\3\2\2\2\13\u00dc\3\2\2\2\r\u00e6\3\2\2\2\17\u00f0\3\2"+
"\2\2\21\u00f9\3\2\2\2\23\u0101\3\2\2\2\25\u010d\3\2\2\2\27\u0119\3\2\2"+
"\2\31\u0124\3\2\2\2\33\u012c\3\2\2\2\35\u012e\3\2\2\2\37\u0130\3\2\2\2"+
"!\u0136\3\2\2\2#\u013d\3\2\2\2%\u0142\3\2\2\2\'\u0147\3\2\2\2)\u014d\3"+
"\2\2\2+\u0151\3\2\2\2-\u0157\3\2\2\2/\u015d\3\2\2\2\61\u0164\3\2\2\2\63"+
"\u0166\3\2\2\2\65\u0168\3\2\2\2\67\u016b\3\2\2\29\u016e\3\2\2\2;\u0171"+
"\3\2\2\2=\u0174\3\2\2\2?\u0178\3\2\2\2A\u017c\3\2\2\2C\u0180\3\2\2\2E"+
"\u0185\3\2\2\2G\u018a\3\2\2\2I\u018d\3\2\2\2K\u0190\3\2\2\2M\u0193\3\2"+
"\2\2O\u0196\3\2\2\2Q\u0199\3\2\2\2S\u019b\3\2\2\2U\u019d\3\2\2\2W\u019f"+
"\3\2\2\2Y\u01a1\3\2\2\2[\u01a4\3\2\2\2]\u01a6\3\2\2\2_\u01a8\3\2\2\2a"+
"\u01ab\3\2\2\2c\u01ae\3\2\2\2e\u01b2\3\2\2\2g\u01b6\3\2\2\2i\u01b8\3\2"+
"\2\2k\u01ba\3\2\2\2m\u01bd\3\2\2\2o\u01c0\3\2\2\2q\u01c3\3\2\2\2s\u01c6"+
"\3\2\2\2u\u01c8\3\2\2\2w\u01ca\3\2\2\2y\u01cc\3\2\2\2{\u01cf\3\2\2\2}"+
"\u01d3\3\2\2\2\177\u01d6\3\2\2\2\u0081\u01da\3\2\2\2\u0083\u01de\3\2\2"+
"\2\u0085\u01e5\3\2\2\2\u0087\u01e7\3\2\2\2\u0089\u01e9\3\2\2\2\u008b\u01eb"+
"\3\2\2\2\u008d\u01ed\3\2\2\2\u008f\u01f0\3\2\2\2\u0091\u01f3\3\2\2\2\u0093"+
"\u01f6\3\2\2\2\u0095\u01f9\3\2\2\2\u0097\u01fc\3\2\2\2\u0099\u01ff\3\2"+
"\2\2\u009b\u0202\3\2\2\2\u009d\u0205\3\2\2\2\u009f\u020a\3\2\2\2\u00a1"+
"\u0210\3\2\2\2\u00a3\u0215\3\2\2\2\u00a5\u0219\3\2\2\2\u00a7\u021c\3\2"+
"\2\2\u00a9\u021e\3\2\2\2\u00ab\u0220\3\2\2\2\u00ad\u0222\3\2\2\2\u00af"+
"\u0225\3\2\2\2\u00b1\u022a\3\2\2\2\u00b3\u0235\3\2\2\2\u00b5\u023e\3\2"+
"\2\2\u00b7\u0243\3\2\2\2\u00b9\u0247\3\2\2\2\u00bb\u0255\3\2\2\2\u00bd"+
"\u0257\3\2\2\2\u00bf\u025d\3\2\2\2\u00c1\u0263\3\2\2\2\u00c3\u026c\3\2"+
"\2\2\u00c5\u027c\3\2\2\2\u00c7\u027e\3\2\2\2\u00c9\u0289\3\2\2\2\u00cb"+
"\u00cc\7\u0080\2\2\u00cc\4\3\2\2\2\u00cd\u00ce\7<\2\2\u00ce\6\3\2\2\2"+
"\u00cf\u00d0\7i\2\2\u00d0\u00d1\7q\2\2\u00d1\u00d2\7v\2\2\u00d2\u00d3"+
"\7q\2\2\u00d3\b\3\2\2\2\u00d4\u00d5\7\'\2\2\u00d5\u00d6\7q\2\2\u00d6\u00d7"+
"\7w\2\2\u00d7\u00d8\7v\2\2\u00d8\u00d9\7r\2\2\u00d9\u00da\7w\2\2\u00da"+
"\u00db\7v\2\2\u00db\n\3\2\2\2\u00dc\u00dd\7\'\2\2\u00dd\u00de\7n\2\2\u00de"+
"\u00df\7c\2\2\u00df\u00e0\7w\2\2\u00e0\u00e1\7p\2\2\u00e1\u00e2\7e\2\2"+
"\u00e2\u00e3\7j\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7t\2\2\u00e5\f\3\2"+
"\2\2\u00e6\u00e7\7\'\2\2\u00e7\u00e8\7|\2\2\u00e8\u00e9\7g\2\2\u00e9\u00ea"+
"\7t\2\2\u00ea\u00eb\7q\2\2\u00eb\u00ec\7r\2\2\u00ec\u00ed\7c\2\2\u00ed"+
"\u00ee\7i\2\2\u00ee\u00ef\7g\2\2\u00ef\16\3\2\2\2\u00f0\u00f1\7\'\2\2"+
"\u00f1\u00f2\7c\2\2\u00f2\u00f3\7f\2\2\u00f3\u00f4\7f\2\2\u00f4\u00f5"+
"\7t\2\2\u00f5\u00f6\7g\2\2\u00f6\u00f7\7u\2\2\u00f7\u00f8\7u\2\2\u00f8"+
"\20\3\2\2\2\u00f9\u00fa\7\'\2\2\u00fa\u00fb\7k\2\2\u00fb\u00fc\7o\2\2"+
"\u00fc\u00fd\7r\2\2\u00fd\u00fe\7q\2\2\u00fe\u00ff\7t\2\2\u00ff\u0100"+
"\7v\2\2\u0100\22\3\2\2\2\u0101\u0102\7\'\2\2\u0102\u0103\7d\2\2\u0103"+
"\u0104\7t\2\2\u0104\u0105\7g\2\2\u0105\u0106\7c\2\2\u0106\u0107\7m\2\2"+
"\u0107\u0108\7r\2\2\u0108\u0109\7q\2\2\u0109\u010a\7k\2\2\u010a\u010b"+
"\7p\2\2\u010b\u010c\7v\2\2\u010c\24\3\2\2\2\u010d\u010e\7\'\2\2\u010e"+
"\u010f\7c\2\2\u010f\u0110\7u\2\2\u0110\u0111\7o\2\2\u0111\u0112\7k\2\2"+
"\u0112\u0113\7p\2\2\u0113\u0114\7e\2\2\u0114\u0115\7n\2\2\u0115\u0116"+
"\7w\2\2\u0116\u0117\7f\2\2\u0117\u0118\7g\2\2\u0118\26\3\2\2\2\u0119\u011a"+
"\7\'\2\2\u011a\u011b\7c\2\2\u011b\u011c\7u\2\2\u011c\u011d\7o\2\2\u011d"+
"\u011e\7d\2\2\u011e\u011f\7k\2\2\u011f\u0120\7p\2\2\u0120\u0121\7c\2\2"+
"\u0121\u0122\7t\2\2\u0122\u0123\7{\2\2\u0123\30\3\2\2\2\u0124\u0125\7"+
"\'\2\2\u0125\u0126\7q\2\2\u0126\u0127\7r\2\2\u0127\u0128\7v\2\2\u0128"+
"\u0129\7k\2\2\u0129\u012a\7q\2\2\u012a\u012b\7p\2\2\u012b\32\3\2\2\2\u012c"+
"\u012d\7.\2\2\u012d\34\3\2\2\2\u012e\u012f\7?\2\2\u012f\36\3\2\2\2\u0130"+
"\u0131\7e\2\2\u0131\u0132\7q\2\2\u0132\u0133\7p\2\2\u0133\u0134\7u\2\2"+
"\u0134\u0135\7v\2\2\u0135 \3\2\2\2\u0136\u0137\7o\2\2\u0137\u0138\7g\2"+
"\2\u0138\u0139\7o\2\2\u0139\u013a\7q\2\2\u013a\u013b\7t\2\2\u013b\u013c"+
"\7{\2\2\u013c\"\3\2\2\2\u013d\u013e\7d\2\2\u013e\u013f\7{\2\2\u013f\u0140"+
"\7v\2\2\u0140\u0141\7g\2\2\u0141$\3\2\2\2\u0142\u0143\7y\2\2\u0143\u0144"+
"\7q\2\2\u0144\u0145\7t\2\2\u0145\u0146\7f\2\2\u0146&\3\2\2\2\u0147\u0148"+
"\7h\2\2\u0148\u0149\7n\2\2\u0149\u014a\7q\2\2\u014a\u014b\7c\2\2\u014b"+
"\u014c\7v\2\2\u014c(\3\2\2\2\u014d\u014e\7u\2\2\u014e\u014f\7v\2\2\u014f"+
"\u0150\7t\2\2\u0150*\3\2\2\2\u0151\u0152\7u\2\2\u0152\u0153\7v\2\2\u0153"+
"\u0154\7t\2\2\u0154\u0155\7a\2\2\u0155\u0156\7r\2\2\u0156,\3\2\2\2\u0157"+
"\u0158\7u\2\2\u0158\u0159\7v\2\2\u0159\u015a\7t\2\2\u015a\u015b\7a\2\2"+
"\u015b\u015c\7u\2\2\u015c.\3\2\2\2\u015d\u015e\7u\2\2\u015e\u015f\7v\2"+
"\2\u015f\u0160\7t\2\2\u0160\u0161\7a\2\2\u0161\u0162\7r\2\2\u0162\u0163"+
"\7u\2\2\u0163\60\3\2\2\2\u0164\u0165\7]\2\2\u0165\62\3\2\2\2\u0166\u0167"+
"\7_\2\2\u0167\64\3\2\2\2\u0168\u0169\7-\2\2\u0169\u016a\7?\2\2\u016a\66"+
"\3\2\2\2\u016b\u016c\7/\2\2\u016c\u016d\7?\2\2\u016d8\3\2\2\2\u016e\u016f"+
"\7\61\2\2\u016f\u0170\7?\2\2\u0170:\3\2\2\2\u0171\u0172\7,\2\2\u0172\u0173"+
"\7?\2\2\u0173<\3\2\2\2\u0174\u0175\7,\2\2\u0175\u0176\7,\2\2\u0176\u0177"+
"\7?\2\2\u0177>\3\2\2\2\u0178\u0179\7>\2\2\u0179\u017a\7>\2\2\u017a\u017b"+
"\7?\2\2\u017b@\3\2\2\2\u017c\u017d\7@\2\2\u017d\u017e\7@\2\2\u017e\u017f"+
"\7?\2\2\u017fB\3\2\2\2\u0180\u0181\7>\2\2\u0181\u0182\7>\2\2\u0182\u0183"+
"\7B\2\2\u0183\u0184\7?\2\2\u0184D\3\2\2\2\u0185\u0186\7@\2\2\u0186\u0187"+
"\7@\2\2\u0187\u0188\7B\2\2\u0188\u0189\7?\2\2\u0189F\3\2\2\2\u018a\u018b"+
"\7(\2\2\u018b\u018c\7?\2\2\u018cH\3\2\2\2\u018d\u018e\7~\2\2\u018e\u018f"+
"\7?\2\2\u018fJ\3\2\2\2\u0190\u0191\7`\2\2\u0191\u0192\7?\2\2\u0192L\3"+
"\2\2\2\u0193\u0194\7-\2\2\u0194\u0195\7-\2\2\u0195N\3\2\2\2\u0196\u0197"+
"\7/\2\2\u0197\u0198\7/\2\2\u0198P\3\2\2\2\u0199\u019a\7*\2\2\u019aR\3"+
"\2\2\2\u019b\u019c\7+\2\2\u019cT\3\2\2\2\u019d\u019e\7-\2\2\u019eV\3\2"+
"\2\2\u019f\u01a0\7/\2\2\u01a0X\3\2\2\2\u01a1\u01a2\7,\2\2\u01a2\u01a3"+
"\7,\2\2\u01a3Z\3\2\2\2\u01a4\u01a5\7,\2\2\u01a5\\\3\2\2\2\u01a6\u01a7"+
"\7\61\2\2\u01a7^\3\2\2\2\u01a8\u01a9\7>\2\2\u01a9\u01aa\7>\2\2\u01aa`"+
"\3\2\2\2\u01ab\u01ac\7@\2\2\u01ac\u01ad\7@\2\2\u01adb\3\2\2\2\u01ae\u01af"+
"\7>\2\2\u01af\u01b0\7>\2\2\u01b0\u01b1\7B\2\2\u01b1d\3\2\2\2\u01b2\u01b3"+
"\7@\2\2\u01b3\u01b4\7@\2\2\u01b4\u01b5\7B\2\2\u01b5f\3\2\2\2\u01b6\u01b7"+
"\7>\2\2\u01b7h\3\2\2\2\u01b8\u01b9\7@\2\2\u01b9j\3\2\2\2\u01ba\u01bb\7"+
">\2\2\u01bb\u01bc\7?\2\2\u01bcl\3\2\2\2\u01bd\u01be\7@\2\2\u01be\u01bf"+
"\7?\2\2\u01bfn\3\2\2\2\u01c0\u01c1\7?\2\2\u01c1\u01c2\7?\2\2\u01c2p\3"+
"\2\2\2\u01c3\u01c4\7#\2\2\u01c4\u01c5\7?\2\2\u01c5r\3\2\2\2\u01c6\u01c7"+
"\7(\2\2\u01c7t\3\2\2\2\u01c8\u01c9\7`\2\2\u01c9v\3\2\2\2\u01ca\u01cb\7"+
"~\2\2\u01cbx\3\2\2\2\u01cc\u01cd\7v\2\2\u01cd\u01ce\7q\2\2\u01cez\3\2"+
"\2\2\u01cf\u01d0\7c\2\2\u01d0\u01d1\7p\2\2\u01d1\u01d2\7f\2\2\u01d2|\3"+
"\2\2\2\u01d3\u01d4\7q\2\2\u01d4\u01d5\7t\2\2\u01d5~\3\2\2\2\u01d6\u01d7"+
"\7z\2\2\u01d7\u01d8\7q\2\2\u01d8\u01d9\7t\2\2\u01d9\u0080\3\2\2\2\u01da"+
"\u01db\7p\2\2\u01db\u01dc\7q\2\2\u01dc\u01dd\7v\2\2\u01dd\u0082\3\2\2"+
"\2\u01de\u01df\7t\2\2\u01df\u01e0\7g\2\2\u01e0\u01e1\7v\2\2\u01e1\u01e2"+
"\7w\2\2\u01e2\u01e3\7t\2\2\u01e3\u01e4\7p\2\2\u01e4\u0084\3\2\2\2\u01e5"+
"\u01e6\7\60\2\2\u01e6\u0086\3\2\2\2\u01e7\u01e8\7C\2\2\u01e8\u0088\3\2"+
"\2\2\u01e9\u01ea\7Z\2\2\u01ea\u008a\3\2\2\2\u01eb\u01ec\7[\2\2\u01ec\u008c"+
"\3\2\2\2\u01ed\u01ee\7C\2\2\u01ee\u01ef\7Z\2\2\u01ef\u008e\3\2\2\2\u01f0"+
"\u01f1\7C\2\2\u01f1\u01f2\7[\2\2\u01f2\u0090\3\2\2\2\u01f3\u01f4\7Z\2"+
"\2\u01f4\u01f5\7[\2\2\u01f5\u0092\3\2\2\2\u01f6\u01f7\7R\2\2\u01f7\u01f8"+
"\7e\2\2\u01f8\u0094\3\2\2\2\u01f9\u01fa\7R\2\2\u01fa\u01fb\7k\2\2\u01fb"+
"\u0096\3\2\2\2\u01fc\u01fd\7R\2\2\u01fd\u01fe\7|\2\2\u01fe\u0098\3\2\2"+
"\2\u01ff\u0200\7R\2\2\u0200\u0201\7p\2\2\u0201\u009a\3\2\2\2\u0202\u0203"+
"\7R\2\2\u0203\u0204\7x\2\2\u0204\u009c\3\2\2\2\u0205\u0206\7v\2\2\u0206"+
"\u0207\7t\2\2\u0207\u0208\7w\2\2\u0208\u0209\7g\2\2\u0209\u009e\3\2\2"+
"\2\u020a\u020b\7h\2\2\u020b\u020c\7c\2\2\u020c\u020d\7n\2\2\u020d\u020e"+
"\7u\2\2\u020e\u020f\7g\2\2\u020f\u00a0\3\2\2\2\u0210\u0211\7\'\2\2\u0211"+
"\u0212\7c\2\2\u0212\u0213\7u\2\2\u0213\u0214\7o\2\2\u0214\u00a2\3\2\2"+
"\2\u0215\u0216\7u\2\2\u0216\u0217\7w\2\2\u0217\u0218\7d\2\2\u0218\u00a4"+
"\3\2\2\2\u0219\u021a\7/\2\2\u021a\u021b\7@\2\2\u021b\u00a6\3\2\2\2\u021c"+
"\u021d\7}\2\2\u021d\u00a8\3\2\2\2\u021e\u021f\7\177\2\2\u021f\u00aa\3"+
"\2\2\2\u0220\u0221\7A\2\2\u0221\u00ac\3\2\2\2\u0222\u0223\7k\2\2\u0223"+
"\u0224\7h\2\2\u0224\u00ae\3\2\2\2\u0225\u0226\7g\2\2\u0226\u0227\7n\2"+
"\2\u0227\u0228\7u\2\2\u0228\u0229\7g\2\2\u0229\u00b0\3\2\2\2\u022a\u022e"+
"\t\2\2\2\u022b\u022d\t\3\2\2\u022c\u022b\3\2\2\2\u022d\u0230\3\2\2\2\u022e"+
"\u022c\3\2\2\2\u022e\u022f\3\2\2\2\u022f\u0231\3\2\2\2\u0230\u022e\3\2"+
"\2\2\u0231\u0232\5\u00b3Z\2\u0232\u0233\3\2\2\2\u0233\u0234\bY\2\2\u0234"+
"\u00b2\3\2\2\2\u0235\u0239\7=\2\2\u0236\u0238\n\2\2\2\u0237\u0236\3\2"+
"\2\2\u0238\u023b\3\2\2\2\u0239\u0237\3\2\2\2\u0239\u023a\3\2\2\2\u023a"+
"\u023c\3\2\2\2\u023b\u0239\3\2\2\2\u023c\u023d\bZ\2\2\u023d\u00b4\3\2"+
"\2\2\u023e\u023f\t\3\2\2\u023f\u0240\3\2\2\2\u0240\u0241\b[\3\2\u0241"+
"\u00b6\3\2\2\2\u0242\u0244\t\2\2\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2"+
"\2\2\u0245\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u00b8\3\2\2\2\u0247"+
"\u024b\t\4\2\2\u0248\u024a\t\5\2\2\u0249\u0248\3\2\2\2\u024a\u024d\3\2"+
"\2\2\u024b\u0249\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u00ba\3\2\2\2\u024d"+
"\u024b\3\2\2\2\u024e\u0256\4\62;\2\u024f\u0251\4\63;\2\u0250\u0252\4\62"+
";\2\u0251\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0251\3\2\2\2\u0253"+
"\u0254\3\2\2\2\u0254\u0256\3\2\2\2\u0255\u024e\3\2\2\2\u0255\u024f\3\2"+
"\2\2\u0256\u00bc\3\2\2\2\u0257\u0259\7&\2\2\u0258\u025a\t\6\2\2\u0259"+
"\u0258\3\2\2\2\u025a\u025b\3\2\2\2\u025b\u0259\3\2\2\2\u025b\u025c\3\2"+
"\2\2\u025c\u00be\3\2\2\2\u025d\u025f\7\'\2\2\u025e\u0260\4\62\63\2\u025f"+
"\u025e\3\2\2\2\u0260\u0261\3\2\2\2\u0261\u025f\3\2\2\2\u0261\u0262\3\2"+
"\2\2\u0262\u00c0\3\2\2\2\u0263\u0269\5\u00c3b\2\u0264\u0266\t\7\2\2\u0265"+
"\u0267\t\b\2\2\u0266\u0265\3\2\2\2\u0266\u0267\3\2\2\2\u0267\u0268\3\2"+
"\2\2\u0268\u026a\5\u00c3b\2\u0269\u0264\3\2\2\2\u0269\u026a\3\2\2\2\u026a"+
"\u00c2\3\2\2\2\u026b\u026d\4\62;\2\u026c\u026b\3\2\2\2\u026d\u026e\3\2"+
"\2\2\u026e\u026c\3\2\2\2\u026e\u026f\3\2\2\2\u026f\u0276\3\2\2\2\u0270"+
"\u0272\7\60\2\2\u0271\u0273\4\62;\2\u0272\u0271\3\2\2\2\u0273\u0274\3"+
"\2\2\2\u0274\u0272\3\2\2\2\u0274\u0275\3\2\2\2\u0275\u0277\3\2\2\2\u0276"+
"\u0270\3\2\2\2\u0276\u0277\3\2\2\2\u0277\u00c4\3\2\2\2\u0278\u0279\7^"+
"\2\2\u0279\u027d\13\2\2\2\u027a\u027b\7^\2\2\u027b\u027d\5\u00b7\\\2\u027c"+
"\u0278\3\2\2\2\u027c\u027a\3\2\2\2\u027d\u00c6\3\2\2\2\u027e\u0283\7$"+
"\2\2\u027f\u0282\5\u00c5c\2\u0280\u0282\n\t\2\2\u0281\u027f\3\2\2\2\u0281"+
"\u0280\3\2\2\2\u0282\u0285\3\2\2\2\u0283\u0281\3\2\2\2\u0283\u0284\3\2"+
"\2\2\u0284\u0286\3\2\2\2\u0285\u0283\3\2\2\2\u0286\u0287\7$\2\2\u0287"+
"\u0288\bd\4\2\u0288\u00c8\3\2\2\2\u0289\u028a\7}\2\2\u028a\u028b\7}\2"+
"\2\u028b\u028d\3\2\2\2\u028c\u028e\13\2\2\2\u028d\u028c\3\2\2\2\u028e"+
"\u028f\3\2\2\2\u028f\u0290\3\2\2\2\u028f\u028d\3\2\2\2\u0290\u0291\3\2"+
"\2\2\u0291\u0292\7\177\2\2\u0292\u0293\7\177\2\2\u0293\u0294\3\2\2\2\u0294"+
"\u0295\be\5\2\u0295\u00ca\3\2\2\2\25\2\u022e\u0239\u0245\u024b\u0253\u0255"+
"\u0259\u025b\u0261\u0266\u0269\u026e\u0274\u0276\u027c\u0281\u0283\u028f"+
"\6\2\3\2\b\2\2\3d\2\3e\3";
"`\t`\4a\ta\4b\tb\4c\tc\4d\td\3\2\3\2\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\5\3"+
"\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+
"\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+
"\b\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+
"\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
"\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3"+
"\r\3\r\3\r\3\16\3\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21"+
"\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23"+
"\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26"+
"\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30"+
"\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35"+
"\3\35\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3!\3\"\3"+
"\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3"+
"(\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3\60\3\60\3\60\3"+
"\61\3\61\3\61\3\62\3\62\3\62\3\62\3\63\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\38\39\39\39\3:\3:\3;\3;\3<\3<"+
"\3=\3=\3=\3>\3>\3>\3>\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3B\3B\3B\3B\3B"+
"\3B\3B\3C\3C\3D\3D\3E\3E\3F\3F\3G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3K"+
"\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P"+
"\3P\3Q\3Q\3Q\3Q\3R\3R\3R\3S\3S\3T\3T\3U\3U\3V\3V\3V\3W\3W\3W\3W\3W\3X"+
"\3X\7X\u0228\nX\fX\16X\u022b\13X\3X\3X\3X\3X\3Y\3Y\7Y\u0233\nY\fY\16Y"+
"\u0236\13Y\3Y\3Y\3Z\3Z\3Z\3Z\3[\6[\u023f\n[\r[\16[\u0240\3\\\3\\\7\\\u0245"+
"\n\\\f\\\16\\\u0248\13\\\3]\3]\3]\6]\u024d\n]\r]\16]\u024e\5]\u0251\n"+
"]\3^\3^\6^\u0255\n^\r^\16^\u0256\3_\3_\6_\u025b\n_\r_\16_\u025c\3`\3`"+
"\3`\5`\u0262\n`\3`\5`\u0265\n`\3a\6a\u0268\na\ra\16a\u0269\3a\3a\6a\u026e"+
"\na\ra\16a\u026f\5a\u0272\na\3b\3b\3b\3b\5b\u0278\nb\3c\3c\3c\7c\u027d"+
"\nc\fc\16c\u0280\13c\3c\3c\3c\3d\3d\3d\3d\6d\u0289\nd\rd\16d\u028a\3d"+
"\3d\3d\3d\3d\3\u028a\2e\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f"+
"\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63"+
"\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62"+
"c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087"+
"E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099N\u009b"+
"O\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00adX\u00af"+
"Y\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bfa\u00c1\2\u00c3"+
"\2\u00c5b\u00c7c\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;"+
"C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u029f\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\2"+
"c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3"+
"\2\2\2\2q\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2"+
"\2\2}\3\2\2\2\2\177\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3"+
"\2\2\2\2\u0087\3\2\2\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2"+
"\2\u008f\3\2\2\2\2\u0091\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097"+
"\3\2\2\2\2\u0099\3\2\2\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2"+
"\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9"+
"\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2"+
"\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb"+
"\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2"+
"\2\3\u00c9\3\2\2\2\5\u00cb\3\2\2\2\7\u00cd\3\2\2\2\t\u00d2\3\2\2\2\13"+
"\u00da\3\2\2\2\r\u00e4\3\2\2\2\17\u00ee\3\2\2\2\21\u00f7\3\2\2\2\23\u00ff"+
"\3\2\2\2\25\u010b\3\2\2\2\27\u0117\3\2\2\2\31\u0122\3\2\2\2\33\u012a\3"+
"\2\2\2\35\u012c\3\2\2\2\37\u012e\3\2\2\2!\u0134\3\2\2\2#\u013b\3\2\2\2"+
"%\u0140\3\2\2\2\'\u0145\3\2\2\2)\u014b\3\2\2\2+\u014f\3\2\2\2-\u0155\3"+
"\2\2\2/\u015b\3\2\2\2\61\u0162\3\2\2\2\63\u0164\3\2\2\2\65\u0166\3\2\2"+
"\2\67\u0169\3\2\2\29\u016c\3\2\2\2;\u016f\3\2\2\2=\u0172\3\2\2\2?\u0176"+
"\3\2\2\2A\u017a\3\2\2\2C\u017e\3\2\2\2E\u0183\3\2\2\2G\u0188\3\2\2\2I"+
"\u018b\3\2\2\2K\u018e\3\2\2\2M\u0191\3\2\2\2O\u0194\3\2\2\2Q\u0197\3\2"+
"\2\2S\u0199\3\2\2\2U\u019b\3\2\2\2W\u019d\3\2\2\2Y\u019f\3\2\2\2[\u01a2"+
"\3\2\2\2]\u01a4\3\2\2\2_\u01a6\3\2\2\2a\u01a9\3\2\2\2c\u01ac\3\2\2\2e"+
"\u01b0\3\2\2\2g\u01b4\3\2\2\2i\u01b6\3\2\2\2k\u01b8\3\2\2\2m\u01bb\3\2"+
"\2\2o\u01be\3\2\2\2q\u01c1\3\2\2\2s\u01c4\3\2\2\2u\u01c6\3\2\2\2w\u01c8"+
"\3\2\2\2y\u01ca\3\2\2\2{\u01cd\3\2\2\2}\u01d1\3\2\2\2\177\u01d4\3\2\2"+
"\2\u0081\u01d8\3\2\2\2\u0083\u01dc\3\2\2\2\u0085\u01e3\3\2\2\2\u0087\u01e5"+
"\3\2\2\2\u0089\u01e7\3\2\2\2\u008b\u01e9\3\2\2\2\u008d\u01eb\3\2\2\2\u008f"+
"\u01ee\3\2\2\2\u0091\u01f1\3\2\2\2\u0093\u01f4\3\2\2\2\u0095\u01f7\3\2"+
"\2\2\u0097\u01fa\3\2\2\2\u0099\u01fd\3\2\2\2\u009b\u0200\3\2\2\2\u009d"+
"\u0205\3\2\2\2\u009f\u020b\3\2\2\2\u00a1\u0210\3\2\2\2\u00a3\u0214\3\2"+
"\2\2\u00a5\u0217\3\2\2\2\u00a7\u0219\3\2\2\2\u00a9\u021b\3\2\2\2\u00ab"+
"\u021d\3\2\2\2\u00ad\u0220\3\2\2\2\u00af\u0225\3\2\2\2\u00b1\u0230\3\2"+
"\2\2\u00b3\u0239\3\2\2\2\u00b5\u023e\3\2\2\2\u00b7\u0242\3\2\2\2\u00b9"+
"\u0250\3\2\2\2\u00bb\u0252\3\2\2\2\u00bd\u0258\3\2\2\2\u00bf\u025e\3\2"+
"\2\2\u00c1\u0267\3\2\2\2\u00c3\u0277\3\2\2\2\u00c5\u0279\3\2\2\2\u00c7"+
"\u0284\3\2\2\2\u00c9\u00ca\7\u0080\2\2\u00ca\4\3\2\2\2\u00cb\u00cc\7<"+
"\2\2\u00cc\6\3\2\2\2\u00cd\u00ce\7i\2\2\u00ce\u00cf\7q\2\2\u00cf\u00d0"+
"\7v\2\2\u00d0\u00d1\7q\2\2\u00d1\b\3\2\2\2\u00d2\u00d3\7\'\2\2\u00d3\u00d4"+
"\7q\2\2\u00d4\u00d5\7w\2\2\u00d5\u00d6\7v\2\2\u00d6\u00d7\7r\2\2\u00d7"+
"\u00d8\7w\2\2\u00d8\u00d9\7v\2\2\u00d9\n\3\2\2\2\u00da\u00db\7\'\2\2\u00db"+
"\u00dc\7n\2\2\u00dc\u00dd\7c\2\2\u00dd\u00de\7w\2\2\u00de\u00df\7p\2\2"+
"\u00df\u00e0\7e\2\2\u00e0\u00e1\7j\2\2\u00e1\u00e2\7g\2\2\u00e2\u00e3"+
"\7t\2\2\u00e3\f\3\2\2\2\u00e4\u00e5\7\'\2\2\u00e5\u00e6\7|\2\2\u00e6\u00e7"+
"\7g\2\2\u00e7\u00e8\7t\2\2\u00e8\u00e9\7q\2\2\u00e9\u00ea\7r\2\2\u00ea"+
"\u00eb\7c\2\2\u00eb\u00ec\7i\2\2\u00ec\u00ed\7g\2\2\u00ed\16\3\2\2\2\u00ee"+
"\u00ef\7\'\2\2\u00ef\u00f0\7c\2\2\u00f0\u00f1\7f\2\2\u00f1\u00f2\7f\2"+
"\2\u00f2\u00f3\7t\2\2\u00f3\u00f4\7g\2\2\u00f4\u00f5\7u\2\2\u00f5\u00f6"+
"\7u\2\2\u00f6\20\3\2\2\2\u00f7\u00f8\7\'\2\2\u00f8\u00f9\7k\2\2\u00f9"+
"\u00fa\7o\2\2\u00fa\u00fb\7r\2\2\u00fb\u00fc\7q\2\2\u00fc\u00fd\7t\2\2"+
"\u00fd\u00fe\7v\2\2\u00fe\22\3\2\2\2\u00ff\u0100\7\'\2\2\u0100\u0101\7"+
"d\2\2\u0101\u0102\7t\2\2\u0102\u0103\7g\2\2\u0103\u0104\7c\2\2\u0104\u0105"+
"\7m\2\2\u0105\u0106\7r\2\2\u0106\u0107\7q\2\2\u0107\u0108\7k\2\2\u0108"+
"\u0109\7p\2\2\u0109\u010a\7v\2\2\u010a\24\3\2\2\2\u010b\u010c\7\'\2\2"+
"\u010c\u010d\7c\2\2\u010d\u010e\7u\2\2\u010e\u010f\7o\2\2\u010f\u0110"+
"\7k\2\2\u0110\u0111\7p\2\2\u0111\u0112\7e\2\2\u0112\u0113\7n\2\2\u0113"+
"\u0114\7w\2\2\u0114\u0115\7f\2\2\u0115\u0116\7g\2\2\u0116\26\3\2\2\2\u0117"+
"\u0118\7\'\2\2\u0118\u0119\7c\2\2\u0119\u011a\7u\2\2\u011a\u011b\7o\2"+
"\2\u011b\u011c\7d\2\2\u011c\u011d\7k\2\2\u011d\u011e\7p\2\2\u011e\u011f"+
"\7c\2\2\u011f\u0120\7t\2\2\u0120\u0121\7{\2\2\u0121\30\3\2\2\2\u0122\u0123"+
"\7\'\2\2\u0123\u0124\7q\2\2\u0124\u0125\7r\2\2\u0125\u0126\7v\2\2\u0126"+
"\u0127\7k\2\2\u0127\u0128\7q\2\2\u0128\u0129\7p\2\2\u0129\32\3\2\2\2\u012a"+
"\u012b\7.\2\2\u012b\34\3\2\2\2\u012c\u012d\7?\2\2\u012d\36\3\2\2\2\u012e"+
"\u012f\7e\2\2\u012f\u0130\7q\2\2\u0130\u0131\7p\2\2\u0131\u0132\7u\2\2"+
"\u0132\u0133\7v\2\2\u0133 \3\2\2\2\u0134\u0135\7o\2\2\u0135\u0136\7g\2"+
"\2\u0136\u0137\7o\2\2\u0137\u0138\7q\2\2\u0138\u0139\7t\2\2\u0139\u013a"+
"\7{\2\2\u013a\"\3\2\2\2\u013b\u013c\7d\2\2\u013c\u013d\7{\2\2\u013d\u013e"+
"\7v\2\2\u013e\u013f\7g\2\2\u013f$\3\2\2\2\u0140\u0141\7y\2\2\u0141\u0142"+
"\7q\2\2\u0142\u0143\7t\2\2\u0143\u0144\7f\2\2\u0144&\3\2\2\2\u0145\u0146"+
"\7h\2\2\u0146\u0147\7n\2\2\u0147\u0148\7q\2\2\u0148\u0149\7c\2\2\u0149"+
"\u014a\7v\2\2\u014a(\3\2\2\2\u014b\u014c\7u\2\2\u014c\u014d\7v\2\2\u014d"+
"\u014e\7t\2\2\u014e*\3\2\2\2\u014f\u0150\7u\2\2\u0150\u0151\7v\2\2\u0151"+
"\u0152\7t\2\2\u0152\u0153\7a\2\2\u0153\u0154\7r\2\2\u0154,\3\2\2\2\u0155"+
"\u0156\7u\2\2\u0156\u0157\7v\2\2\u0157\u0158\7t\2\2\u0158\u0159\7a\2\2"+
"\u0159\u015a\7u\2\2\u015a.\3\2\2\2\u015b\u015c\7u\2\2\u015c\u015d\7v\2"+
"\2\u015d\u015e\7t\2\2\u015e\u015f\7a\2\2\u015f\u0160\7r\2\2\u0160\u0161"+
"\7u\2\2\u0161\60\3\2\2\2\u0162\u0163\7]\2\2\u0163\62\3\2\2\2\u0164\u0165"+
"\7_\2\2\u0165\64\3\2\2\2\u0166\u0167\7-\2\2\u0167\u0168\7?\2\2\u0168\66"+
"\3\2\2\2\u0169\u016a\7/\2\2\u016a\u016b\7?\2\2\u016b8\3\2\2\2\u016c\u016d"+
"\7\61\2\2\u016d\u016e\7?\2\2\u016e:\3\2\2\2\u016f\u0170\7,\2\2\u0170\u0171"+
"\7?\2\2\u0171<\3\2\2\2\u0172\u0173\7,\2\2\u0173\u0174\7,\2\2\u0174\u0175"+
"\7?\2\2\u0175>\3\2\2\2\u0176\u0177\7>\2\2\u0177\u0178\7>\2\2\u0178\u0179"+
"\7?\2\2\u0179@\3\2\2\2\u017a\u017b\7@\2\2\u017b\u017c\7@\2\2\u017c\u017d"+
"\7?\2\2\u017dB\3\2\2\2\u017e\u017f\7>\2\2\u017f\u0180\7>\2\2\u0180\u0181"+
"\7B\2\2\u0181\u0182\7?\2\2\u0182D\3\2\2\2\u0183\u0184\7@\2\2\u0184\u0185"+
"\7@\2\2\u0185\u0186\7B\2\2\u0186\u0187\7?\2\2\u0187F\3\2\2\2\u0188\u0189"+
"\7(\2\2\u0189\u018a\7?\2\2\u018aH\3\2\2\2\u018b\u018c\7~\2\2\u018c\u018d"+
"\7?\2\2\u018dJ\3\2\2\2\u018e\u018f\7`\2\2\u018f\u0190\7?\2\2\u0190L\3"+
"\2\2\2\u0191\u0192\7-\2\2\u0192\u0193\7-\2\2\u0193N\3\2\2\2\u0194\u0195"+
"\7/\2\2\u0195\u0196\7/\2\2\u0196P\3\2\2\2\u0197\u0198\7*\2\2\u0198R\3"+
"\2\2\2\u0199\u019a\7+\2\2\u019aT\3\2\2\2\u019b\u019c\7-\2\2\u019cV\3\2"+
"\2\2\u019d\u019e\7/\2\2\u019eX\3\2\2\2\u019f\u01a0\7,\2\2\u01a0\u01a1"+
"\7,\2\2\u01a1Z\3\2\2\2\u01a2\u01a3\7,\2\2\u01a3\\\3\2\2\2\u01a4\u01a5"+
"\7\61\2\2\u01a5^\3\2\2\2\u01a6\u01a7\7>\2\2\u01a7\u01a8\7>\2\2\u01a8`"+
"\3\2\2\2\u01a9\u01aa\7@\2\2\u01aa\u01ab\7@\2\2\u01abb\3\2\2\2\u01ac\u01ad"+
"\7>\2\2\u01ad\u01ae\7>\2\2\u01ae\u01af\7B\2\2\u01afd\3\2\2\2\u01b0\u01b1"+
"\7@\2\2\u01b1\u01b2\7@\2\2\u01b2\u01b3\7B\2\2\u01b3f\3\2\2\2\u01b4\u01b5"+
"\7>\2\2\u01b5h\3\2\2\2\u01b6\u01b7\7@\2\2\u01b7j\3\2\2\2\u01b8\u01b9\7"+
">\2\2\u01b9\u01ba\7?\2\2\u01bal\3\2\2\2\u01bb\u01bc\7@\2\2\u01bc\u01bd"+
"\7?\2\2\u01bdn\3\2\2\2\u01be\u01bf\7?\2\2\u01bf\u01c0\7?\2\2\u01c0p\3"+
"\2\2\2\u01c1\u01c2\7#\2\2\u01c2\u01c3\7?\2\2\u01c3r\3\2\2\2\u01c4\u01c5"+
"\7(\2\2\u01c5t\3\2\2\2\u01c6\u01c7\7`\2\2\u01c7v\3\2\2\2\u01c8\u01c9\7"+
"~\2\2\u01c9x\3\2\2\2\u01ca\u01cb\7v\2\2\u01cb\u01cc\7q\2\2\u01ccz\3\2"+
"\2\2\u01cd\u01ce\7c\2\2\u01ce\u01cf\7p\2\2\u01cf\u01d0\7f\2\2\u01d0|\3"+
"\2\2\2\u01d1\u01d2\7q\2\2\u01d2\u01d3\7t\2\2\u01d3~\3\2\2\2\u01d4\u01d5"+
"\7z\2\2\u01d5\u01d6\7q\2\2\u01d6\u01d7\7t\2\2\u01d7\u0080\3\2\2\2\u01d8"+
"\u01d9\7p\2\2\u01d9\u01da\7q\2\2\u01da\u01db\7v\2\2\u01db\u0082\3\2\2"+
"\2\u01dc\u01dd\7t\2\2\u01dd\u01de\7g\2\2\u01de\u01df\7v\2\2\u01df\u01e0"+
"\7w\2\2\u01e0\u01e1\7t\2\2\u01e1\u01e2\7p\2\2\u01e2\u0084\3\2\2\2\u01e3"+
"\u01e4\7\60\2\2\u01e4\u0086\3\2\2\2\u01e5\u01e6\7C\2\2\u01e6\u0088\3\2"+
"\2\2\u01e7\u01e8\7Z\2\2\u01e8\u008a\3\2\2\2\u01e9\u01ea\7[\2\2\u01ea\u008c"+
"\3\2\2\2\u01eb\u01ec\7C\2\2\u01ec\u01ed\7Z\2\2\u01ed\u008e\3\2\2\2\u01ee"+
"\u01ef\7C\2\2\u01ef\u01f0\7[\2\2\u01f0\u0090\3\2\2\2\u01f1\u01f2\7Z\2"+
"\2\u01f2\u01f3\7[\2\2\u01f3\u0092\3\2\2\2\u01f4\u01f5\7R\2\2\u01f5\u01f6"+
"\7e\2\2\u01f6\u0094\3\2\2\2\u01f7\u01f8\7R\2\2\u01f8\u01f9\7|\2\2\u01f9"+
"\u0096\3\2\2\2\u01fa\u01fb\7R\2\2\u01fb\u01fc\7p\2\2\u01fc\u0098\3\2\2"+
"\2\u01fd\u01fe\7R\2\2\u01fe\u01ff\7x\2\2\u01ff\u009a\3\2\2\2\u0200\u0201"+
"\7v\2\2\u0201\u0202\7t\2\2\u0202\u0203\7w\2\2\u0203\u0204\7g\2\2\u0204"+
"\u009c\3\2\2\2\u0205\u0206\7h\2\2\u0206\u0207\7c\2\2\u0207\u0208\7n\2"+
"\2\u0208\u0209\7u\2\2\u0209\u020a\7g\2\2\u020a\u009e\3\2\2\2\u020b\u020c"+
"\7\'\2\2\u020c\u020d\7c\2\2\u020d\u020e\7u\2\2\u020e\u020f\7o\2\2\u020f"+
"\u00a0\3\2\2\2\u0210\u0211\7u\2\2\u0211\u0212\7w\2\2\u0212\u0213\7d\2"+
"\2\u0213\u00a2\3\2\2\2\u0214\u0215\7/\2\2\u0215\u0216\7@\2\2\u0216\u00a4"+
"\3\2\2\2\u0217\u0218\7}\2\2\u0218\u00a6\3\2\2\2\u0219\u021a\7\177\2\2"+
"\u021a\u00a8\3\2\2\2\u021b\u021c\7A\2\2\u021c\u00aa\3\2\2\2\u021d\u021e"+
"\7k\2\2\u021e\u021f\7h\2\2\u021f\u00ac\3\2\2\2\u0220\u0221\7g\2\2\u0221"+
"\u0222\7n\2\2\u0222\u0223\7u\2\2\u0223\u0224\7g\2\2\u0224\u00ae\3\2\2"+
"\2\u0225\u0229\t\2\2\2\u0226\u0228\t\3\2\2\u0227\u0226\3\2\2\2\u0228\u022b"+
"\3\2\2\2\u0229\u0227\3\2\2\2\u0229\u022a\3\2\2\2\u022a\u022c\3\2\2\2\u022b"+
"\u0229\3\2\2\2\u022c\u022d\5\u00b1Y\2\u022d\u022e\3\2\2\2\u022e\u022f"+
"\bX\2\2\u022f\u00b0\3\2\2\2\u0230\u0234\7=\2\2\u0231\u0233\n\2\2\2\u0232"+
"\u0231\3\2\2\2\u0233\u0236\3\2\2\2\u0234\u0232\3\2\2\2\u0234\u0235\3\2"+
"\2\2\u0235\u0237\3\2\2\2\u0236\u0234\3\2\2\2\u0237\u0238\bY\2\2\u0238"+
"\u00b2\3\2\2\2\u0239\u023a\t\3\2\2\u023a\u023b\3\2\2\2\u023b\u023c\bZ"+
"\3\2\u023c\u00b4\3\2\2\2\u023d\u023f\t\2\2\2\u023e\u023d\3\2\2\2\u023f"+
"\u0240\3\2\2\2\u0240\u023e\3\2\2\2\u0240\u0241\3\2\2\2\u0241\u00b6\3\2"+
"\2\2\u0242\u0246\t\4\2\2\u0243\u0245\t\5\2\2\u0244\u0243\3\2\2\2\u0245"+
"\u0248\3\2\2\2\u0246\u0244\3\2\2\2\u0246\u0247\3\2\2\2\u0247\u00b8\3\2"+
"\2\2\u0248\u0246\3\2\2\2\u0249\u0251\4\62;\2\u024a\u024c\4\63;\2\u024b"+
"\u024d\4\62;\2\u024c\u024b\3\2\2\2\u024d\u024e\3\2\2\2\u024e\u024c\3\2"+
"\2\2\u024e\u024f\3\2\2\2\u024f\u0251\3\2\2\2\u0250\u0249\3\2\2\2\u0250"+
"\u024a\3\2\2\2\u0251\u00ba\3\2\2\2\u0252\u0254\7&\2\2\u0253\u0255\t\6"+
"\2\2\u0254\u0253\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u0254\3\2\2\2\u0256"+
"\u0257\3\2\2\2\u0257\u00bc\3\2\2\2\u0258\u025a\7\'\2\2\u0259\u025b\4\62"+
"\63\2\u025a\u0259\3\2\2\2\u025b\u025c\3\2\2\2\u025c\u025a\3\2\2\2\u025c"+
"\u025d\3\2\2\2\u025d\u00be\3\2\2\2\u025e\u0264\5\u00c1a\2\u025f\u0261"+
"\t\7\2\2\u0260\u0262\t\b\2\2\u0261\u0260\3\2\2\2\u0261\u0262\3\2\2\2\u0262"+
"\u0263\3\2\2\2\u0263\u0265\5\u00c1a\2\u0264\u025f\3\2\2\2\u0264\u0265"+
"\3\2\2\2\u0265\u00c0\3\2\2\2\u0266\u0268\4\62;\2\u0267\u0266\3\2\2\2\u0268"+
"\u0269\3\2\2\2\u0269\u0267\3\2\2\2\u0269\u026a\3\2\2\2\u026a\u0271\3\2"+
"\2\2\u026b\u026d\7\60\2\2\u026c\u026e\4\62;\2\u026d\u026c\3\2\2\2\u026e"+
"\u026f\3\2\2\2\u026f\u026d\3\2\2\2\u026f\u0270\3\2\2\2\u0270\u0272\3\2"+
"\2\2\u0271\u026b\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u00c2\3\2\2\2\u0273"+
"\u0274\7^\2\2\u0274\u0278\13\2\2\2\u0275\u0276\7^\2\2\u0276\u0278\5\u00b5"+
"[\2\u0277\u0273\3\2\2\2\u0277\u0275\3\2\2\2\u0278\u00c4\3\2\2\2\u0279"+
"\u027e\7$\2\2\u027a\u027d\5\u00c3b\2\u027b\u027d\n\t\2\2\u027c\u027a\3"+
"\2\2\2\u027c\u027b\3\2\2\2\u027d\u0280\3\2\2\2\u027e\u027c\3\2\2\2\u027e"+
"\u027f\3\2\2\2\u027f\u0281\3\2\2\2\u0280\u027e\3\2\2\2\u0281\u0282\7$"+
"\2\2\u0282\u0283\bc\4\2\u0283\u00c6\3\2\2\2\u0284\u0285\7}\2\2\u0285\u0286"+
"\7}\2\2\u0286\u0288\3\2\2\2\u0287\u0289\13\2\2\2\u0288\u0287\3\2\2\2\u0289"+
"\u028a\3\2\2\2\u028a\u028b\3\2\2\2\u028a\u0288\3\2\2\2\u028b\u028c\3\2"+
"\2\2\u028c\u028d\7\177\2\2\u028d\u028e\7\177\2\2\u028e\u028f\3\2\2\2\u028f"+
"\u0290\bd\5\2\u0290\u00c8\3\2\2\2\25\2\u0229\u0234\u0240\u0246\u024e\u0250"+
"\u0254\u0256\u025c\u0261\u0264\u0269\u026f\u0271\u0277\u027c\u027e\u028a"+
"\6\2\3\2\b\2\2\3c\2\3d\3";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -84,18 +84,17 @@ T__82=83
T__83=84
T__84=85
T__85=86
T__86=87
LINECOMMENT=88
COMMENT=89
WS=90
EOL=91
NAME=92
DEC_INTEGER=93
HEX_INTEGER=94
BIN_INTEGER=95
FLOAT_NUMBER=96
STRING=97
INLINEASMBLOCK=98
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
'~'=1
':'=2
'goto'=3
@ -169,17 +168,16 @@ INLINEASMBLOCK=98
'AY'=71
'XY'=72
'Pc'=73
'Pi'=74
'Pz'=75
'Pn'=76
'Pv'=77
'true'=78
'false'=79
'%asm'=80
'sub'=81
'->'=82
'{'=83
'}'=84
'?'=85
'if'=86
'else'=87
'Pz'=74
'Pn'=75
'Pv'=76
'true'=77
'false'=78
'%asm'=79
'sub'=80
'->'=81
'{'=82
'}'=83
'?'=84
'if'=85
'else'=86

View File

@ -1,4 +1,4 @@
// Generated from il65.g4 by ANTLR 4.7.1
// Generated from /home/irmen/Projects/il65/il65/antlr/il65.g4 by ANTLR 4.7
package il65.parser;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
@ -11,7 +11,7 @@ import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class il65Parser extends Parser {
static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); }
static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); }
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache =
@ -28,9 +28,9 @@ public class il65Parser extends Parser {
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, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, T__86=87,
LINECOMMENT=88, COMMENT=89, WS=90, EOL=91, NAME=92, DEC_INTEGER=93, HEX_INTEGER=94,
BIN_INTEGER=95, FLOAT_NUMBER=96, STRING=97, INLINEASMBLOCK=98;
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, LINECOMMENT=87,
COMMENT=88, WS=89, EOL=90, NAME=91, DEC_INTEGER=92, HEX_INTEGER=93, BIN_INTEGER=94,
FLOAT_NUMBER=95, STRING=96, INLINEASMBLOCK=97;
public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3,
RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7,
@ -65,7 +65,7 @@ public class il65Parser extends Parser {
"'*'", "'/'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'",
"'XY'", "'Pc'", "'Pi'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
};
private static final String[] _SYMBOLIC_NAMES = {
@ -76,9 +76,8 @@ public class il65Parser 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, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME",
"DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING",
"INLINEASMBLOCK"
null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -294,7 +293,7 @@ public class il65Parser extends Parser {
setState(100);
_errHandler.sync(this);
_la = _input.LA(1);
if (((((_la - 93)) & ~0x3f) == 0 && ((1L << (_la - 93)) & ((1L << (DEC_INTEGER - 93)) | (1L << (HEX_INTEGER - 93)) | (1L << (BIN_INTEGER - 93)))) != 0)) {
if (((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (DEC_INTEGER - 92)) | (1L << (HEX_INTEGER - 92)) | (1L << (BIN_INTEGER - 92)))) != 0)) {
{
setState(99);
integerliteral();
@ -1617,7 +1616,7 @@ public class il65Parser extends Parser {
setState(264);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (T__78 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{
setState(263);
expression_list();
@ -1683,7 +1682,7 @@ public class il65Parser extends Parser {
setState(274);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (T__78 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{
setState(273);
expression_list();
@ -1897,7 +1896,7 @@ public class il65Parser extends Parser {
{
setState(299);
_la = _input.LA(1);
if ( !(((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)) | (1L << (T__76 - 67)))) != 0)) ) {
if ( !(((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1937,7 +1936,7 @@ public class il65Parser extends Parser {
{
setState(301);
_la = _input.LA(1);
if ( !(((((_la - 93)) & ~0x3f) == 0 && ((1L << (_la - 93)) & ((1L << (DEC_INTEGER - 93)) | (1L << (HEX_INTEGER - 93)) | (1L << (BIN_INTEGER - 93)))) != 0)) ) {
if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (DEC_INTEGER - 92)) | (1L << (HEX_INTEGER - 92)) | (1L << (BIN_INTEGER - 92)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1974,7 +1973,7 @@ public class il65Parser extends Parser {
{
setState(303);
_la = _input.LA(1);
if ( !(_la==T__77 || _la==T__78) ) {
if ( !(_la==T__76 || _la==T__77) ) {
_errHandler.recoverInline(this);
}
else {
@ -2146,8 +2145,8 @@ public class il65Parser extends Parser {
integerliteral();
}
break;
case T__76:
case T__77:
case T__78:
enterOuterAlt(_localctx, 2);
{
setState(321);
@ -2205,7 +2204,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(327);
match(T__79);
match(T__78);
setState(328);
match(INLINEASMBLOCK);
}
@ -2252,7 +2251,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(330);
match(T__80);
match(T__79);
setState(331);
identifier();
setState(332);
@ -2270,13 +2269,13 @@ public class il65Parser extends Parser {
setState(336);
match(T__40);
setState(337);
match(T__81);
match(T__80);
setState(338);
match(T__39);
setState(340);
_errHandler.sync(this);
_la = _input.LA(1);
if (((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)) | (1L << (T__76 - 67)) | (1L << (T__84 - 67)))) != 0)) {
if (((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)) | (1L << (T__83 - 67)))) != 0)) {
{
setState(339);
sub_returns();
@ -2294,7 +2293,7 @@ public class il65Parser extends Parser {
sub_address();
}
break;
case T__82:
case T__81:
{
{
setState(344);
@ -2345,13 +2344,13 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(349);
match(T__82);
match(T__81);
setState(350);
match(EOL);
setState(355);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__74 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (T__79 - 65)) | (1L << (T__80 - 65)) | (1L << (T__85 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) {
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__74 - 65)) | (1L << (T__75 - 65)) | (1L << (T__78 - 65)) | (1L << (T__79 - 65)) | (1L << (T__84 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) {
{
setState(353);
_errHandler.sync(this);
@ -2386,10 +2385,9 @@ public class il65Parser extends Parser {
case T__73:
case T__74:
case T__75:
case T__76:
case T__78:
case T__79:
case T__80:
case T__85:
case T__84:
case NAME:
{
setState(351);
@ -2411,7 +2409,7 @@ public class il65Parser extends Parser {
_la = _input.LA(1);
}
setState(358);
match(T__83);
match(T__82);
}
}
catch (RecognitionException re) {
@ -2568,11 +2566,11 @@ public class il65Parser extends Parser {
setState(384);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__84:
case T__83:
enterOuterAlt(_localctx, 1);
{
setState(375);
match(T__84);
match(T__83);
}
break;
case T__66:
@ -2585,7 +2583,6 @@ public class il65Parser extends Parser {
case T__73:
case T__74:
case T__75:
case T__76:
enterOuterAlt(_localctx, 2);
{
{
@ -2647,10 +2644,10 @@ public class il65Parser extends Parser {
setState(388);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__84) {
if (_la==T__83) {
{
setState(387);
match(T__84);
match(T__83);
}
}
@ -2698,7 +2695,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(390);
match(T__85);
match(T__84);
setState(391);
match(T__39);
setState(392);
@ -2748,17 +2745,16 @@ public class il65Parser extends Parser {
case T__73:
case T__74:
case T__75:
case T__76:
case T__78:
case T__79:
case T__80:
case T__85:
case T__84:
case NAME:
{
setState(397);
statement();
}
break;
case T__82:
case T__81:
{
setState(398);
statement_block();
@ -2780,7 +2776,7 @@ public class il65Parser extends Parser {
setState(405);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__86) {
if (_la==T__85) {
{
setState(404);
else_part();
@ -2824,7 +2820,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(409);
match(T__86);
match(T__85);
setState(411);
_errHandler.sync(this);
_la = _input.LA(1);
@ -2868,17 +2864,16 @@ public class il65Parser extends Parser {
case T__73:
case T__74:
case T__75:
case T__76:
case T__78:
case T__79:
case T__80:
case T__85:
case T__84:
case NAME:
{
setState(413);
statement();
}
break;
case T__82:
case T__81:
{
setState(414);
statement_block();
@ -2942,7 +2937,7 @@ public class il65Parser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3d\u01a4\4\2\t\2\4"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3c\u01a4\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"+
@ -2974,7 +2969,7 @@ public class il65Parser extends Parser {
"\n*\3*\5*\u0198\n*\3*\3*\3+\3+\5+\u019e\n+\3+\3+\5+\u01a2\n+\3+\2\3&,"+
"\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
"JLNPRT\2\17\3\2\6\16\3\2\23\31\3\2\34\'\3\2()\4\2\3\3,-\3\2/\60\3\2,-"+
"\3\2\61\64\3\2\658\3\29:\3\2EO\3\2_a\3\2PQ\2\u01c7\2Z\3\2\2\2\4a\3\2\2"+
"\3\2\61\64\3\2\658\3\29:\3\2EN\3\2^`\3\2OP\2\u01c7\2Z\3\2\2\2\4a\3\2\2"+
"\2\6c\3\2\2\2\bz\3\2\2\2\n|\3\2\2\2\f\177\3\2\2\2\16\u0085\3\2\2\2\20"+
"\u0096\3\2\2\2\22\u0098\3\2\2\2\24\u009e\3\2\2\2\26\u00a6\3\2\2\2\30\u00a9"+
"\3\2\2\2\32\u00ac\3\2\2\2\34\u00ae\3\2\2\2\36\u00b6\3\2\2\2 \u00ba\3\2"+
@ -2983,11 +2978,11 @@ public class il65Parser extends Parser {
"\2\64\u012d\3\2\2\2\66\u012f\3\2\2\28\u0131\3\2\2\2:\u0133\3\2\2\2<\u013e"+
"\3\2\2\2>\u0140\3\2\2\2@\u0147\3\2\2\2B\u0149\3\2\2\2D\u014c\3\2\2\2F"+
"\u015f\3\2\2\2H\u016a\3\2\2\2J\u016d\3\2\2\2L\u0175\3\2\2\2N\u0182\3\2"+
"\2\2P\u0184\3\2\2\2R\u0188\3\2\2\2T\u019b\3\2\2\2VY\5\4\3\2WY\7]\2\2X"+
"V\3\2\2\2XW\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2[]\3\2\2\2\\Z\3\2\2"+
"\2\2P\u0184\3\2\2\2R\u0188\3\2\2\2T\u019b\3\2\2\2VY\5\4\3\2WY\7\\\2\2"+
"XV\3\2\2\2XW\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2[]\3\2\2\2\\Z\3\2\2"+
"\2]^\7\2\2\3^\3\3\2\2\2_b\5\16\b\2`b\5\6\4\2a_\3\2\2\2a`\3\2\2\2b\5\3"+
"\2\2\2cd\7\3\2\2df\5\60\31\2eg\5\66\34\2fe\3\2\2\2fg\3\2\2\2gh\3\2\2\2"+
"hi\5F$\2ij\7]\2\2j\7\3\2\2\2k{\5\16\b\2l{\5\24\13\2m{\5\22\n\2n{\5\26"+
"hi\5F$\2ij\7\\\2\2j\7\3\2\2\2k{\5\16\b\2l{\5\24\13\2m{\5\22\n\2n{\5\26"+
"\f\2o{\5\30\r\2p{\5\36\20\2q{\5 \21\2r{\5\f\7\2s{\5$\23\2t{\5*\26\2u{"+
"\5R*\2v{\5D#\2w{\5B\"\2x{\5\n\6\2y{\5.\30\2zk\3\2\2\2zl\3\2\2\2zm\3\2"+
"\2\2zn\3\2\2\2zo\3\2\2\2zp\3\2\2\2zq\3\2\2\2zr\3\2\2\2zs\3\2\2\2zt\3\2"+
@ -3050,44 +3045,44 @@ public class il65Parser extends Parser {
"\u011b\u0119\3\2\2\2\u011c\u011f\3\2\2\2\u011d\u011b\3\2\2\2\u011d\u011e"+
"\3\2\2\2\u011e-\3\2\2\2\u011f\u011d\3\2\2\2\u0120\u0122\7C\2\2\u0121\u0123"+
"\5,\27\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2\2\u0123/\3\2\2\2\u0124"+
"\u0125\7^\2\2\u0125\61\3\2\2\2\u0126\u0129\7^\2\2\u0127\u0128\7D\2\2\u0128"+
"\u012a\7^\2\2\u0129\u0127\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u0129\3\2"+
"\u0125\7]\2\2\u0125\61\3\2\2\2\u0126\u0129\7]\2\2\u0127\u0128\7D\2\2\u0128"+
"\u012a\7]\2\2\u0129\u0127\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u0129\3\2"+
"\2\2\u012b\u012c\3\2\2\2\u012c\63\3\2\2\2\u012d\u012e\t\f\2\2\u012e\65"+
"\3\2\2\2\u012f\u0130\t\r\2\2\u0130\67\3\2\2\2\u0131\u0132\t\16\2\2\u0132"+
"9\3\2\2\2\u0133\u0134\7\32\2\2\u0134\u0139\5&\24\2\u0135\u0136\7\17\2"+
"\2\u0136\u0138\5&\24\2\u0137\u0135\3\2\2\2\u0138\u013b\3\2\2\2\u0139\u0137"+
"\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013c\3\2\2\2\u013b\u0139\3\2\2\2\u013c"+
"\u013d\7\33\2\2\u013d;\3\2\2\2\u013e\u013f\7c\2\2\u013f=\3\2\2\2\u0140"+
"\u0141\7b\2\2\u0141?\3\2\2\2\u0142\u0148\5\66\34\2\u0143\u0148\58\35\2"+
"\u013d\7\33\2\2\u013d;\3\2\2\2\u013e\u013f\7b\2\2\u013f=\3\2\2\2\u0140"+
"\u0141\7a\2\2\u0141?\3\2\2\2\u0142\u0148\5\66\34\2\u0143\u0148\58\35\2"+
"\u0144\u0148\5:\36\2\u0145\u0148\5<\37\2\u0146\u0148\5> \2\u0147\u0142"+
"\3\2\2\2\u0147\u0143\3\2\2\2\u0147\u0144\3\2\2\2\u0147\u0145\3\2\2\2\u0147"+
"\u0146\3\2\2\2\u0148A\3\2\2\2\u0149\u014a\7R\2\2\u014a\u014b\7d\2\2\u014b"+
"C\3\2\2\2\u014c\u014d\7S\2\2\u014d\u014e\5\60\31\2\u014e\u0150\7*\2\2"+
"\u0146\3\2\2\2\u0148A\3\2\2\2\u0149\u014a\7Q\2\2\u014a\u014b\7c\2\2\u014b"+
"C\3\2\2\2\u014c\u014d\7R\2\2\u014d\u014e\5\60\31\2\u014e\u0150\7*\2\2"+
"\u014f\u0151\5J&\2\u0150\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0152"+
"\3\2\2\2\u0152\u0153\7+\2\2\u0153\u0154\7T\2\2\u0154\u0156\7*\2\2\u0155"+
"\3\2\2\2\u0152\u0153\7+\2\2\u0153\u0154\7S\2\2\u0154\u0156\7*\2\2\u0155"+
"\u0157\5N(\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0158\3\2\2"+
"\2\u0158\u015d\7+\2\2\u0159\u015e\5H%\2\u015a\u015b\5F$\2\u015b\u015c"+
"\7]\2\2\u015c\u015e\3\2\2\2\u015d\u0159\3\2\2\2\u015d\u015a\3\2\2\2\u015e"+
"E\3\2\2\2\u015f\u0160\7U\2\2\u0160\u0165\7]\2\2\u0161\u0164\5\b\5\2\u0162"+
"\u0164\7]\2\2\u0163\u0161\3\2\2\2\u0163\u0162\3\2\2\2\u0164\u0167\3\2"+
"\7\\\2\2\u015c\u015e\3\2\2\2\u015d\u0159\3\2\2\2\u015d\u015a\3\2\2\2\u015e"+
"E\3\2\2\2\u015f\u0160\7T\2\2\u0160\u0165\7\\\2\2\u0161\u0164\5\b\5\2\u0162"+
"\u0164\7\\\2\2\u0163\u0161\3\2\2\2\u0163\u0162\3\2\2\2\u0164\u0167\3\2"+
"\2\2\u0165\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0168\3\2\2\2\u0167"+
"\u0165\3\2\2\2\u0168\u0169\7V\2\2\u0169G\3\2\2\2\u016a\u016b\7\20\2\2"+
"\u0165\3\2\2\2\u0168\u0169\7U\2\2\u0169G\3\2\2\2\u016a\u016b\7\20\2\2"+
"\u016b\u016c\5\66\34\2\u016cI\3\2\2\2\u016d\u0172\5L\'\2\u016e\u016f\7"+
"\17\2\2\u016f\u0171\5L\'\2\u0170\u016e\3\2\2\2\u0171\u0174\3\2\2\2\u0172"+
"\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173K\3\2\2\2\u0174\u0172\3\2\2\2"+
"\u0175\u0176\5\60\31\2\u0176\u0177\7\4\2\2\u0177\u0178\5\64\33\2\u0178"+
"M\3\2\2\2\u0179\u0183\7W\2\2\u017a\u017f\5P)\2\u017b\u017c\7\17\2\2\u017c"+
"M\3\2\2\2\u0179\u0183\7V\2\2\u017a\u017f\5P)\2\u017b\u017c\7\17\2\2\u017c"+
"\u017e\5P)\2\u017d\u017b\3\2\2\2\u017e\u0181\3\2\2\2\u017f\u017d\3\2\2"+
"\2\u017f\u0180\3\2\2\2\u0180\u0183\3\2\2\2\u0181\u017f\3\2\2\2\u0182\u0179"+
"\3\2\2\2\u0182\u017a\3\2\2\2\u0183O\3\2\2\2\u0184\u0186\5\64\33\2\u0185"+
"\u0187\7W\2\2\u0186\u0185\3\2\2\2\u0186\u0187\3\2\2\2\u0187Q\3\2\2\2\u0188"+
"\u0189\7X\2\2\u0189\u018a\7*\2\2\u018a\u018b\5&\24\2\u018b\u018d\7+\2"+
"\2\u018c\u018e\7]\2\2\u018d\u018c\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0191"+
"\u0187\7V\2\2\u0186\u0185\3\2\2\2\u0186\u0187\3\2\2\2\u0187Q\3\2\2\2\u0188"+
"\u0189\7W\2\2\u0189\u018a\7*\2\2\u018a\u018b\5&\24\2\u018b\u018d\7+\2"+
"\2\u018c\u018e\7\\\2\2\u018d\u018c\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0191"+
"\3\2\2\2\u018f\u0192\5\b\5\2\u0190\u0192\5F$\2\u0191\u018f\3\2\2\2\u0191"+
"\u0190\3\2\2\2\u0192\u0194\3\2\2\2\u0193\u0195\7]\2\2\u0194\u0193\3\2"+
"\u0190\3\2\2\2\u0192\u0194\3\2\2\2\u0193\u0195\7\\\2\2\u0194\u0193\3\2"+
"\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0198\5T+\2\u0197\u0196"+
"\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\7]\2\2\u019a"+
"S\3\2\2\2\u019b\u019d\7Y\2\2\u019c\u019e\7]\2\2\u019d\u019c\3\2\2\2\u019d"+
"\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\7\\\2\2\u019a"+
"S\3\2\2\2\u019b\u019d\7X\2\2\u019c\u019e\7\\\2\2\u019d\u019c\3\2\2\2\u019d"+
"\u019e\3\2\2\2\u019e\u01a1\3\2\2\2\u019f\u01a2\5\b\5\2\u01a0\u01a2\5F"+
"$\2\u01a1\u019f\3\2\2\2\u01a1\u01a0\3\2\2\2\u01a2U\3\2\2\2+XZafz\u0083"+
"\u0087\u008e\u0091\u0096\u009a\u00a0\u00b2\u00c1\u00d4\u00ff\u0101\u0106"+

View File

@ -0,0 +1,104 @@
package il65.stackvm
enum class Opcode {
// pushing values on the (evaluation) stack
PUSH, // push constant byte value
PUSH_W, // push constant word value
PUSH_F, // push constant float value
PUSH_LOCAL, // push block-local variable (byte)
PUSH_LOCAL_W, // push block-local variable (word)
PUSH_LOCAL_F, // push block-local variable (float)
// popping values off the (evaluation) stack, possibly storing them in another location
DISCARD, // discard X bytes from the top of the stack
POP_MEM, // pop byte value into destination memory address
POP_MEM_W, // pop word value into destination memory address
POP_MEM_F, // pop float value into destination memory address
POP_LOCAL, // pop byte value into block-local variable
POP_LOCAL_W, // pop word value into block-local variable
POP_LOCAL_F, // pop float value into block-local variable
// integer and bitwise arithmetic
ADD,
SUB,
MUL,
DIV,
ADD_W,
SUB_W,
MUL_W,
DIV_W,
SHL,
SHR,
ROL,
ROR,
SHL_W,
SHR_W,
ROL_W,
ROR_W,
AND,
OR,
XOR,
NOT,
AND_W,
OR_W,
XOR_W,
NOT_W,
// floating point arithmetic
ADD_F,
SUB_F,
MUL_F,
DIV_F,
NEG_F,
// logical operations (?)
// increment, decrement
INC,
INC_W,
INC_F,
INC_MEM,
INC_MEM_W,
INC_MEM_F,
INC_LOCAL,
INC_LOCAL_W,
INC_LOCAL_F,
DEC,
DEC_W,
DEC_F,
DEC_MEM,
DEC_MEM_W,
DEC_MEM_F,
DEC_LOCAL,
DEC_LOCAL_W,
DEC_LOCAL_F,
// conversions
CV_F_B, // float -> byte (truncated)
CV_F_W, // float -> word (truncated)
CV_B_F, // byte -> float
CV_W_F, // word -> float
CV_B_W, // byte -> word
CV_W_B, // word -> byte
// comparisons (?)
// branching
JUMP,
// subroutine calling
CALL,
RETURN,
SYSCALL,
// misc
TERMINATE
}
private class Memory {
val mem = ByteArray(65536)
}