ast processing

This commit is contained in:
Irmen de Jong 2018-08-12 17:16:36 +02:00
parent 306663b991
commit 30c5550ece
11 changed files with 920 additions and 684 deletions

View File

@ -0,0 +1,6 @@
~ extra {
; this is imported
X = 42
return 44
}

View File

@ -0,0 +1,14 @@
~ main $c000 {
const byte hopla=55-33
const byte hopla2=55-hopla
A = "derp" * %000100
%import maghierniet
return 1+999
}
%import imported1, 33, aaa
%import imported2
%import imported3

View File

@ -63,11 +63,12 @@ statement :
| unconditionaljump | unconditionaljump
| postincrdecr | postincrdecr
| inlineasm | inlineasm
| label | labeldef
| returnstmt
// @todo forloop, whileloop, repeatloop, ifelse // @todo forloop, whileloop, repeatloop, ifelse
; ;
label : identifier ':' ; labeldef : identifier ':' ;
call_location : integerliteral | identifier | scoped_identifier ; call_location : integerliteral | identifier | scoped_identifier ;
@ -135,13 +136,15 @@ expression :
functioncall : functioncall :
call_location '(' function_arg_list? ')' call_location '(' expression_list? ')'
; ;
function_arg_list : expression_list :
expression (',' expression)* expression (',' expression)*
; ;
returnstmt : 'return' expression_list? ;
identifier : NAME ; identifier : NAME ;
scoped_identifier : NAME ('.' NAME)+ ; scoped_identifier : NAME ('.' NAME)+ ;

View File

@ -0,0 +1,81 @@
package il65
import il65.ast.*
fun Module.checkValid() : List<SyntaxError> {
val checker = AstChecker()
this.process(checker)
return checker.result()
}
class AstChecker : IAstProcessor {
private val checkResult: MutableList<SyntaxError> = mutableListOf()
fun result(): List<SyntaxError> {
return checkResult
}
override fun process(expr: PrefixExpression): IExpression {
return expr
}
override fun process(expr: BinaryExpression): IExpression {
return expr
}
/**
* check the arguments of the directive
*/
override fun process(directive: Directive): IStatement {
fun err(msg: String) {
checkResult.add(SyntaxError(msg, directive))
}
when(directive.directive) {
"%output" -> {
if(directive.args.size!=1 || directive.args[0].name != "raw" && directive.args[0].name != "prg")
err("invalid output directive type, expected raw or prg")
}
"%launcher" -> {
if(directive.args.size!=1 || directive.args[0].name != "basic" && directive.args[0].name != "none")
err("invalid launcher directive type, expected basic or none")
}
"%zp" -> {
if(directive.args.size!=1 ||
directive.args[0].name != "compatible" &&
directive.args[0].name != "full" &&
directive.args[0].name != "full-restore")
err("invalid zp directive style, expected compatible, full or full-restore")
}
"%address" -> {
if(directive.args.size!=1 || directive.args[0].int == null)
err("invalid address directive, expected numeric address argument")
}
"%import" -> {
if(directive.args.size!=1 || directive.args[0].name==null)
err("invalid import directive, expected module name argument")
}
"%breakpoint" -> {
if(directive.args.isNotEmpty())
err("invalid breakpoint directive, expected no arguments")
}
"%asminclude" -> {
if(directive.args.size!=2 || directive.args[0].str==null || directive.args[1].name==null)
err("invalid asminclude directive, expected arguments: \"filename\", scopelabel")
}
"%asmbinary" -> {
val errormsg = "invalid asmbinary directive, expected arguments: \"filename\" [, offset [, length ] ]"
if(directive.args.isEmpty()) err(errormsg)
if(directive.args.isNotEmpty() && directive.args[0].str==null) err(errormsg)
if(directive.args.size>=2 && directive.args[1].int==null) err(errormsg)
if(directive.args.size==3 && directive.args[2].int==null) err(errormsg)
if(directive.args.size>3) err(errormsg)
}
else -> throw AstException("invalid directive ${directive.directive}")
}
return directive
}
}

