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.
``//`` means *integer division* even when the operands are floating point values: ``9.5 // 2.5`` is 3 (and not 3.8)
``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243.
``%`` is the modulo operator: ``25 % 7`` is 4.
``%`` is the remainder operator: ``25 % 7`` is 4.
bitwise arithmetic: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~``

View File

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

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

View File

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

View File

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

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

View File

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

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__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, LINECOMMENT=82, COMMENT=83, WS=84, EOL=85, NAME=86, DEC_INTEGER=87,
HEX_INTEGER=88, BIN_INTEGER=89, FLOAT_NUMBER=90, STRING=91, INLINEASMBLOCK=92;
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, LINECOMMENT=80,
COMMENT=81, WS=82, EOL=83, NAME=84, DEC_INTEGER=85, HEX_INTEGER=86, BIN_INTEGER=87,
FLOAT_NUMBER=88, STRING=89, INLINEASMBLOCK=90;
public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3,
RULE_label = 4, RULE_call_location = 5, RULE_unconditionaljump = 6, RULE_directive = 7,
@ -54,12 +54,12 @@ public class il65Parser extends Parser {
"'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'",
"'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='",
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'",
"'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'",
"'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'",
"'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'"
"'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='",
"'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'",
"'*'", "'/'", "'%'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'and'", "'or'", "'xor'",
"'not'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'", "'SC'",
"'SI'", "'SZ'", "'true'", "'false'", "'%asm'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -68,9 +68,9 @@ public class il65Parser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, "LINECOMMENT",
"COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER",
"FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
null, null, null, null, null, null, null, null, "LINECOMMENT", "COMMENT",
"WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER",
"STRING", "INLINEASMBLOCK"
};
public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES);
@ -290,7 +290,7 @@ public class il65Parser extends Parser {
setState(78);
_errHandler.sync(this);
_la = _input.LA(1);
if (((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & ((1L << (DEC_INTEGER - 87)) | (1L << (HEX_INTEGER - 87)) | (1L << (BIN_INTEGER - 87)))) != 0)) {
if (((((_la - 85)) & ~0x3f) == 0 && ((1L << (_la - 85)) & ((1L << (DEC_INTEGER - 85)) | (1L << (HEX_INTEGER - 85)) | (1L << (BIN_INTEGER - 85)))) != 0)) {
{
setState(77);
integerliteral();
@ -304,7 +304,7 @@ public class il65Parser extends Parser {
setState(86);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)) | (1L << (T__80 - 70)) | (1L << (EOL - 70)) | (1L << (NAME - 70)))) != 0)) {
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__23))) != 0) || ((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (T__67 - 68)) | (1L << (T__68 - 68)) | (1L << (T__69 - 68)) | (1L << (T__70 - 68)) | (1L << (T__71 - 68)) | (1L << (T__72 - 68)) | (1L << (T__73 - 68)) | (1L << (T__74 - 68)) | (1L << (T__75 - 68)) | (1L << (T__78 - 68)) | (1L << (EOL - 68)) | (1L << (NAME - 68)))) != 0)) {
{
setState(84);
_errHandler.sync(this);
@ -327,6 +327,8 @@ public class il65Parser extends Parser {
case T__21:
case T__22:
case T__23:
case T__67:
case T__68:
case T__69:
case T__70:
case T__71:
@ -334,9 +336,7 @@ public class il65Parser extends Parser {
case T__73:
case T__74:
case T__75:
case T__76:
case T__77:
case T__80:
case T__78:
case NAME:
{
setState(82);
@ -1105,7 +1105,7 @@ public class il65Parser extends Parser {
setState(170);
((AugassignmentContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32) | (1L << T__33) | (1L << T__34) | (1L << T__35) | (1L << T__36) | (1L << T__37))) != 0)) ) {
((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
@ -1208,7 +1208,7 @@ public class il65Parser extends Parser {
setState(179);
((PostincrdecrContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__39 || _la==T__40) ) {
if ( !(_la==T__38 || _la==T__39) ) {
((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
@ -1288,11 +1288,11 @@ public class il65Parser extends Parser {
case 1:
{
setState(182);
match(T__41);
match(T__40);
setState(183);
expression(0);
setState(184);
match(T__42);
match(T__41);
}
break;
case 2:
@ -1306,7 +1306,7 @@ public class il65Parser extends Parser {
setState(187);
((ExpressionContext)_localctx).prefix = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__43 || _la==T__44) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__42) | (1L << T__43))) != 0)) ) {
((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this);
}
else {
@ -1321,18 +1321,9 @@ public class il65Parser extends Parser {
case 4:
{
setState(189);
((ExpressionContext)_localctx).prefix = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__0 || _la==T__45) ) {
((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this);
}
else {
if ( _input.LA(1)==Token.EOF ) matchedEOF = true;
_errHandler.reportMatch(this);
consume();
}
((ExpressionContext)_localctx).prefix = match(T__64);
setState(190);
expression(18);
expression(6);
}
break;
case 5:
@ -1379,11 +1370,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(197);
if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)");
if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)");
setState(198);
((ExpressionContext)_localctx).bop = match(T__46);
((ExpressionContext)_localctx).bop = match(T__44);
setState(199);
((ExpressionContext)_localctx).right = expression(18);
((ExpressionContext)_localctx).right = expression(19);
}
break;
case 2:
@ -1393,11 +1384,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(200);
if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)");
if (!(precpred(_ctx, 17))) throw new FailedPredicateException(this, "precpred(_ctx, 17)");
setState(201);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__47) | (1L << T__48) | (1L << T__49) | (1L << T__50))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__45) | (1L << T__46) | (1L << T__47))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1406,7 +1397,7 @@ public class il65Parser extends Parser {
consume();
}
setState(202);
((ExpressionContext)_localctx).right = expression(17);
((ExpressionContext)_localctx).right = expression(18);
}
break;
case 3:
@ -1416,11 +1407,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(203);
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
if (!(precpred(_ctx, 16))) throw new FailedPredicateException(this, "precpred(_ctx, 16)");
setState(204);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__43 || _la==T__44) ) {
if ( !(_la==T__42 || _la==T__43) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1429,7 +1420,7 @@ public class il65Parser extends Parser {
consume();
}
setState(205);
((ExpressionContext)_localctx).right = expression(16);
((ExpressionContext)_localctx).right = expression(17);
}
break;
case 4:
@ -1439,11 +1430,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(206);
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
if (!(precpred(_ctx, 15))) throw new FailedPredicateException(this, "precpred(_ctx, 15)");
setState(207);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__51) | (1L << T__52) | (1L << T__53) | (1L << T__54))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__48) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1452,7 +1443,7 @@ public class il65Parser extends Parser {
consume();
}
setState(208);
((ExpressionContext)_localctx).right = expression(15);
((ExpressionContext)_localctx).right = expression(16);
}
break;
case 5:
@ -1462,11 +1453,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(209);
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
if (!(precpred(_ctx, 14))) throw new FailedPredicateException(this, "precpred(_ctx, 14)");
setState(210);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__55) | (1L << T__56) | (1L << T__57) | (1L << T__58))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__52) | (1L << T__53) | (1L << T__54) | (1L << T__55))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1475,7 +1466,7 @@ public class il65Parser extends Parser {
consume();
}
setState(211);
((ExpressionContext)_localctx).right = expression(14);
((ExpressionContext)_localctx).right = expression(15);
}
break;
case 6:
@ -1485,11 +1476,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(212);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
if (!(precpred(_ctx, 13))) throw new FailedPredicateException(this, "precpred(_ctx, 13)");
setState(213);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__59 || _la==T__60) ) {
if ( !(_la==T__56 || _la==T__57) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1498,7 +1489,7 @@ public class il65Parser extends Parser {
consume();
}
setState(214);
((ExpressionContext)_localctx).right = expression(13);
((ExpressionContext)_localctx).right = expression(14);
}
break;
case 7:
@ -1508,11 +1499,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(215);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
setState(216);
((ExpressionContext)_localctx).bop = match(T__61);
((ExpressionContext)_localctx).bop = match(T__58);
setState(217);
((ExpressionContext)_localctx).right = expression(12);
((ExpressionContext)_localctx).right = expression(13);
}
break;
case 8:
@ -1522,11 +1513,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(218);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
setState(219);
((ExpressionContext)_localctx).bop = match(T__62);
((ExpressionContext)_localctx).bop = match(T__59);
setState(220);
((ExpressionContext)_localctx).right = expression(11);
((ExpressionContext)_localctx).right = expression(12);
}
break;
case 9:
@ -1536,11 +1527,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(221);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(222);
((ExpressionContext)_localctx).bop = match(T__63);
((ExpressionContext)_localctx).bop = match(T__60);
setState(223);
((ExpressionContext)_localctx).right = expression(10);
((ExpressionContext)_localctx).right = expression(11);
}
break;
case 10:
@ -1550,11 +1541,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(224);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(225);
((ExpressionContext)_localctx).bop = match(T__64);
((ExpressionContext)_localctx).bop = match(T__61);
setState(226);
((ExpressionContext)_localctx).right = expression(9);
((ExpressionContext)_localctx).right = expression(10);
}
break;
case 11:
@ -1564,11 +1555,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(227);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
setState(228);
((ExpressionContext)_localctx).bop = match(T__65);
((ExpressionContext)_localctx).bop = match(T__62);
setState(229);
((ExpressionContext)_localctx).right = expression(8);
((ExpressionContext)_localctx).right = expression(9);
}
break;
case 12:
@ -1578,11 +1569,11 @@ public class il65Parser extends Parser {
_localctx.left = _prevctx;
pushNewRecursionContext(_localctx, _startState, RULE_expression);
setState(230);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(231);
((ExpressionContext)_localctx).bop = match(T__66);
((ExpressionContext)_localctx).bop = match(T__63);
setState(232);
((ExpressionContext)_localctx).right = expression(7);
((ExpressionContext)_localctx).right = expression(8);
}
break;
case 13:
@ -1594,7 +1585,7 @@ public class il65Parser extends Parser {
setState(233);
if (!(precpred(_ctx, 5))) throw new FailedPredicateException(this, "precpred(_ctx, 5)");
setState(234);
match(T__67);
match(T__65);
setState(235);
((ExpressionContext)_localctx).rangeto = expression(6);
}
@ -1652,11 +1643,11 @@ public class il65Parser extends Parser {
setState(243);
call_location();
setState(244);
match(T__41);
match(T__40);
setState(246);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__41) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0) || ((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)) | (1L << (T__78 - 70)) | (1L << (T__79 - 70)) | (1L << (NAME - 70)) | (1L << (DEC_INTEGER - 70)) | (1L << (HEX_INTEGER - 70)) | (1L << (BIN_INTEGER - 70)) | (1L << (FLOAT_NUMBER - 70)) | (1L << (STRING - 70)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__24) | (1L << T__40) | (1L << T__42) | (1L << T__43))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__74 - 65)) | (1L << (T__75 - 65)) | (1L << (T__76 - 65)) | (1L << (T__77 - 65)) | (1L << (NAME - 65)) | (1L << (DEC_INTEGER - 65)) | (1L << (HEX_INTEGER - 65)) | (1L << (BIN_INTEGER - 65)) | (1L << (FLOAT_NUMBER - 65)) | (1L << (STRING - 65)))) != 0)) {
{
setState(245);
expression(0);
@ -1664,7 +1655,7 @@ public class il65Parser extends Parser {
}
setState(248);
match(T__42);
match(T__41);
}
}
catch (RecognitionException re) {
@ -1736,7 +1727,7 @@ public class il65Parser extends Parser {
{
{
setState(253);
match(T__68);
match(T__66);
setState(254);
match(NAME);
}
@ -1778,7 +1769,7 @@ public class il65Parser extends Parser {
{
setState(259);
_la = _input.LA(1);
if ( !(((((_la - 70)) & ~0x3f) == 0 && ((1L << (_la - 70)) & ((1L << (T__69 - 70)) | (1L << (T__70 - 70)) | (1L << (T__71 - 70)) | (1L << (T__72 - 70)) | (1L << (T__73 - 70)) | (1L << (T__74 - 70)) | (1L << (T__75 - 70)) | (1L << (T__76 - 70)) | (1L << (T__77 - 70)))) != 0)) ) {
if ( !(((((_la - 68)) & ~0x3f) == 0 && ((1L << (_la - 68)) & ((1L << (T__67 - 68)) | (1L << (T__68 - 68)) | (1L << (T__69 - 68)) | (1L << (T__70 - 68)) | (1L << (T__71 - 68)) | (1L << (T__72 - 68)) | (1L << (T__73 - 68)) | (1L << (T__74 - 68)) | (1L << (T__75 - 68)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1818,7 +1809,7 @@ public class il65Parser extends Parser {
{
setState(261);
_la = _input.LA(1);
if ( !(((((_la - 87)) & ~0x3f) == 0 && ((1L << (_la - 87)) & ((1L << (DEC_INTEGER - 87)) | (1L << (HEX_INTEGER - 87)) | (1L << (BIN_INTEGER - 87)))) != 0)) ) {
if ( !(((((_la - 85)) & ~0x3f) == 0 && ((1L << (_la - 85)) & ((1L << (DEC_INTEGER - 85)) | (1L << (HEX_INTEGER - 85)) | (1L << (BIN_INTEGER - 85)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1855,7 +1846,7 @@ public class il65Parser extends Parser {
{
setState(263);
_la = _input.LA(1);
if ( !(_la==T__78 || _la==T__79) ) {
if ( !(_la==T__76 || _la==T__77) ) {
_errHandler.recoverInline(this);
}
else {
@ -2027,8 +2018,8 @@ public class il65Parser extends Parser {
integerliteral();
}
break;
case T__78:
case T__79:
case T__76:
case T__77:
enterOuterAlt(_localctx, 2);
{
setState(281);
@ -2086,7 +2077,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(287);
match(T__80);
match(T__78);
setState(288);
match(INLINEASMBLOCK);
}
@ -2112,29 +2103,29 @@ public class il65Parser extends Parser {
private boolean expression_sempred(ExpressionContext _localctx, int predIndex) {
switch (predIndex) {
case 0:
return precpred(_ctx, 17);
return precpred(_ctx, 18);
case 1:
return precpred(_ctx, 16);
return precpred(_ctx, 17);
case 2:
return precpred(_ctx, 15);
return precpred(_ctx, 16);
case 3:
return precpred(_ctx, 14);
return precpred(_ctx, 15);
case 4:
return precpred(_ctx, 13);
return precpred(_ctx, 14);
case 5:
return precpred(_ctx, 12);
return precpred(_ctx, 13);
case 6:
return precpred(_ctx, 11);
return precpred(_ctx, 12);
case 7:
return precpred(_ctx, 10);
return precpred(_ctx, 11);
case 8:
return precpred(_ctx, 9);
return precpred(_ctx, 10);
case 9:
return precpred(_ctx, 8);
return precpred(_ctx, 9);
case 10:
return precpred(_ctx, 7);
return precpred(_ctx, 8);
case 11:
return precpred(_ctx, 6);
return precpred(_ctx, 7);
case 12:
return precpred(_ctx, 5);
case 13:
@ -2144,7 +2135,7 @@ public class il65Parser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3^\u0125\4\2\t\2\4"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\\\u0125\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -2167,19 +2158,19 @@ public class il65Parser extends Parser {
"\u0110\n\34\f\34\16\34\u0113\13\34\3\34\3\34\3\35\3\35\3\36\3\36\3\37"+
"\3\37\3\37\3\37\3\37\5\37\u0120\n\37\3 \3 \3 \3 \2\3(!\2\4\6\b\n\f\16"+
"\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>\2\17\3\2\b\17\3\2\24"+
"\32\3\2\35)\3\2*+\3\2./\4\2\3\3\60\60\3\2\62\65\3\2\669\3\2:=\3\2>?\3"+
"\2HP\3\2Y[\3\2QR\2\u013d\2D\3\2\2\2\4K\3\2\2\2\6M\3\2\2\2\bi\3\2\2\2\n"+
"\32\3\2\35(\3\2)*\4\2\3\3-.\3\2\60\62\3\2-.\3\2\63\66\3\2\67:\3\2;<\3"+
"\2FN\3\2WY\3\2OP\2\u013d\2D\3\2\2\2\4K\3\2\2\2\6M\3\2\2\2\bi\3\2\2\2\n"+
"k\3\2\2\2\fq\3\2\2\2\16s\3\2\2\2\20v\3\2\2\2\22\u0087\3\2\2\2\24\u0089"+
"\3\2\2\2\26\u008f\3\2\2\2\30\u0097\3\2\2\2\32\u009a\3\2\2\2\34\u009d\3"+
"\2\2\2\36\u009f\3\2\2\2 \u00a7\3\2\2\2\"\u00ab\3\2\2\2$\u00b2\3\2\2\2"+
"&\u00b4\3\2\2\2(\u00c5\3\2\2\2*\u00f5\3\2\2\2,\u00fc\3\2\2\2.\u00fe\3"+
"\2\2\2\60\u0105\3\2\2\2\62\u0107\3\2\2\2\64\u0109\3\2\2\2\66\u010b\3\2"+
"\2\28\u0116\3\2\2\2:\u0118\3\2\2\2<\u011f\3\2\2\2>\u0121\3\2\2\2@C\5\4"+
"\3\2AC\7W\2\2B@\3\2\2\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2EG\3\2"+
"\3\2AC\7U\2\2B@\3\2\2\2BA\3\2\2\2CF\3\2\2\2DB\3\2\2\2DE\3\2\2\2EG\3\2"+
"\2\2FD\3\2\2\2GH\7\2\2\3H\3\3\2\2\2IL\5\20\t\2JL\5\6\4\2KI\3\2\2\2KJ\3"+
"\2\2\2L\5\3\2\2\2MN\7\3\2\2NP\5,\27\2OQ\5\62\32\2PO\3\2\2\2PQ\3\2\2\2"+
"QR\3\2\2\2RS\7\4\2\2SX\7W\2\2TW\5\b\5\2UW\7W\2\2VT\3\2\2\2VU\3\2\2\2W"+
"Z\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZX\3\2\2\2[\\\7\5\2\2\\]\7W\2\2"+
"QR\3\2\2\2RS\7\4\2\2SX\7U\2\2TW\5\b\5\2UW\7U\2\2VT\3\2\2\2VU\3\2\2\2W"+
"Z\3\2\2\2XV\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZX\3\2\2\2[\\\7\5\2\2\\]\7U\2\2"+
"]\7\3\2\2\2^j\5\20\t\2_j\5\26\f\2`j\5\24\13\2aj\5\30\r\2bj\5\32\16\2c"+
"j\5 \21\2dj\5\"\22\2ej\5\16\b\2fj\5&\24\2gj\5> \2hj\5\n\6\2i^\3\2\2\2"+
"i_\3\2\2\2i`\3\2\2\2ia\3\2\2\2ib\3\2\2\2ic\3\2\2\2id\3\2\2\2ie\3\2\2\2"+
@ -2205,46 +2196,46 @@ public class il65Parser extends Parser {
"\u00ae\5(\25\2\u00ae#\3\2\2\2\u00af\u00b3\5\60\31\2\u00b0\u00b3\5,\27"+
"\2\u00b1\u00b3\5.\30\2\u00b2\u00af\3\2\2\2\u00b2\u00b0\3\2\2\2\u00b2\u00b1"+
"\3\2\2\2\u00b3%\3\2\2\2\u00b4\u00b5\5$\23\2\u00b5\u00b6\t\5\2\2\u00b6"+
"\'\3\2\2\2\u00b7\u00b8\b\25\1\2\u00b8\u00b9\7,\2\2\u00b9\u00ba\5(\25\2"+
"\u00ba\u00bb\7-\2\2\u00bb\u00c6\3\2\2\2\u00bc\u00c6\5*\26\2\u00bd\u00be"+
"\t\6\2\2\u00be\u00c6\5(\25\25\u00bf\u00c0\t\7\2\2\u00c0\u00c6\5(\25\24"+
"\u00c1\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6"+
"\5.\30\2\u00c5\u00b7\3\2\2\2\u00c5\u00bc\3\2\2\2\u00c5\u00bd\3\2\2\2\u00c5"+
"\'\3\2\2\2\u00b7\u00b8\b\25\1\2\u00b8\u00b9\7+\2\2\u00b9\u00ba\5(\25\2"+
"\u00ba\u00bb\7,\2\2\u00bb\u00c6\3\2\2\2\u00bc\u00c6\5*\26\2\u00bd\u00be"+
"\t\6\2\2\u00be\u00c6\5(\25\25\u00bf\u00c0\7C\2\2\u00c0\u00c6\5(\25\b\u00c1"+
"\u00c6\5<\37\2\u00c2\u00c6\5\60\31\2\u00c3\u00c6\5,\27\2\u00c4\u00c6\5"+
".\30\2\u00c5\u00b7\3\2\2\2\u00c5\u00bc\3\2\2\2\u00c5\u00bd\3\2\2\2\u00c5"+
"\u00bf\3\2\2\2\u00c5\u00c1\3\2\2\2\u00c5\u00c2\3\2\2\2\u00c5\u00c3\3\2"+
"\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00f2\3\2\2\2\u00c7\u00c8\f\23\2\2\u00c8"+
"\u00c9\7\61\2\2\u00c9\u00f1\5(\25\24\u00ca\u00cb\f\22\2\2\u00cb\u00cc"+
"\t\b\2\2\u00cc\u00f1\5(\25\23\u00cd\u00ce\f\21\2\2\u00ce\u00cf\t\6\2\2"+
"\u00cf\u00f1\5(\25\22\u00d0\u00d1\f\20\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1"+
"\5(\25\21\u00d3\u00d4\f\17\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\20"+
"\u00d6\u00d7\f\16\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\17\u00d9"+
"\u00da\f\r\2\2\u00da\u00db\7@\2\2\u00db\u00f1\5(\25\16\u00dc\u00dd\f\f"+
"\2\2\u00dd\u00de\7A\2\2\u00de\u00f1\5(\25\r\u00df\u00e0\f\13\2\2\u00e0"+
"\u00e1\7B\2\2\u00e1\u00f1\5(\25\f\u00e2\u00e3\f\n\2\2\u00e3\u00e4\7C\2"+
"\2\u00e4\u00f1\5(\25\13\u00e5\u00e6\f\t\2\2\u00e6\u00e7\7D\2\2\u00e7\u00f1"+
"\5(\25\n\u00e8\u00e9\f\b\2\2\u00e9\u00ea\7E\2\2\u00ea\u00f1\5(\25\t\u00eb"+
"\u00ec\f\7\2\2\u00ec\u00ed\7F\2\2\u00ed\u00f1\5(\25\b\u00ee\u00ef\f\27"+
"\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca\3\2\2\2\u00f0"+
"\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0\u00d6\3\2"+
"\2\2\u00f0\u00d9\3\2\2\2\u00f0\u00dc\3\2\2\2\u00f0\u00df\3\2\2\2\u00f0"+
"\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0\u00eb\3\2"+
"\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f2"+
"\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6\5\f\7\2"+
"\u00f6\u00f8\7,\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8\u00f9"+
"\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7-\2\2\u00fb+\3\2\2\2\u00fc\u00fd"+
"\7X\2\2\u00fd-\3\2\2\2\u00fe\u0101\7X\2\2\u00ff\u0100\7G\2\2\u0100\u0102"+
"\7X\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2\2\2\u0103"+
"\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3\2\2\2\u0107"+
"\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a\65\3\2\2\2"+
"\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20\2\2\u010e\u0110"+
"\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\3\2\2\2\u0111\u010f\3\2\2\2\u0111"+
"\u0112\3\2\2\2\u0112\u0114\3\2\2\2\u0113\u0111\3\2\2\2\u0114\u0115\7\34"+
"\2\2\u0115\67\3\2\2\2\u0116\u0117\7]\2\2\u01179\3\2\2\2\u0118\u0119\7"+
"\\\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120\5\64\33\2\u011c"+
"\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36\2\u011f\u011a\3"+
"\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d\3\2\2\2\u011f"+
"\u011e\3\2\2\2\u0120=\3\2\2\2\u0121\u0122\7S\2\2\u0122\u0123\7^\2\2\u0123"+
"?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3\u00b2\u00c5\u00f0"+
"\u00f2\u00f8\u0103\u0111\u011f";
"\2\2\u00c5\u00c4\3\2\2\2\u00c6\u00f2\3\2\2\2\u00c7\u00c8\f\24\2\2\u00c8"+
"\u00c9\7/\2\2\u00c9\u00f1\5(\25\25\u00ca\u00cb\f\23\2\2\u00cb\u00cc\t"+
"\7\2\2\u00cc\u00f1\5(\25\24\u00cd\u00ce\f\22\2\2\u00ce\u00cf\t\b\2\2\u00cf"+
"\u00f1\5(\25\23\u00d0\u00d1\f\21\2\2\u00d1\u00d2\t\t\2\2\u00d2\u00f1\5"+
"(\25\22\u00d3\u00d4\f\20\2\2\u00d4\u00d5\t\n\2\2\u00d5\u00f1\5(\25\21"+
"\u00d6\u00d7\f\17\2\2\u00d7\u00d8\t\13\2\2\u00d8\u00f1\5(\25\20\u00d9"+
"\u00da\f\16\2\2\u00da\u00db\7=\2\2\u00db\u00f1\5(\25\17\u00dc\u00dd\f"+
"\r\2\2\u00dd\u00de\7>\2\2\u00de\u00f1\5(\25\16\u00df\u00e0\f\f\2\2\u00e0"+
"\u00e1\7?\2\2\u00e1\u00f1\5(\25\r\u00e2\u00e3\f\13\2\2\u00e3\u00e4\7@"+
"\2\2\u00e4\u00f1\5(\25\f\u00e5\u00e6\f\n\2\2\u00e6\u00e7\7A\2\2\u00e7"+
"\u00f1\5(\25\13\u00e8\u00e9\f\t\2\2\u00e9\u00ea\7B\2\2\u00ea\u00f1\5("+
"\25\n\u00eb\u00ec\f\7\2\2\u00ec\u00ed\7D\2\2\u00ed\u00f1\5(\25\b\u00ee"+
"\u00ef\f\27\2\2\u00ef\u00f1\5\36\20\2\u00f0\u00c7\3\2\2\2\u00f0\u00ca"+
"\3\2\2\2\u00f0\u00cd\3\2\2\2\u00f0\u00d0\3\2\2\2\u00f0\u00d3\3\2\2\2\u00f0"+
"\u00d6\3\2\2\2\u00f0\u00d9\3\2\2\2\u00f0\u00dc\3\2\2\2\u00f0\u00df\3\2"+
"\2\2\u00f0\u00e2\3\2\2\2\u00f0\u00e5\3\2\2\2\u00f0\u00e8\3\2\2\2\u00f0"+
"\u00eb\3\2\2\2\u00f0\u00ee\3\2\2\2\u00f1\u00f4\3\2\2\2\u00f2\u00f0\3\2"+
"\2\2\u00f2\u00f3\3\2\2\2\u00f3)\3\2\2\2\u00f4\u00f2\3\2\2\2\u00f5\u00f6"+
"\5\f\7\2\u00f6\u00f8\7+\2\2\u00f7\u00f9\5(\25\2\u00f8\u00f7\3\2\2\2\u00f8"+
"\u00f9\3\2\2\2\u00f9\u00fa\3\2\2\2\u00fa\u00fb\7,\2\2\u00fb+\3\2\2\2\u00fc"+
"\u00fd\7V\2\2\u00fd-\3\2\2\2\u00fe\u0101\7V\2\2\u00ff\u0100\7E\2\2\u0100"+
"\u0102\7V\2\2\u0101\u00ff\3\2\2\2\u0102\u0103\3\2\2\2\u0103\u0101\3\2"+
"\2\2\u0103\u0104\3\2\2\2\u0104/\3\2\2\2\u0105\u0106\t\f\2\2\u0106\61\3"+
"\2\2\2\u0107\u0108\t\r\2\2\u0108\63\3\2\2\2\u0109\u010a\t\16\2\2\u010a"+
"\65\3\2\2\2\u010b\u010c\7\33\2\2\u010c\u0111\5(\25\2\u010d\u010e\7\20"+
"\2\2\u010e\u0110\5(\25\2\u010f\u010d\3\2\2\2\u0110\u0113\3\2\2\2\u0111"+
"\u010f\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0114\3\2\2\2\u0113\u0111\3\2"+
"\2\2\u0114\u0115\7\34\2\2\u0115\67\3\2\2\2\u0116\u0117\7[\2\2\u01179\3"+
"\2\2\2\u0118\u0119\7Z\2\2\u0119;\3\2\2\2\u011a\u0120\5\62\32\2\u011b\u0120"+
"\5\64\33\2\u011c\u0120\5\66\34\2\u011d\u0120\58\35\2\u011e\u0120\5:\36"+
"\2\u011f\u011a\3\2\2\2\u011f\u011b\3\2\2\2\u011f\u011c\3\2\2\2\u011f\u011d"+
"\3\2\2\2\u011f\u011e\3\2\2\2\u0120=\3\2\2\2\u0121\u0122\7Q\2\2\u0122\u0123"+
"\7\\\2\2\u0123?\3\2\2\2\31BDKPVXiqx\177\u0082\u0087\u008b\u0091\u00a3"+
"\u00b2\u00c5\u00f0\u00f2\u00f8\u0103\u0111\u011f";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {