diff --git a/docs/source/syntaxreference.rst b/docs/source/syntaxreference.rst index 45a3062f3..a3c1e4ef0 100644 --- a/docs/source/syntaxreference.rst +++ b/docs/source/syntaxreference.rst @@ -289,7 +289,7 @@ arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%`` ``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations. ``//`` means *integer division* even when the operands are floating point values: ``9.5 // 2.5`` is 3 (and not 3.8) ``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243. - ``%`` is the modulo operator: ``25 % 7`` is 4. + ``%`` is the remainder operator: ``25 % 7`` is 4. bitwise arithmetic: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~`` diff --git a/il65/antlr/il65.g4 b/il65/antlr/il65.g4 index d2708ba53..c7b7e63bf 100644 --- a/il65/antlr/il65.g4 +++ b/il65/antlr/il65.g4 @@ -96,7 +96,7 @@ arrayspec: '[' expression (',' expression)? ']' ; assignment : assign_target '=' expression ; augassignment : - assign_target operator=('+=' | '-=' | '/=' | '//=' | '*=' | '**=' | + assign_target operator=('+=' | '-=' | '/=' | '*=' | '**=' | '<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression ; @@ -112,10 +112,9 @@ expression : '(' expression ')' | expression arrayspec | functioncall - | prefix = ('+'|'-') expression - | prefix = ('~'|'not') expression + | prefix = ('+'|'-'|'~') expression | left = expression bop = '**' right = expression - | left = expression bop = ('*' | '/' | '//' | '%') right = expression + | left = expression bop = ('*' | '/' | '%') right = expression | left = expression bop = ('+' | '-' ) right = expression | left = expression bop = ('<<' | '>>' | '<<@' | '>>@' ) right = expression | left = expression bop = ('<' | '>' | '<=' | '>=') right = expression @@ -126,6 +125,7 @@ expression : | left = expression bop = 'and' right = expression | left = expression bop = 'or' right = expression | left = expression bop = 'xor' right = expression + | prefix = 'not' expression | rangefrom = expression 'to' rangeto = expression | literalvalue | register diff --git a/il65/src/il65/AstOptimizer.kt b/il65/src/il65/AstOptimizer.kt new file mode 100644 index 000000000..3d3afa09b --- /dev/null +++ b/il65/src/il65/AstOptimizer.kt @@ -0,0 +1,445 @@ +package il65 + +import il65.ast.* +import kotlin.math.pow + + +interface IAstOptimizer { + fun optimize(expr: PrefixExpression): IExpression + fun optimize(expr: BinaryExpression): IExpression +} + +fun Module.optimized() : Module { + val optimizer = AstOptimizer() + var result = this.optimizeOnceWith(optimizer) + while(optimizer.optimizationsDone>0) { + println("Optimizations done: ${optimizer.optimizationsDone}") + optimizer.reset() + result = result.optimizeOnceWith(optimizer) + } + println("nothing left to optimize!") + return result +} + + +class AstOptimizer : IAstOptimizer { + + var optimizationsDone: Int = 0 + private set + + fun reset() { + optimizationsDone = 0 + } + + /** + * Try to optimize a unary prefix expression. + * Compile-time constant sub expressions will be evaluated on the spot. + * For instance, the expression for "- 4.5" will be optimized into the float literal -4.5 + */ + override fun optimize(expr: PrefixExpression): IExpression { + expr.expression = expr.expression.optimize(this) // optimize sub expression first + + val subexpr = expr.expression + if (subexpr is LiteralValue) { + // optimize prefixed literal values (such as -3, not true) + return when { + expr.operator == "+" -> subexpr + expr.operator == "-" -> return when { + subexpr.intvalue != null -> { + optimizationsDone++ + LiteralValue(intvalue = subexpr.intvalue, position = subexpr.position) + } + subexpr.floatvalue != null -> { + optimizationsDone++ + LiteralValue(floatvalue = -subexpr.floatvalue, position = subexpr.position) + } + else -> throw UnsupportedOperationException("can only take negative of int or float") + } + expr.operator == "~" -> return when { + subexpr.intvalue != null -> { + optimizationsDone++ + LiteralValue(intvalue = subexpr.intvalue.inv(), position = subexpr.position) + } + else -> throw UnsupportedOperationException("can only take bitwise inversion of int") + } + expr.operator == "not" -> return when { + subexpr.intvalue != null -> { + optimizationsDone++ + LiteralValue(intvalue = if (subexpr.intvalue == 0) 1 else 0, position = subexpr.position) + } + subexpr.floatvalue != null -> { + optimizationsDone++ + LiteralValue(intvalue = if (subexpr.floatvalue == 0.0) 1 else 0, position = subexpr.position) + } + else -> throw UnsupportedOperationException("can not take logical not of $subexpr") + } + else -> throw UnsupportedOperationException(expr.operator) + } + } + return expr + } + + /** + * Try to optimize a binary expression. + * Compile-time constant sub expressions will be evaluated on the spot. + * For instance, "9 * (4 + 2)" will be optimized into the integer literal 54. + */ + override fun optimize(expr: BinaryExpression): IExpression { + val evaluator = ConstExprEvaluator() + // optimize sub expressions first + expr.left = expr.left.optimize(this) + expr.right = expr.right.optimize(this) + + val leftconst = expr.left.constValue() + val rightconst = expr.right.constValue() + return when { + leftconst != null && rightconst != null -> { + println("optimizing $expr") + optimizationsDone++ + evaluator.evaluate(leftconst, expr.operator, rightconst) + } + else -> expr + } + } +} + + +class ConstExprEvaluator { + + fun evaluate(left: LiteralValue, operator: String, right: LiteralValue): IExpression { + return when(operator) { + "+" -> plus(left, right) + "-" -> minus(left, right) + "*" -> multiply(left, right) + "/" -> divide(left, right) + "%" -> remainder(left, right) + "**" -> power(left, right) + "<<" -> shiftleft(left, right) + ">>" -> shiftright(left, right) + "<<@" -> rotateleft(left, right) + ">>@" -> rotateright(left, right) + "&" -> bitwiseand(left, right) + "|" -> bitwiseor(left, right) + "^" -> bitwisexor(left, right) + "and" -> logicaland(left, right) + "or" -> logicalor(left, right) + "xor" -> logicalxor(left, right) + "<" -> compareless(left, right) + ">" -> comparegreater(left, right) + "<=" -> comparelessequal(left, right) + ">=" -> comparegreaterequal(left, right) + "==" -> compareequal(left, right) + "!=" -> comparenotequal(left, right) + else -> throw AstException("const evaluation for invalid operator $operator") + } + } + + private fun comparenotequal(left: LiteralValue, right: LiteralValue): LiteralValue { + val leq = compareequal(left, right) + return LiteralValue(intvalue = if(leq.intvalue==1) 0 else 1, position = left.position) + } + + private fun compareequal(left: LiteralValue, right: LiteralValue): LiteralValue { + val leftvalue: Any = when { + left.intvalue!=null -> left.intvalue + left.floatvalue!=null -> left.floatvalue + left.strvalue!=null -> left.strvalue + left.arrayvalue!=null -> left.arrayvalue + else -> throw AstException("missing literal value") + } + val rightvalue: Any = when { + right.intvalue!=null -> right.intvalue + right.floatvalue!=null -> right.floatvalue + right.strvalue!=null -> right.strvalue + right.arrayvalue!=null -> right.arrayvalue + else -> throw AstException("missing literal value") + } + return LiteralValue(intvalue = if(leftvalue==rightvalue) 1 else 0, position = left.position) + } + + private fun comparegreaterequal(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot compute $left >= $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.intvalue >= right.intvalue) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.intvalue >= right.floatvalue) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue >= right.intvalue) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue >= right.floatvalue) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun comparelessequal(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot compute $left >= $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.intvalue <= right.intvalue) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.intvalue <= right.floatvalue) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue <= right.intvalue) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue <= right.floatvalue) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun comparegreater(left: LiteralValue, right: LiteralValue): LiteralValue { + val leq = comparelessequal(left, right) + return LiteralValue(intvalue = if(leq.intvalue==1) 0 else 1, position = left.position) + } + + private fun compareless(left: LiteralValue, right: LiteralValue): LiteralValue { + val leq = comparegreaterequal(left, right) + return LiteralValue(intvalue = if(leq.intvalue==1) 0 else 1, position = left.position) + } + + private fun logicalxor(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot compute $left locical-xor $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if ((left.intvalue!=0).xor(right.intvalue!=0)) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if ((left.intvalue!=0).xor(right.floatvalue!=0.0)) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if ((left.floatvalue!=0.0).xor(right.intvalue!=0)) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if ((left.floatvalue!=0.0).xor(right.floatvalue!=0.0)) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun logicalor(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot compute $left locical-or $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.intvalue!=0 || right.intvalue!=0) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.intvalue!=0 || right.floatvalue!=0.0) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue!=0.0 || right.intvalue!=0) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue!=0.0 || right.floatvalue!=0.0) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun logicaland(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot compute $left locical-and $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.intvalue!=0 && right.intvalue!=0) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.intvalue!=0 && right.floatvalue!=0.0) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue!=0.0 && right.intvalue!=0) 1 else 0, + position = left.position) + right.floatvalue!=null -> LiteralValue( + intvalue = if (left.floatvalue!=0.0 && right.floatvalue!=0.0) 1 else 0, + position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun bitwisexor(left: LiteralValue, right: LiteralValue): LiteralValue { + if(left.intvalue!=null && right.intvalue !=null) + return LiteralValue(intvalue = left.intvalue.xor(right.intvalue), position = left.position) + throw AstException("cannot calculate $left ^ $right") + } + + private fun bitwiseor(left: LiteralValue, right: LiteralValue): LiteralValue { + if(left.intvalue!=null && right.intvalue !=null) + return LiteralValue(intvalue = left.intvalue.or(right.intvalue), position = left.position) + throw AstException("cannot calculate $left | $right") + } + + private fun bitwiseand(left: LiteralValue, right: LiteralValue): LiteralValue { + if(left.intvalue!=null && right.intvalue !=null) + return LiteralValue(intvalue = left.intvalue.and(right.intvalue), position = left.position) + throw AstException("cannot calculate $left & $right") + } + + private fun rotateright(left: LiteralValue, right: LiteralValue): LiteralValue { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + private fun rotateleft(left: LiteralValue, right: LiteralValue): LiteralValue { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + private fun shiftright(left: LiteralValue, right: LiteralValue): LiteralValue { + if(left.intvalue!=null && right.intvalue !=null) + return LiteralValue(intvalue = left.intvalue.shr(right.intvalue), position = left.position) + throw AstException("cannot calculate $left >> $right") + } + + private fun shiftleft(left: LiteralValue, right: LiteralValue): LiteralValue { + if(left.intvalue!=null && right.intvalue !=null) + return LiteralValue(intvalue = left.intvalue.shl(right.intvalue), position = left.position) + throw AstException("cannot calculate $left << $right") + } + + private fun power(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot calculate $left ** $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue.toDouble().pow(right.intvalue).toInt(), position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue.toDouble().pow(right.floatvalue), position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue.pow(right.intvalue), position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue.pow(right.floatvalue), position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun remainder(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot calculate remainder of $left / $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue.rem(right.intvalue), position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue.rem(right.floatvalue), position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue.rem(right.intvalue), position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue.rem(right.floatvalue), position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun plus(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot add $left and $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue + right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue + right.floatvalue, position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue + right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue + right.floatvalue, position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun minus(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot subtract $left and $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue - right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue - right.floatvalue, position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue - right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue - right.floatvalue, position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun multiply(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot multiply $left and $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue * right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue * right.floatvalue, position = left.position) + right.strvalue!=null -> { + if(right.strvalue.length * left.intvalue > 65535) throw AstException("string too large") + LiteralValue(strvalue = right.strvalue.repeat(left.intvalue), position = left.position) + } + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue * right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue * right.floatvalue, position = left.position) + else -> throw AstException(error) + } + left.strvalue!=null -> when { + right.intvalue!=null -> { + if(left.strvalue.length * right.intvalue > 65535) throw AstException("string too large") + LiteralValue(strvalue = left.strvalue.repeat(right.intvalue), position=left.position) + } + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } + + private fun divide(left: LiteralValue, right: LiteralValue): LiteralValue { + val error = "cannot divide $left by $right" + return when { + left.intvalue!=null -> when { + right.intvalue!=null -> LiteralValue(intvalue = left.intvalue / right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.intvalue / right.floatvalue, position = left.position) + else -> throw AstException(error) + } + left.floatvalue!=null -> when { + right.intvalue!=null -> LiteralValue(floatvalue = left.floatvalue / right.intvalue, position = left.position) + right.floatvalue!=null -> LiteralValue(floatvalue = left.floatvalue / right.floatvalue, position = left.position) + else -> throw AstException(error) + } + else -> throw AstException(error) + } + } +} diff --git a/il65/src/il65/Main.kt b/il65/src/il65/Main.kt index 557fa9ea8..58974af89 100644 --- a/il65/src/il65/Main.kt +++ b/il65/src/il65/Main.kt @@ -1,15 +1,13 @@ package il65 -import il65.ast.Label -import il65.ast.LiteralValue -import il65.ast.PrefixExpression +import il65.ast.IStatement +import il65.ast.Module import il65.ast.toAst import il65.parser.il65Lexer import il65.parser.il65Parser import org.antlr.v4.runtime.CharStreams import org.antlr.v4.runtime.CommonTokenStream import org.antlr.v4.runtime.Lexer -import org.antlr.v4.runtime.misc.IntegerList class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) { @@ -29,33 +27,33 @@ class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) { } } +public inline fun Module.map(transform: (IStatement) -> R): List { + val result = ArrayList(lines.size) + for (line in this.lines) { + result.add(transform(line)) + } + return result +} fun main(args: Array) { // println("Reading source file: ${args[0]}") val input = CharStreams.fromString( - "%zp clobber,derp,33,de\n" + "~ main \$c000 { \n" + - " A=4 + 99\n" + - " ; full position comment\n" + - " %asm {{\n" + - " position 1\n"+ - "\t\tposition 2\n"+ - " }}\n" + - " X=Y ; comment hooo\n"+ - "}\n" - ) + " const byte hopla=55-33\n"+ + " const byte hopla2=55-hopla\n"+ + " A = \"derp\" * (2-2) \n" + + "}\n") val lexer = il65Lexer(input) val tokens = MyTokenStream(lexer) val parser = il65Parser(tokens) - val module = parser.module() - val program = module.toAst(true) + var moduleAst = parser.module().toAst(true).optimized() // the comments: tokens.commentTokens().forEach { println(it) } - program.lines.map { + moduleAst.lines.map { println(it) } } diff --git a/il65/src/il65/ast/AST.kt b/il65/src/il65/ast/AST.kt index 958fb1e3d..98cabf9e6 100644 --- a/il65/src/il65/ast/AST.kt +++ b/il65/src/il65/ast/AST.kt @@ -1,9 +1,11 @@ package il65.ast +import il65.IAstOptimizer import il65.parser.il65Parser import org.antlr.v4.runtime.ParserRuleContext import org.antlr.v4.runtime.tree.TerminalNode + /**************************** AST Data classes ****************************/ enum class DataType { @@ -28,28 +30,51 @@ enum class Register { SZ } + +class AstException(override var message: String) : Exception(message) + + data class Position(val line: Int, val startCol:Int, val endCol: Int) + interface Node { val position: Position? // optional for the sake of easy unit testing } -interface IStatement : Node -data class Module(val lines: MutableList, - override val position: Position? = null) : Node +interface IStatement : Node { + fun optimize(optimizer: IAstOptimizer) : IStatement +} -data class Block(val name: String, val address: Int?, val statements: MutableList, - override val position: Position? = null) : IStatement + +data class Module(var lines: List, + override val position: Position? = null) : Node { + fun optimizeOnceWith(optimizer: IAstOptimizer): Module { + lines = lines.map { it.optimize(optimizer) } + return this + } +} + +data class Block(val name: String, val address: Int?, var statements: List, + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer) : IStatement { + statements = statements.map { it.optimize(optimizer) } + return this + } +} data class Directive(val directive: String, val args: List, - override val position: Position? = null) : IStatement + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer) = this +} data class DirectiveArg(val str: String?, val name: String?, val int: Int?, override val position: Position? = null) : Node data class Label(val name: String, - override val position: Position? = null) : IStatement + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer) = this +} interface IVarDecl : IStatement { val datatype: DataType @@ -66,68 +91,159 @@ data class VarDecl(override val datatype: DataType, override val arrayspec: ArraySpec?, override val name: String, override var value: IExpression?, - override val position: Position? = null) : IVarDecl + override val position: Position? = null) : IVarDecl { + override fun optimize(optimizer: IAstOptimizer): IStatement { + value = value?.optimize(optimizer) + return this + } +} data class ConstDecl(override val datatype: DataType, override val arrayspec: ArraySpec?, override val name: String, override var value: IExpression?, - override val position: Position? = null) : IVarDecl + override val position: Position? = null) : IVarDecl { + override fun optimize(optimizer: IAstOptimizer): IStatement { + value = value?.optimize(optimizer) + return this + } +} data class MemoryVarDecl(override val datatype: DataType, override val arrayspec: ArraySpec?, override val name: String, override var value: IExpression?, - override val position: Position? = null) : IVarDecl + override val position: Position? = null) : IVarDecl { + override fun optimize(optimizer: IAstOptimizer): IStatement { + value = value?.optimize(optimizer) + return this + } +} -data class Assignment(val target: AssignTarget, val aug_op : String?, var value: IExpression, - override val position: Position? = null) : IStatement +data class Assignment(var target: AssignTarget, val aug_op : String?, var value: IExpression, + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer): IStatement { + target = target.optimize(optimizer) + value = value.optimize(optimizer) + return this + } +} data class AssignTarget(val register: Register?, val identifier: Identifier?, - override val position: Position? = null) : Node + override val position: Position? = null) : Node { + fun optimize(optimizer: IAstOptimizer) = this // for now +} -interface IExpression: Node +interface IExpression: Node { + fun constValue() : LiteralValue? + fun optimize(optimizer: IAstOptimizer): IExpression +} // note: some expression elements are mutable, to be able to rewrite/optimize the expression tree -data class PrefixExpression(val operator: String, val expression: IExpression, - override val position: Position? = null) : IExpression +data class PrefixExpression(val operator: String, var expression: IExpression, + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? { + throw AstException("should have been optimized away before const value was asked") + } + + override fun optimize(optimizer: IAstOptimizer) = optimizer.optimize(this) +} + data class BinaryExpression(var left: IExpression, val operator: String, var right: IExpression, - override val position: Position? = null) : IExpression + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? { + throw AstException("should have been optimized away before const value was asked") + } + + override fun optimize(optimizer: IAstOptimizer) = optimizer.optimize(this) +} + +data class LiteralValue(val intvalue: Int? = null, + val floatvalue: Double? = null, + val strvalue: String? = null, + val arrayvalue: List? = null, + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? = this + override fun optimize(optimizer: IAstOptimizer) = this +} -data class LiteralValue(val intvalue: Int?, - val floatvalue: Double?, - val strvalue: String?, - val boolvalue: Boolean?, - val arrayvalue: MutableList?, - override val position: Position? = null) : IExpression data class RangeExpr(var from: IExpression, var to: IExpression, - override val position: Position? = null) : IExpression + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? = null + override fun optimize(optimizer: IAstOptimizer): IExpression { + from = from.optimize(optimizer) + to = to.optimize(optimizer) + return this + } +} + data class RegisterExpr(val register: Register, - override val position: Position? = null) : IExpression + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? = null + override fun optimize(optimizer: IAstOptimizer) = this +} + data class Identifier(val name: String, val scope: List, - override val position: Position? = null) : IExpression + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? { + // @todo should look up the identifier and return its value if that is a compile time const + return null + } + + override fun optimize(optimizer: IAstOptimizer) = this +} + data class CallTarget(val address: Int?, val identifier: Identifier?, - override val position: Position? = null) : Node + override val position: Position? = null) : Node { + fun optimize(optimizer: IAstOptimizer) = this +} -data class PostIncrDecr(val target: AssignTarget, val operator: String, - override val position: Position? = null) : IStatement -data class Jump(val target: CallTarget, - override val position: Position? = null) : IStatement +data class PostIncrDecr(var target: AssignTarget, val operator: String, + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer): IStatement { + target = target.optimize(optimizer) + return this + } +} + + +data class Jump(var target: CallTarget, + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer): IStatement { + target = target.optimize(optimizer) + return this + } +} + + +data class FunctionCall(var target: CallTarget, var arglist: List, + override val position: Position? = null) : IExpression { + override fun constValue(): LiteralValue? { + // if the function is a built-in function and the args are consts, should evaluate! + return null + } + + override fun optimize(optimizer: IAstOptimizer): IExpression { + target = target.optimize(optimizer) + arglist = arglist.map{it.optimize(optimizer)} + return this + } +} -data class FunctionCall(val target: CallTarget, val arglist: MutableList, - override val position: Position? = null) : IExpression data class InlineAssembly(val assembly: String, - override val position: Position? = null) : IStatement + override val position: Position? = null) : IStatement { + override fun optimize(optimizer: IAstOptimizer) = this +} /***************** Antlr Extension methods to create AST ****************/ @@ -141,7 +257,7 @@ fun ParserRuleContext.toPosition(withPosition: Boolean) : Position? { fun il65Parser.ModuleContext.toAst(withPosition: Boolean) = - Module(modulestatement().map { it.toAst(withPosition) }.toMutableList(), toPosition(withPosition)) + Module(modulestatement().map { it.toAst(withPosition) }, toPosition(withPosition)) fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : IStatement { @@ -158,7 +274,7 @@ fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : IStatement fun il65Parser.BlockContext.toAst(withPosition: Boolean) : IStatement { return Block(identifier().text, integerliteral()?.toAst(), - statement().map { it.toAst(withPosition) }.toMutableList(), + statement().map { it.toAst(withPosition) }, toPosition(withPosition)) } @@ -298,14 +414,17 @@ fun il65Parser.IntegerliteralContext.toAst(): Int { fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression { val litval = literalvalue() - if(litval!=null) + if(litval!=null) { + val booleanlit = litval.booleanliteral()?.toAst() + if(booleanlit!=null) + return LiteralValue(intvalue = if(booleanlit) 1 else 0) return LiteralValue(litval.integerliteral()?.toAst(), litval.floatliteral()?.toAst(), litval.stringliteral()?.text, - litval.booleanliteral()?.toAst(), litval.arrayliteral()?.toAst(withPosition), litval.toPosition(withPosition) ) + } if(register()!=null) return RegisterExpr(register().toAst(), register().toPosition(withPosition)) @@ -331,14 +450,18 @@ fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression { if(funcall!=null) { val location = funcall.call_location().toAst(withPosition) return if(funcall.expression()!=null) - FunctionCall(location, mutableListOf(funcall.expression().toAst(withPosition)), funcall.toPosition(withPosition)) + // TODO : more than one argument + FunctionCall(location, listOf(funcall.expression().toAst(withPosition)), funcall.toPosition(withPosition)) else - FunctionCall(location, mutableListOf(), funcall.toPosition(withPosition)) + FunctionCall(location, emptyList(), funcall.toPosition(withPosition)) } if (rangefrom!=null && rangeto!=null) return RangeExpr(rangefrom.toAst(withPosition), rangeto.toAst(withPosition), toPosition(withPosition)) + if(childCount==3 && children[0].text=="(" && children[2].text==")") + return expression(0).toAst(withPosition) // expression within ( ) + throw UnsupportedOperationException(text) } @@ -367,5 +490,5 @@ fun il65Parser.BooleanliteralContext.toAst() = when(text) { fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) = - expression().map { it.toAst(withPosition) }.toMutableList() + expression().map { it.toAst(withPosition) } diff --git a/il65/src/il65/parser/il65.tokens b/il65/src/il65/parser/il65.tokens index 7a6e4fb41..b73e7409a 100644 --- a/il65/src/il65/parser/il65.tokens +++ b/il65/src/il65/parser/il65.tokens @@ -77,19 +77,17 @@ T__75=76 T__76=77 T__77=78 T__78=79 -T__79=80 -T__80=81 -LINECOMMENT=82 -COMMENT=83 -WS=84 -EOL=85 -NAME=86 -DEC_INTEGER=87 -HEX_INTEGER=88 -BIN_INTEGER=89 -FLOAT_NUMBER=90 -STRING=91 -INLINEASMBLOCK=92 +LINECOMMENT=80 +COMMENT=81 +WS=82 +EOL=83 +NAME=84 +DEC_INTEGER=85 +HEX_INTEGER=86 +BIN_INTEGER=87 +FLOAT_NUMBER=88 +STRING=89 +INLINEASMBLOCK=90 '~'=1 '{'=2 '}'=3 @@ -119,55 +117,53 @@ INLINEASMBLOCK=92 '+='=27 '-='=28 '/='=29 -'//='=30 -'*='=31 -'**='=32 -'<<='=33 -'>>='=34 -'<<@='=35 -'>>@='=36 -'&='=37 -'|='=38 -'^='=39 -'++'=40 -'--'=41 -'('=42 -')'=43 -'+'=44 -'-'=45 -'not'=46 -'**'=47 -'*'=48 -'/'=49 -'//'=50 -'%'=51 -'<<'=52 -'>>'=53 -'<<@'=54 -'>>@'=55 -'<'=56 -'>'=57 -'<='=58 -'>='=59 -'=='=60 -'!='=61 -'&'=62 -'^'=63 -'|'=64 -'and'=65 -'or'=66 -'xor'=67 -'to'=68 -'.'=69 -'A'=70 -'X'=71 -'Y'=72 -'AX'=73 -'AY'=74 -'XY'=75 -'SC'=76 -'SI'=77 -'SZ'=78 -'true'=79 -'false'=80 -'%asm'=81 +'*='=30 +'**='=31 +'<<='=32 +'>>='=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 +'and'=62 +'or'=63 +'xor'=64 +'not'=65 +'to'=66 +'.'=67 +'A'=68 +'X'=69 +'Y'=70 +'AX'=71 +'AY'=72 +'XY'=73 +'SC'=74 +'SI'=75 +'SZ'=76 +'true'=77 +'false'=78 +'%asm'=79 diff --git a/il65/src/il65/parser/il65Lexer.java b/il65/src/il65/parser/il65Lexer.java index 74aa1726e..ff615deb3 100644 --- a/il65/src/il65/parser/il65Lexer.java +++ b/il65/src/il65/parser/il65Lexer.java @@ -27,9 +27,9 @@ public class il65Lexer 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, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, - T__80=81, LINECOMMENT=82, COMMENT=83, WS=84, EOL=85, NAME=86, DEC_INTEGER=87, - HEX_INTEGER=88, BIN_INTEGER=89, FLOAT_NUMBER=90, STRING=91, INLINEASMBLOCK=92; + T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, LINECOMMENT=80, + COMMENT=81, WS=82, EOL=83, NAME=84, DEC_INTEGER=85, HEX_INTEGER=86, BIN_INTEGER=87, + FLOAT_NUMBER=88, STRING=89, INLINEASMBLOCK=90; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -48,10 +48,9 @@ public class il65Lexer 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", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", - "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", - "BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", - "INLINEASMBLOCK" + "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "LINECOMMENT", "COMMENT", + "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", + "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK" }; private static final String[] _LITERAL_NAMES = { @@ -59,12 +58,12 @@ public class il65Lexer extends Lexer { "'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", - "'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", - "'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", - "'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'", - "'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", - "'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", - "'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" + "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='", + "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", + "'*'", "'/'", "'%'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='", + "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'", + "'not'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'SC'", + "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -73,9 +72,9 @@ 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, null, null, null, null, null, null, "LINECOMMENT", - "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", - "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" + null, null, null, null, null, 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); @@ -137,10 +136,10 @@ public class il65Lexer extends Lexer { @Override public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { switch (ruleIndex) { - case 92: + case 90: STRING_action((RuleContext)_localctx, actionIndex); break; - case 93: + case 91: INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); break; } @@ -169,7 +168,7 @@ public class il65Lexer extends Lexer { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2^\u0267\b\1\4\2\t"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\\\u025c\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"+ @@ -179,201 +178,197 @@ public class il65Lexer extends Lexer { "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\tI\4J\tJ\4K\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_\3"+ - "\2\3\2\3\3\3\3\3\4\3\4\3\5\3\5\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\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3"+ - "\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\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r"+ - "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ - "\16\3\16\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\22\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+ - "\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3"+ - "\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+ - "\31\3\31\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3"+ - "\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\""+ - "\3#\3#\3#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3("+ - "\3(\3)\3)\3)\3*\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3/\3/\3\60\3\60\3"+ - "\60\3\61\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\65\3\65\3\65\3\66\3"+ - "\66\3\66\3\67\3\67\3\67\3\67\38\38\38\38\39\39\3:\3:\3;\3;\3;\3<\3<\3"+ - "<\3=\3=\3=\3>\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3"+ - "D\3E\3E\3E\3F\3F\3G\3G\3H\3H\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3"+ - "M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3"+ - "S\3S\7S\u01fe\nS\fS\16S\u0201\13S\3S\3S\3S\3S\3T\3T\7T\u0209\nT\fT\16"+ - "T\u020c\13T\3T\3T\3U\3U\3U\3U\3V\6V\u0215\nV\rV\16V\u0216\3W\3W\7W\u021b"+ - "\nW\fW\16W\u021e\13W\3X\3X\3X\6X\u0223\nX\rX\16X\u0224\5X\u0227\nX\3Y"+ - "\3Y\6Y\u022b\nY\rY\16Y\u022c\3Z\3Z\6Z\u0231\nZ\rZ\16Z\u0232\3[\3[\3[\5"+ - "[\u0238\n[\3[\5[\u023b\n[\3\\\6\\\u023e\n\\\r\\\16\\\u023f\3\\\3\\\6\\"+ - "\u0244\n\\\r\\\16\\\u0245\5\\\u0248\n\\\3]\3]\3]\3]\5]\u024e\n]\3^\3^"+ - "\3^\7^\u0253\n^\f^\16^\u0256\13^\3^\3^\3^\3_\3_\3_\3_\6_\u025f\n_\r_\16"+ - "_\u0260\3_\3_\3_\3_\3_\3\u0260\2`\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23"+ - "\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31"+ - "\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60"+ - "_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\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\2\u00b9\2\u00bb]\u00bd^\3\2\n\4\2"+ - "\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGg"+ - "g\4\2--//\6\2\f\f\16\17$$^^\2\u0275\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\u00bb\3\2\2\2\2\u00bd\3\2\2\2\3\u00bf\3\2\2\2\5\u00c1\3\2\2\2\7\u00c3"+ - "\3\2\2\2\t\u00c5\3\2\2\2\13\u00c7\3\2\2\2\r\u00cc\3\2\2\2\17\u00d4\3\2"+ - "\2\2\21\u00de\3\2\2\2\23\u00e2\3\2\2\2\25\u00eb\3\2\2\2\27\u00f3\3\2\2"+ - "\2\31\u00ff\3\2\2\2\33\u010b\3\2\2\2\35\u0116\3\2\2\2\37\u0118\3\2\2\2"+ - "!\u011a\3\2\2\2#\u0120\3\2\2\2%\u0127\3\2\2\2\'\u012c\3\2\2\2)\u0131\3"+ - "\2\2\2+\u0137\3\2\2\2-\u013b\3\2\2\2/\u0141\3\2\2\2\61\u0147\3\2\2\2\63"+ - "\u014e\3\2\2\2\65\u0150\3\2\2\2\67\u0152\3\2\2\29\u0155\3\2\2\2;\u0158"+ - "\3\2\2\2=\u015b\3\2\2\2?\u015f\3\2\2\2A\u0162\3\2\2\2C\u0166\3\2\2\2E"+ - "\u016a\3\2\2\2G\u016e\3\2\2\2I\u0173\3\2\2\2K\u0178\3\2\2\2M\u017b\3\2"+ - "\2\2O\u017e\3\2\2\2Q\u0181\3\2\2\2S\u0184\3\2\2\2U\u0187\3\2\2\2W\u0189"+ - "\3\2\2\2Y\u018b\3\2\2\2[\u018d\3\2\2\2]\u018f\3\2\2\2_\u0193\3\2\2\2a"+ - "\u0196\3\2\2\2c\u0198\3\2\2\2e\u019a\3\2\2\2g\u019d\3\2\2\2i\u019f\3\2"+ - "\2\2k\u01a2\3\2\2\2m\u01a5\3\2\2\2o\u01a9\3\2\2\2q\u01ad\3\2\2\2s\u01af"+ - "\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\u01bf\3\2\2\2\u0081\u01c1\3\2\2\2\u0083\u01c3\3\2\2"+ - "\2\u0085\u01c7\3\2\2\2\u0087\u01ca\3\2\2\2\u0089\u01ce\3\2\2\2\u008b\u01d1"+ - "\3\2\2\2\u008d\u01d3\3\2\2\2\u008f\u01d5\3\2\2\2\u0091\u01d7\3\2\2\2\u0093"+ - "\u01d9\3\2\2\2\u0095\u01dc\3\2\2\2\u0097\u01df\3\2\2\2\u0099\u01e2\3\2"+ - "\2\2\u009b\u01e5\3\2\2\2\u009d\u01e8\3\2\2\2\u009f\u01eb\3\2\2\2\u00a1"+ - "\u01f0\3\2\2\2\u00a3\u01f6\3\2\2\2\u00a5\u01fb\3\2\2\2\u00a7\u0206\3\2"+ - "\2\2\u00a9\u020f\3\2\2\2\u00ab\u0214\3\2\2\2\u00ad\u0218\3\2\2\2\u00af"+ - "\u0226\3\2\2\2\u00b1\u0228\3\2\2\2\u00b3\u022e\3\2\2\2\u00b5\u0234\3\2"+ - "\2\2\u00b7\u023d\3\2\2\2\u00b9\u024d\3\2\2\2\u00bb\u024f\3\2\2\2\u00bd"+ - "\u025a\3\2\2\2\u00bf\u00c0\7\u0080\2\2\u00c0\4\3\2\2\2\u00c1\u00c2\7}"+ - "\2\2\u00c2\6\3\2\2\2\u00c3\u00c4\7\177\2\2\u00c4\b\3\2\2\2\u00c5\u00c6"+ - "\7<\2\2\u00c6\n\3\2\2\2\u00c7\u00c8\7i\2\2\u00c8\u00c9\7q\2\2\u00c9\u00ca"+ - "\7v\2\2\u00ca\u00cb\7q\2\2\u00cb\f\3\2\2\2\u00cc\u00cd\7\'\2\2\u00cd\u00ce"+ - "\7q\2\2\u00ce\u00cf\7w\2\2\u00cf\u00d0\7v\2\2\u00d0\u00d1\7r\2\2\u00d1"+ - "\u00d2\7w\2\2\u00d2\u00d3\7v\2\2\u00d3\16\3\2\2\2\u00d4\u00d5\7\'\2\2"+ - "\u00d5\u00d6\7n\2\2\u00d6\u00d7\7c\2\2\u00d7\u00d8\7w\2\2\u00d8\u00d9"+ - "\7p\2\2\u00d9\u00da\7e\2\2\u00da\u00db\7j\2\2\u00db\u00dc\7g\2\2\u00dc"+ - "\u00dd\7t\2\2\u00dd\20\3\2\2\2\u00de\u00df\7\'\2\2\u00df\u00e0\7|\2\2"+ - "\u00e0\u00e1\7r\2\2\u00e1\22\3\2\2\2\u00e2\u00e3\7\'\2\2\u00e3\u00e4\7"+ - "c\2\2\u00e4\u00e5\7f\2\2\u00e5\u00e6\7f\2\2\u00e6\u00e7\7t\2\2\u00e7\u00e8"+ - "\7g\2\2\u00e8\u00e9\7u\2\2\u00e9\u00ea\7u\2\2\u00ea\24\3\2\2\2\u00eb\u00ec"+ - "\7\'\2\2\u00ec\u00ed\7k\2\2\u00ed\u00ee\7o\2\2\u00ee\u00ef\7r\2\2\u00ef"+ - "\u00f0\7q\2\2\u00f0\u00f1\7t\2\2\u00f1\u00f2\7v\2\2\u00f2\26\3\2\2\2\u00f3"+ - "\u00f4\7\'\2\2\u00f4\u00f5\7d\2\2\u00f5\u00f6\7t\2\2\u00f6\u00f7\7g\2"+ - "\2\u00f7\u00f8\7c\2\2\u00f8\u00f9\7m\2\2\u00f9\u00fa\7r\2\2\u00fa\u00fb"+ - "\7q\2\2\u00fb\u00fc\7k\2\2\u00fc\u00fd\7p\2\2\u00fd\u00fe\7v\2\2\u00fe"+ - "\30\3\2\2\2\u00ff\u0100\7\'\2\2\u0100\u0101\7c\2\2\u0101\u0102\7u\2\2"+ - "\u0102\u0103\7o\2\2\u0103\u0104\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106"+ - "\7e\2\2\u0106\u0107\7n\2\2\u0107\u0108\7w\2\2\u0108\u0109\7f\2\2\u0109"+ - "\u010a\7g\2\2\u010a\32\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\7d\2\2\u0110\u0111"+ - "\7k\2\2\u0111\u0112\7p\2\2\u0112\u0113\7c\2\2\u0113\u0114\7t\2\2\u0114"+ - "\u0115\7{\2\2\u0115\34\3\2\2\2\u0116\u0117\7.\2\2\u0117\36\3\2\2\2\u0118"+ - "\u0119\7?\2\2\u0119 \3\2\2\2\u011a\u011b\7e\2\2\u011b\u011c\7q\2\2\u011c"+ - "\u011d\7p\2\2\u011d\u011e\7u\2\2\u011e\u011f\7v\2\2\u011f\"\3\2\2\2\u0120"+ - "\u0121\7o\2\2\u0121\u0122\7g\2\2\u0122\u0123\7o\2\2\u0123\u0124\7q\2\2"+ - "\u0124\u0125\7t\2\2\u0125\u0126\7{\2\2\u0126$\3\2\2\2\u0127\u0128\7d\2"+ - "\2\u0128\u0129\7{\2\2\u0129\u012a\7v\2\2\u012a\u012b\7g\2\2\u012b&\3\2"+ - "\2\2\u012c\u012d\7y\2\2\u012d\u012e\7q\2\2\u012e\u012f\7t\2\2\u012f\u0130"+ - "\7f\2\2\u0130(\3\2\2\2\u0131\u0132\7h\2\2\u0132\u0133\7n\2\2\u0133\u0134"+ - "\7q\2\2\u0134\u0135\7c\2\2\u0135\u0136\7v\2\2\u0136*\3\2\2\2\u0137\u0138"+ - "\7u\2\2\u0138\u0139\7v\2\2\u0139\u013a\7t\2\2\u013a,\3\2\2\2\u013b\u013c"+ - "\7u\2\2\u013c\u013d\7v\2\2\u013d\u013e\7t\2\2\u013e\u013f\7a\2\2\u013f"+ - "\u0140\7r\2\2\u0140.\3\2\2\2\u0141\u0142\7u\2\2\u0142\u0143\7v\2\2\u0143"+ - "\u0144\7t\2\2\u0144\u0145\7a\2\2\u0145\u0146\7u\2\2\u0146\60\3\2\2\2\u0147"+ - "\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149\u014a\7t\2\2\u014a\u014b\7a\2\2"+ - "\u014b\u014c\7r\2\2\u014c\u014d\7u\2\2\u014d\62\3\2\2\2\u014e\u014f\7"+ - "]\2\2\u014f\64\3\2\2\2\u0150\u0151\7_\2\2\u0151\66\3\2\2\2\u0152\u0153"+ - "\7-\2\2\u0153\u0154\7?\2\2\u01548\3\2\2\2\u0155\u0156\7/\2\2\u0156\u0157"+ - "\7?\2\2\u0157:\3\2\2\2\u0158\u0159\7\61\2\2\u0159\u015a\7?\2\2\u015a<"+ - "\3\2\2\2\u015b\u015c\7\61\2\2\u015c\u015d\7\61\2\2\u015d\u015e\7?\2\2"+ - "\u015e>\3\2\2\2\u015f\u0160\7,\2\2\u0160\u0161\7?\2\2\u0161@\3\2\2\2\u0162"+ - "\u0163\7,\2\2\u0163\u0164\7,\2\2\u0164\u0165\7?\2\2\u0165B\3\2\2\2\u0166"+ - "\u0167\7>\2\2\u0167\u0168\7>\2\2\u0168\u0169\7?\2\2\u0169D\3\2\2\2\u016a"+ - "\u016b\7@\2\2\u016b\u016c\7@\2\2\u016c\u016d\7?\2\2\u016dF\3\2\2\2\u016e"+ - "\u016f\7>\2\2\u016f\u0170\7>\2\2\u0170\u0171\7B\2\2\u0171\u0172\7?\2\2"+ - "\u0172H\3\2\2\2\u0173\u0174\7@\2\2\u0174\u0175\7@\2\2\u0175\u0176\7B\2"+ - "\2\u0176\u0177\7?\2\2\u0177J\3\2\2\2\u0178\u0179\7(\2\2\u0179\u017a\7"+ - "?\2\2\u017aL\3\2\2\2\u017b\u017c\7~\2\2\u017c\u017d\7?\2\2\u017dN\3\2"+ - "\2\2\u017e\u017f\7`\2\2\u017f\u0180\7?\2\2\u0180P\3\2\2\2\u0181\u0182"+ - "\7-\2\2\u0182\u0183\7-\2\2\u0183R\3\2\2\2\u0184\u0185\7/\2\2\u0185\u0186"+ - "\7/\2\2\u0186T\3\2\2\2\u0187\u0188\7*\2\2\u0188V\3\2\2\2\u0189\u018a\7"+ - "+\2\2\u018aX\3\2\2\2\u018b\u018c\7-\2\2\u018cZ\3\2\2\2\u018d\u018e\7/"+ - "\2\2\u018e\\\3\2\2\2\u018f\u0190\7p\2\2\u0190\u0191\7q\2\2\u0191\u0192"+ - "\7v\2\2\u0192^\3\2\2\2\u0193\u0194\7,\2\2\u0194\u0195\7,\2\2\u0195`\3"+ - "\2\2\2\u0196\u0197\7,\2\2\u0197b\3\2\2\2\u0198\u0199\7\61\2\2\u0199d\3"+ - "\2\2\2\u019a\u019b\7\61\2\2\u019b\u019c\7\61\2\2\u019cf\3\2\2\2\u019d"+ - "\u019e\7\'\2\2\u019eh\3\2\2\2\u019f\u01a0\7>\2\2\u01a0\u01a1\7>\2\2\u01a1"+ - "j\3\2\2\2\u01a2\u01a3\7@\2\2\u01a3\u01a4\7@\2\2\u01a4l\3\2\2\2\u01a5\u01a6"+ - "\7>\2\2\u01a6\u01a7\7>\2\2\u01a7\u01a8\7B\2\2\u01a8n\3\2\2\2\u01a9\u01aa"+ - "\7@\2\2\u01aa\u01ab\7@\2\2\u01ab\u01ac\7B\2\2\u01acp\3\2\2\2\u01ad\u01ae"+ - "\7>\2\2\u01aer\3\2\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?\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~\3\2\2\2\u01bf\u01c0\7`\2\2\u01c0\u0080\3\2\2\2\u01c1\u01c2"+ - "\7~\2\2\u01c2\u0082\3\2\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7p\2\2\u01c5"+ - "\u01c6\7f\2\2\u01c6\u0084\3\2\2\2\u01c7\u01c8\7q\2\2\u01c8\u01c9\7t\2"+ - "\2\u01c9\u0086\3\2\2\2\u01ca\u01cb\7z\2\2\u01cb\u01cc\7q\2\2\u01cc\u01cd"+ - "\7t\2\2\u01cd\u0088\3\2\2\2\u01ce\u01cf\7v\2\2\u01cf\u01d0\7q\2\2\u01d0"+ - "\u008a\3\2\2\2\u01d1\u01d2\7\60\2\2\u01d2\u008c\3\2\2\2\u01d3\u01d4\7"+ - "C\2\2\u01d4\u008e\3\2\2\2\u01d5\u01d6\7Z\2\2\u01d6\u0090\3\2\2\2\u01d7"+ - "\u01d8\7[\2\2\u01d8\u0092\3\2\2\2\u01d9\u01da\7C\2\2\u01da\u01db\7Z\2"+ - "\2\u01db\u0094\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\7[\2\2\u01de\u0096"+ - "\3\2\2\2\u01df\u01e0\7Z\2\2\u01e0\u01e1\7[\2\2\u01e1\u0098\3\2\2\2\u01e2"+ - "\u01e3\7U\2\2\u01e3\u01e4\7E\2\2\u01e4\u009a\3\2\2\2\u01e5\u01e6\7U\2"+ - "\2\u01e6\u01e7\7K\2\2\u01e7\u009c\3\2\2\2\u01e8\u01e9\7U\2\2\u01e9\u01ea"+ - "\7\\\2\2\u01ea\u009e\3\2\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7t\2\2\u01ed"+ - "\u01ee\7w\2\2\u01ee\u01ef\7g\2\2\u01ef\u00a0\3\2\2\2\u01f0\u01f1\7h\2"+ - "\2\u01f1\u01f2\7c\2\2\u01f2\u01f3\7n\2\2\u01f3\u01f4\7u\2\2\u01f4\u01f5"+ - "\7g\2\2\u01f5\u00a2\3\2\2\2\u01f6\u01f7\7\'\2\2\u01f7\u01f8\7c\2\2\u01f8"+ - "\u01f9\7u\2\2\u01f9\u01fa\7o\2\2\u01fa\u00a4\3\2\2\2\u01fb\u01ff\t\2\2"+ - "\2\u01fc\u01fe\t\3\2\2\u01fd\u01fc\3\2\2\2\u01fe\u0201\3\2\2\2\u01ff\u01fd"+ - "\3\2\2\2\u01ff\u0200\3\2\2\2\u0200\u0202\3\2\2\2\u0201\u01ff\3\2\2\2\u0202"+ - "\u0203\5\u00a7T\2\u0203\u0204\3\2\2\2\u0204\u0205\bS\2\2\u0205\u00a6\3"+ - "\2\2\2\u0206\u020a\7=\2\2\u0207\u0209\n\2\2\2\u0208\u0207\3\2\2\2\u0209"+ - "\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u020d\3\2"+ - "\2\2\u020c\u020a\3\2\2\2\u020d\u020e\bT\2\2\u020e\u00a8\3\2\2\2\u020f"+ - "\u0210\t\3\2\2\u0210\u0211\3\2\2\2\u0211\u0212\bU\3\2\u0212\u00aa\3\2"+ - "\2\2\u0213\u0215\t\2\2\2\u0214\u0213\3\2\2\2\u0215\u0216\3\2\2\2\u0216"+ - "\u0214\3\2\2\2\u0216\u0217\3\2\2\2\u0217\u00ac\3\2\2\2\u0218\u021c\t\4"+ - "\2\2\u0219\u021b\t\5\2\2\u021a\u0219\3\2\2\2\u021b\u021e\3\2\2\2\u021c"+ - "\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u00ae\3\2\2\2\u021e\u021c\3\2"+ - "\2\2\u021f\u0227\4\62;\2\u0220\u0222\4\63;\2\u0221\u0223\4\62;\2\u0222"+ - "\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224\u0222\3\2\2\2\u0224\u0225\3\2"+ - "\2\2\u0225\u0227\3\2\2\2\u0226\u021f\3\2\2\2\u0226\u0220\3\2\2\2\u0227"+ - "\u00b0\3\2\2\2\u0228\u022a\7&\2\2\u0229\u022b\t\6\2\2\u022a\u0229\3\2"+ - "\2\2\u022b\u022c\3\2\2\2\u022c\u022a\3\2\2\2\u022c\u022d\3\2\2\2\u022d"+ - "\u00b2\3\2\2\2\u022e\u0230\7\'\2\2\u022f\u0231\4\62\63\2\u0230\u022f\3"+ - "\2\2\2\u0231\u0232\3\2\2\2\u0232\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233"+ - "\u00b4\3\2\2\2\u0234\u023a\5\u00b7\\\2\u0235\u0237\t\7\2\2\u0236\u0238"+ - "\t\b\2\2\u0237\u0236\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u0239\3\2\2\2\u0239"+ - "\u023b\5\u00b7\\\2\u023a\u0235\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u00b6"+ - "\3\2\2\2\u023c\u023e\4\62;\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f"+ - "\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0247\3\2\2\2\u0241\u0243\7\60"+ - "\2\2\u0242\u0244\4\62;\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\u0248\3\2\2\2\u0247\u0241\3\2"+ - "\2\2\u0247\u0248\3\2\2\2\u0248\u00b8\3\2\2\2\u0249\u024a\7^\2\2\u024a"+ - "\u024e\13\2\2\2\u024b\u024c\7^\2\2\u024c\u024e\5\u00abV\2\u024d\u0249"+ - "\3\2\2\2\u024d\u024b\3\2\2\2\u024e\u00ba\3\2\2\2\u024f\u0254\7$\2\2\u0250"+ - "\u0253\5\u00b9]\2\u0251\u0253\n\t\2\2\u0252\u0250\3\2\2\2\u0252\u0251"+ - "\3\2\2\2\u0253\u0256\3\2\2\2\u0254\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255"+ - "\u0257\3\2\2\2\u0256\u0254\3\2\2\2\u0257\u0258\7$\2\2\u0258\u0259\b^\4"+ - "\2\u0259\u00bc\3\2\2\2\u025a\u025b\7}\2\2\u025b\u025c\7}\2\2\u025c\u025e"+ - "\3\2\2\2\u025d\u025f\13\2\2\2\u025e\u025d\3\2\2\2\u025f\u0260\3\2\2\2"+ - "\u0260\u0261\3\2\2\2\u0260\u025e\3\2\2\2\u0261\u0262\3\2\2\2\u0262\u0263"+ - "\7\177\2\2\u0263\u0264\7\177\2\2\u0264\u0265\3\2\2\2\u0265\u0266\b_\5"+ - "\2\u0266\u00be\3\2\2\2\25\2\u01ff\u020a\u0216\u021c\u0224\u0226\u022a"+ - "\u022c\u0232\u0237\u023a\u023f\u0245\u0247\u024d\u0252\u0254\u0260\6\2"+ - "\3\2\b\2\2\3^\2\3_\3"; + "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\3\2\3\2\3\3\3"+ + "\3\3\4\3\4\3\5\3\5\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\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\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\f\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3"+ + "\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+ + "\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3"+ + "\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3"+ + "\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36\3\36\3"+ + "\37\3\37\3\37\3 \3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3#\3#\3#\3"+ + "$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3"+ + "+\3+\3,\3,\3-\3-\3.\3.\3.\3/\3/\3\60\3\60\3\61\3\61\3\62\3\62\3\62\3\63"+ + "\3\63\3\63\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\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@\3A\3A\3A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3E\3E\3F\3F\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\7Q\u01f3\nQ\fQ\16Q\u01f6\13Q\3Q\3Q\3"+ + "Q\3Q\3R\3R\7R\u01fe\nR\fR\16R\u0201\13R\3R\3R\3S\3S\3S\3S\3T\6T\u020a"+ + "\nT\rT\16T\u020b\3U\3U\7U\u0210\nU\fU\16U\u0213\13U\3V\3V\3V\6V\u0218"+ + "\nV\rV\16V\u0219\5V\u021c\nV\3W\3W\6W\u0220\nW\rW\16W\u0221\3X\3X\6X\u0226"+ + "\nX\rX\16X\u0227\3Y\3Y\3Y\5Y\u022d\nY\3Y\5Y\u0230\nY\3Z\6Z\u0233\nZ\r"+ + "Z\16Z\u0234\3Z\3Z\6Z\u0239\nZ\rZ\16Z\u023a\5Z\u023d\nZ\3[\3[\3[\3[\5["+ + "\u0243\n[\3\\\3\\\3\\\7\\\u0248\n\\\f\\\16\\\u024b\13\\\3\\\3\\\3\\\3"+ + "]\3]\3]\3]\6]\u0254\n]\r]\16]\u0255\3]\3]\3]\3]\3]\3\u0255\2^\3\3\5\4"+ + "\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+ + "#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+ + "#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091"+ + "J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5"+ + "T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7[\u00b9"+ + "\\\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\u026a\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\u00b7\3\2\2"+ + "\2\2\u00b9\3\2\2\2\3\u00bb\3\2\2\2\5\u00bd\3\2\2\2\7\u00bf\3\2\2\2\t\u00c1"+ + "\3\2\2\2\13\u00c3\3\2\2\2\r\u00c8\3\2\2\2\17\u00d0\3\2\2\2\21\u00da\3"+ + "\2\2\2\23\u00de\3\2\2\2\25\u00e7\3\2\2\2\27\u00ef\3\2\2\2\31\u00fb\3\2"+ + "\2\2\33\u0107\3\2\2\2\35\u0112\3\2\2\2\37\u0114\3\2\2\2!\u0116\3\2\2\2"+ + "#\u011c\3\2\2\2%\u0123\3\2\2\2\'\u0128\3\2\2\2)\u012d\3\2\2\2+\u0133\3"+ + "\2\2\2-\u0137\3\2\2\2/\u013d\3\2\2\2\61\u0143\3\2\2\2\63\u014a\3\2\2\2"+ + "\65\u014c\3\2\2\2\67\u014e\3\2\2\29\u0151\3\2\2\2;\u0154\3\2\2\2=\u0157"+ + "\3\2\2\2?\u015a\3\2\2\2A\u015e\3\2\2\2C\u0162\3\2\2\2E\u0166\3\2\2\2G"+ + "\u016b\3\2\2\2I\u0170\3\2\2\2K\u0173\3\2\2\2M\u0176\3\2\2\2O\u0179\3\2"+ + "\2\2Q\u017c\3\2\2\2S\u017f\3\2\2\2U\u0181\3\2\2\2W\u0183\3\2\2\2Y\u0185"+ + "\3\2\2\2[\u0187\3\2\2\2]\u018a\3\2\2\2_\u018c\3\2\2\2a\u018e\3\2\2\2c"+ + "\u0190\3\2\2\2e\u0193\3\2\2\2g\u0196\3\2\2\2i\u019a\3\2\2\2k\u019e\3\2"+ + "\2\2m\u01a0\3\2\2\2o\u01a2\3\2\2\2q\u01a5\3\2\2\2s\u01a8\3\2\2\2u\u01ab"+ + "\3\2\2\2w\u01ae\3\2\2\2y\u01b0\3\2\2\2{\u01b2\3\2\2\2}\u01b4\3\2\2\2\177"+ + "\u01b8\3\2\2\2\u0081\u01bb\3\2\2\2\u0083\u01bf\3\2\2\2\u0085\u01c3\3\2"+ + "\2\2\u0087\u01c6\3\2\2\2\u0089\u01c8\3\2\2\2\u008b\u01ca\3\2\2\2\u008d"+ + "\u01cc\3\2\2\2\u008f\u01ce\3\2\2\2\u0091\u01d1\3\2\2\2\u0093\u01d4\3\2"+ + "\2\2\u0095\u01d7\3\2\2\2\u0097\u01da\3\2\2\2\u0099\u01dd\3\2\2\2\u009b"+ + "\u01e0\3\2\2\2\u009d\u01e5\3\2\2\2\u009f\u01eb\3\2\2\2\u00a1\u01f0\3\2"+ + "\2\2\u00a3\u01fb\3\2\2\2\u00a5\u0204\3\2\2\2\u00a7\u0209\3\2\2\2\u00a9"+ + "\u020d\3\2\2\2\u00ab\u021b\3\2\2\2\u00ad\u021d\3\2\2\2\u00af\u0223\3\2"+ + "\2\2\u00b1\u0229\3\2\2\2\u00b3\u0232\3\2\2\2\u00b5\u0242\3\2\2\2\u00b7"+ + "\u0244\3\2\2\2\u00b9\u024f\3\2\2\2\u00bb\u00bc\7\u0080\2\2\u00bc\4\3\2"+ + "\2\2\u00bd\u00be\7}\2\2\u00be\6\3\2\2\2\u00bf\u00c0\7\177\2\2\u00c0\b"+ + "\3\2\2\2\u00c1\u00c2\7<\2\2\u00c2\n\3\2\2\2\u00c3\u00c4\7i\2\2\u00c4\u00c5"+ + "\7q\2\2\u00c5\u00c6\7v\2\2\u00c6\u00c7\7q\2\2\u00c7\f\3\2\2\2\u00c8\u00c9"+ + "\7\'\2\2\u00c9\u00ca\7q\2\2\u00ca\u00cb\7w\2\2\u00cb\u00cc\7v\2\2\u00cc"+ + "\u00cd\7r\2\2\u00cd\u00ce\7w\2\2\u00ce\u00cf\7v\2\2\u00cf\16\3\2\2\2\u00d0"+ + "\u00d1\7\'\2\2\u00d1\u00d2\7n\2\2\u00d2\u00d3\7c\2\2\u00d3\u00d4\7w\2"+ + "\2\u00d4\u00d5\7p\2\2\u00d5\u00d6\7e\2\2\u00d6\u00d7\7j\2\2\u00d7\u00d8"+ + "\7g\2\2\u00d8\u00d9\7t\2\2\u00d9\20\3\2\2\2\u00da\u00db\7\'\2\2\u00db"+ + "\u00dc\7|\2\2\u00dc\u00dd\7r\2\2\u00dd\22\3\2\2\2\u00de\u00df\7\'\2\2"+ + "\u00df\u00e0\7c\2\2\u00e0\u00e1\7f\2\2\u00e1\u00e2\7f\2\2\u00e2\u00e3"+ + "\7t\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7u\2\2\u00e5\u00e6\7u\2\2\u00e6"+ + "\24\3\2\2\2\u00e7\u00e8\7\'\2\2\u00e8\u00e9\7k\2\2\u00e9\u00ea\7o\2\2"+ + "\u00ea\u00eb\7r\2\2\u00eb\u00ec\7q\2\2\u00ec\u00ed\7t\2\2\u00ed\u00ee"+ + "\7v\2\2\u00ee\26\3\2\2\2\u00ef\u00f0\7\'\2\2\u00f0\u00f1\7d\2\2\u00f1"+ + "\u00f2\7t\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4\7c\2\2\u00f4\u00f5\7m\2\2"+ + "\u00f5\u00f6\7r\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7k\2\2\u00f8\u00f9"+ + "\7p\2\2\u00f9\u00fa\7v\2\2\u00fa\30\3\2\2\2\u00fb\u00fc\7\'\2\2\u00fc"+ + "\u00fd\7c\2\2\u00fd\u00fe\7u\2\2\u00fe\u00ff\7o\2\2\u00ff\u0100\7k\2\2"+ + "\u0100\u0101\7p\2\2\u0101\u0102\7e\2\2\u0102\u0103\7n\2\2\u0103\u0104"+ + "\7w\2\2\u0104\u0105\7f\2\2\u0105\u0106\7g\2\2\u0106\32\3\2\2\2\u0107\u0108"+ + "\7\'\2\2\u0108\u0109\7c\2\2\u0109\u010a\7u\2\2\u010a\u010b\7o\2\2\u010b"+ + "\u010c\7d\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f\7c\2\2"+ + "\u010f\u0110\7t\2\2\u0110\u0111\7{\2\2\u0111\34\3\2\2\2\u0112\u0113\7"+ + ".\2\2\u0113\36\3\2\2\2\u0114\u0115\7?\2\2\u0115 \3\2\2\2\u0116\u0117\7"+ + "e\2\2\u0117\u0118\7q\2\2\u0118\u0119\7p\2\2\u0119\u011a\7u\2\2\u011a\u011b"+ + "\7v\2\2\u011b\"\3\2\2\2\u011c\u011d\7o\2\2\u011d\u011e\7g\2\2\u011e\u011f"+ + "\7o\2\2\u011f\u0120\7q\2\2\u0120\u0121\7t\2\2\u0121\u0122\7{\2\2\u0122"+ + "$\3\2\2\2\u0123\u0124\7d\2\2\u0124\u0125\7{\2\2\u0125\u0126\7v\2\2\u0126"+ + "\u0127\7g\2\2\u0127&\3\2\2\2\u0128\u0129\7y\2\2\u0129\u012a\7q\2\2\u012a"+ + "\u012b\7t\2\2\u012b\u012c\7f\2\2\u012c(\3\2\2\2\u012d\u012e\7h\2\2\u012e"+ + "\u012f\7n\2\2\u012f\u0130\7q\2\2\u0130\u0131\7c\2\2\u0131\u0132\7v\2\2"+ + "\u0132*\3\2\2\2\u0133\u0134\7u\2\2\u0134\u0135\7v\2\2\u0135\u0136\7t\2"+ + "\2\u0136,\3\2\2\2\u0137\u0138\7u\2\2\u0138\u0139\7v\2\2\u0139\u013a\7"+ + "t\2\2\u013a\u013b\7a\2\2\u013b\u013c\7r\2\2\u013c.\3\2\2\2\u013d\u013e"+ + "\7u\2\2\u013e\u013f\7v\2\2\u013f\u0140\7t\2\2\u0140\u0141\7a\2\2\u0141"+ + "\u0142\7u\2\2\u0142\60\3\2\2\2\u0143\u0144\7u\2\2\u0144\u0145\7v\2\2\u0145"+ + "\u0146\7t\2\2\u0146\u0147\7a\2\2\u0147\u0148\7r\2\2\u0148\u0149\7u\2\2"+ + "\u0149\62\3\2\2\2\u014a\u014b\7]\2\2\u014b\64\3\2\2\2\u014c\u014d\7_\2"+ + "\2\u014d\66\3\2\2\2\u014e\u014f\7-\2\2\u014f\u0150\7?\2\2\u01508\3\2\2"+ + "\2\u0151\u0152\7/\2\2\u0152\u0153\7?\2\2\u0153:\3\2\2\2\u0154\u0155\7"+ + "\61\2\2\u0155\u0156\7?\2\2\u0156<\3\2\2\2\u0157\u0158\7,\2\2\u0158\u0159"+ + "\7?\2\2\u0159>\3\2\2\2\u015a\u015b\7,\2\2\u015b\u015c\7,\2\2\u015c\u015d"+ + "\7?\2\2\u015d@\3\2\2\2\u015e\u015f\7>\2\2\u015f\u0160\7>\2\2\u0160\u0161"+ + "\7?\2\2\u0161B\3\2\2\2\u0162\u0163\7@\2\2\u0163\u0164\7@\2\2\u0164\u0165"+ + "\7?\2\2\u0165D\3\2\2\2\u0166\u0167\7>\2\2\u0167\u0168\7>\2\2\u0168\u0169"+ + "\7B\2\2\u0169\u016a\7?\2\2\u016aF\3\2\2\2\u016b\u016c\7@\2\2\u016c\u016d"+ + "\7@\2\2\u016d\u016e\7B\2\2\u016e\u016f\7?\2\2\u016fH\3\2\2\2\u0170\u0171"+ + "\7(\2\2\u0171\u0172\7?\2\2\u0172J\3\2\2\2\u0173\u0174\7~\2\2\u0174\u0175"+ + "\7?\2\2\u0175L\3\2\2\2\u0176\u0177\7`\2\2\u0177\u0178\7?\2\2\u0178N\3"+ + "\2\2\2\u0179\u017a\7-\2\2\u017a\u017b\7-\2\2\u017bP\3\2\2\2\u017c\u017d"+ + "\7/\2\2\u017d\u017e\7/\2\2\u017eR\3\2\2\2\u017f\u0180\7*\2\2\u0180T\3"+ + "\2\2\2\u0181\u0182\7+\2\2\u0182V\3\2\2\2\u0183\u0184\7-\2\2\u0184X\3\2"+ + "\2\2\u0185\u0186\7/\2\2\u0186Z\3\2\2\2\u0187\u0188\7,\2\2\u0188\u0189"+ + "\7,\2\2\u0189\\\3\2\2\2\u018a\u018b\7,\2\2\u018b^\3\2\2\2\u018c\u018d"+ + "\7\61\2\2\u018d`\3\2\2\2\u018e\u018f\7\'\2\2\u018fb\3\2\2\2\u0190\u0191"+ + "\7>\2\2\u0191\u0192\7>\2\2\u0192d\3\2\2\2\u0193\u0194\7@\2\2\u0194\u0195"+ + "\7@\2\2\u0195f\3\2\2\2\u0196\u0197\7>\2\2\u0197\u0198\7>\2\2\u0198\u0199"+ + "\7B\2\2\u0199h\3\2\2\2\u019a\u019b\7@\2\2\u019b\u019c\7@\2\2\u019c\u019d"+ + "\7B\2\2\u019dj\3\2\2\2\u019e\u019f\7>\2\2\u019fl\3\2\2\2\u01a0\u01a1\7"+ + "@\2\2\u01a1n\3\2\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4\7?\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(\2\2\u01afx\3\2\2\2\u01b0\u01b1\7"+ + "`\2\2\u01b1z\3\2\2\2\u01b2\u01b3\7~\2\2\u01b3|\3\2\2\2\u01b4\u01b5\7c"+ + "\2\2\u01b5\u01b6\7p\2\2\u01b6\u01b7\7f\2\2\u01b7~\3\2\2\2\u01b8\u01b9"+ + "\7q\2\2\u01b9\u01ba\7t\2\2\u01ba\u0080\3\2\2\2\u01bb\u01bc\7z\2\2\u01bc"+ + "\u01bd\7q\2\2\u01bd\u01be\7t\2\2\u01be\u0082\3\2\2\2\u01bf\u01c0\7p\2"+ + "\2\u01c0\u01c1\7q\2\2\u01c1\u01c2\7v\2\2\u01c2\u0084\3\2\2\2\u01c3\u01c4"+ + "\7v\2\2\u01c4\u01c5\7q\2\2\u01c5\u0086\3\2\2\2\u01c6\u01c7\7\60\2\2\u01c7"+ + "\u0088\3\2\2\2\u01c8\u01c9\7C\2\2\u01c9\u008a\3\2\2\2\u01ca\u01cb\7Z\2"+ + "\2\u01cb\u008c\3\2\2\2\u01cc\u01cd\7[\2\2\u01cd\u008e\3\2\2\2\u01ce\u01cf"+ + "\7C\2\2\u01cf\u01d0\7Z\2\2\u01d0\u0090\3\2\2\2\u01d1\u01d2\7C\2\2\u01d2"+ + "\u01d3\7[\2\2\u01d3\u0092\3\2\2\2\u01d4\u01d5\7Z\2\2\u01d5\u01d6\7[\2"+ + "\2\u01d6\u0094\3\2\2\2\u01d7\u01d8\7U\2\2\u01d8\u01d9\7E\2\2\u01d9\u0096"+ + "\3\2\2\2\u01da\u01db\7U\2\2\u01db\u01dc\7K\2\2\u01dc\u0098\3\2\2\2\u01dd"+ + "\u01de\7U\2\2\u01de\u01df\7\\\2\2\u01df\u009a\3\2\2\2\u01e0\u01e1\7v\2"+ + "\2\u01e1\u01e2\7t\2\2\u01e2\u01e3\7w\2\2\u01e3\u01e4\7g\2\2\u01e4\u009c"+ + "\3\2\2\2\u01e5\u01e6\7h\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7n\2\2\u01e8"+ + "\u01e9\7u\2\2\u01e9\u01ea\7g\2\2\u01ea\u009e\3\2\2\2\u01eb\u01ec\7\'\2"+ + "\2\u01ec\u01ed\7c\2\2\u01ed\u01ee\7u\2\2\u01ee\u01ef\7o\2\2\u01ef\u00a0"+ + "\3\2\2\2\u01f0\u01f4\t\2\2\2\u01f1\u01f3\t\3\2\2\u01f2\u01f1\3\2\2\2\u01f3"+ + "\u01f6\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4\u01f5\3\2\2\2\u01f5\u01f7\3\2"+ + "\2\2\u01f6\u01f4\3\2\2\2\u01f7\u01f8\5\u00a3R\2\u01f8\u01f9\3\2\2\2\u01f9"+ + "\u01fa\bQ\2\2\u01fa\u00a2\3\2\2\2\u01fb\u01ff\7=\2\2\u01fc\u01fe\n\2\2"+ + "\2\u01fd\u01fc\3\2\2\2\u01fe\u0201\3\2\2\2\u01ff\u01fd\3\2\2\2\u01ff\u0200"+ + "\3\2\2\2\u0200\u0202\3\2\2\2\u0201\u01ff\3\2\2\2\u0202\u0203\bR\2\2\u0203"+ + "\u00a4\3\2\2\2\u0204\u0205\t\3\2\2\u0205\u0206\3\2\2\2\u0206\u0207\bS"+ + "\3\2\u0207\u00a6\3\2\2\2\u0208\u020a\t\2\2\2\u0209\u0208\3\2\2\2\u020a"+ + "\u020b\3\2\2\2\u020b\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u00a8\3\2"+ + "\2\2\u020d\u0211\t\4\2\2\u020e\u0210\t\5\2\2\u020f\u020e\3\2\2\2\u0210"+ + "\u0213\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\2\u0212\u00aa\3\2"+ + "\2\2\u0213\u0211\3\2\2\2\u0214\u021c\4\62;\2\u0215\u0217\4\63;\2\u0216"+ + "\u0218\4\62;\2\u0217\u0216\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u0217\3\2"+ + "\2\2\u0219\u021a\3\2\2\2\u021a\u021c\3\2\2\2\u021b\u0214\3\2\2\2\u021b"+ + "\u0215\3\2\2\2\u021c\u00ac\3\2\2\2\u021d\u021f\7&\2\2\u021e\u0220\t\6"+ + "\2\2\u021f\u021e\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u021f\3\2\2\2\u0221"+ + "\u0222\3\2\2\2\u0222\u00ae\3\2\2\2\u0223\u0225\7\'\2\2\u0224\u0226\4\62"+ + "\63\2\u0225\u0224\3\2\2\2\u0226\u0227\3\2\2\2\u0227\u0225\3\2\2\2\u0227"+ + "\u0228\3\2\2\2\u0228\u00b0\3\2\2\2\u0229\u022f\5\u00b3Z\2\u022a\u022c"+ + "\t\7\2\2\u022b\u022d\t\b\2\2\u022c\u022b\3\2\2\2\u022c\u022d\3\2\2\2\u022d"+ + "\u022e\3\2\2\2\u022e\u0230\5\u00b3Z\2\u022f\u022a\3\2\2\2\u022f\u0230"+ + "\3\2\2\2\u0230\u00b2\3\2\2\2\u0231\u0233\4\62;\2\u0232\u0231\3\2\2\2\u0233"+ + "\u0234\3\2\2\2\u0234\u0232\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u023c\3\2"+ + "\2\2\u0236\u0238\7\60\2\2\u0237\u0239\4\62;\2\u0238\u0237\3\2\2\2\u0239"+ + "\u023a\3\2\2\2\u023a\u0238\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023d\3\2"+ + "\2\2\u023c\u0236\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u00b4\3\2\2\2\u023e"+ + "\u023f\7^\2\2\u023f\u0243\13\2\2\2\u0240\u0241\7^\2\2\u0241\u0243\5\u00a7"+ + "T\2\u0242\u023e\3\2\2\2\u0242\u0240\3\2\2\2\u0243\u00b6\3\2\2\2\u0244"+ + "\u0249\7$\2\2\u0245\u0248\5\u00b5[\2\u0246\u0248\n\t\2\2\u0247\u0245\3"+ + "\2\2\2\u0247\u0246\3\2\2\2\u0248\u024b\3\2\2\2\u0249\u0247\3\2\2\2\u0249"+ + "\u024a\3\2\2\2\u024a\u024c\3\2\2\2\u024b\u0249\3\2\2\2\u024c\u024d\7$"+ + "\2\2\u024d\u024e\b\\\4\2\u024e\u00b8\3\2\2\2\u024f\u0250\7}\2\2\u0250"+ + "\u0251\7}\2\2\u0251\u0253\3\2\2\2\u0252\u0254\13\2\2\2\u0253\u0252\3\2"+ + "\2\2\u0254\u0255\3\2\2\2\u0255\u0256\3\2\2\2\u0255\u0253\3\2\2\2\u0256"+ + "\u0257\3\2\2\2\u0257\u0258\7\177\2\2\u0258\u0259\7\177\2\2\u0259\u025a"+ + "\3\2\2\2\u025a\u025b\b]\5\2\u025b\u00ba\3\2\2\2\25\2\u01f4\u01ff\u020b"+ + "\u0211\u0219\u021b\u021f\u0221\u0227\u022c\u022f\u0234\u023a\u023c\u0242"+ + "\u0247\u0249\u0255\6\2\3\2\b\2\2\3\\\2\3]\3"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/il65/src/il65/parser/il65Lexer.tokens b/il65/src/il65/parser/il65Lexer.tokens index 7a6e4fb41..b73e7409a 100644 --- a/il65/src/il65/parser/il65Lexer.tokens +++ b/il65/src/il65/parser/il65Lexer.tokens @@ -77,19 +77,17 @@ T__75=76 T__76=77 T__77=78 T__78=79 -T__79=80 -T__80=81 -LINECOMMENT=82 -COMMENT=83 -WS=84 -EOL=85 -NAME=86 -DEC_INTEGER=87 -HEX_INTEGER=88 -BIN_INTEGER=89 -FLOAT_NUMBER=90 -STRING=91 -INLINEASMBLOCK=92 +LINECOMMENT=80 +COMMENT=81 +WS=82 +EOL=83 +NAME=84 +DEC_INTEGER=85 +HEX_INTEGER=86 +BIN_INTEGER=87 +FLOAT_NUMBER=88 +STRING=89 +INLINEASMBLOCK=90 '~'=1 '{'=2 '}'=3 @@ -119,55 +117,53 @@ INLINEASMBLOCK=92 '+='=27 '-='=28 '/='=29 -'//='=30 -'*='=31 -'**='=32 -'<<='=33 -'>>='=34 -'<<@='=35 -'>>@='=36 -'&='=37 -'|='=38 -'^='=39 -'++'=40 -'--'=41 -'('=42 -')'=43 -'+'=44 -'-'=45 -'not'=46 -'**'=47 -'*'=48 -'/'=49 -'//'=50 -'%'=51 -'<<'=52 -'>>'=53 -'<<@'=54 -'>>@'=55 -'<'=56 -'>'=57 -'<='=58 -'>='=59 -'=='=60 -'!='=61 -'&'=62 -'^'=63 -'|'=64 -'and'=65 -'or'=66 -'xor'=67 -'to'=68 -'.'=69 -'A'=70 -'X'=71 -'Y'=72 -'AX'=73 -'AY'=74 -'XY'=75 -'SC'=76 -'SI'=77 -'SZ'=78 -'true'=79 -'false'=80 -'%asm'=81 +'*='=30 +'**='=31 +'<<='=32 +'>>='=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 +'and'=62 +'or'=63 +'xor'=64 +'not'=65 +'to'=66 +'.'=67 +'A'=68 +'X'=69 +'Y'=70 +'AX'=71 +'AY'=72 +'XY'=73 +'SC'=74 +'SI'=75 +'SZ'=76 +'true'=77 +'false'=78 +'%asm'=79 diff --git a/il65/src/il65/parser/il65Parser.java b/il65/src/il65/parser/il65Parser.java index 2250c912d..3a5e6ef28 100644 --- a/il65/src/il65/parser/il65Parser.java +++ b/il65/src/il65/parser/il65Parser.java @@ -27,9 +27,9 @@ public class il65Parser 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, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80, - T__80=81, LINECOMMENT=82, COMMENT=83, WS=84, EOL=85, NAME=86, DEC_INTEGER=87, - HEX_INTEGER=88, BIN_INTEGER=89, FLOAT_NUMBER=90, STRING=91, INLINEASMBLOCK=92; + T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, LINECOMMENT=80, + COMMENT=81, WS=82, EOL=83, NAME=84, DEC_INTEGER=85, HEX_INTEGER=86, BIN_INTEGER=87, + FLOAT_NUMBER=88, STRING=89, INLINEASMBLOCK=90; public static final int RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, RULE_label = 4, RULE_call_location = 5, RULE_unconditionaljump = 6, RULE_directive = 7, @@ -54,12 +54,12 @@ public class il65Parser extends Parser { "'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", - "'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", - "'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", - "'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'", - "'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", - "'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", - "'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" + "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='", + "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'", + "'*'", "'/'", "'%'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='", + "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'", + "'not'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'SC'", + "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" }; private static final String[] _SYMBOLIC_NAMES = { null, null, null, null, null, null, null, null, null, null, null, null, @@ -68,9 +68,9 @@ 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, null, null, null, null, null, null, "LINECOMMENT", - "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", - "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" + null, null, null, null, null, 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); @@ -290,7 +290,7 @@ public class il65Parser extends Parser { setState(78); _errHandler.sync(this); _la = _input.LA(1); - if (((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & ((1L << (DEC_INTEGER - 87)) | (1L << (HEX_INTEGER - 87)) | (1L << (BIN_INTEGER - 87)))) != 0)) { + if (((((_la - 85)) & ~0x3f) == 0 && ((1L << (_la - 85)) & ((1L << (DEC_INTEGER - 85)) | (1L << (HEX_INTEGER - 85)) | (1L << (BIN_INTEGER - 85)))) != 0)) { { setState(77); integerliteral(); @@ -304,7 +304,7 @@ public class il65Parser extends Parser { setState(86); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)) | (1L << (T__80 - 70)) | (1L << (EOL - 70)) | (1L << (NAME - 70)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (T__67 - 68)) | (1L << (T__68 - 68)) | (1L << (T__69 - 68)) | (1L << (T__70 - 68)) | (1L << (T__71 - 68)) | (1L << (T__72 - 68)) | (1L << (T__73 - 68)) | (1L << (T__74 - 68)) | (1L << (T__75 - 68)) | (1L << (T__78 - 68)) | (1L << (EOL - 68)) | (1L << (NAME - 68)))) != 0)) { { setState(84); _errHandler.sync(this); @@ -327,6 +327,8 @@ public class il65Parser extends Parser { case T__21: case T__22: case T__23: + case T__67: + case T__68: case T__69: case T__70: case T__71: @@ -334,9 +336,7 @@ public class il65Parser extends Parser { case T__73: case T__74: case T__75: - case T__76: - case T__77: - case T__80: + case T__78: case NAME: { setState(82); @@ -1105,7 +1105,7 @@ public class il65Parser extends Parser { setState(170); ((AugassignmentContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37))) != 0)) ) { ((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1208,7 +1208,7 @@ public class il65Parser extends Parser { setState(179); ((PostincrdecrContext)_localctx).operator = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__39 || _la==T__40) ) { + if ( !(_la==T__38 || _la==T__39) ) { ((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this); } else { @@ -1288,11 +1288,11 @@ public class il65Parser extends Parser { case 1: { setState(182); - match(T__41); + match(T__40); setState(183); expression(0); setState(184); - match(T__42); + match(T__41); } break; case 2: @@ -1306,7 +1306,7 @@ public class il65Parser extends Parser { setState(187); ((ExpressionContext)_localctx).prefix = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__43 || _la==T__44) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__42) | (1L << T__43))) != 0)) ) { ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this); } else { @@ -1321,18 +1321,9 @@ public class il65Parser extends Parser { case 4: { setState(189); - ((ExpressionContext)_localctx).prefix = _input.LT(1); - _la = _input.LA(1); - if ( !(_la==T__0 || _la==T__45) ) { - ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this); - } - else { - if ( _input.LA(1)==Token.EOF ) matchedEOF = true; - _errHandler.reportMatch(this); - consume(); - } + ((ExpressionContext)_localctx).prefix = match(T__64); setState(190); - expression(18); + expression(6); } break; case 5: @@ -1379,11 +1370,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(197); - if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); setState(198); - ((ExpressionContext)_localctx).bop = match(T__46); + ((ExpressionContext)_localctx).bop = match(T__44); setState(199); - ((ExpressionContext)_localctx).right = expression(18); + ((ExpressionContext)_localctx).right = expression(19); } break; case 2: @@ -1393,11 +1384,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(200); - if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); + if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)"); setState(201); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1406,7 +1397,7 @@ public class il65Parser extends Parser { consume(); } setState(202); - ((ExpressionContext)_localctx).right = expression(17); + ((ExpressionContext)_localctx).right = expression(18); } break; case 3: @@ -1416,11 +1407,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(203); - if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); + if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)"); setState(204); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__43 || _la==T__44) ) { + if ( !(_la==T__42 || _la==T__43) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1429,7 +1420,7 @@ public class il65Parser extends Parser { consume(); } setState(205); - ((ExpressionContext)_localctx).right = expression(16); + ((ExpressionContext)_localctx).right = expression(17); } break; case 4: @@ -1439,11 +1430,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(206); - if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); + if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)"); setState(207); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1452,7 +1443,7 @@ public class il65Parser extends Parser { consume(); } setState(208); - ((ExpressionContext)_localctx).right = expression(15); + ((ExpressionContext)_localctx).right = expression(16); } break; case 5: @@ -1462,11 +1453,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(209); - if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); + if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)"); setState(210); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58))) != 0)) ) { + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55))) != 0)) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1475,7 +1466,7 @@ public class il65Parser extends Parser { consume(); } setState(211); - ((ExpressionContext)_localctx).right = expression(14); + ((ExpressionContext)_localctx).right = expression(15); } break; case 6: @@ -1485,11 +1476,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(212); - if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); + if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)"); setState(213); ((ExpressionContext)_localctx).bop = _input.LT(1); _la = _input.LA(1); - if ( !(_la==T__59 || _la==T__60) ) { + if ( !(_la==T__56 || _la==T__57) ) { ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this); } else { @@ -1498,7 +1489,7 @@ public class il65Parser extends Parser { consume(); } setState(214); - ((ExpressionContext)_localctx).right = expression(13); + ((ExpressionContext)_localctx).right = expression(14); } break; case 7: @@ -1508,11 +1499,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(215); - if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); + if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)"); setState(216); - ((ExpressionContext)_localctx).bop = match(T__61); + ((ExpressionContext)_localctx).bop = match(T__58); setState(217); - ((ExpressionContext)_localctx).right = expression(12); + ((ExpressionContext)_localctx).right = expression(13); } break; case 8: @@ -1522,11 +1513,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(218); - if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); + if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)"); setState(219); - ((ExpressionContext)_localctx).bop = match(T__62); + ((ExpressionContext)_localctx).bop = match(T__59); setState(220); - ((ExpressionContext)_localctx).right = expression(11); + ((ExpressionContext)_localctx).right = expression(12); } break; case 9: @@ -1536,11 +1527,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(221); - if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); + if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)"); setState(222); - ((ExpressionContext)_localctx).bop = match(T__63); + ((ExpressionContext)_localctx).bop = match(T__60); setState(223); - ((ExpressionContext)_localctx).right = expression(10); + ((ExpressionContext)_localctx).right = expression(11); } break; case 10: @@ -1550,11 +1541,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(224); - if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); + if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)"); setState(225); - ((ExpressionContext)_localctx).bop = match(T__64); + ((ExpressionContext)_localctx).bop = match(T__61); setState(226); - ((ExpressionContext)_localctx).right = expression(9); + ((ExpressionContext)_localctx).right = expression(10); } break; case 11: @@ -1564,11 +1555,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(227); - if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); + if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)"); setState(228); - ((ExpressionContext)_localctx).bop = match(T__65); + ((ExpressionContext)_localctx).bop = match(T__62); setState(229); - ((ExpressionContext)_localctx).right = expression(8); + ((ExpressionContext)_localctx).right = expression(9); } break; case 12: @@ -1578,11 +1569,11 @@ public class il65Parser extends Parser { _localctx.left = _prevctx; pushNewRecursionContext(_localctx, _startState, RULE_expression); setState(230); - if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)"); + if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)"); setState(231); - ((ExpressionContext)_localctx).bop = match(T__66); + ((ExpressionContext)_localctx).bop = match(T__63); setState(232); - ((ExpressionContext)_localctx).right = expression(7); + ((ExpressionContext)_localctx).right = expression(8); } break; case 13: @@ -1594,7 +1585,7 @@ public class il65Parser extends Parser { setState(233); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); setState(234); - match(T__67); + match(T__65); setState(235); ((ExpressionContext)_localctx).rangeto = expression(6); } @@ -1652,11 +1643,11 @@ public class il65Parser extends Parser { setState(243); call_location(); setState(244); - match(T__41); + match(T__40); setState(246); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__41) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)) | (1L << (T__78 - 70)) | (1L << (T__79 - 70)) | (1L << (NAME - 70)) | (1L << (DEC_INTEGER - 70)) | (1L << (HEX_INTEGER - 70)) | (1L << (BIN_INTEGER - 70)) | (1L << (FLOAT_NUMBER - 70)) | (1L << (STRING - 70)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__40) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 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__77 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) { { setState(245); expression(0); @@ -1664,7 +1655,7 @@ public class il65Parser extends Parser { } setState(248); - match(T__42); + match(T__41); } } catch (RecognitionException re) { @@ -1736,7 +1727,7 @@ public class il65Parser extends Parser { { { setState(253); - match(T__68); + match(T__66); setState(254); match(NAME); } @@ -1778,7 +1769,7 @@ public class il65Parser extends Parser { { setState(259); _la = _input.LA(1); - if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)))) != 0)) ) { + if ( !(((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (T__67 - 68)) | (1L << (T__68 - 68)) | (1L << (T__69 - 68)) | (1L << (T__70 - 68)) | (1L << (T__71 - 68)) | (1L << (T__72 - 68)) | (1L << (T__73 - 68)) | (1L << (T__74 - 68)) | (1L << (T__75 - 68)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -1818,7 +1809,7 @@ public class il65Parser extends Parser { { setState(261); _la = _input.LA(1); - if ( !(((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & ((1L << (DEC_INTEGER - 87)) | (1L << (HEX_INTEGER - 87)) | (1L << (BIN_INTEGER - 87)))) != 0)) ) { + if ( !(((((_la - 85)) & ~0x3f) == 0 && ((1L << (_la - 85)) & ((1L << (DEC_INTEGER - 85)) | (1L << (HEX_INTEGER - 85)) | (1L << (BIN_INTEGER - 85)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -1855,7 +1846,7 @@ public class il65Parser extends Parser { { setState(263); _la = _input.LA(1); - if ( !(_la==T__78 || _la==T__79) ) { + if ( !(_la==T__76 || _la==T__77) ) { _errHandler.recoverInline(this); } else { @@ -2027,8 +2018,8 @@ public class il65Parser extends Parser { integerliteral(); } break; - case T__78: - case T__79: + case T__76: + case T__77: enterOuterAlt(_localctx, 2); { setState(281); @@ -2086,7 +2077,7 @@ public class il65Parser extends Parser { enterOuterAlt(_localctx, 1); { setState(287); - match(T__80); + match(T__78); setState(288); match(INLINEASMBLOCK); } @@ -2112,29 +2103,29 @@ public class il65Parser extends Parser { private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { switch (predIndex) { case 0: - return precpred(_ctx, 17); + return precpred(_ctx, 18); case 1: - return precpred(_ctx, 16); + return precpred(_ctx, 17); case 2: - return precpred(_ctx, 15); + return precpred(_ctx, 16); case 3: - return precpred(_ctx, 14); + return precpred(_ctx, 15); case 4: - return precpred(_ctx, 13); + return precpred(_ctx, 14); case 5: - return precpred(_ctx, 12); + return precpred(_ctx, 13); case 6: - return precpred(_ctx, 11); + return precpred(_ctx, 12); case 7: - return precpred(_ctx, 10); + return precpred(_ctx, 11); case 8: - return precpred(_ctx, 9); + return precpred(_ctx, 10); case 9: - return precpred(_ctx, 8); + return precpred(_ctx, 9); case 10: - return precpred(_ctx, 7); + return precpred(_ctx, 8); case 11: - return precpred(_ctx, 6); + return precpred(_ctx, 7); case 12: return precpred(_ctx, 5); case 13: @@ -2144,7 +2135,7 @@ public class il65Parser extends Parser { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3^\u0125\4\2\t\2\4"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\\\u0125\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"+ @@ -2167,19 +2158,19 @@ public class il65Parser extends Parser { "\u0110\n\34\f\34\16\34\u0113\13\34\3\34\3\34\3\35\3\35\3\36\3\36\3\37"+ "\3\37\3\37\3\37\3\37\5\37\u0120\n\37\3 \3 \3 \3 \2\3(!\2\4\6\b\n\f\16"+ "\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>\2\17\3\2\b\17\3\2\24"+ - "\32\3\2\35)\3\2*+\3\2./\4\2\3\3\60\60\3\2\62\65\3\2\669\3\2:=\3\2>?\3"+ - "\2HP\3\2Y[\3\2QR\2\u013d\2D\3\2\2\2\4K\3\2\2\2\6M\3\2\2\2\bi\3\2\2\2\n"+ + "\32\3\2\35(\3\2)*\4\2\3\3-.\3\2\60\62\3\2-.\3\2\63\66\3\2\67:\3\2;<\3"+ + "\2FN\3\2WY\3\2OP\2\u013d\2D\3\2\2\2\4K\3\2\2\2\6M\3\2\2\2\bi\3\2\2\2\n"+ "k\3\2\2\2\fq\3\2\2\2\16s\3\2\2\2\20v\3\2\2\2\22\u0087\3\2\2\2\24\u0089"+ "\3\2\2\2\26\u008f\3\2\2\2\30\u0097\3\2\2\2\32\u009a\3\2\2\2\34\u009d\3"+ "\2\2\2\36\u009f\3\2\2\2 \u00a7\3\2\2\2\"\u00ab\3\2\2\2$\u00b2\3\2\2\2"+ "&\u00b4\3\2\2\2(\u00c5\3\2\2\2*\u00f5\3\2\2\2,\u00fc\3\2\2\2.\u00fe\3"+ "\2\2\2\60\u0105\3\2\2\2\62\u0107\3\2\2\2\64\u0109\3\2\2\2\66\u010b\3\2"+ "\2\28\u0116\3\2\2\2:\u0118\3\2\2\2<\u011f\3\2\2\2>\u0121\3\2\2\2@C\5\4"+ - "\3\2AC\7W\2\2B@\3\2\2\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2EG\3\2"+ + "\3\2AC\7U\2\2B@\3\2\2\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2EG\3\2"+ "\2\2FD\3\2\2\2GH\7\2\2\3H\3\3\2\2\2IL\5\20\t\2JL\5\6\4\2KI\3\2\2\2KJ\3"+ "\2\2\2L\5\3\2\2\2MN\7\3\2\2NP\5,\27\2OQ\5\62\32\2PO\3\2\2\2PQ\3\2\2\2"+ - "QR\3\2\2\2RS\7\4\2\2SX\7W\2\2TW\5\b\5\2UW\7W\2\2VT\3\2\2\2VU\3\2\2\2W"+ - "Z\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZX\3\2\2\2[\\\7\5\2\2\\]\7W\2\2"+ + "QR\3\2\2\2RS\7\4\2\2SX\7U\2\2TW\5\b\5\2UW\7U\2\2VT\3\2\2\2VU\3\2\2\2W"+ + "Z\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZX\3\2\2\2[\\\7\5\2\2\\]\7U\2\2"+ "]\7\3\2\2\2^j\5\20\t\2_j\5\26\f\2`j\5\24\13\2aj\5\30\r\2bj\5\32\16\2c"+ "j\5 \21\2dj\5\"\22\2ej\5\16\b\2fj\5&\24\2gj\5> \2hj\5\n\6\2i^\3\2\2\2"+ "i_\3\2\2\2i`\3\2\2\2ia\3\2\2\2ib\3\2\2\2ic\3\2\2\2id\3\2\2\2ie\3\2\2\2"+ @@ -2205,46 +2196,46 @@ public class il65Parser extends Parser { "\u00ae\5(\25\2\u00ae#\3\2\2\2\u00af\u00b3\5\60\31\2\u00b0\u00b3\5,\27"+ "\2\u00b1\u00b3\5.\30\2\u00b2\u00af\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b2\u00b1"+ "\3\2\2\2\u00b3%\3\2\2\2\u00b4\u00b5\5$\23\2\u00b5\u00b6\t\5\2\2\u00b6"+ - "\'\3\2\2\2\u00b7\u00b8\b\25\1\2\u00b8\u00b9\7,\2\2\u00b9\u00ba\5(\25\2"+ - "\u00ba\u00bb\7-\2\2\u00bb\u00c6\3\2\2\2\u00bc\u00c6\5*\26\2\u00bd\u00be"+ - "\t\6\2\2\u00be\u00c6\5(\25\25\u00bf\u00c0\t\7\2\2\u00c0\u00c6\5(\25\24"+ - "\u00c1\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6"+ - "\5.\30\2\u00c5\u00b7\3\2\2\2\u00c5\u00bc\3\2\2\2\u00c5\u00bd\3\2\2\2\u00c5"+ + "\'\3\2\2\2\u00b7\u00b8\b\25\1\2\u00b8\u00b9\7+\2\2\u00b9\u00ba\5(\25\2"+ + "\u00ba\u00bb\7,\2\2\u00bb\u00c6\3\2\2\2\u00bc\u00c6\5*\26\2\u00bd\u00be"+ + "\t\6\2\2\u00be\u00c6\5(\25\25\u00bf\u00c0\7C\2\2\u00c0\u00c6\5(\25\b\u00c1"+ + "\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6\5"+ + ".\30\2\u00c5\u00b7\3\2\2\2\u00c5\u00bc\3\2\2\2\u00c5\u00bd\3\2\2\2\u00c5"+ "\u00bf\3\2\2\2\u00c5\u00c1\3\2\2\2\u00c5\u00c2\3\2\2\2\u00c5\u00c3\3\2"+ - "\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00f2\3\2\2\2\u00c7\u00c8\f\23\2\2\u00c8"+ - "\u00c9\7\61\2\2\u00c9\u00f1\5(\25\24\u00ca\u00cb\f\22\2\2\u00cb\u00cc"+ - "\t\b\2\2\u00cc\u00f1\5(\25\23\u00cd\u00ce\f\21\2\2\u00ce\u00cf\t\6\2\2"+ - "\u00cf\u00f1\5(\25\22\u00d0\u00d1\f\20\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1"+ - "\5(\25\21\u00d3\u00d4\f\17\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\20"+ - "\u00d6\u00d7\f\16\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\17\u00d9"+ - "\u00da\f\r\2\2\u00da\u00db\7@\2\2\u00db\u00f1\5(\25\16\u00dc\u00dd\f\f"+ - "\2\2\u00dd\u00de\7A\2\2\u00de\u00f1\5(\25\r\u00df\u00e0\f\13\2\2\u00e0"+ - "\u00e1\7B\2\2\u00e1\u00f1\5(\25\f\u00e2\u00e3\f\n\2\2\u00e3\u00e4\7C\2"+ - "\2\u00e4\u00f1\5(\25\13\u00e5\u00e6\f\t\2\2\u00e6\u00e7\7D\2\2\u00e7\u00f1"+ - "\5(\25\n\u00e8\u00e9\f\b\2\2\u00e9\u00ea\7E\2\2\u00ea\u00f1\5(\25\t\u00eb"+ - "\u00ec\f\7\2\2\u00ec\u00ed\7F\2\2\u00ed\u00f1\5(\25\b\u00ee\u00ef\f\27"+ - "\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca\3\2\2\2\u00f0"+ - "\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0\u00d6\3\2"+ - "\2\2\u00f0\u00d9\3\2\2\2\u00f0\u00dc\3\2\2\2\u00f0\u00df\3\2\2\2\u00f0"+ - "\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0\u00eb\3\2"+ - "\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f2"+ - "\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6\5\f\7\2"+ - "\u00f6\u00f8\7,\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8\u00f9"+ - "\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7-\2\2\u00fb+\3\2\2\2\u00fc\u00fd"+ - "\7X\2\2\u00fd-\3\2\2\2\u00fe\u0101\7X\2\2\u00ff\u0100\7G\2\2\u0100\u0102"+ - "\7X\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2\2\2\u0103"+ - "\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3\2\2\2\u0107"+ - "\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a\65\3\2\2\2"+ - "\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20\2\2\u010e\u0110"+ - "\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\3\2\2\2\u0111\u010f\3\2\2\2\u0111"+ - "\u0112\3\2\2\2\u0112\u0114\3\2\2\2\u0113\u0111\3\2\2\2\u0114\u0115\7\34"+ - "\2\2\u0115\67\3\2\2\2\u0116\u0117\7]\2\2\u01179\3\2\2\2\u0118\u0119\7"+ - "\\\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120\5\64\33\2\u011c"+ - "\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36\2\u011f\u011a\3"+ - "\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d\3\2\2\2\u011f"+ - "\u011e\3\2\2\2\u0120=\3\2\2\2\u0121\u0122\7S\2\2\u0122\u0123\7^\2\2\u0123"+ - "?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3\u00b2\u00c5\u00f0"+ - "\u00f2\u00f8\u0103\u0111\u011f"; + "\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00f2\3\2\2\2\u00c7\u00c8\f\24\2\2\u00c8"+ + "\u00c9\7/\2\2\u00c9\u00f1\5(\25\25\u00ca\u00cb\f\23\2\2\u00cb\u00cc\t"+ + "\7\2\2\u00cc\u00f1\5(\25\24\u00cd\u00ce\f\22\2\2\u00ce\u00cf\t\b\2\2\u00cf"+ + "\u00f1\5(\25\23\u00d0\u00d1\f\21\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1\5"+ + "(\25\22\u00d3\u00d4\f\20\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\21"+ + "\u00d6\u00d7\f\17\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\20\u00d9"+ + "\u00da\f\16\2\2\u00da\u00db\7=\2\2\u00db\u00f1\5(\25\17\u00dc\u00dd\f"+ + "\r\2\2\u00dd\u00de\7>\2\2\u00de\u00f1\5(\25\16\u00df\u00e0\f\f\2\2\u00e0"+ + "\u00e1\7?\2\2\u00e1\u00f1\5(\25\r\u00e2\u00e3\f\13\2\2\u00e3\u00e4\7@"+ + "\2\2\u00e4\u00f1\5(\25\f\u00e5\u00e6\f\n\2\2\u00e6\u00e7\7A\2\2\u00e7"+ + "\u00f1\5(\25\13\u00e8\u00e9\f\t\2\2\u00e9\u00ea\7B\2\2\u00ea\u00f1\5("+ + "\25\n\u00eb\u00ec\f\7\2\2\u00ec\u00ed\7D\2\2\u00ed\u00f1\5(\25\b\u00ee"+ + "\u00ef\f\27\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca"+ + "\3\2\2\2\u00f0\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0"+ + "\u00d6\3\2\2\2\u00f0\u00d9\3\2\2\2\u00f0\u00dc\3\2\2\2\u00f0\u00df\3\2"+ + "\2\2\u00f0\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0"+ + "\u00eb\3\2\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2"+ + "\2\2\u00f2\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6"+ + "\5\f\7\2\u00f6\u00f8\7+\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8"+ + "\u00f9\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7,\2\2\u00fb+\3\2\2\2\u00fc"+ + "\u00fd\7V\2\2\u00fd-\3\2\2\2\u00fe\u0101\7V\2\2\u00ff\u0100\7E\2\2\u0100"+ + "\u0102\7V\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2"+ + "\2\2\u0103\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3"+ + "\2\2\2\u0107\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a"+ + "\65\3\2\2\2\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20"+ + "\2\2\u010e\u0110\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\3\2\2\2\u0111"+ + "\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0114\3\2\2\2\u0113\u0111\3\2"+ + "\2\2\u0114\u0115\7\34\2\2\u0115\67\3\2\2\2\u0116\u0117\7[\2\2\u01179\3"+ + "\2\2\2\u0118\u0119\7Z\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120"+ + "\5\64\33\2\u011c\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36"+ + "\2\u011f\u011a\3\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d"+ + "\3\2\2\2\u011f\u011e\3\2\2\2\u0120=\3\2\2\2\u0121\u0122\7Q\2\2\u0122\u0123"+ + "\7\\\2\2\u0123?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3"+ + "\u00b2\u00c5\u00f0\u00f2\u00f8\u0103\u0111\u011f"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static {