View File

@ -4,25 +4,20 @@ import il65.ast.*
import kotlin.math.pow import kotlin.math.pow
interface IAstOptimizer {
fun optimize(expr: PrefixExpression): IExpression
fun optimize(expr: BinaryExpression): IExpression
}
fun Module.optimized() : Module { fun Module.optimized() : Module {
val optimizer = AstOptimizer() val optimizer = AstOptimizer()
var result = this.optimizeOnceWith(optimizer) var result = this.process(optimizer)
while(optimizer.optimizationsDone>0) { while(optimizer.optimizationsDone>0) {
println("Optimizations done: ${optimizer.optimizationsDone}") println("Optimizations done: ${optimizer.optimizationsDone}")
optimizer.reset() optimizer.reset()
result = result.optimizeOnceWith(optimizer) result = result.process(optimizer)
} }
println("nothing left to optimize!") println("nothing left to process!")
return result return result
} }
class AstOptimizer : IAstOptimizer { class AstOptimizer : IAstProcessor {
var optimizationsDone: Int = 0 var optimizationsDone: Int = 0
private set private set
@ -32,16 +27,16 @@ class AstOptimizer : IAstOptimizer {
} }
/** /**
* Try to optimize a unary prefix expression. * Try to process a unary prefix expression.
* Compile-time constant sub expressions will be evaluated on the spot. * 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 * For instance, the expression for "- 4.5" will be optimized into the float literal -4.5
*/ */
override fun optimize(expr: PrefixExpression): IExpression { override fun process(expr: PrefixExpression): IExpression {
expr.expression = expr.expression.optimize(this) // optimize sub expression first expr.expression = expr.expression.process(this) // process sub expression first
val subexpr = expr.expression val subexpr = expr.expression
if (subexpr is LiteralValue) { if (subexpr is LiteralValue) {
// optimize prefixed literal values (such as -3, not true) // process prefixed literal values (such as -3, not true)
return when { return when {
expr.operator == "+" -> subexpr expr.operator == "+" -> subexpr
expr.operator == "-" -> return when { expr.operator == "-" -> return when {
@ -80,15 +75,15 @@ class AstOptimizer : IAstOptimizer {
} }
/** /**
* Try to optimize a binary expression. * Try to process a binary expression.
* Compile-time constant sub expressions will be evaluated on the spot. * Compile-time constant sub expressions will be evaluated on the spot.
* For instance, "9 * (4 + 2)" will be optimized into the integer literal 54. * For instance, "9 * (4 + 2)" will be optimized into the integer literal 54.
*/ */
override fun optimize(expr: BinaryExpression): IExpression { override fun process(expr: BinaryExpression): IExpression {
val evaluator = ConstExprEvaluator() val evaluator = ConstExprEvaluator()
// optimize sub expressions first // process sub expressions first
expr.left = expr.left.optimize(this) expr.left = expr.left.process(this)
expr.right = expr.right.optimize(this) expr.right = expr.right.process(this)
val leftconst = expr.left.constValue() val leftconst = expr.left.constValue()
val rightconst = expr.right.constValue() val rightconst = expr.right.constValue()
@ -101,6 +96,11 @@ class AstOptimizer : IAstOptimizer {
else -> expr else -> expr
} }
} }
override fun process(directive: Directive): IStatement {
println("directove OPT $directive")
return directive
}
} }

View File

@ -1,13 +1,15 @@
package il65 package il65
import il65.ast.IStatement import il65.ast.Directive
import il65.ast.Module import il65.ast.Module
import il65.ast.SyntaxError
import il65.ast.toAst import il65.ast.toAst
import il65.parser.il65Lexer import il65.parser.il65Lexer
import il65.parser.il65Parser import il65.parser.il65Parser
import org.antlr.v4.runtime.CharStreams import org.antlr.v4.runtime.CharStreams
import org.antlr.v4.runtime.CommonTokenStream import org.antlr.v4.runtime.CommonTokenStream
import org.antlr.v4.runtime.Lexer import org.antlr.v4.runtime.Lexer
import java.nio.file.Paths
class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) { class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) {
@ -27,35 +29,71 @@ class MyTokenStream(lexer: Lexer) : CommonTokenStream(lexer) {
} }
} }
public inline fun <R> Module.map(transform: (IStatement) -> R): List<R> { class ParsingFailedError(override var message: String) : Exception(message)
val result = ArrayList<R>(lines.size)
for (line in this.lines) {
result.add(transform(line)) fun loadModule(filename: String) : Module {
val filePath = Paths.get(filename).normalize()
val fileLocation = filePath.parent
val fileName = filePath.fileName
println("importing '$fileName' (from $fileLocation)...")
val input = CharStreams.fromPath(filePath)
val lexer = il65Lexer(input)
val tokens = MyTokenStream(lexer)
val parser = il65Parser(tokens)
val parseTree = parser.module()
if(parser.numberOfSyntaxErrors > 0)
throw ParsingFailedError("There are ${parser.numberOfSyntaxErrors} syntax errors in '$fileName'.")
// TODO the comments:
// tokens.commentTokens().forEach { println(it) }
// convert to Ast (optimizing this is done as a final step)
var moduleAst = parseTree.toAst(fileName.toString(),true)
val checkResult = moduleAst.checkValid()
checkResult.forEach { it.printError() }
if(checkResult.isNotEmpty())
throw ParsingFailedError("There are ${checkResult.size} syntax errors in '$fileName'.")
// process imports
val lines = moduleAst.lines.toMutableList()
val imports = lines
.mapIndexed { i, it -> Pair(i, it) }
.filter { (it.second as? Directive)?.directive == "%import" }
.map { Pair(it.first, executeImportDirective(it.second as Directive)) }
imports.reversed().forEach {
println("IMPORT [in ${moduleAst.name}]: $it")
} }
return result
moduleAst.lines = lines
return moduleAst
}
fun executeImportDirective(import: Directive): Module {
if(import.directive!="%import" || import.args.size!=1 || import.args[0].name==null)
throw SyntaxError("invalid import directive", import)
return Module("???", emptyList(), null) // TODO
} }
fun main(args: Array<String>) { fun main(args: Array<String>) {
// println("Reading source file: ${args[0]}") println("Reading source file: ${args[0]}")
try {
val input = CharStreams.fromString( val moduleAst = loadModule(args[0]).optimized()
"~ main \$c000 { \n" +
" const byte hopla=55-33\n"+
" const byte hopla2=55-hopla\n"+
" A = \"derp\" * %000100 \n" +
"}\n")
val lexer = il65Lexer(input)
val tokens = MyTokenStream(lexer)
val parser = il65Parser(tokens)
var moduleAst = parser.module().toAst(true).optimized()
// the comments:
tokens.commentTokens().forEach { println(it) }
moduleAst.lines.map { moduleAst.lines.map {
println(it) println(it)
} }
} catch(sx: SyntaxError) {
sx.printError()
} catch (px: ParsingFailedError) {
System.err.println(px.message)
}
} }

View File

@ -1,6 +1,5 @@
package il65.ast package il65.ast
import il65.IAstOptimizer
import il65.parser.il65Parser import il65.parser.il65Parser
import org.antlr.v4.runtime.ParserRuleContext import org.antlr.v4.runtime.ParserRuleContext
import org.antlr.v4.runtime.tree.TerminalNode import org.antlr.v4.runtime.tree.TerminalNode
@ -34,39 +33,59 @@ enum class Register {
open class AstException(override var message: String) : Exception(message) open class AstException(override var message: String) : Exception(message)
class ExpressionException(override var message: String) : AstException(message) class ExpressionException(override var message: String) : AstException(message)
class SyntaxError(override var message: String, val node: Node?) : AstException(message) {
fun printError() {
val location = if(node?.position == null)
""
else
"[line ${node.position!!.line} col ${node.position!!.startCol}-${node.position!!.endCol}] "
System.err.println("$location$message")
}
}
data class Position(val line: Int, val startCol:Int, val endCol: Int) data class Position(val line: Int, val startCol:Int, val endCol: Int)
interface IAstProcessor {
fun process(expr: PrefixExpression): IExpression
fun process(expr: BinaryExpression): IExpression
fun process(directive: Directive): IStatement
}
interface Node { interface Node {
val position: Position? // optional for the sake of easy unit testing val position: Position? // optional for the sake of easy unit testing
} }
interface IStatement : Node { interface IStatement : Node {
fun optimize(optimizer: IAstOptimizer) : IStatement fun process(processor: IAstProcessor) : IStatement
} }
data class Module(var lines: List<IStatement>, data class Module(val name: String,
var lines: List<IStatement>,
override val position: Position? = null) : Node { override val position: Position? = null) : Node {
fun optimizeOnceWith(optimizer: IAstOptimizer): Module { fun process(processor: IAstProcessor): Module {
lines = lines.map { it.optimize(optimizer) } lines = lines.map { it.process(processor) }
return this return this
} }
} }
data class Block(val name: String, val address: Int?, var statements: List<IStatement>, data class Block(val name: String, val address: Int?, var statements: List<IStatement>,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer) : IStatement { override fun process(processor: IAstProcessor) : IStatement {
statements = statements.map { it.optimize(optimizer) } statements = statements.map { it.process(processor) }
return this return this
} }
} }
data class Directive(val directive: String, val args: List<DirectiveArg>, data class Directive(val directive: String, val args: List<DirectiveArg>,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) : IStatement {
return processor.process(this)
}
} }
data class DirectiveArg(val str: String?, val name: String?, val int: Int?, data class DirectiveArg(val str: String?, val name: String?, val int: Int?,
@ -74,9 +93,18 @@ data class DirectiveArg(val str: String?, val name: String?, val int: Int?,
data class Label(val name: String, data class Label(val name: String,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) = this
} }
data class Return(var values: List<IExpression>,
override val position: Position? = null) : IStatement {
override fun process(processor: IAstProcessor): IStatement {
values = values.map { it.process(processor) }
return this
}
}
interface IVarDecl : IStatement { interface IVarDecl : IStatement {
val datatype: DataType val datatype: DataType
val arrayspec: ArraySpec? val arrayspec: ArraySpec?
@ -93,8 +121,8 @@ data class VarDecl(override val datatype: DataType,
override val name: String, override val name: String,
override var value: IExpression?, override var value: IExpression?,
override val position: Position? = null) : IVarDecl { override val position: Position? = null) : IVarDecl {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
value = value?.optimize(optimizer) value = value?.process(processor)
return this return this
} }
} }
@ -104,8 +132,8 @@ data class ConstDecl(override val datatype: DataType,
override val name: String, override val name: String,
override var value: IExpression?, override var value: IExpression?,
override val position: Position? = null) : IVarDecl { override val position: Position? = null) : IVarDecl {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
value = value?.optimize(optimizer) value = value?.process(processor)
return this return this
} }
} }
@ -115,34 +143,34 @@ data class MemoryVarDecl(override val datatype: DataType,
override val name: String, override val name: String,
override var value: IExpression?, override var value: IExpression?,
override val position: Position? = null) : IVarDecl { override val position: Position? = null) : IVarDecl {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
value = value?.optimize(optimizer) value = value?.process(processor)
return this return this
} }
} }
data class Assignment(var target: AssignTarget, val aug_op : String?, var value: IExpression, data class Assignment(var target: AssignTarget, val aug_op : String?, var value: IExpression,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
target = target.optimize(optimizer) target = target.process(processor)
value = value.optimize(optimizer) value = value.process(processor)
return this return this
} }
} }
data class AssignTarget(val register: Register?, val identifier: Identifier?, data class AssignTarget(val register: Register?, val identifier: Identifier?,
override val position: Position? = null) : Node { override val position: Position? = null) : Node {
fun optimize(optimizer: IAstOptimizer) = this // for now fun process(processor: IAstProcessor) = this // for now
} }
interface IExpression: Node { interface IExpression: Node {
fun constValue() : LiteralValue? fun constValue() : LiteralValue?
fun optimize(optimizer: IAstOptimizer): IExpression fun process(processor: IAstProcessor): IExpression
} }
// note: some expression elements are mutable, to be able to rewrite/optimize the expression tree // note: some expression elements are mutable, to be able to rewrite/process the expression tree
data class PrefixExpression(val operator: String, var expression: IExpression, data class PrefixExpression(val operator: String, var expression: IExpression,
override val position: Position? = null) : IExpression { override val position: Position? = null) : IExpression {
@ -150,7 +178,7 @@ data class PrefixExpression(val operator: String, var expression: IExpression,
throw ExpressionException("should have been optimized away before const value was asked") throw ExpressionException("should have been optimized away before const value was asked")
} }
override fun optimize(optimizer: IAstOptimizer) = optimizer.optimize(this) override fun process(processor: IAstProcessor) = processor.process(this)
} }
@ -160,7 +188,7 @@ data class BinaryExpression(var left: IExpression, val operator: String, var rig
throw ExpressionException("should have been optimized away before const value was asked") throw ExpressionException("should have been optimized away before const value was asked")
} }
override fun optimize(optimizer: IAstOptimizer) = optimizer.optimize(this) override fun process(processor: IAstProcessor) = processor.process(this)
} }
data class LiteralValue(val intvalue: Int? = null, data class LiteralValue(val intvalue: Int? = null,
@ -169,16 +197,16 @@ data class LiteralValue(val intvalue: Int? = null,
val arrayvalue: List<IExpression>? = null, val arrayvalue: List<IExpression>? = null,
override val position: Position? = null) : IExpression { override val position: Position? = null) : IExpression {
override fun constValue(): LiteralValue? = this override fun constValue(): LiteralValue? = this
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) = this
} }
data class RangeExpr(var from: IExpression, var to: IExpression, data class RangeExpr(var from: IExpression, var to: IExpression,
override val position: Position? = null) : IExpression { override val position: Position? = null) : IExpression {
override fun constValue(): LiteralValue? = null override fun constValue(): LiteralValue? = null
override fun optimize(optimizer: IAstOptimizer): IExpression { override fun process(processor: IAstProcessor): IExpression {
from = from.optimize(optimizer) from = from.process(processor)
to = to.optimize(optimizer) to = to.process(processor)
return this return this
} }
} }
@ -187,7 +215,7 @@ data class RangeExpr(var from: IExpression, var to: IExpression,
data class RegisterExpr(val register: Register, data class RegisterExpr(val register: Register,
override val position: Position? = null) : IExpression { override val position: Position? = null) : IExpression {
override fun constValue(): LiteralValue? = null override fun constValue(): LiteralValue? = null
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) = this
} }
@ -198,20 +226,20 @@ data class Identifier(val name: String, val scope: List<String>,
return null return null
} }
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) = this
} }
data class CallTarget(val address: Int?, val identifier: Identifier?, data class CallTarget(val address: Int?, val identifier: Identifier?,
override val position: Position? = null) : Node { override val position: Position? = null) : Node {
fun optimize(optimizer: IAstOptimizer) = this fun process(processor: IAstProcessor) = this
} }
data class PostIncrDecr(var target: AssignTarget, val operator: String, data class PostIncrDecr(var target: AssignTarget, val operator: String,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
target = target.optimize(optimizer) target = target.process(processor)
return this return this
} }
} }
@ -219,8 +247,8 @@ data class PostIncrDecr(var target: AssignTarget, val operator: String,
data class Jump(var target: CallTarget, data class Jump(var target: CallTarget,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer): IStatement { override fun process(processor: IAstProcessor): IStatement {
target = target.optimize(optimizer) target = target.process(processor)
return this return this
} }
} }
@ -233,9 +261,9 @@ data class FunctionCall(var target: CallTarget, var arglist: List<IExpression>,
return null return null
} }
override fun optimize(optimizer: IAstOptimizer): IExpression { override fun process(processor: IAstProcessor): IExpression {
target = target.optimize(optimizer) target = target.process(processor)
arglist = arglist.map{it.optimize(optimizer)} arglist = arglist.map{it.process(processor)}
return this return this
} }
} }
@ -243,7 +271,7 @@ data class FunctionCall(var target: CallTarget, var arglist: List<IExpression>,
data class InlineAssembly(val assembly: String, data class InlineAssembly(val assembly: String,
override val position: Position? = null) : IStatement { override val position: Position? = null) : IStatement {
override fun optimize(optimizer: IAstOptimizer) = this override fun process(processor: IAstProcessor) = this
} }
@ -251,14 +279,14 @@ data class InlineAssembly(val assembly: String,
fun ParserRuleContext.toPosition(withPosition: Boolean) : Position? { fun ParserRuleContext.toPosition(withPosition: Boolean) : Position? {
return if (withPosition) return if (withPosition)
Position(start.line, start.charPositionInLine, stop.charPositionInLine) Position(start.line, start.charPositionInLine, stop.charPositionInLine+stop.text.length)
else else
null null
} }
fun il65Parser.ModuleContext.toAst(withPosition: Boolean) = fun il65Parser.ModuleContext.toAst(name: String, withPosition: Boolean) =
Module(modulestatement().map { it.toAst(withPosition) }, toPosition(withPosition)) Module(name, modulestatement().map { it.toAst(withPosition) }, toPosition(withPosition))
fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : IStatement { fun il65Parser.ModulestatementContext.toAst(withPosition: Boolean) : IStatement {
@ -341,7 +369,7 @@ fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement {
val directive = directive()?.toAst(withPosition) val directive = directive()?.toAst(withPosition)
if(directive!=null) return directive if(directive!=null) return directive
val label=label() val label=labeldef()
if(label!=null) if(label!=null)
return Label(label.text, label.toPosition(withPosition)) return Label(label.text, label.toPosition(withPosition))
@ -349,6 +377,10 @@ fun il65Parser.StatementContext.toAst(withPosition: Boolean) : IStatement {
if(jump!=null) if(jump!=null)
return Jump(jump.call_location().toAst(withPosition), jump.toPosition(withPosition)) return Jump(jump.call_location().toAst(withPosition), jump.toPosition(withPosition))
val returnstmt = returnstmt()
if(returnstmt!=null)
return Return(returnstmt.expression_list().toAst(withPosition))
val asm = inlineasm() val asm = inlineasm()
if(asm!=null) if(asm!=null)
return InlineAssembly(asm.INLINEASMBLOCK().text, asm.toPosition(withPosition)) return InlineAssembly(asm.INLINEASMBLOCK().text, asm.toPosition(withPosition))
@ -450,10 +482,10 @@ fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression {
val funcall = functioncall() val funcall = functioncall()
if(funcall!=null) { if(funcall!=null) {
val location = funcall.call_location().toAst(withPosition) val location = funcall.call_location().toAst(withPosition)
return if(funcall.function_arg_list()==null) return if(funcall.expression_list()==null)
FunctionCall(location, emptyList(), funcall.toPosition(withPosition)) FunctionCall(location, emptyList(), funcall.toPosition(withPosition))
else else
FunctionCall(location, funcall.function_arg_list().toAst(withPosition), funcall.toPosition(withPosition)) FunctionCall(location, funcall.expression_list().toAst(withPosition), funcall.toPosition(withPosition))
} }
if (rangefrom!=null && rangeto!=null) if (rangefrom!=null && rangeto!=null)
@ -466,7 +498,7 @@ fun il65Parser.ExpressionContext.toAst(withPosition: Boolean) : IExpression {
} }
fun il65Parser.Function_arg_listContext.toAst(withPosition: Boolean) = expression().map{ it.toAst(withPosition) } fun il65Parser.Expression_listContext.toAst(withPosition: Boolean) = expression().map{ it.toAst(withPosition) }
fun il65Parser.IdentifierContext.toAst(withPosition: Boolean) : Identifier { fun il65Parser.IdentifierContext.toAst(withPosition: Boolean) : Identifier {

View File

@ -76,17 +76,18 @@ T__74=75
T__75=76 T__75=76
T__76=77 T__76=77
T__77=78 T__77=78
LINECOMMENT=79 T__78=79
COMMENT=80 LINECOMMENT=80
WS=81 COMMENT=81
EOL=82 WS=82
NAME=83 EOL=83
DEC_INTEGER=84 NAME=84
HEX_INTEGER=85 DEC_INTEGER=85
BIN_INTEGER=86 HEX_INTEGER=86
FLOAT_NUMBER=87 BIN_INTEGER=87
STRING=88 FLOAT_NUMBER=88
INLINEASMBLOCK=89 STRING=89
INLINEASMBLOCK=90
'~'=1 '~'=1
'{'=2 '{'=2
'}'=3 '}'=3
@ -152,16 +153,17 @@ INLINEASMBLOCK=89
'xor'=63 'xor'=63
'not'=64 'not'=64
'to'=65 'to'=65
'.'=66 'return'=66
'A'=67 '.'=67
'X'=68 'A'=68
'Y'=69 'X'=69
'AX'=70 'Y'=70
'AY'=71 'AX'=71
'XY'=72 'AY'=72
'SC'=73 'XY'=73
'SI'=74 'SC'=74
'SZ'=75 'SI'=75
'true'=76 'SZ'=76
'false'=77 'true'=77
'%asm'=78 'false'=78
'%asm'=79

View File

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

View File

@ -76,17 +76,18 @@ T__74=75
T__75=76 T__75=76
T__76=77 T__76=77
T__77=78 T__77=78
LINECOMMENT=79 T__78=79
COMMENT=80 LINECOMMENT=80
WS=81 COMMENT=81
EOL=82 WS=82
NAME=83 EOL=83
DEC_INTEGER=84 NAME=84
HEX_INTEGER=85 DEC_INTEGER=85
BIN_INTEGER=86 HEX_INTEGER=86
FLOAT_NUMBER=87 BIN_INTEGER=87
STRING=88 FLOAT_NUMBER=88
INLINEASMBLOCK=89 STRING=89
INLINEASMBLOCK=90
'~'=1 '~'=1
'{'=2 '{'=2
'}'=3 '}'=3
@ -152,16 +153,17 @@ INLINEASMBLOCK=89
'xor'=63 'xor'=63
'not'=64 'not'=64
'to'=65 'to'=65
'.'=66 'return'=66
'A'=67 '.'=67
'X'=68 'A'=68
'Y'=69 'X'=69
'AX'=70 'Y'=70
'AY'=71 'AX'=71
'XY'=72 'AY'=72
'SC'=73 'XY'=73
'SI'=74 'SC'=74
'SZ'=75 'SI'=75
'true'=76 'SZ'=76
'false'=77 'true'=77
'%asm'=78 'false'=78
'%asm'=79

File diff suppressed because it is too large Load Diff