optimizer first steps

This commit is contained in:
Irmen de Jong 2018-08-11 19:15:39 +02:00
parent 89ffb0021d
commit aadd50cc27
9 changed files with 1088 additions and 544 deletions

View File

@ -289,7 +289,7 @@ arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%``
``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations. ``+``, ``-``, ``*``, ``/`` 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) ``//`` 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 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: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~`` bitwise arithmetic: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~``

View File

@ -96,7 +96,7 @@ arrayspec: '[' expression (',' expression)? ']' ;
assignment : assign_target '=' expression ; assignment : assign_target '=' expression ;
augassignment : augassignment :
assign_target operator=('+=' | '-=' | '/=' | '//=' | '*=' | '**=' | assign_target operator=('+=' | '-=' | '/=' | '*=' | '**=' |
'<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression '<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression
; ;
@ -112,10 +112,9 @@ expression :
'(' expression ')' '(' expression ')'
| expression arrayspec | expression arrayspec
| functioncall | functioncall
| prefix = ('+'|'-') expression | prefix = ('+'|'-'|'~') expression
| prefix = ('~'|'not') 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
| 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 = 'and' right = expression
| left = expression bop = 'or' right = expression | left = expression bop = 'or' right = expression
| left = expression bop = 'xor' right = expression | left = expression bop = 'xor' right = expression
| prefix = 'not' expression
| rangefrom = expression 'to' rangeto = expression | rangefrom = expression 'to' rangeto = expression
| literalvalue | literalvalue
| register | register

View File

@ -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)
}
}
}

View File

@ -1,15 +1,13 @@
package il65 package il65
import il65.ast.Label import il65.ast.IStatement
import il65.ast.LiteralValue import il65.ast.Module
import il65.ast.PrefixExpression
import il65.ast.toAst import il65.ast.toAst
import il65.parser.il65Lexer import il65.parser.il65Lexer
import il65.parser.il65Parser import il65.parser.il65Parser
import org.antlr.v4.runtime.CharStreams import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream import org.antlr.v4.runtime.CommonTokenStream
import org.antlr.v4.runtime.Lexer import org.antlr.v4.runtime.Lexer
import org.antlr.v4.runtime.misc.IntegerList
class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) { class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) {
@ -29,33 +27,33 @@ class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) {
} }
} }
public inline fun <R> Module.map(transform: (IStatement) -> R): List<R> {
val result = ArrayList<R>(lines.size)
for (line in this.lines) {
result.add(transform(line))
}
return result
}
fun main(args: Array<String>) { fun main(args: Array<String>) {
// println("Reading source file: ${args[0]}") // println("Reading source file: ${args[0]}")
val input = CharStreams.fromString( val input = CharStreams.fromString(
"%zp clobber,derp,33,de\n" +
"~ main \$c000 { \n" + "~ main \$c000 { \n" +
" A=4 + 99\n" + " const byte hopla=55-33\n"+
" ; full position comment\n" + " const byte hopla2=55-hopla\n"+
" %asm {{\n" + " A = \"derp\" * (2-2) \n" +
" position 1\n"+ "}\n")
"\t\tposition 2\n"+
" }}\n" +
" X=Y ; comment hooo\n"+
"}\n"
)
val lexer = il65Lexer(input) val lexer = il65Lexer(input)
val tokens = MyTokenStream(lexer) val tokens = MyTokenStream(lexer)
val parser = il65Parser(tokens) val parser = il65Parser(tokens)
val module = parser.module() var moduleAst = parser.module().toAst(true).optimized()
val program = module.toAst(true)
// the comments: // the comments:
tokens.commentTokens().forEach { println(it) } tokens.commentTokens().forEach { println(it) }
program.lines.map { moduleAst.lines.map {
println(it) println(it)
} }
} }

View File

@ -1,9 +1,11 @@
package il65.ast package il65.ast
import il65.IAstOptimizer
import il65.parser.il65Parser import il65.parser.il65Parser
import org.antlr.v4.runtime.ParserRuleContext import org.antlr.v4.runtime.ParserRuleContext
import org.antlr.v4.runtime.tree.TerminalNode import org.antlr.v4.runtime.tree.TerminalNode
/**************************** AST Data classes ****************************/ /**************************** AST Data classes ****************************/
enum class DataType { enum class DataType {
@ -28,28 +30,51 @@ enum class Register {
SZ SZ
} }
class AstException(override var message: String) : Exception(message)
data class Position(val line: Int, val startCol:Int, val endCol: Int) data class Position(val line: Int, val startCol:Int, val endCol: Int)
interface Node { interface Node {
val position: Position? // optional for the sake of easy unit testing val position: Position? // optional for the sake of easy unit testing
} }
interface IStatement : Node
data class Module(val lines: MutableList<IStatement>, interface IStatement : Node {
override val position: Position? = null) : Node fun optimize(optimizer: IAstOptimizer) : IStatement
}
data class Block(val name: String, val address: Int?, val statements: MutableList<IStatement>,
override val position: Position? = null) : IStatement data class Module(var lines: List<IStatement>,
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<IStatement>,
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<DirectiveArg>, data class Directive(val directive: String, val args: List<DirectiveArg>,
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?, data class DirectiveArg(val str: String?, val name: String?, val int: Int?,
override val position: Position? = null) : Node override val position: Position? = null) : Node
data class Label(val name: String, 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 { interface IVarDecl : IStatement {
val datatype: DataType val datatype: DataType
@ -66,68 +91,159 @@ data class VarDecl(override val datatype: DataType,
override val arrayspec: ArraySpec?, override val arrayspec: ArraySpec?,
override val name: String, override val name: String,
override var value: IExpression?, 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, data class ConstDecl(override val datatype: DataType,
override val arrayspec: ArraySpec?, override val arrayspec: ArraySpec?,
override val name: String, override val name: String,
override var value: IExpression?, 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, data class MemoryVarDecl(override val datatype: DataType,
override val arrayspec: ArraySpec?, override val arrayspec: ArraySpec?,
override val name: String, override val name: String,
override var value: IExpression?, 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, data class Assignment(var target: AssignTarget, val aug_op : String?, var value: IExpression,
override val position: Position? = null) : IStatement 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?, 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 // note: some expression elements are mutable, to be able to rewrite/optimize the expression tree
data class PrefixExpression(val operator: String, val expression: IExpression, data class PrefixExpression(val operator: String, var expression: 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 BinaryExpression(var left: IExpression, val operator: String, var right: IExpression, 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<IExpression>? = 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<IExpression>?,
override val position: Position? = null) : IExpression
data class RangeExpr(var from: IExpression, var to: 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, 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<String>, data class Identifier(val name: String, val scope: List<String>,
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?, 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, data class PostIncrDecr(var target: AssignTarget, val operator: String,
override val position: Position? = null) : IStatement 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<IExpression>,
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<IExpression>,
override val position: Position? = null) : IExpression
data class InlineAssembly(val assembly: String, 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 ****************/ /***************** Antlr Extension methods to create AST ****************/
@ -141,7 +257,7 @@ fun ParserRuleContext.toPosition(withPosition: Boolean) : Position? {
fun il65Parser.ModuleContext.toAst(withPosition: Boolean) = 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 { 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 { fun il65Parser.BlockContext.toAst(withPosition: Boolean) : IStatement {
return Block(identifier().text, return Block(identifier().text,
integerliteral()?.toAst(), integerliteral()?.toAst(),
statement().map { it.toAst(withPosition) }.toMutableList(), statement().map { it.toAst(withPosition) },
toPosition(withPosition)) toPosition(withPosition))
} }
@ -298,14 +414,17 @@ fun il65Parser.IntegerliteralContext.toAst(): Int {
fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression { fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression {
val litval = literalvalue() 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(), return LiteralValue(litval.integerliteral()?.toAst(),
litval.floatliteral()?.toAst(), litval.floatliteral()?.toAst(),
litval.stringliteral()?.text, litval.stringliteral()?.text,
litval.booleanliteral()?.toAst(),
litval.arrayliteral()?.toAst(withPosition), litval.arrayliteral()?.toAst(withPosition),
litval.toPosition(withPosition) litval.toPosition(withPosition)
) )
}
if(register()!=null) if(register()!=null)
return RegisterExpr(register().toAst(), register().toPosition(withPosition)) return RegisterExpr(register().toAst(), register().toPosition(withPosition))
@ -331,14 +450,18 @@ fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression {
if(funcall!=null) { if(funcall!=null) {
val location = funcall.call_location().toAst(withPosition) val location = funcall.call_location().toAst(withPosition)
return if(funcall.expression()!=null) 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 else
FunctionCall(location, mutableListOf(), funcall.toPosition(withPosition)) FunctionCall(location, emptyList(), funcall.toPosition(withPosition))
} }
if (rangefrom!=null && rangeto!=null) if (rangefrom!=null && rangeto!=null)
return RangeExpr(rangefrom.toAst(withPosition), rangeto.toAst(withPosition), toPosition(withPosition)) 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) throw UnsupportedOperationException(text)
} }
@ -367,5 +490,5 @@ fun il65Parser.BooleanliteralContext.toAst() = when(text) {
fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) = fun il65Parser.ArrayliteralContext.toAst(withPosition: Boolean) =
expression().map { it.toAst(withPosition) }.toMutableList() expression().map { it.toAst(withPosition) }

View File

@ -77,19 +77,17 @@ T__75=76
T__76=77 T__76=77
T__77=78 T__77=78
T__78=79 T__78=79
T__79=80 LINECOMMENT=80
T__80=81 COMMENT=81
LINECOMMENT=82 WS=82
COMMENT=83 EOL=83
WS=84 NAME=84
EOL=85 DEC_INTEGER=85
NAME=86 HEX_INTEGER=86
DEC_INTEGER=87 BIN_INTEGER=87
HEX_INTEGER=88 FLOAT_NUMBER=88
BIN_INTEGER=89 STRING=89
FLOAT_NUMBER=90 INLINEASMBLOCK=90
STRING=91
INLINEASMBLOCK=92
'~'=1 '~'=1
'{'=2 '{'=2
'}'=3 '}'=3
@ -119,55 +117,53 @@ INLINEASMBLOCK=92
'+='=27 '+='=27
'-='=28 '-='=28
'/='=29 '/='=29
'//='=30 '*='=30
'*='=31 '**='=31
'**='=32 '<<='=32
'<<='=33 '>>='=33
'>>='=34 '<<@='=34
'<<@='=35 '>>@='=35
'>>@='=36 '&='=36
'&='=37 '|='=37
'|='=38 '^='=38
'^='=39 '++'=39
'++'=40 '--'=40
'--'=41 '('=41
'('=42 ')'=42
')'=43 '+'=43
'+'=44 '-'=44
'-'=45 '**'=45
'not'=46 '*'=46
'**'=47 '/'=47
'*'=48 '%'=48
'/'=49 '<<'=49
'//'=50 '>>'=50
'%'=51 '<<@'=51
'<<'=52 '>>@'=52
'>>'=53 '<'=53
'<<@'=54 '>'=54
'>>@'=55 '<='=55
'<'=56 '>='=56
'>'=57 '=='=57
'<='=58 '!='=58
'>='=59 '&'=59
'=='=60 '^'=60
'!='=61 '|'=61
'&'=62 'and'=62
'^'=63 'or'=63
'|'=64 'xor'=64
'and'=65 'not'=65
'or'=66 'to'=66
'xor'=67 '.'=67
'to'=68 'A'=68
'.'=69 'X'=69
'A'=70 'Y'=70
'X'=71 'AX'=71
'Y'=72 'AY'=72
'AX'=73 'XY'=73
'AY'=74 'SC'=74
'XY'=75 'SI'=75
'SC'=76 'SZ'=76
'SI'=77 'true'=77
'SZ'=78 'false'=78
'true'=79 '%asm'=79
'false'=80
'%asm'=81

View File

@ -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__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__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__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__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, LINECOMMENT=80,
T__80=81, LINECOMMENT=82, COMMENT=83, WS=84, EOL=85, NAME=86, DEC_INTEGER=87, COMMENT=81, WS=82, EOL=83, NAME=84, DEC_INTEGER=85, HEX_INTEGER=86, BIN_INTEGER=87,
HEX_INTEGER=88, BIN_INTEGER=89, FLOAT_NUMBER=90, STRING=91, INLINEASMBLOCK=92; FLOAT_NUMBER=88, STRING=89, INLINEASMBLOCK=90;
public static String[] channelNames = { public static String[] channelNames = {
"DEFAULT_TOKEN_CHANNEL", "HIDDEN" "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__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__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__65", "T__66", "T__67", "T__68", "T__69", "T__70", "T__71", "T__72",
"T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "T__79", "T__80", "T__73", "T__74", "T__75", "T__76", "T__77", "T__78", "LINECOMMENT", "COMMENT",
"LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"BIN_INTEGER", "FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
"INLINEASMBLOCK"
}; };
private static final String[] _LITERAL_NAMES = { private static final String[] _LITERAL_NAMES = {
@ -59,12 +58,12 @@ public class il65Lexer extends Lexer {
"'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'",
"'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='",
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'",
"'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'", "'*'", "'/'", "'%'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'",
"'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'not'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'SC'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" "'SI'", "'SZ'", "'true'", "'false'", "'%asm'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, 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, 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", null, null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT",
"COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" "STRING", "INLINEASMBLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -137,10 +136,10 @@ public class il65Lexer extends Lexer {
@Override @Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) { public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) { switch (ruleIndex) {
case 92: case 90:
STRING_action((RuleContext)_localctx, actionIndex); STRING_action((RuleContext)_localctx, actionIndex);
break; break;
case 93: case 91:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex); INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break; break;
} }
@ -169,7 +168,7 @@ public class il65Lexer extends Lexer {
} }
public static final String _serializedATN = 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"+ "\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"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\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="+ "\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"+ "\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"+ "\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"+ "\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"+
"\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\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\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"+ "\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\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13"+ "\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\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\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"+
"\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"+ "\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\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"+ "\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\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3"+ "\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24\3\24\3"+
"\24\3\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"+ "\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\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3"+ "\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\31\3"+
"\31\3\31\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\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"+
"\36\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\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\'\3(\3(\3(\3)\3)\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"+ "+\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"+
"\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"+ "\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"+
"\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"+ "\38\38\38\39\39\39\3:\3:\3:\3;\3;\3;\3<\3<\3=\3=\3>\3>\3?\3?\3?\3?\3@"+
"<\3=\3=\3=\3>\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3"+ "\3@\3@\3A\3A\3A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3E\3E\3F\3F\3G\3G\3H\3H"+
"D\3E\3E\3E\3F\3F\3G\3G\3H\3H\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3"+ "\3H\3I\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3N\3N\3N\3O\3O"+
"M\3N\3N\3N\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3"+ "\3O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\7Q\u01f3\nQ\fQ\16Q\u01f6\13Q\3Q\3Q\3"+
"S\3S\7S\u01fe\nS\fS\16S\u0201\13S\3S\3S\3S\3S\3T\3T\7T\u0209\nT\fT\16"+ "Q\3Q\3R\3R\7R\u01fe\nR\fR\16R\u0201\13R\3R\3R\3S\3S\3S\3S\3T\6T\u020a"+
"T\u020c\13T\3T\3T\3U\3U\3U\3U\3V\6V\u0215\nV\rV\16V\u0216\3W\3W\7W\u021b"+ "\nT\rT\16T\u020b\3U\3U\7U\u0210\nU\fU\16U\u0213\13U\3V\3V\3V\6V\u0218"+
"\nW\fW\16W\u021e\13W\3X\3X\3X\6X\u0223\nX\rX\16X\u0224\5X\u0227\nX\3Y"+ "\nV\rV\16V\u0219\5V\u021c\nV\3W\3W\6W\u0220\nW\rW\16W\u0221\3X\3X\6X\u0226"+
"\3Y\6Y\u022b\nY\rY\16Y\u022c\3Z\3Z\6Z\u0231\nZ\rZ\16Z\u0232\3[\3[\3[\5"+ "\nX\rX\16X\u0227\3Y\3Y\3Y\5Y\u022d\nY\3Y\5Y\u0230\nY\3Z\6Z\u0233\nZ\r"+
"[\u0238\n[\3[\5[\u023b\n[\3\\\6\\\u023e\n\\\r\\\16\\\u023f\3\\\3\\\6\\"+ "Z\16Z\u0234\3Z\3Z\6Z\u0239\nZ\rZ\16Z\u023a\5Z\u023d\nZ\3[\3[\3[\3[\5["+
"\u0244\n\\\r\\\16\\\u0245\5\\\u0248\n\\\3]\3]\3]\3]\5]\u024e\n]\3^\3^"+ "\u0243\n[\3\\\3\\\3\\\7\\\u0248\n\\\f\\\16\\\u024b\13\\\3\\\3\\\3\\\3"+
"\3^\7^\u0253\n^\f^\16^\u0256\13^\3^\3^\3^\3_\3_\3_\3_\6_\u025f\n_\r_\16"+ "]\3]\3]\3]\6]\u0254\n]\r]\16]\u0255\3]\3]\3]\3]\3]\3\u0255\2^\3\3\5\4"+
"_\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"+ "\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"+
"\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31"+ "#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+
"\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60"+ "#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w"+
"_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085"+ "=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091"+
"D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097M\u0099"+ "J\u0093K\u0095L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5"+
"N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00abW\u00ad"+ "T\u00a7U\u00a9V\u00abW\u00adX\u00afY\u00b1Z\u00b3\2\u00b5\2\u00b7[\u00b9"+
"X\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7\2\u00b9\2\u00bb]\u00bd^\3\2\n\4\2"+ "\\\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62"+
"\f\f\17\17\4\2\13\13\"\"\5\2C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGg"+ ";CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2\u026a\2\3\3\2\2\2\2\5\3\2\2"+
"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\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"+
"\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\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"+
"\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\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\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\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+\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\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\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\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2"+
"\2\2\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"+ "\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"+
"\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["+ "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"+
"\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\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\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"+ "\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"+
"\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"+ "\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\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"+ "\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"+
"\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\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"+
"\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\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2"+
"\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\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"+
"\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\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b7\3\2\2"+
"\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\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"+
"\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\13\u00c3\3\2\2\2\r\u00c8\3\2\2\2\17\u00d0\3\2\2\2\21\u00da\3"+
"\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\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\21\u00de\3\2\2\2\23\u00e2\3\2\2\2\25\u00eb\3\2\2\2\27\u00f3\3\2\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"+
"\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"+ "#\u011c\3\2\2\2%\u0123\3\2\2\2\'\u0128\3\2\2\2)\u012d\3\2\2\2+\u0133\3"+
"!\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/\u013d\3\2\2\2\61\u0143\3\2\2\2\63\u014a\3\2\2\2"+
"\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"+ "\65\u014c\3\2\2\2\67\u014e\3\2\2\29\u0151\3\2\2\2;\u0154\3\2\2\2=\u0157"+
"\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?\u015a\3\2\2\2A\u015e\3\2\2\2C\u0162\3\2\2\2E\u0166\3\2\2\2G"+
"\3\2\2\2=\u015b\3\2\2\2?\u015f\3\2\2\2A\u0162\3\2\2\2C\u0166\3\2\2\2E"+ "\u016b\3\2\2\2I\u0170\3\2\2\2K\u0173\3\2\2\2M\u0176\3\2\2\2O\u0179\3\2"+
"\u016a\3\2\2\2G\u016e\3\2\2\2I\u0173\3\2\2\2K\u0178\3\2\2\2M\u017b\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"+
"\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\2[\u0187\3\2\2\2]\u018a\3\2\2\2_\u018c\3\2\2\2a\u018e\3\2\2\2c"+
"\3\2\2\2Y\u018b\3\2\2\2[\u018d\3\2\2\2]\u018f\3\2\2\2_\u0193\3\2\2\2a"+ "\u0190\3\2\2\2e\u0193\3\2\2\2g\u0196\3\2\2\2i\u019a\3\2\2\2k\u019e\3\2"+
"\u0196\3\2\2\2c\u0198\3\2\2\2e\u019a\3\2\2\2g\u019d\3\2\2\2i\u019f\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"+
"\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\2w\u01ae\3\2\2\2y\u01b0\3\2\2\2{\u01b2\3\2\2\2}\u01b4\3\2\2\2\177"+
"\3\2\2\2u\u01b1\3\2\2\2w\u01b4\3\2\2\2y\u01b7\3\2\2\2{\u01ba\3\2\2\2}"+ "\u01b8\3\2\2\2\u0081\u01bb\3\2\2\2\u0083\u01bf\3\2\2\2\u0085\u01c3\3\2"+
"\u01bd\3\2\2\2\177\u01bf\3\2\2\2\u0081\u01c1\3\2\2\2\u0083\u01c3\3\2\2"+ "\2\2\u0087\u01c6\3\2\2\2\u0089\u01c8\3\2\2\2\u008b\u01ca\3\2\2\2\u008d"+
"\2\u0085\u01c7\3\2\2\2\u0087\u01ca\3\2\2\2\u0089\u01ce\3\2\2\2\u008b\u01d1"+ "\u01cc\3\2\2\2\u008f\u01ce\3\2\2\2\u0091\u01d1\3\2\2\2\u0093\u01d4\3\2"+
"\3\2\2\2\u008d\u01d3\3\2\2\2\u008f\u01d5\3\2\2\2\u0091\u01d7\3\2\2\2\u0093"+ "\2\2\u0095\u01d7\3\2\2\2\u0097\u01da\3\2\2\2\u0099\u01dd\3\2\2\2\u009b"+
"\u01d9\3\2\2\2\u0095\u01dc\3\2\2\2\u0097\u01df\3\2\2\2\u0099\u01e2\3\2"+ "\u01e0\3\2\2\2\u009d\u01e5\3\2\2\2\u009f\u01eb\3\2\2\2\u00a1\u01f0\3\2"+
"\2\2\u009b\u01e5\3\2\2\2\u009d\u01e8\3\2\2\2\u009f\u01eb\3\2\2\2\u00a1"+ "\2\2\u00a3\u01fb\3\2\2\2\u00a5\u0204\3\2\2\2\u00a7\u0209\3\2\2\2\u00a9"+
"\u01f0\3\2\2\2\u00a3\u01f6\3\2\2\2\u00a5\u01fb\3\2\2\2\u00a7\u0206\3\2"+ "\u020d\3\2\2\2\u00ab\u021b\3\2\2\2\u00ad\u021d\3\2\2\2\u00af\u0223\3\2"+
"\2\2\u00a9\u020f\3\2\2\2\u00ab\u0214\3\2\2\2\u00ad\u0218\3\2\2\2\u00af"+ "\2\2\u00b1\u0229\3\2\2\2\u00b3\u0232\3\2\2\2\u00b5\u0242\3\2\2\2\u00b7"+
"\u0226\3\2\2\2\u00b1\u0228\3\2\2\2\u00b3\u022e\3\2\2\2\u00b5\u0234\3\2"+ "\u0244\3\2\2\2\u00b9\u024f\3\2\2\2\u00bb\u00bc\7\u0080\2\2\u00bc\4\3\2"+
"\2\2\u00b7\u023d\3\2\2\2\u00b9\u024d\3\2\2\2\u00bb\u024f\3\2\2\2\u00bd"+ "\2\2\u00bd\u00be\7}\2\2\u00be\6\3\2\2\2\u00bf\u00c0\7\177\2\2\u00c0\b"+
"\u025a\3\2\2\2\u00bf\u00c0\7\u0080\2\2\u00c0\4\3\2\2\2\u00c1\u00c2\7}"+ "\3\2\2\2\u00c1\u00c2\7<\2\2\u00c2\n\3\2\2\2\u00c3\u00c4\7i\2\2\u00c4\u00c5"+
"\2\2\u00c2\6\3\2\2\2\u00c3\u00c4\7\177\2\2\u00c4\b\3\2\2\2\u00c5\u00c6"+ "\7q\2\2\u00c5\u00c6\7v\2\2\u00c6\u00c7\7q\2\2\u00c7\f\3\2\2\2\u00c8\u00c9"+
"\7<\2\2\u00c6\n\3\2\2\2\u00c7\u00c8\7i\2\2\u00c8\u00c9\7q\2\2\u00c9\u00ca"+ "\7\'\2\2\u00c9\u00ca\7q\2\2\u00ca\u00cb\7w\2\2\u00cb\u00cc\7v\2\2\u00cc"+
"\7v\2\2\u00ca\u00cb\7q\2\2\u00cb\f\3\2\2\2\u00cc\u00cd\7\'\2\2\u00cd\u00ce"+ "\u00cd\7r\2\2\u00cd\u00ce\7w\2\2\u00ce\u00cf\7v\2\2\u00cf\16\3\2\2\2\u00d0"+
"\7q\2\2\u00ce\u00cf\7w\2\2\u00cf\u00d0\7v\2\2\u00d0\u00d1\7r\2\2\u00d1"+ "\u00d1\7\'\2\2\u00d1\u00d2\7n\2\2\u00d2\u00d3\7c\2\2\u00d3\u00d4\7w\2"+
"\u00d2\7w\2\2\u00d2\u00d3\7v\2\2\u00d3\16\3\2\2\2\u00d4\u00d5\7\'\2\2"+ "\2\u00d4\u00d5\7p\2\2\u00d5\u00d6\7e\2\2\u00d6\u00d7\7j\2\2\u00d7\u00d8"+
"\u00d5\u00d6\7n\2\2\u00d6\u00d7\7c\2\2\u00d7\u00d8\7w\2\2\u00d8\u00d9"+ "\7g\2\2\u00d8\u00d9\7t\2\2\u00d9\20\3\2\2\2\u00da\u00db\7\'\2\2\u00db"+
"\7p\2\2\u00d9\u00da\7e\2\2\u00da\u00db\7j\2\2\u00db\u00dc\7g\2\2\u00dc"+ "\u00dc\7|\2\2\u00dc\u00dd\7r\2\2\u00dd\22\3\2\2\2\u00de\u00df\7\'\2\2"+
"\u00dd\7t\2\2\u00dd\20\3\2\2\2\u00de\u00df\7\'\2\2\u00df\u00e0\7|\2\2"+ "\u00df\u00e0\7c\2\2\u00e0\u00e1\7f\2\2\u00e1\u00e2\7f\2\2\u00e2\u00e3"+
"\u00e0\u00e1\7r\2\2\u00e1\22\3\2\2\2\u00e2\u00e3\7\'\2\2\u00e3\u00e4\7"+ "\7t\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7u\2\2\u00e5\u00e6\7u\2\2\u00e6"+
"c\2\2\u00e4\u00e5\7f\2\2\u00e5\u00e6\7f\2\2\u00e6\u00e7\7t\2\2\u00e7\u00e8"+ "\24\3\2\2\2\u00e7\u00e8\7\'\2\2\u00e8\u00e9\7k\2\2\u00e9\u00ea\7o\2\2"+
"\7g\2\2\u00e8\u00e9\7u\2\2\u00e9\u00ea\7u\2\2\u00ea\24\3\2\2\2\u00eb\u00ec"+ "\u00ea\u00eb\7r\2\2\u00eb\u00ec\7q\2\2\u00ec\u00ed\7t\2\2\u00ed\u00ee"+
"\7\'\2\2\u00ec\u00ed\7k\2\2\u00ed\u00ee\7o\2\2\u00ee\u00ef\7r\2\2\u00ef"+ "\7v\2\2\u00ee\26\3\2\2\2\u00ef\u00f0\7\'\2\2\u00f0\u00f1\7d\2\2\u00f1"+
"\u00f0\7q\2\2\u00f0\u00f1\7t\2\2\u00f1\u00f2\7v\2\2\u00f2\26\3\2\2\2\u00f3"+ "\u00f2\7t\2\2\u00f2\u00f3\7g\2\2\u00f3\u00f4\7c\2\2\u00f4\u00f5\7m\2\2"+
"\u00f4\7\'\2\2\u00f4\u00f5\7d\2\2\u00f5\u00f6\7t\2\2\u00f6\u00f7\7g\2"+ "\u00f5\u00f6\7r\2\2\u00f6\u00f7\7q\2\2\u00f7\u00f8\7k\2\2\u00f8\u00f9"+
"\2\u00f7\u00f8\7c\2\2\u00f8\u00f9\7m\2\2\u00f9\u00fa\7r\2\2\u00fa\u00fb"+ "\7p\2\2\u00f9\u00fa\7v\2\2\u00fa\30\3\2\2\2\u00fb\u00fc\7\'\2\2\u00fc"+
"\7q\2\2\u00fb\u00fc\7k\2\2\u00fc\u00fd\7p\2\2\u00fd\u00fe\7v\2\2\u00fe"+ "\u00fd\7c\2\2\u00fd\u00fe\7u\2\2\u00fe\u00ff\7o\2\2\u00ff\u0100\7k\2\2"+
"\30\3\2\2\2\u00ff\u0100\7\'\2\2\u0100\u0101\7c\2\2\u0101\u0102\7u\2\2"+ "\u0100\u0101\7p\2\2\u0101\u0102\7e\2\2\u0102\u0103\7n\2\2\u0103\u0104"+
"\u0102\u0103\7o\2\2\u0103\u0104\7k\2\2\u0104\u0105\7p\2\2\u0105\u0106"+ "\7w\2\2\u0104\u0105\7f\2\2\u0105\u0106\7g\2\2\u0106\32\3\2\2\2\u0107\u0108"+
"\7e\2\2\u0106\u0107\7n\2\2\u0107\u0108\7w\2\2\u0108\u0109\7f\2\2\u0109"+ "\7\'\2\2\u0108\u0109\7c\2\2\u0109\u010a\7u\2\2\u010a\u010b\7o\2\2\u010b"+
"\u010a\7g\2\2\u010a\32\3\2\2\2\u010b\u010c\7\'\2\2\u010c\u010d\7c\2\2"+ "\u010c\7d\2\2\u010c\u010d\7k\2\2\u010d\u010e\7p\2\2\u010e\u010f\7c\2\2"+
"\u010d\u010e\7u\2\2\u010e\u010f\7o\2\2\u010f\u0110\7d\2\2\u0110\u0111"+ "\u010f\u0110\7t\2\2\u0110\u0111\7{\2\2\u0111\34\3\2\2\2\u0112\u0113\7"+
"\7k\2\2\u0111\u0112\7p\2\2\u0112\u0113\7c\2\2\u0113\u0114\7t\2\2\u0114"+ ".\2\2\u0113\36\3\2\2\2\u0114\u0115\7?\2\2\u0115 \3\2\2\2\u0116\u0117\7"+
"\u0115\7{\2\2\u0115\34\3\2\2\2\u0116\u0117\7.\2\2\u0117\36\3\2\2\2\u0118"+ "e\2\2\u0117\u0118\7q\2\2\u0118\u0119\7p\2\2\u0119\u011a\7u\2\2\u011a\u011b"+
"\u0119\7?\2\2\u0119 \3\2\2\2\u011a\u011b\7e\2\2\u011b\u011c\7q\2\2\u011c"+ "\7v\2\2\u011b\"\3\2\2\2\u011c\u011d\7o\2\2\u011d\u011e\7g\2\2\u011e\u011f"+
"\u011d\7p\2\2\u011d\u011e\7u\2\2\u011e\u011f\7v\2\2\u011f\"\3\2\2\2\u0120"+ "\7o\2\2\u011f\u0120\7q\2\2\u0120\u0121\7t\2\2\u0121\u0122\7{\2\2\u0122"+
"\u0121\7o\2\2\u0121\u0122\7g\2\2\u0122\u0123\7o\2\2\u0123\u0124\7q\2\2"+ "$\3\2\2\2\u0123\u0124\7d\2\2\u0124\u0125\7{\2\2\u0125\u0126\7v\2\2\u0126"+
"\u0124\u0125\7t\2\2\u0125\u0126\7{\2\2\u0126$\3\2\2\2\u0127\u0128\7d\2"+ "\u0127\7g\2\2\u0127&\3\2\2\2\u0128\u0129\7y\2\2\u0129\u012a\7q\2\2\u012a"+
"\2\u0128\u0129\7{\2\2\u0129\u012a\7v\2\2\u012a\u012b\7g\2\2\u012b&\3\2"+ "\u012b\7t\2\2\u012b\u012c\7f\2\2\u012c(\3\2\2\2\u012d\u012e\7h\2\2\u012e"+
"\2\2\u012c\u012d\7y\2\2\u012d\u012e\7q\2\2\u012e\u012f\7t\2\2\u012f\u0130"+ "\u012f\7n\2\2\u012f\u0130\7q\2\2\u0130\u0131\7c\2\2\u0131\u0132\7v\2\2"+
"\7f\2\2\u0130(\3\2\2\2\u0131\u0132\7h\2\2\u0132\u0133\7n\2\2\u0133\u0134"+ "\u0132*\3\2\2\2\u0133\u0134\7u\2\2\u0134\u0135\7v\2\2\u0135\u0136\7t\2"+
"\7q\2\2\u0134\u0135\7c\2\2\u0135\u0136\7v\2\2\u0136*\3\2\2\2\u0137\u0138"+ "\2\u0136,\3\2\2\2\u0137\u0138\7u\2\2\u0138\u0139\7v\2\2\u0139\u013a\7"+
"\7u\2\2\u0138\u0139\7v\2\2\u0139\u013a\7t\2\2\u013a,\3\2\2\2\u013b\u013c"+ "t\2\2\u013a\u013b\7a\2\2\u013b\u013c\7r\2\2\u013c.\3\2\2\2\u013d\u013e"+
"\7u\2\2\u013c\u013d\7v\2\2\u013d\u013e\7t\2\2\u013e\u013f\7a\2\2\u013f"+ "\7u\2\2\u013e\u013f\7v\2\2\u013f\u0140\7t\2\2\u0140\u0141\7a\2\2\u0141"+
"\u0140\7r\2\2\u0140.\3\2\2\2\u0141\u0142\7u\2\2\u0142\u0143\7v\2\2\u0143"+ "\u0142\7u\2\2\u0142\60\3\2\2\2\u0143\u0144\7u\2\2\u0144\u0145\7v\2\2\u0145"+
"\u0144\7t\2\2\u0144\u0145\7a\2\2\u0145\u0146\7u\2\2\u0146\60\3\2\2\2\u0147"+ "\u0146\7t\2\2\u0146\u0147\7a\2\2\u0147\u0148\7r\2\2\u0148\u0149\7u\2\2"+
"\u0148\7u\2\2\u0148\u0149\7v\2\2\u0149\u014a\7t\2\2\u014a\u014b\7a\2\2"+ "\u0149\62\3\2\2\2\u014a\u014b\7]\2\2\u014b\64\3\2\2\2\u014c\u014d\7_\2"+
"\u014b\u014c\7r\2\2\u014c\u014d\7u\2\2\u014d\62\3\2\2\2\u014e\u014f\7"+ "\2\u014d\66\3\2\2\2\u014e\u014f\7-\2\2\u014f\u0150\7?\2\2\u01508\3\2\2"+
"]\2\2\u014f\64\3\2\2\2\u0150\u0151\7_\2\2\u0151\66\3\2\2\2\u0152\u0153"+ "\2\u0151\u0152\7/\2\2\u0152\u0153\7?\2\2\u0153:\3\2\2\2\u0154\u0155\7"+
"\7-\2\2\u0153\u0154\7?\2\2\u01548\3\2\2\2\u0155\u0156\7/\2\2\u0156\u0157"+ "\61\2\2\u0155\u0156\7?\2\2\u0156<\3\2\2\2\u0157\u0158\7,\2\2\u0158\u0159"+
"\7?\2\2\u0157:\3\2\2\2\u0158\u0159\7\61\2\2\u0159\u015a\7?\2\2\u015a<"+ "\7?\2\2\u0159>\3\2\2\2\u015a\u015b\7,\2\2\u015b\u015c\7,\2\2\u015c\u015d"+
"\3\2\2\2\u015b\u015c\7\61\2\2\u015c\u015d\7\61\2\2\u015d\u015e\7?\2\2"+ "\7?\2\2\u015d@\3\2\2\2\u015e\u015f\7>\2\2\u015f\u0160\7>\2\2\u0160\u0161"+
"\u015e>\3\2\2\2\u015f\u0160\7,\2\2\u0160\u0161\7?\2\2\u0161@\3\2\2\2\u0162"+ "\7?\2\2\u0161B\3\2\2\2\u0162\u0163\7@\2\2\u0163\u0164\7@\2\2\u0164\u0165"+
"\u0163\7,\2\2\u0163\u0164\7,\2\2\u0164\u0165\7?\2\2\u0165B\3\2\2\2\u0166"+ "\7?\2\2\u0165D\3\2\2\2\u0166\u0167\7>\2\2\u0167\u0168\7>\2\2\u0168\u0169"+
"\u0167\7>\2\2\u0167\u0168\7>\2\2\u0168\u0169\7?\2\2\u0169D\3\2\2\2\u016a"+ "\7B\2\2\u0169\u016a\7?\2\2\u016aF\3\2\2\2\u016b\u016c\7@\2\2\u016c\u016d"+
"\u016b\7@\2\2\u016b\u016c\7@\2\2\u016c\u016d\7?\2\2\u016dF\3\2\2\2\u016e"+ "\7@\2\2\u016d\u016e\7B\2\2\u016e\u016f\7?\2\2\u016fH\3\2\2\2\u0170\u0171"+
"\u016f\7>\2\2\u016f\u0170\7>\2\2\u0170\u0171\7B\2\2\u0171\u0172\7?\2\2"+ "\7(\2\2\u0171\u0172\7?\2\2\u0172J\3\2\2\2\u0173\u0174\7~\2\2\u0174\u0175"+
"\u0172H\3\2\2\2\u0173\u0174\7@\2\2\u0174\u0175\7@\2\2\u0175\u0176\7B\2"+ "\7?\2\2\u0175L\3\2\2\2\u0176\u0177\7`\2\2\u0177\u0178\7?\2\2\u0178N\3"+
"\2\u0176\u0177\7?\2\2\u0177J\3\2\2\2\u0178\u0179\7(\2\2\u0179\u017a\7"+ "\2\2\2\u0179\u017a\7-\2\2\u017a\u017b\7-\2\2\u017bP\3\2\2\2\u017c\u017d"+
"?\2\2\u017aL\3\2\2\2\u017b\u017c\7~\2\2\u017c\u017d\7?\2\2\u017dN\3\2"+ "\7/\2\2\u017d\u017e\7/\2\2\u017eR\3\2\2\2\u017f\u0180\7*\2\2\u0180T\3"+
"\2\2\u017e\u017f\7`\2\2\u017f\u0180\7?\2\2\u0180P\3\2\2\2\u0181\u0182"+ "\2\2\2\u0181\u0182\7+\2\2\u0182V\3\2\2\2\u0183\u0184\7-\2\2\u0184X\3\2"+
"\7-\2\2\u0182\u0183\7-\2\2\u0183R\3\2\2\2\u0184\u0185\7/\2\2\u0185\u0186"+ "\2\2\u0185\u0186\7/\2\2\u0186Z\3\2\2\2\u0187\u0188\7,\2\2\u0188\u0189"+
"\7/\2\2\u0186T\3\2\2\2\u0187\u0188\7*\2\2\u0188V\3\2\2\2\u0189\u018a\7"+ "\7,\2\2\u0189\\\3\2\2\2\u018a\u018b\7,\2\2\u018b^\3\2\2\2\u018c\u018d"+
"+\2\2\u018aX\3\2\2\2\u018b\u018c\7-\2\2\u018cZ\3\2\2\2\u018d\u018e\7/"+ "\7\61\2\2\u018d`\3\2\2\2\u018e\u018f\7\'\2\2\u018fb\3\2\2\2\u0190\u0191"+
"\2\2\u018e\\\3\2\2\2\u018f\u0190\7p\2\2\u0190\u0191\7q\2\2\u0191\u0192"+ "\7>\2\2\u0191\u0192\7>\2\2\u0192d\3\2\2\2\u0193\u0194\7@\2\2\u0194\u0195"+
"\7v\2\2\u0192^\3\2\2\2\u0193\u0194\7,\2\2\u0194\u0195\7,\2\2\u0195`\3"+ "\7@\2\2\u0195f\3\2\2\2\u0196\u0197\7>\2\2\u0197\u0198\7>\2\2\u0198\u0199"+
"\2\2\2\u0196\u0197\7,\2\2\u0197b\3\2\2\2\u0198\u0199\7\61\2\2\u0199d\3"+ "\7B\2\2\u0199h\3\2\2\2\u019a\u019b\7@\2\2\u019b\u019c\7@\2\2\u019c\u019d"+
"\2\2\2\u019a\u019b\7\61\2\2\u019b\u019c\7\61\2\2\u019cf\3\2\2\2\u019d"+ "\7B\2\2\u019dj\3\2\2\2\u019e\u019f\7>\2\2\u019fl\3\2\2\2\u01a0\u01a1\7"+
"\u019e\7\'\2\2\u019eh\3\2\2\2\u019f\u01a0\7>\2\2\u01a0\u01a1\7>\2\2\u01a1"+ "@\2\2\u01a1n\3\2\2\2\u01a2\u01a3\7>\2\2\u01a3\u01a4\7?\2\2\u01a4p\3\2"+
"j\3\2\2\2\u01a2\u01a3\7@\2\2\u01a3\u01a4\7@\2\2\u01a4l\3\2\2\2\u01a5\u01a6"+ "\2\2\u01a5\u01a6\7@\2\2\u01a6\u01a7\7?\2\2\u01a7r\3\2\2\2\u01a8\u01a9"+
"\7>\2\2\u01a6\u01a7\7>\2\2\u01a7\u01a8\7B\2\2\u01a8n\3\2\2\2\u01a9\u01aa"+ "\7?\2\2\u01a9\u01aa\7?\2\2\u01aat\3\2\2\2\u01ab\u01ac\7#\2\2\u01ac\u01ad"+
"\7@\2\2\u01aa\u01ab\7@\2\2\u01ab\u01ac\7B\2\2\u01acp\3\2\2\2\u01ad\u01ae"+ "\7?\2\2\u01adv\3\2\2\2\u01ae\u01af\7(\2\2\u01afx\3\2\2\2\u01b0\u01b1\7"+
"\7>\2\2\u01aer\3\2\2\2\u01af\u01b0\7@\2\2\u01b0t\3\2\2\2\u01b1\u01b2\7"+ "`\2\2\u01b1z\3\2\2\2\u01b2\u01b3\7~\2\2\u01b3|\3\2\2\2\u01b4\u01b5\7c"+
">\2\2\u01b2\u01b3\7?\2\2\u01b3v\3\2\2\2\u01b4\u01b5\7@\2\2\u01b5\u01b6"+ "\2\2\u01b5\u01b6\7p\2\2\u01b6\u01b7\7f\2\2\u01b7~\3\2\2\2\u01b8\u01b9"+
"\7?\2\2\u01b6x\3\2\2\2\u01b7\u01b8\7?\2\2\u01b8\u01b9\7?\2\2\u01b9z\3"+ "\7q\2\2\u01b9\u01ba\7t\2\2\u01ba\u0080\3\2\2\2\u01bb\u01bc\7z\2\2\u01bc"+
"\2\2\2\u01ba\u01bb\7#\2\2\u01bb\u01bc\7?\2\2\u01bc|\3\2\2\2\u01bd\u01be"+ "\u01bd\7q\2\2\u01bd\u01be\7t\2\2\u01be\u0082\3\2\2\2\u01bf\u01c0\7p\2"+
"\7(\2\2\u01be~\3\2\2\2\u01bf\u01c0\7`\2\2\u01c0\u0080\3\2\2\2\u01c1\u01c2"+ "\2\u01c0\u01c1\7q\2\2\u01c1\u01c2\7v\2\2\u01c2\u0084\3\2\2\2\u01c3\u01c4"+
"\7~\2\2\u01c2\u0082\3\2\2\2\u01c3\u01c4\7c\2\2\u01c4\u01c5\7p\2\2\u01c5"+ "\7v\2\2\u01c4\u01c5\7q\2\2\u01c5\u0086\3\2\2\2\u01c6\u01c7\7\60\2\2\u01c7"+
"\u01c6\7f\2\2\u01c6\u0084\3\2\2\2\u01c7\u01c8\7q\2\2\u01c8\u01c9\7t\2"+ "\u0088\3\2\2\2\u01c8\u01c9\7C\2\2\u01c9\u008a\3\2\2\2\u01ca\u01cb\7Z\2"+
"\2\u01c9\u0086\3\2\2\2\u01ca\u01cb\7z\2\2\u01cb\u01cc\7q\2\2\u01cc\u01cd"+ "\2\u01cb\u008c\3\2\2\2\u01cc\u01cd\7[\2\2\u01cd\u008e\3\2\2\2\u01ce\u01cf"+
"\7t\2\2\u01cd\u0088\3\2\2\2\u01ce\u01cf\7v\2\2\u01cf\u01d0\7q\2\2\u01d0"+ "\7C\2\2\u01cf\u01d0\7Z\2\2\u01d0\u0090\3\2\2\2\u01d1\u01d2\7C\2\2\u01d2"+
"\u008a\3\2\2\2\u01d1\u01d2\7\60\2\2\u01d2\u008c\3\2\2\2\u01d3\u01d4\7"+ "\u01d3\7[\2\2\u01d3\u0092\3\2\2\2\u01d4\u01d5\7Z\2\2\u01d5\u01d6\7[\2"+
"C\2\2\u01d4\u008e\3\2\2\2\u01d5\u01d6\7Z\2\2\u01d6\u0090\3\2\2\2\u01d7"+ "\2\u01d6\u0094\3\2\2\2\u01d7\u01d8\7U\2\2\u01d8\u01d9\7E\2\2\u01d9\u0096"+
"\u01d8\7[\2\2\u01d8\u0092\3\2\2\2\u01d9\u01da\7C\2\2\u01da\u01db\7Z\2"+ "\3\2\2\2\u01da\u01db\7U\2\2\u01db\u01dc\7K\2\2\u01dc\u0098\3\2\2\2\u01dd"+
"\2\u01db\u0094\3\2\2\2\u01dc\u01dd\7C\2\2\u01dd\u01de\7[\2\2\u01de\u0096"+ "\u01de\7U\2\2\u01de\u01df\7\\\2\2\u01df\u009a\3\2\2\2\u01e0\u01e1\7v\2"+
"\3\2\2\2\u01df\u01e0\7Z\2\2\u01e0\u01e1\7[\2\2\u01e1\u0098\3\2\2\2\u01e2"+ "\2\u01e1\u01e2\7t\2\2\u01e2\u01e3\7w\2\2\u01e3\u01e4\7g\2\2\u01e4\u009c"+
"\u01e3\7U\2\2\u01e3\u01e4\7E\2\2\u01e4\u009a\3\2\2\2\u01e5\u01e6\7U\2"+ "\3\2\2\2\u01e5\u01e6\7h\2\2\u01e6\u01e7\7c\2\2\u01e7\u01e8\7n\2\2\u01e8"+
"\2\u01e6\u01e7\7K\2\2\u01e7\u009c\3\2\2\2\u01e8\u01e9\7U\2\2\u01e9\u01ea"+ "\u01e9\7u\2\2\u01e9\u01ea\7g\2\2\u01ea\u009e\3\2\2\2\u01eb\u01ec\7\'\2"+
"\7\\\2\2\u01ea\u009e\3\2\2\2\u01eb\u01ec\7v\2\2\u01ec\u01ed\7t\2\2\u01ed"+ "\2\u01ec\u01ed\7c\2\2\u01ed\u01ee\7u\2\2\u01ee\u01ef\7o\2\2\u01ef\u00a0"+
"\u01ee\7w\2\2\u01ee\u01ef\7g\2\2\u01ef\u00a0\3\2\2\2\u01f0\u01f1\7h\2"+ "\3\2\2\2\u01f0\u01f4\t\2\2\2\u01f1\u01f3\t\3\2\2\u01f2\u01f1\3\2\2\2\u01f3"+
"\2\u01f1\u01f2\7c\2\2\u01f2\u01f3\7n\2\2\u01f3\u01f4\7u\2\2\u01f4\u01f5"+ "\u01f6\3\2\2\2\u01f4\u01f2\3\2\2\2\u01f4\u01f5\3\2\2\2\u01f5\u01f7\3\2"+
"\7g\2\2\u01f5\u00a2\3\2\2\2\u01f6\u01f7\7\'\2\2\u01f7\u01f8\7c\2\2\u01f8"+ "\2\2\u01f6\u01f4\3\2\2\2\u01f7\u01f8\5\u00a3R\2\u01f8\u01f9\3\2\2\2\u01f9"+
"\u01f9\7u\2\2\u01f9\u01fa\7o\2\2\u01fa\u00a4\3\2\2\2\u01fb\u01ff\t\2\2"+ "\u01fa\bQ\2\2\u01fa\u00a2\3\2\2\2\u01fb\u01ff\7=\2\2\u01fc\u01fe\n\2\2"+
"\2\u01fc\u01fe\t\3\2\2\u01fd\u01fc\3\2\2\2\u01fe\u0201\3\2\2\2\u01ff\u01fd"+ "\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\u01ff\u0200\3\2\2\2\u0200\u0202\3\2\2\2\u0201\u01ff\3\2\2\2\u0202"+ "\3\2\2\2\u0200\u0202\3\2\2\2\u0201\u01ff\3\2\2\2\u0202\u0203\bR\2\2\u0203"+
"\u0203\5\u00a7T\2\u0203\u0204\3\2\2\2\u0204\u0205\bS\2\2\u0205\u00a6\3"+ "\u00a4\3\2\2\2\u0204\u0205\t\3\2\2\u0205\u0206\3\2\2\2\u0206\u0207\bS"+
"\2\2\2\u0206\u020a\7=\2\2\u0207\u0209\n\2\2\2\u0208\u0207\3\2\2\2\u0209"+ "\3\2\u0207\u00a6\3\2\2\2\u0208\u020a\t\2\2\2\u0209\u0208\3\2\2\2\u020a"+
"\u020c\3\2\2\2\u020a\u0208\3\2\2\2\u020a\u020b\3\2\2\2\u020b\u020d\3\2"+ "\u020b\3\2\2\2\u020b\u0209\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u00a8\3\2"+
"\2\2\u020c\u020a\3\2\2\2\u020d\u020e\bT\2\2\u020e\u00a8\3\2\2\2\u020f"+ "\2\2\u020d\u0211\t\4\2\2\u020e\u0210\t\5\2\2\u020f\u020e\3\2\2\2\u0210"+
"\u0210\t\3\2\2\u0210\u0211\3\2\2\2\u0211\u0212\bU\3\2\u0212\u00aa\3\2"+ "\u0213\3\2\2\2\u0211\u020f\3\2\2\2\u0211\u0212\3\2\2\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"+ "\2\2\u0213\u0211\3\2\2\2\u0214\u021c\4\62;\2\u0215\u0217\4\63;\2\u0216"+
"\u0214\3\2\2\2\u0216\u0217\3\2\2\2\u0217\u00ac\3\2\2\2\u0218\u021c\t\4"+ "\u0218\4\62;\2\u0217\u0216\3\2\2\2\u0218\u0219\3\2\2\2\u0219\u0217\3\2"+
"\2\2\u0219\u021b\t\5\2\2\u021a\u0219\3\2\2\2\u021b\u021e\3\2\2\2\u021c"+ "\2\2\u0219\u021a\3\2\2\2\u021a\u021c\3\2\2\2\u021b\u0214\3\2\2\2\u021b"+
"\u021a\3\2\2\2\u021c\u021d\3\2\2\2\u021d\u00ae\3\2\2\2\u021e\u021c\3\2"+ "\u0215\3\2\2\2\u021c\u00ac\3\2\2\2\u021d\u021f\7&\2\2\u021e\u0220\t\6"+
"\2\2\u021f\u0227\4\62;\2\u0220\u0222\4\63;\2\u0221\u0223\4\62;\2\u0222"+ "\2\2\u021f\u021e\3\2\2\2\u0220\u0221\3\2\2\2\u0221\u021f\3\2\2\2\u0221"+
"\u0221\3\2\2\2\u0223\u0224\3\2\2\2\u0224\u0222\3\2\2\2\u0224\u0225\3\2"+ "\u0222\3\2\2\2\u0222\u00ae\3\2\2\2\u0223\u0225\7\'\2\2\u0224\u0226\4\62"+
"\2\2\u0225\u0227\3\2\2\2\u0226\u021f\3\2\2\2\u0226\u0220\3\2\2\2\u0227"+ "\63\2\u0225\u0224\3\2\2\2\u0226\u0227\3\2\2\2\u0227\u0225\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"+ "\u0228\3\2\2\2\u0228\u00b0\3\2\2\2\u0229\u022f\5\u00b3Z\2\u022a\u022c"+
"\2\2\u022b\u022c\3\2\2\2\u022c\u022a\3\2\2\2\u022c\u022d\3\2\2\2\u022d"+ "\t\7\2\2\u022b\u022d\t\b\2\2\u022c\u022b\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"+ "\u022e\3\2\2\2\u022e\u0230\5\u00b3Z\2\u022f\u022a\3\2\2\2\u022f\u0230"+
"\2\2\2\u0231\u0232\3\2\2\2\u0232\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233"+ "\3\2\2\2\u0230\u00b2\3\2\2\2\u0231\u0233\4\62;\2\u0232\u0231\3\2\2\2\u0233"+
"\u00b4\3\2\2\2\u0234\u023a\5\u00b7\\\2\u0235\u0237\t\7\2\2\u0236\u0238"+ "\u0234\3\2\2\2\u0234\u0232\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u023c\3\2"+
"\t\b\2\2\u0237\u0236\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u0239\3\2\2\2\u0239"+ "\2\2\u0236\u0238\7\60\2\2\u0237\u0239\4\62;\2\u0238\u0237\3\2\2\2\u0239"+
"\u023b\5\u00b7\\\2\u023a\u0235\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u00b6"+ "\u023a\3\2\2\2\u023a\u0238\3\2\2\2\u023a\u023b\3\2\2\2\u023b\u023d\3\2"+
"\3\2\2\2\u023c\u023e\4\62;\2\u023d\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f"+ "\2\2\u023c\u0236\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u00b4\3\2\2\2\u023e"+
"\u023d\3\2\2\2\u023f\u0240\3\2\2\2\u0240\u0247\3\2\2\2\u0241\u0243\7\60"+ "\u023f\7^\2\2\u023f\u0243\13\2\2\2\u0240\u0241\7^\2\2\u0241\u0243\5\u00a7"+
"\2\2\u0242\u0244\4\62;\2\u0243\u0242\3\2\2\2\u0244\u0245\3\2\2\2\u0245"+ "T\2\u0242\u023e\3\2\2\2\u0242\u0240\3\2\2\2\u0243\u00b6\3\2\2\2\u0244"+
"\u0243\3\2\2\2\u0245\u0246\3\2\2\2\u0246\u0248\3\2\2\2\u0247\u0241\3\2"+ "\u0249\7$\2\2\u0245\u0248\5\u00b5[\2\u0246\u0248\n\t\2\2\u0247\u0245\3"+
"\2\2\u0247\u0248\3\2\2\2\u0248\u00b8\3\2\2\2\u0249\u024a\7^\2\2\u024a"+ "\2\2\2\u0247\u0246\3\2\2\2\u0248\u024b\3\2\2\2\u0249\u0247\3\2\2\2\u0249"+
"\u024e\13\2\2\2\u024b\u024c\7^\2\2\u024c\u024e\5\u00abV\2\u024d\u0249"+ "\u024a\3\2\2\2\u024a\u024c\3\2\2\2\u024b\u0249\3\2\2\2\u024c\u024d\7$"+
"\3\2\2\2\u024d\u024b\3\2\2\2\u024e\u00ba\3\2\2\2\u024f\u0254\7$\2\2\u0250"+ "\2\2\u024d\u024e\b\\\4\2\u024e\u00b8\3\2\2\2\u024f\u0250\7}\2\2\u0250"+
"\u0253\5\u00b9]\2\u0251\u0253\n\t\2\2\u0252\u0250\3\2\2\2\u0252\u0251"+ "\u0251\7}\2\2\u0251\u0253\3\2\2\2\u0252\u0254\13\2\2\2\u0253\u0252\3\2"+
"\3\2\2\2\u0253\u0256\3\2\2\2\u0254\u0252\3\2\2\2\u0254\u0255\3\2\2\2\u0255"+ "\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\u0256\u0254\3\2\2\2\u0257\u0258\7$\2\2\u0258\u0259\b^\4"+ "\u0257\3\2\2\2\u0257\u0258\7\177\2\2\u0258\u0259\7\177\2\2\u0259\u025a"+
"\2\u0259\u00bc\3\2\2\2\u025a\u025b\7}\2\2\u025b\u025c\7}\2\2\u025c\u025e"+ "\3\2\2\2\u025a\u025b\b]\5\2\u025b\u00ba\3\2\2\2\25\2\u01f4\u01ff\u020b"+
"\3\2\2\2\u025d\u025f\13\2\2\2\u025e\u025d\3\2\2\2\u025f\u0260\3\2\2\2"+ "\u0211\u0219\u021b\u021f\u0221\u0227\u022c\u022f\u0234\u023a\u023c\u0242"+
"\u0260\u0261\3\2\2\2\u0260\u025e\3\2\2\2\u0261\u0262\3\2\2\2\u0262\u0263"+ "\u0247\u0249\u0255\6\2\3\2\b\2\2\3\\\2\3]\3";
"\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";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {

View File

@ -77,19 +77,17 @@ T__75=76
T__76=77 T__76=77
T__77=78 T__77=78
T__78=79 T__78=79
T__79=80 LINECOMMENT=80
T__80=81 COMMENT=81
LINECOMMENT=82 WS=82
COMMENT=83 EOL=83
WS=84 NAME=84
EOL=85 DEC_INTEGER=85
NAME=86 HEX_INTEGER=86
DEC_INTEGER=87 BIN_INTEGER=87
HEX_INTEGER=88 FLOAT_NUMBER=88
BIN_INTEGER=89 STRING=89
FLOAT_NUMBER=90 INLINEASMBLOCK=90
STRING=91
INLINEASMBLOCK=92
'~'=1 '~'=1
'{'=2 '{'=2
'}'=3 '}'=3
@ -119,55 +117,53 @@ INLINEASMBLOCK=92
'+='=27 '+='=27
'-='=28 '-='=28
'/='=29 '/='=29
'//='=30 '*='=30
'*='=31 '**='=31
'**='=32 '<<='=32
'<<='=33 '>>='=33
'>>='=34 '<<@='=34
'<<@='=35 '>>@='=35
'>>@='=36 '&='=36
'&='=37 '|='=37
'|='=38 '^='=38
'^='=39 '++'=39
'++'=40 '--'=40
'--'=41 '('=41
'('=42 ')'=42
')'=43 '+'=43
'+'=44 '-'=44
'-'=45 '**'=45
'not'=46 '*'=46
'**'=47 '/'=47
'*'=48 '%'=48
'/'=49 '<<'=49
'//'=50 '>>'=50
'%'=51 '<<@'=51
'<<'=52 '>>@'=52
'>>'=53 '<'=53
'<<@'=54 '>'=54
'>>@'=55 '<='=55
'<'=56 '>='=56
'>'=57 '=='=57
'<='=58 '!='=58
'>='=59 '&'=59
'=='=60 '^'=60
'!='=61 '|'=61
'&'=62 'and'=62
'^'=63 'or'=63
'|'=64 'xor'=64
'and'=65 'not'=65
'or'=66 'to'=66
'xor'=67 '.'=67
'to'=68 'A'=68
'.'=69 'X'=69
'A'=70 'Y'=70
'X'=71 'AX'=71
'Y'=72 'AY'=72
'AX'=73 'XY'=73
'AY'=74 'SC'=74
'XY'=75 'SI'=75
'SC'=76 'SZ'=76
'SI'=77 'true'=77
'SZ'=78 'false'=78
'true'=79 '%asm'=79
'false'=80
'%asm'=81

View File

@ -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__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__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__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__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, LINECOMMENT=80,
T__80=81, LINECOMMENT=82, COMMENT=83, WS=84, EOL=85, NAME=86, DEC_INTEGER=87, COMMENT=81, WS=82, EOL=83, NAME=84, DEC_INTEGER=85, HEX_INTEGER=86, BIN_INTEGER=87,
HEX_INTEGER=88, BIN_INTEGER=89, FLOAT_NUMBER=90, STRING=91, INLINEASMBLOCK=92; FLOAT_NUMBER=88, STRING=89, INLINEASMBLOCK=90;
public static final int public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3, 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, 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'", "'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'",
"'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'", "'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='", "'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='",
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'",
"'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'", "'*'", "'/'", "'%'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'",
"'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'not'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'SC'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'" "'SI'", "'SZ'", "'true'", "'false'", "'%asm'"
}; };
private static final String[] _SYMBOLIC_NAMES = { private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null, 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, 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", null, null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT",
"COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"FLOAT_NUMBER", "STRING", "INLINEASMBLOCK" "STRING", "INLINEASMBLOCK"
}; };
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -290,7 +290,7 @@ public class il65Parser extends Parser {
setState(78); setState(78);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _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); setState(77);
integerliteral(); integerliteral();
@ -304,7 +304,7 @@ public class il65Parser extends Parser {
setState(86); setState(86);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _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); setState(84);
_errHandler.sync(this); _errHandler.sync(this);
@ -327,6 +327,8 @@ public class il65Parser extends Parser {
case T__21: case T__21:
case T__22: case T__22:
case T__23: case T__23:
case T__67:
case T__68:
case T__69: case T__69:
case T__70: case T__70:
case T__71: case T__71:
@ -334,9 +336,7 @@ public class il65Parser extends Parser {
case T__73: case T__73:
case T__74: case T__74:
case T__75: case T__75:
case T__76: case T__78:
case T__77:
case T__80:
case NAME: case NAME:
{ {
setState(82); setState(82);
@ -1105,7 +1105,7 @@ public class il65Parser extends Parser {
setState(170); setState(170);
((AugassignmentContext)_localctx).operator = _input.LT(1); ((AugassignmentContext)_localctx).operator = _input.LT(1);
_la = _input.LA(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); ((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1208,7 +1208,7 @@ public class il65Parser extends Parser {
setState(179); setState(179);
((PostincrdecrContext)_localctx).operator = _input.LT(1); ((PostincrdecrContext)_localctx).operator = _input.LT(1);
_la = _input.LA(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); ((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1288,11 +1288,11 @@ public class il65Parser extends Parser {
case 1: case 1:
{ {
setState(182); setState(182);
match(T__41); match(T__40);
setState(183); setState(183);
expression(0); expression(0);
setState(184); setState(184);
match(T__42); match(T__41);
} }
break; break;
case 2: case 2:
@ -1306,7 +1306,7 @@ public class il65Parser extends Parser {
setState(187); setState(187);
((ExpressionContext)_localctx).prefix = _input.LT(1); ((ExpressionContext)_localctx).prefix = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1321,18 +1321,9 @@ public class il65Parser extends Parser {
case 4: case 4:
{ {
setState(189); setState(189);
((ExpressionContext)_localctx).prefix = _input.LT(1); ((ExpressionContext)_localctx).prefix = match(T__64);
_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();
}
setState(190); setState(190);
expression(18); expression(6);
} }
break; break;
case 5: case 5:
@ -1379,11 +1370,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(197); 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); setState(198);
((ExpressionContext)_localctx).bop = match(T__46); ((ExpressionContext)_localctx).bop = match(T__44);
setState(199); setState(199);
((ExpressionContext)_localctx).right = expression(18); ((ExpressionContext)_localctx).right = expression(19);
} }
break; break;
case 2: case 2:
@ -1393,11 +1384,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(200); 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); setState(201);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1406,7 +1397,7 @@ public class il65Parser extends Parser {
consume(); consume();
} }
setState(202); setState(202);
((ExpressionContext)_localctx).right = expression(17); ((ExpressionContext)_localctx).right = expression(18);
} }
break; break;
case 3: case 3:
@ -1416,11 +1407,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(203); 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); setState(204);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1429,7 +1420,7 @@ public class il65Parser extends Parser {
consume(); consume();
} }
setState(205); setState(205);
((ExpressionContext)_localctx).right = expression(16); ((ExpressionContext)_localctx).right = expression(17);
} }
break; break;
case 4: case 4:
@ -1439,11 +1430,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(206); 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); setState(207);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1452,7 +1443,7 @@ public class il65Parser extends Parser {
consume(); consume();
} }
setState(208); setState(208);
((ExpressionContext)_localctx).right = expression(15); ((ExpressionContext)_localctx).right = expression(16);
} }
break; break;
case 5: case 5:
@ -1462,11 +1453,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(209); 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); setState(210);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1475,7 +1466,7 @@ public class il65Parser extends Parser {
consume(); consume();
} }
setState(211); setState(211);
((ExpressionContext)_localctx).right = expression(14); ((ExpressionContext)_localctx).right = expression(15);
} }
break; break;
case 6: case 6:
@ -1485,11 +1476,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(212); 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); setState(213);
((ExpressionContext)_localctx).bop = _input.LT(1); ((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(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); ((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
} }
else { else {
@ -1498,7 +1489,7 @@ public class il65Parser extends Parser {
consume(); consume();
} }
setState(214); setState(214);
((ExpressionContext)_localctx).right = expression(13); ((ExpressionContext)_localctx).right = expression(14);
} }
break; break;
case 7: case 7:
@ -1508,11 +1499,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(215); 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); setState(216);
((ExpressionContext)_localctx).bop = match(T__61); ((ExpressionContext)_localctx).bop = match(T__58);
setState(217); setState(217);
((ExpressionContext)_localctx).right = expression(12); ((ExpressionContext)_localctx).right = expression(13);
} }
break; break;
case 8: case 8:
@ -1522,11 +1513,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(218); 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); setState(219);
((ExpressionContext)_localctx).bop = match(T__62); ((ExpressionContext)_localctx).bop = match(T__59);
setState(220); setState(220);
((ExpressionContext)_localctx).right = expression(11); ((ExpressionContext)_localctx).right = expression(12);
} }
break; break;
case 9: case 9:
@ -1536,11 +1527,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(221); 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); setState(222);
((ExpressionContext)_localctx).bop = match(T__63); ((ExpressionContext)_localctx).bop = match(T__60);
setState(223); setState(223);
((ExpressionContext)_localctx).right = expression(10); ((ExpressionContext)_localctx).right = expression(11);
} }
break; break;
case 10: case 10:
@ -1550,11 +1541,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(224); 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); setState(225);
((ExpressionContext)_localctx).bop = match(T__64); ((ExpressionContext)_localctx).bop = match(T__61);
setState(226); setState(226);
((ExpressionContext)_localctx).right = expression(9); ((ExpressionContext)_localctx).right = expression(10);
} }
break; break;
case 11: case 11:
@ -1564,11 +1555,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(227); 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); setState(228);
((ExpressionContext)_localctx).bop = match(T__65); ((ExpressionContext)_localctx).bop = match(T__62);
setState(229); setState(229);
((ExpressionContext)_localctx).right = expression(8); ((ExpressionContext)_localctx).right = expression(9);
} }
break; break;
case 12: case 12:
@ -1578,11 +1569,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx; _localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression); pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(230); 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); setState(231);
((ExpressionContext)_localctx).bop = match(T__66); ((ExpressionContext)_localctx).bop = match(T__63);
setState(232); setState(232);
((ExpressionContext)_localctx).right = expression(7); ((ExpressionContext)_localctx).right = expression(8);
} }
break; break;
case 13: case 13:
@ -1594,7 +1585,7 @@ public class il65Parser extends Parser {
setState(233); setState(233);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)"); if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
setState(234); setState(234);
match(T__67); match(T__65);
setState(235); setState(235);
((ExpressionContext)_localctx).rangeto = expression(6); ((ExpressionContext)_localctx).rangeto = expression(6);
} }
@ -1652,11 +1643,11 @@ public class il65Parser extends Parser {
setState(243); setState(243);
call_location(); call_location();
setState(244); setState(244);
match(T__41); match(T__40);
setState(246); setState(246);
_errHandler.sync(this); _errHandler.sync(this);
_la = _input.LA(1); _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); setState(245);
expression(0); expression(0);
@ -1664,7 +1655,7 @@ public class il65Parser extends Parser {
} }
setState(248); setState(248);
match(T__42); match(T__41);
} }
} }
catch (RecognitionException re) { catch (RecognitionException re) {
@ -1736,7 +1727,7 @@ public class il65Parser extends Parser {
{ {
{ {
setState(253); setState(253);
match(T__68); match(T__66);
setState(254); setState(254);
match(NAME); match(NAME);
} }
@ -1778,7 +1769,7 @@ public class il65Parser extends Parser {
{ {
setState(259); setState(259);
_la = _input.LA(1); _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); _errHandler.recoverInline(this);
} }
else { else {
@ -1818,7 +1809,7 @@ public class il65Parser extends Parser {
{ {
setState(261); setState(261);
_la = _input.LA(1); _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); _errHandler.recoverInline(this);
} }
else { else {
@ -1855,7 +1846,7 @@ public class il65Parser extends Parser {
{ {
setState(263); setState(263);
_la = _input.LA(1); _la = _input.LA(1);
if ( !(_la==T__78 || _la==T__79) ) { if ( !(_la==T__76 || _la==T__77) ) {
_errHandler.recoverInline(this); _errHandler.recoverInline(this);
} }
else { else {
@ -2027,8 +2018,8 @@ public class il65Parser extends Parser {
integerliteral(); integerliteral();
} }
break; break;
case T__78: case T__76:
case T__79: case T__77:
enterOuterAlt(_localctx, 2); enterOuterAlt(_localctx, 2);
{ {
setState(281); setState(281);
@ -2086,7 +2077,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1); enterOuterAlt(_localctx, 1);
{ {
setState(287); setState(287);
match(T__80); match(T__78);
setState(288); setState(288);
match(INLINEASMBLOCK); match(INLINEASMBLOCK);
} }
@ -2112,29 +2103,29 @@ public class il65Parser extends Parser {
private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
switch (predIndex) { switch (predIndex) {
case 0: case 0:
return precpred(_ctx, 17); return precpred(_ctx, 18);
case 1: case 1:
return precpred(_ctx, 16); return precpred(_ctx, 17);
case 2: case 2:
return precpred(_ctx, 15); return precpred(_ctx, 16);
case 3: case 3:
return precpred(_ctx, 14); return precpred(_ctx, 15);
case 4: case 4:
return precpred(_ctx, 13); return precpred(_ctx, 14);
case 5: case 5:
return precpred(_ctx, 12); return precpred(_ctx, 13);
case 6: case 6:
return precpred(_ctx, 11); return precpred(_ctx, 12);
case 7: case 7:
return precpred(_ctx, 10); return precpred(_ctx, 11);
case 8: case 8:
return precpred(_ctx, 9); return precpred(_ctx, 10);
case 9: case 9:
return precpred(_ctx, 8); return precpred(_ctx, 9);
case 10: case 10:
return precpred(_ctx, 7); return precpred(_ctx, 8);
case 11: case 11:
return precpred(_ctx, 6); return precpred(_ctx, 7);
case 12: case 12:
return precpred(_ctx, 5); return precpred(_ctx, 5);
case 13: case 13:
@ -2144,7 +2135,7 @@ public class il65Parser extends Parser {
} }
public static final String _serializedATN = 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"+ "\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"+ "\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\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"+ "\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"+ "\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"+ "\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"+ "\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"+
"\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"+ "\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"+ "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"+ "\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"+ "\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"+ "&\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\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"+ "\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\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"+ "\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"+ "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\\]\7W\2\2"+ "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"+ "]\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"+ "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"+ "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"+ "\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"+ "\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\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"+ "\'\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"+ "\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"+ "\t\6\2\2\u00be\u00c6\5(\25\25\u00bf\u00c0\7C\2\2\u00c0\u00c6\5(\25\b\u00c1"+
"\u00c1\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6"+ "\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6\5"+
"\5.\30\2\u00c5\u00b7\3\2\2\2\u00c5\u00bc\3\2\2\2\u00c5\u00bd\3\2\2\2\u00c5"+ ".\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"+ "\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"+ "\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00f2\3\2\2\2\u00c7\u00c8\f\24\2\2\u00c8"+
"\u00c9\7\61\2\2\u00c9\u00f1\5(\25\24\u00ca\u00cb\f\22\2\2\u00cb\u00cc"+ "\u00c9\7/\2\2\u00c9\u00f1\5(\25\25\u00ca\u00cb\f\23\2\2\u00cb\u00cc\t"+
"\t\b\2\2\u00cc\u00f1\5(\25\23\u00cd\u00ce\f\21\2\2\u00ce\u00cf\t\6\2\2"+ "\7\2\2\u00cc\u00f1\5(\25\24\u00cd\u00ce\f\22\2\2\u00ce\u00cf\t\b\2\2\u00cf"+
"\u00cf\u00f1\5(\25\22\u00d0\u00d1\f\20\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1"+ "\u00f1\5(\25\23\u00d0\u00d1\f\21\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1\5"+
"\5(\25\21\u00d3\u00d4\f\17\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\20"+ "(\25\22\u00d3\u00d4\f\20\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\21"+
"\u00d6\u00d7\f\16\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\17\u00d9"+ "\u00d6\u00d7\f\17\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\20\u00d9"+
"\u00da\f\r\2\2\u00da\u00db\7@\2\2\u00db\u00f1\5(\25\16\u00dc\u00dd\f\f"+ "\u00da\f\16\2\2\u00da\u00db\7=\2\2\u00db\u00f1\5(\25\17\u00dc\u00dd\f"+
"\2\2\u00dd\u00de\7A\2\2\u00de\u00f1\5(\25\r\u00df\u00e0\f\13\2\2\u00e0"+ "\r\2\2\u00dd\u00de\7>\2\2\u00de\u00f1\5(\25\16\u00df\u00e0\f\f\2\2\u00e0"+
"\u00e1\7B\2\2\u00e1\u00f1\5(\25\f\u00e2\u00e3\f\n\2\2\u00e3\u00e4\7C\2"+ "\u00e1\7?\2\2\u00e1\u00f1\5(\25\r\u00e2\u00e3\f\13\2\2\u00e3\u00e4\7@"+
"\2\u00e4\u00f1\5(\25\13\u00e5\u00e6\f\t\2\2\u00e6\u00e7\7D\2\2\u00e7\u00f1"+ "\2\2\u00e4\u00f1\5(\25\f\u00e5\u00e6\f\n\2\2\u00e6\u00e7\7A\2\2\u00e7"+
"\5(\25\n\u00e8\u00e9\f\b\2\2\u00e9\u00ea\7E\2\2\u00ea\u00f1\5(\25\t\u00eb"+ "\u00f1\5(\25\13\u00e8\u00e9\f\t\2\2\u00e9\u00ea\7B\2\2\u00ea\u00f1\5("+
"\u00ec\f\7\2\2\u00ec\u00ed\7F\2\2\u00ed\u00f1\5(\25\b\u00ee\u00ef\f\27"+ "\25\n\u00eb\u00ec\f\7\2\2\u00ec\u00ed\7D\2\2\u00ed\u00f1\5(\25\b\u00ee"+
"\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca\3\2\2\2\u00f0"+ "\u00ef\f\27\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca"+
"\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0\u00d6\3\2"+ "\3\2\2\2\u00f0\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0"+
"\2\2\u00f0\u00d9\3\2\2\2\u00f0\u00dc\3\2\2\2\u00f0\u00df\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"+
"\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0\u00eb\3\2"+ "\2\2\u00f0\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0"+
"\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f2"+ "\u00eb\3\2\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2"+
"\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6\5\f\7\2"+ "\2\2\u00f2\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6"+
"\u00f6\u00f8\7,\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8\u00f9"+ "\5\f\7\2\u00f6\u00f8\7+\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8"+
"\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7-\2\2\u00fb+\3\2\2\2\u00fc\u00fd"+ "\u00f9\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7,\2\2\u00fb+\3\2\2\2\u00fc"+
"\7X\2\2\u00fd-\3\2\2\2\u00fe\u0101\7X\2\2\u00ff\u0100\7G\2\2\u0100\u0102"+ "\u00fd\7V\2\2\u00fd-\3\2\2\2\u00fe\u0101\7V\2\2\u00ff\u0100\7E\2\2\u0100"+
"\7X\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2\2\2\u0103"+ "\u0102\7V\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2"+
"\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3\2\2\2\u0107"+ "\2\2\u0103\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3"+
"\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a\65\3\2\2\2"+ "\2\2\2\u0107\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a"+
"\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20\2\2\u010e\u0110"+ "\65\3\2\2\2\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20"+
"\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\3\2\2\2\u0111\u010f\3\2\2\2\u0111"+ "\2\2\u010e\u0110\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\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"+ "\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0114\3\2\2\2\u0113\u0111\3\2"+
"\2\2\u0115\67\3\2\2\2\u0116\u0117\7]\2\2\u01179\3\2\2\2\u0118\u0119\7"+ "\2\2\u0114\u0115\7\34\2\2\u0115\67\3\2\2\2\u0116\u0117\7[\2\2\u01179\3"+
"\\\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120\5\64\33\2\u011c"+ "\2\2\2\u0118\u0119\7Z\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120"+
"\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36\2\u011f\u011a\3"+ "\5\64\33\2\u011c\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36"+
"\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d\3\2\2\2\u011f"+ "\2\u011f\u011a\3\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d"+
"\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\u011f\u011e\3\2\2\2\u0120=\3\2\2\2\u0121\u0122\7Q\2\2\u0122\u0123"+
"?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3\u00b2\u00c5\u00f0"+ "\7\\\2\2\u0123?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3"+
"\u00f2\u00f8\u0103\u0111\u011f"; "\u00b2\u00c5\u00f0\u00f2\u00f8\u0103\u0111\u011f";
public static final ATN _ATN = public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray()); new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static { static {