more builtin functions

This commit is contained in:
Irmen de Jong 2018-09-02 11:54:42 +02:00
parent dc3095956a
commit d4341b7afe
17 changed files with 1038 additions and 710 deletions

View File

@ -2,7 +2,9 @@
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/build" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>

View File

@ -172,6 +172,15 @@ Note that the various keywords for the data type and variable type (``byte``, ``
cannot be used as *identifiers* elsewhere. You can't make a variable, block or subroutine with the name ``byte``
for instance.
Variables that represent CPU hardware registers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The following variables are reserved
and map directly (read/write) to a CPU hardware register: ``A``, ``X``, ``Y``, ``AX``, ``AY``, ``XY`` (the 2-letter ones
are a pseudo 16-bit 'register' by pairing two 8-bit registers).
The following variables are reserved and can be used to *read* a CPU status register bit (can be used in conditional
expressions): ``Pc``, ``Pz``, ``Pn``, ``Pv``.
Special types: const and memory-mapped
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -379,49 +388,94 @@ stack manipulation code to be inserted for every call like this, which can be qu
Built-in Functions
------------------
The compiler has the following built-in functions that you can use in expressions:
sin(value)
There's a set of predefined functions in the language. These are fixed and can't be redefined in user code.
You can use them in expressions and the compiler will evaluate them at compile-time if possible.
sin(x)
Sine.
cos(value)
cos(x)
Cosine.
abs(value)
abs(x)
Absolute value.
acos(value)
acos(x)
Arccosine.
asin(value)
asin(x)
Arcsine.
tan(value)
tan(x)
Tangent.
atan(value)
atan(x)
Arctangent.
log(value)
log(x)
Natural logarithm.
log10(value)
log10(x)
Base-10 logarithm.
sqrt(value)
sqrt(x)
Square root.
max(value [, value, ...])
Maximum of the values.
max(x [, y, ...])
Maximum of the values x, y, ...
min(value [, value, ...])
Minumum of the values.
min(x [, y, ...])
Minumum of the values x, y, ...
round(value)
round(x)
Rounds the floating point to an integer.
rad(value)
rad(x)
Degrees to radians.
deg(value)
deg(x)
Radians to degrees.
_lsl(x)
Shift the bits in x (byte or word) one position to the left.
Bit 0 is set to 0 (and the highest bit is shifted into the status register's Carry flag)
Modifies in-place but also returns the new value.
_lsr(x)
Shift the bits in x (byte or word) one position to the right.
The highest bit is set to 0 (and bit 0 is shifted into the status register's Carry flag)
Modifies in-place but also returns the new value.
_rol(x)
Rotate the bits in x (byte or word) one position to the left.
This uses the CPU's rotate semantics: bit 0 will be set to the current value of the Carry flag,
while the highest bit will become the new Carry flag value.
(essentially, it is a 9-bit or 17-bit rotation)
Modifies in-place, doesn't return a value (so can't be used in an expression).
_rol2(x)
Like _rol but now as 8-bit or 16-bit rotation.
It uses some extra logic to not consider the carry flag as extra rotation bit.
Modifies in-place, doesn't return a value (so can't be used in an expression).
_ror(x)
Rotate the bits in x (byte or word) one position to the right.
This uses the CPU's rotate semantics: the highest bit will be set to the current value of the Carry flag,
while bit 0 will become the new Carry flag value.
(essentially, it is a 9-bit or 17-bit rotation)
Modifies in-place, doesn't return a value (so can't be used in an expression).
_ror2(x)
Like _ror but now as 8-bit or 16-bit rotation.
It uses some extra logic to not consider the carry flag as extra rotation bit.
Modifies in-place, doesn't return a value (so can't be used in an expression).
_P_carry(bit)
Set (or clear) the CPU status register Carry flag. No result value.
(translated into ``SEC`` or ``CLC`` cpu instruction)
_P_irqd(bit)
Set (or clear) the CPU status register Interrupt Disable flag. No result value.
(translated into ``SEI`` or ``CLI`` cpu instruction)

View File

@ -307,14 +307,13 @@ arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%``
``%`` is the remainder operator: ``25 % 7`` is 4.
bitwise arithmetic: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~``
``<<`` and ``>>`` are bitwise shifts (left and right), ``<<@`` and ``@>>`` are bitwise rotations (left and right)
bitwise arithmetic: ``&`` ``|`` ``^`` ``~``
``&`` is bitwise and, ``|`` is bitwise or, ``^`` is bitwise xor, ``~`` is bitwise invert (this one is an unary operator)
assignment: ``=``
Sets the target on the LHS (left hand side) of the operator to the value of the expression on the RHS (right hand side).
augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``//=`` ``**=`` ``<<=`` ``>>=`` ``<<@=`` ``>>@=`` ``&=`` ``|=`` ``^=``
augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``//=`` ``**=`` ``&=`` ``|=`` ``^=``
Syntactic sugar; ``A += X`` is equivalent to ``A = A + X``
postfix increment and decrement: ``++`` ``--``

View File

@ -127,11 +127,11 @@ The following 6502 CPU hardware registers are directly usable in program code (a
- ``A``, ``X``, ``Y`` the three main cpu registers (8 bits)
- ``AX``, ``AY``, ``XY`` surrogate 16-bit registers: LSB-order (lo/hi) combined register pairs
- ``Pc`` status register (P) Carry flag (read-only, use ``P_carry()`` pseudo-function to write it)
- ``Pc`` status register (P) Carry flag (read-only, use ``_P_carry`` pseudo-function to write it)
- ``Pz`` status register (P) Zero flag (read-only)
- ``Pn`` status register (P) Negative flag (read-only)
- ``Pv`` status register (P) Overflow flag (read-only)
- the status register (P) Interrupt flag is not accessible, but can be set with the ``P_irqd()`` pseudo-function.
- the status register (P) Interrupt flag is not accessible, but can be set with the ``_P_irqd`` pseudo-function.
Subroutine Calling Conventions
------------------------------

View File

@ -94,8 +94,7 @@ arrayspec: '[' expression (',' expression)? ']' ;
assignment : assign_target '=' expression ;
augassignment :
assign_target operator=('+=' | '-=' | '/=' | '*=' | '**=' |
'<<=' | '>>=' | '<<@=' | '>>@=' | '&=' | '|=' | '^=') expression
assign_target operator=('+=' | '-=' | '/=' | '*=' | '**=' | '&=' | '|=' | '^=') expression
;
assign_target:
@ -114,7 +113,7 @@ expression :
| left = expression bop = '**' right = expression
| left = expression bop = ('*' | '/' ) right = expression
| left = expression bop = ('+' | '-' ) right = expression
| left = expression bop = ('<<' | '>>' | '<<@' | '>>@' ) right = expression
| left = expression bop = ('<<' | '>>') right = expression
| left = expression bop = ('<' | '>' | '<=' | '>=') right = expression
| left = expression bop = ('==' | '!=') right = expression
| left = expression bop = '&' right = expression

View File

@ -36,8 +36,8 @@
byte equalQQ = 4==4
const byte equalQQ2 = (4+hopla)>0
P_carry(1)
P_irqd(0)
_P_carry(1)
_P_irqd(0)
equalQQ = foo(33)
equalQQ = main.foo(33)
@ -61,7 +61,17 @@
}
if(6==6) {
A=99
A=sin(X)
X=max(1,2,Y)
X=min(1,2,Y)
X=_lsl(1)
X=_lsl(Y)
_P_carry(0)
_P_carry(Y) ; TODO error
_P_carry(9.99) ; TODO error
_P_irqd(0)
_P_irqd(Y) ; TODO error
_P_irqd(9.99) ; TODO error
} else X=33
if(6>36) {

View File

@ -292,7 +292,7 @@ data class Module(override val name: String,
override fun usedNames(): Set<String> = scopedNamesUsed
override fun lookup(scopedName: List<String>, statement: Node): IStatement? {
if(PseudoFunctionNames.contains(scopedName.last())) {
if(BuiltinFunctionNames.contains(scopedName.last())) {
// pseudo functions always exist, return a dummy statement for them
val pseudo = Label("pseudo::${scopedName.last()}")
pseudo.position = statement.position
@ -666,25 +666,39 @@ data class FunctionCall(override var target: IdentifierReference, override var a
}
override fun constValue(namespace: INameScope): LiteralValue? {
// if the function is a built-in function and the args are consts, should evaluate!
// if the function is a built-in function and the args are consts, should try to const-evaluate!
if(target.nameInSource.size>1) return null
return when(target.nameInSource[0]){
"sin" -> builtin_sin(arglist, position, namespace)
"cos" -> builtin_cos(arglist, position, namespace)
"abs" -> builtin_abs(arglist, position, namespace)
"acos" -> builtin_acos(arglist, position, namespace)
"asin" -> builtin_asin(arglist, position, namespace)
"tan" -> builtin_tan(arglist, position, namespace)
"atan" -> builtin_atan(arglist, position, namespace)
"log" -> builtin_log(arglist, position, namespace)
"log10" -> builtin_log10(arglist, position, namespace)
"sqrt" -> builtin_sqrt(arglist, position, namespace)
"max" -> builtin_max(arglist, position, namespace)
"min" -> builtin_min(arglist, position, namespace)
"round" -> builtin_round(arglist, position, namespace)
"rad" -> builtin_rad(arglist, position, namespace)
"deg" -> builtin_deg(arglist, position, namespace)
else -> null
try {
return when (target.nameInSource[0]) {
"sin" -> builtinSin(arglist, position, namespace)
"cos" -> builtinCos(arglist, position, namespace)
"abs" -> builtinAbs(arglist, position, namespace)
"acos" -> builtinAcos(arglist, position, namespace)
"asin" -> builtinAsin(arglist, position, namespace)
"tan" -> builtinTan(arglist, position, namespace)
"atan" -> builtinAtan(arglist, position, namespace)
"log" -> builtinLog(arglist, position, namespace)
"log10" -> builtinLog10(arglist, position, namespace)
"sqrt" -> builtinSqrt(arglist, position, namespace)
"max" -> builtinMax(arglist, position, namespace)
"min" -> builtinMin(arglist, position, namespace)
"round" -> builtinRound(arglist, position, namespace)
"rad" -> builtinRad(arglist, position, namespace)
"deg" -> builtinDeg(arglist, position, namespace)
"_lsl" -> builtinLsl(arglist, position, namespace)
"_lsr" -> builtinLsr(arglist, position, namespace)
"_rol" -> throw ExpressionException("builtin function _rol can't be used in expressions because it doesn't return a value", position)
"_rol2" -> throw ExpressionException("builtin function _rol2 can't be used in expressions because it doesn't return a value", position)
"_ror" -> throw ExpressionException("builtin function _ror can't be used in expressions because it doesn't return a value", position)
"_ror2" -> throw ExpressionException("builtin function _ror2 can't be used in expressions because it doesn't return a value", position)
"_P_carry" -> throw ExpressionException("builtin function _P_carry can't be used in expressions because it doesn't return a value", position)
"_P_irqd" -> throw ExpressionException("builtin function _P_irqd can't be used in expressions because it doesn't return a value", position)
else -> null
}
}
catch(x: NotConstArgumentException) {
// const-evaluating the builtin function call failed.
return null
}
}

View File

@ -20,7 +20,11 @@ fun Module.checkIdentifiers(globalNamespace: INameScope): MutableMap<String, ISt
}
val PseudoFunctionNames = setOf("P_carry", "P_irqd")
val BuiltinFunctionNames = setOf(
"_P_carry", "_P_irqd", "_rol", "_ror", "_rol2", "_ror2",
"_lsl", "_lsr", "sin", "cos", "abs", "acos",
"asin", "tan", "atan", "log", "log10", "sqrt",
"max", "min", "round", "rad", "deg")
class AstIdentifiersChecker(private val globalNamespace: INameScope) : IAstProcessor {
@ -60,9 +64,9 @@ class AstIdentifiersChecker(private val globalNamespace: INameScope) : IAstProce
}
override fun process(subroutine: Subroutine): IStatement {
if(PseudoFunctionNames.contains(subroutine.name)) {
if(BuiltinFunctionNames.contains(subroutine.name)) {
// the special pseudo-functions can't be redefined
checkResult.add(NameError("subroutine cannot have the name of a builtin pseudo-function", subroutine.position))
checkResult.add(NameError("builtin function cannot be redefined", subroutine.position))
} else {
val scopedName = subroutine.makeScopedName(subroutine.name).joinToString(".")
val existing = symbols[scopedName]
@ -76,9 +80,9 @@ class AstIdentifiersChecker(private val globalNamespace: INameScope) : IAstProce
}
override fun process(label: Label): IStatement {
if(PseudoFunctionNames.contains(label.name)) {
if(BuiltinFunctionNames.contains(label.name)) {
// the special pseudo-functions can't be redefined
checkResult.add(NameError("label cannot have the name of a builtin pseudo-function", label.position))
checkResult.add(NameError("builtin function cannot be redefined", label.position))
} else {
val scopedName = label.makeScopedName(label.name).joinToString(".")
val existing = symbols[scopedName]

View File

@ -1060,7 +1060,7 @@ class Petscii {
return result
}
fun decodePetscii(petscii: ShortArray, lowercase: Boolean = false): String {
fun decodePetscii(petscii: Iterable<Short>, lowercase: Boolean = false): String {
val decodeTable = if(lowercase) decodingPetsciiLowercase else decodingPetsciiUppercase
return petscii.map { decodeTable[it.toInt()] }.joinToString("")
}
@ -1075,7 +1075,7 @@ class Petscii {
return result
}
fun decodeScreencode(screencode: ShortArray, lowercase: Boolean = false): String {
fun decodeScreencode(screencode: Iterable<Short>, lowercase: Boolean = false): String {
val decodeTable = if(lowercase) decodingScreencodeLowercase else decodingScreencodeUppercase
return screencode.map { decodeTable[it.toInt()] }.joinToString("")
}

View File

@ -6,6 +6,9 @@ import il65.ast.*
val BuiltIns = listOf("sin", "cos", "abs", "acos", "asin", "tan", "atan", "log", "log10", "sqrt", "max", "min", "round", "rad", "deg")
class NotConstArgumentException: AstException("not a const argument to a built-in function")
private fun oneDoubleArg(args: List<IExpression>, position: Position?, namespace:INameScope, function: (arg: Double)->Double): LiteralValue {
if(args.size!=1)
throw SyntaxError("built-in function requires one floating point argument", position)
@ -17,7 +20,7 @@ private fun oneDoubleArg(args: List<IExpression>, position: Position?, namespace
return result
}
else
throw SyntaxError("built-in function requires floating point value as argument", position)
throw NotConstArgumentException()
}
private fun oneDoubleArgOutputInt(args: List<IExpression>, position: Position?, namespace:INameScope, function: (arg: Double)->Int): LiteralValue {
@ -31,47 +34,60 @@ private fun oneDoubleArgOutputInt(args: List<IExpression>, position: Position?,
return result
}
else
throw SyntaxError("built-in function requires floating point value as argument", position)
throw NotConstArgumentException()
}
private fun oneIntArgOutputInt(args: List<IExpression>, position: Position?, namespace:INameScope, function: (arg: Int)->Int): LiteralValue {
if(args.size!=1)
throw SyntaxError("built-in function requires one integer argument", position)
fun builtin_round(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
val integer = args[0].constValue(namespace)?.asInt()
if(integer!=null) {
val result = LiteralValue(intvalue = function(integer))
result.position = args[0].position
return result
}
else
throw NotConstArgumentException()
}
fun builtinRound(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArgOutputInt(args, position, namespace) { it -> Math.round(it).toInt() }
fun builtin_sin(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinSin(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::sin)
fun builtin_cos(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinCos(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::cos)
fun builtin_acos(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinAcos(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::acos)
fun builtin_asin(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinAsin(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::asin)
fun builtin_tan(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinTan(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::tan)
fun builtin_atan(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinAtan(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::atan)
fun builtin_log(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinLog(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::log)
fun builtin_log10(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinLog10(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::log10)
fun builtin_sqrt(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinSqrt(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::sqrt)
fun builtin_rad(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinRad(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::toRadians)
fun builtin_deg(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
fun builtinDeg(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue
= oneDoubleArg(args, position, namespace, Math::toDegrees)
fun builtin_abs(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
fun builtinAbs(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
if(args.size!=1)
throw SyntaxError("built-in function abs requires one numeric argument", position)
val float = args[0].constValue(namespace)?.asFloat()
@ -81,26 +97,32 @@ fun builtin_abs(args: List<IExpression>, position: Position?, namespace:INameSco
throw SyntaxError("built-in function abs requires floating point value as argument", position)
}
fun builtin_max(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
fun builtinMax(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
if(args.isEmpty())
throw SyntaxError("max requires at least one argument", position)
val constants = args.map { it.constValue(namespace) }
if(constants.contains(null))
throw SyntaxError("not all arguments to max are a constant value", position)
throw NotConstArgumentException()
val result = constants.map { it?.asFloat()!! }.max()
return intOrFloatLiteral(result!!, args[0].position)
}
fun builtin_min(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
fun builtinMin(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue {
if(args.isEmpty())
throw SyntaxError("min requires at least one argument", position)
val constants = args.map { it.constValue(namespace) }
if(constants.contains(null))
throw SyntaxError("not all arguments to min are a constant value", position)
throw NotConstArgumentException()
val result = constants.map { it?.asFloat()!! }.min()
return intOrFloatLiteral(result!!, args[0].position)
}
fun builtinLsl(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue =
oneIntArgOutputInt(args, position, namespace) { x: Int -> x shl 1 }
fun builtinLsr(args: List<IExpression>, position: Position?, namespace:INameScope): LiteralValue =
oneIntArgOutputInt(args, position, namespace) { x: Int -> x ushr 1 }
private fun intOrFloatLiteral(value: Double, position: Position?): LiteralValue {
val intresult = value.toInt()

View File

@ -220,10 +220,6 @@ class ConstExprEvaluator {
"*" -> multiply(left, right)
"/" -> divide(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)
@ -423,32 +419,6 @@ class ConstExprEvaluator {
throw ExpressionException("cannot calculate $left & $right", left.position)
}
private fun rotateright(left: LiteralValue, right: LiteralValue): LiteralValue {
throw ExpressionException("ror not possible on literal values", left.position)
}
private fun rotateleft(left: LiteralValue, right: LiteralValue): LiteralValue {
throw ExpressionException("rol not possible on literal values", left.position)
}
private fun shiftright(left: LiteralValue, right: LiteralValue): LiteralValue {
if(left.intvalue!=null && right.intvalue !=null) {
val litval = LiteralValue(intvalue = left.intvalue.shr(right.intvalue))
litval.position = left.position
return litval
}
throw ExpressionException("cannot calculate $left >> $right", left.position)
}
private fun shiftleft(left: LiteralValue, right: LiteralValue): LiteralValue {
if(left.intvalue!=null && right.intvalue !=null) {
val litval = LiteralValue(intvalue = left.intvalue.shl(right.intvalue))
litval.position = left.position
return litval
}
throw ExpressionException("cannot calculate $left << $right", left.position)
}
private fun power(left: LiteralValue, right: LiteralValue): LiteralValue {
val error = "cannot calculate $left ** $right"
val litval = when {

View File

@ -78,23 +78,17 @@ T__76=77
T__77=78
T__78=79
T__79=80
T__80=81
T__81=82
T__82=83
T__83=84
T__84=85
T__85=86
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
LINECOMMENT=81
COMMENT=82
WS=83
EOL=84
NAME=85
DEC_INTEGER=86
HEX_INTEGER=87
BIN_INTEGER=88
FLOAT_NUMBER=89
STRING=90
INLINEASMBLOCK=91
'~'=1
':'=2
'goto'=3
@ -125,59 +119,53 @@ INLINEASMBLOCK=97
'/='=28
'*='=29
'**='=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
'to'=60
'and'=61
'or'=62
'xor'=63
'not'=64
'return'=65
'.'=66
'A'=67
'X'=68
'Y'=69
'AX'=70
'AY'=71
'XY'=72
'Pc'=73
'Pz'=74
'Pn'=75
'Pv'=76
'true'=77
'false'=78
'%asm'=79
'sub'=80
'->'=81
'{'=82
'}'=83
'?'=84
'if'=85
'else'=86
'&='=31
'|='=32
'^='=33
'++'=34
'--'=35
'('=36
')'=37
'+'=38
'-'=39
'**'=40
'*'=41
'/'=42
'<<'=43
'>>'=44
'<'=45
'>'=46
'<='=47
'>='=48
'=='=49
'!='=50
'&'=51
'^'=52
'|'=53
'to'=54
'and'=55
'or'=56
'xor'=57
'not'=58
'return'=59
'.'=60
'A'=61
'X'=62
'Y'=63
'AX'=64
'AY'=65
'XY'=66
'Pc'=67
'Pz'=68
'Pn'=69
'Pv'=70
'true'=71
'false'=72
'%asm'=73
'sub'=74
'->'=75
'{'=76
'}'=77
'?'=78
'if'=79
'else'=80

View File

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

View File

@ -78,23 +78,17 @@ T__76=77
T__77=78
T__78=79
T__79=80
T__80=81
T__81=82
T__82=83
T__83=84
T__84=85
T__85=86
LINECOMMENT=87
COMMENT=88
WS=89
EOL=90
NAME=91
DEC_INTEGER=92
HEX_INTEGER=93
BIN_INTEGER=94
FLOAT_NUMBER=95
STRING=96
INLINEASMBLOCK=97
LINECOMMENT=81
COMMENT=82
WS=83
EOL=84
NAME=85
DEC_INTEGER=86
HEX_INTEGER=87
BIN_INTEGER=88
FLOAT_NUMBER=89
STRING=90
INLINEASMBLOCK=91
'~'=1
':'=2
'goto'=3
@ -125,59 +119,53 @@ INLINEASMBLOCK=97
'/='=28
'*='=29
'**='=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
'to'=60
'and'=61
'or'=62
'xor'=63
'not'=64
'return'=65
'.'=66
'A'=67
'X'=68
'Y'=69
'AX'=70
'AY'=71
'XY'=72
'Pc'=73
'Pz'=74
'Pn'=75
'Pv'=76
'true'=77
'false'=78
'%asm'=79
'sub'=80
'->'=81
'{'=82
'}'=83
'?'=84
'if'=85
'else'=86
'&='=31
'|='=32
'^='=33
'++'=34
'--'=35
'('=36
')'=37
'+'=38
'-'=39
'**'=40
'*'=41
'/'=42
'<<'=43
'>>'=44
'<'=45
'>'=46
'<='=47
'>='=48
'=='=49
'!='=50
'&'=51
'^'=52
'|'=53
'to'=54
'and'=55
'or'=56
'xor'=57
'not'=58
'return'=59
'.'=60
'A'=61
'X'=62
'Y'=63
'AX'=64
'AY'=65
'XY'=66
'Pc'=67
'Pz'=68
'Pn'=69
'Pv'=70
'true'=71
'false'=72
'%asm'=73
'sub'=74
'->'=75
'{'=76
'}'=77
'?'=78
'if'=79
'else'=80

View File

@ -28,9 +28,8 @@ public class il65Parser extends Parser {
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, T__65=66,
T__66=67, T__67=68, T__68=69, T__69=70, T__70=71, T__71=72, T__72=73,
T__73=74, T__74=75, T__75=76, T__76=77, T__77=78, T__78=79, T__79=80,
T__80=81, T__81=82, T__82=83, T__83=84, T__84=85, T__85=86, LINECOMMENT=87,
COMMENT=88, WS=89, EOL=90, NAME=91, DEC_INTEGER=92, HEX_INTEGER=93, BIN_INTEGER=94,
FLOAT_NUMBER=95, STRING=96, INLINEASMBLOCK=97;
LINECOMMENT=81, COMMENT=82, WS=83, EOL=84, NAME=85, DEC_INTEGER=86, HEX_INTEGER=87,
BIN_INTEGER=88, FLOAT_NUMBER=89, STRING=90, INLINEASMBLOCK=91;
public static final int
RULE_module = 0, RULE_modulestatement = 1, RULE_block = 2, RULE_statement = 3,
RULE_labeldef = 4, RULE_unconditionaljump = 5, RULE_directive = 6, RULE_directivearg = 7,
@ -60,12 +59,11 @@ public class il65Parser extends Parser {
"'%address'", "'%import'", "'%breakpoint'", "'%asminclude'", "'%asmbinary'",
"'%option'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='", "'>>@='",
"'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'", "'-'", "'**'",
"'*'", "'/'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'<'", "'>'", "'<='",
"'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'", "'or'",
"'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'",
"'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'-='", "'/='", "'*='", "'**='", "'&='", "'|='", "'^='", "'++'", "'--'",
"'('", "')'", "'+'", "'-'", "'**'", "'*'", "'/'", "'<<'", "'>>'", "'<'",
"'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'", "'to'", "'and'",
"'or'", "'xor'", "'not'", "'return'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'AY'", "'XY'", "'Pc'", "'Pz'", "'Pn'", "'Pv'", "'true'", "'false'", "'%asm'",
"'sub'", "'->'", "'{'", "'}'", "'?'", "'if'", "'else'"
};
private static final String[] _SYMBOLIC_NAMES = {
@ -75,9 +73,9 @@ public class il65Parser extends Parser {
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, "LINECOMMENT", "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING", "INLINEASMBLOCK"
null, 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);
@ -293,7 +291,7 @@ public class il65Parser extends Parser {
setState(100);
_errHandler.sync(this);
_la = _input.LA(1);
if (((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (DEC_INTEGER - 92)) | (1L << (HEX_INTEGER - 92)) | (1L << (BIN_INTEGER - 92)))) != 0)) {
if (((((_la - 86)) & ~0x3f) == 0 && ((1L << (_la - 86)) & ((1L << (DEC_INTEGER - 86)) | (1L << (HEX_INTEGER - 86)) | (1L << (BIN_INTEGER - 86)))) != 0)) {
{
setState(99);
integerliteral();
@ -1057,7 +1055,7 @@ public class il65Parser extends Parser {
setState(185);
((AugassignmentContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (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))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__25) | (1L << T__26) | (1L << T__27) | (1L << T__28) | (1L << T__29) | (1L << T__30) | (1L << T__31) | (1L << T__32))) != 0)) ) {
((AugassignmentContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
@ -1160,7 +1158,7 @@ public class il65Parser extends Parser {
setState(194);
((PostincrdecrContext)_localctx).operator = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__37 || _la==T__38) ) {
if ( !(_la==T__33 || _la==T__34) ) {
((PostincrdecrContext)_localctx).operator = (Token)_errHandler.recoverInline(this);
}
else {
@ -1240,11 +1238,11 @@ public class il65Parser extends Parser {
case 1:
{
setState(197);
match(T__39);
match(T__35);
setState(198);
expression(0);
setState(199);
match(T__40);
match(T__36);
}
break;
case 2:
@ -1258,7 +1256,7 @@ public class il65Parser extends Parser {
setState(202);
((ExpressionContext)_localctx).prefix = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__41) | (1L << T__42))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__37) | (1L << T__38))) != 0)) ) {
((ExpressionContext)_localctx).prefix = (Token)_errHandler.recoverInline(this);
}
else {
@ -1273,7 +1271,7 @@ public class il65Parser extends Parser {
case 4:
{
setState(204);
((ExpressionContext)_localctx).prefix = match(T__63);
((ExpressionContext)_localctx).prefix = match(T__57);
setState(205);
expression(5);
}
@ -1324,7 +1322,7 @@ public class il65Parser extends Parser {
setState(212);
if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)");
setState(213);
((ExpressionContext)_localctx).bop = match(T__43);
((ExpressionContext)_localctx).bop = match(T__39);
setState(214);
((ExpressionContext)_localctx).right = expression(19);
}
@ -1340,7 +1338,7 @@ public class il65Parser extends Parser {
setState(216);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__44 || _la==T__45) ) {
if ( !(_la==T__40 || _la==T__41) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1363,7 +1361,7 @@ public class il65Parser extends Parser {
setState(219);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__41 || _la==T__42) ) {
if ( !(_la==T__37 || _la==T__38) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1386,7 +1384,7 @@ public class il65Parser extends Parser {
setState(222);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__46) | (1L << T__47) | (1L << T__48) | (1L << T__49))) != 0)) ) {
if ( !(_la==T__42 || _la==T__43) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1409,7 +1407,7 @@ public class il65Parser extends Parser {
setState(225);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__50) | (1L << T__51) | (1L << T__52) | (1L << T__53))) != 0)) ) {
if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__44) | (1L << T__45) | (1L << T__46) | (1L << T__47))) != 0)) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1432,7 +1430,7 @@ public class il65Parser extends Parser {
setState(228);
((ExpressionContext)_localctx).bop = _input.LT(1);
_la = _input.LA(1);
if ( !(_la==T__54 || _la==T__55) ) {
if ( !(_la==T__48 || _la==T__49) ) {
((ExpressionContext)_localctx).bop = (Token)_errHandler.recoverInline(this);
}
else {
@ -1453,7 +1451,7 @@ public class il65Parser extends Parser {
setState(230);
if (!(precpred(_ctx, 12))) throw new FailedPredicateException(this, "precpred(_ctx, 12)");
setState(231);
((ExpressionContext)_localctx).bop = match(T__56);
((ExpressionContext)_localctx).bop = match(T__50);
setState(232);
((ExpressionContext)_localctx).right = expression(13);
}
@ -1467,7 +1465,7 @@ public class il65Parser extends Parser {
setState(233);
if (!(precpred(_ctx, 11))) throw new FailedPredicateException(this, "precpred(_ctx, 11)");
setState(234);
((ExpressionContext)_localctx).bop = match(T__57);
((ExpressionContext)_localctx).bop = match(T__51);
setState(235);
((ExpressionContext)_localctx).right = expression(12);
}
@ -1481,7 +1479,7 @@ public class il65Parser extends Parser {
setState(236);
if (!(precpred(_ctx, 10))) throw new FailedPredicateException(this, "precpred(_ctx, 10)");
setState(237);
((ExpressionContext)_localctx).bop = match(T__58);
((ExpressionContext)_localctx).bop = match(T__52);
setState(238);
((ExpressionContext)_localctx).right = expression(11);
}
@ -1495,7 +1493,7 @@ public class il65Parser extends Parser {
setState(239);
if (!(precpred(_ctx, 9))) throw new FailedPredicateException(this, "precpred(_ctx, 9)");
setState(240);
match(T__59);
match(T__53);
setState(241);
((ExpressionContext)_localctx).rangeto = expression(10);
}
@ -1509,7 +1507,7 @@ public class il65Parser extends Parser {
setState(242);
if (!(precpred(_ctx, 8))) throw new FailedPredicateException(this, "precpred(_ctx, 8)");
setState(243);
((ExpressionContext)_localctx).bop = match(T__60);
((ExpressionContext)_localctx).bop = match(T__54);
setState(244);
((ExpressionContext)_localctx).right = expression(9);
}
@ -1523,7 +1521,7 @@ public class il65Parser extends Parser {
setState(245);
if (!(precpred(_ctx, 7))) throw new FailedPredicateException(this, "precpred(_ctx, 7)");
setState(246);
((ExpressionContext)_localctx).bop = match(T__61);
((ExpressionContext)_localctx).bop = match(T__55);
setState(247);
((ExpressionContext)_localctx).right = expression(8);
}
@ -1537,7 +1535,7 @@ public class il65Parser extends Parser {
setState(248);
if (!(precpred(_ctx, 6))) throw new FailedPredicateException(this, "precpred(_ctx, 6)");
setState(249);
((ExpressionContext)_localctx).bop = match(T__62);
((ExpressionContext)_localctx).bop = match(T__56);
setState(250);
((ExpressionContext)_localctx).right = expression(7);
}
@ -1612,11 +1610,11 @@ public class il65Parser extends Parser {
break;
}
setState(262);
match(T__39);
match(T__35);
setState(264);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__57) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{
setState(263);
expression_list();
@ -1624,7 +1622,7 @@ public class il65Parser extends Parser {
}
setState(266);
match(T__40);
match(T__36);
}
}
catch (RecognitionException re) {
@ -1678,11 +1676,11 @@ public class il65Parser extends Parser {
break;
}
setState(272);
match(T__39);
match(T__35);
setState(274);
_errHandler.sync(this);
_la = _input.LA(1);
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__39) | (1L << T__41) | (1L << T__42))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__74 - 64)) | (1L << (T__75 - 64)) | (1L << (T__76 - 64)) | (1L << (T__77 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__0) | (1L << T__23) | (1L << T__35) | (1L << T__37) | (1L << T__38) | (1L << T__57) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__70 - 64)) | (1L << (T__71 - 64)) | (1L << (NAME - 64)) | (1L << (DEC_INTEGER - 64)) | (1L << (HEX_INTEGER - 64)) | (1L << (BIN_INTEGER - 64)) | (1L << (FLOAT_NUMBER - 64)) | (1L << (STRING - 64)))) != 0)) {
{
setState(273);
expression_list();
@ -1690,7 +1688,7 @@ public class il65Parser extends Parser {
}
setState(276);
match(T__40);
match(T__36);
}
}
catch (RecognitionException re) {
@ -1772,7 +1770,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(286);
match(T__64);
match(T__58);
setState(288);
_errHandler.sync(this);
switch ( getInterpreter().adaptivePredict(_input,22,_ctx) ) {
@ -1854,7 +1852,7 @@ public class il65Parser extends Parser {
{
{
setState(293);
match(T__65);
match(T__59);
setState(294);
match(NAME);
}
@ -1896,7 +1894,7 @@ public class il65Parser extends Parser {
{
setState(299);
_la = _input.LA(1);
if ( !(((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)))) != 0)) ) {
if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (T__60 - 61)) | (1L << (T__61 - 61)) | (1L << (T__62 - 61)) | (1L << (T__63 - 61)) | (1L << (T__64 - 61)) | (1L << (T__65 - 61)) | (1L << (T__66 - 61)) | (1L << (T__67 - 61)) | (1L << (T__68 - 61)) | (1L << (T__69 - 61)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1936,7 +1934,7 @@ public class il65Parser extends Parser {
{
setState(301);
_la = _input.LA(1);
if ( !(((((_la - 92)) & ~0x3f) == 0 && ((1L << (_la - 92)) & ((1L << (DEC_INTEGER - 92)) | (1L << (HEX_INTEGER - 92)) | (1L << (BIN_INTEGER - 92)))) != 0)) ) {
if ( !(((((_la - 86)) & ~0x3f) == 0 && ((1L << (_la - 86)) & ((1L << (DEC_INTEGER - 86)) | (1L << (HEX_INTEGER - 86)) | (1L << (BIN_INTEGER - 86)))) != 0)) ) {
_errHandler.recoverInline(this);
}
else {
@ -1973,7 +1971,7 @@ public class il65Parser extends Parser {
{
setState(303);
_la = _input.LA(1);
if ( !(_la==T__76 || _la==T__77) ) {
if ( !(_la==T__70 || _la==T__71) ) {
_errHandler.recoverInline(this);
}
else {
@ -2145,8 +2143,8 @@ public class il65Parser extends Parser {
integerliteral();
}
break;
case T__76:
case T__77:
case T__70:
case T__71:
enterOuterAlt(_localctx, 2);
{
setState(321);
@ -2204,7 +2202,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(327);
match(T__78);
match(T__72);
setState(328);
match(INLINEASMBLOCK);
}
@ -2251,11 +2249,11 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(330);
match(T__79);
match(T__73);
setState(331);
identifier();
setState(332);
match(T__39);
match(T__35);
setState(334);
_errHandler.sync(this);
_la = _input.LA(1);
@ -2267,15 +2265,15 @@ public class il65Parser extends Parser {
}
setState(336);
match(T__40);
match(T__36);
setState(337);
match(T__80);
match(T__74);
setState(338);
match(T__39);
match(T__35);
setState(340);
_errHandler.sync(this);
_la = _input.LA(1);
if (((((_la - 67)) & ~0x3f) == 0 && ((1L << (_la - 67)) & ((1L << (T__66 - 67)) | (1L << (T__67 - 67)) | (1L << (T__68 - 67)) | (1L << (T__69 - 67)) | (1L << (T__70 - 67)) | (1L << (T__71 - 67)) | (1L << (T__72 - 67)) | (1L << (T__73 - 67)) | (1L << (T__74 - 67)) | (1L << (T__75 - 67)) | (1L << (T__83 - 67)))) != 0)) {
if (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (T__60 - 61)) | (1L << (T__61 - 61)) | (1L << (T__62 - 61)) | (1L << (T__63 - 61)) | (1L << (T__64 - 61)) | (1L << (T__65 - 61)) | (1L << (T__66 - 61)) | (1L << (T__67 - 61)) | (1L << (T__68 - 61)) | (1L << (T__69 - 61)) | (1L << (T__77 - 61)))) != 0)) {
{
setState(339);
sub_returns();
@ -2283,7 +2281,7 @@ public class il65Parser extends Parser {
}
setState(342);
match(T__40);
match(T__36);
setState(347);
_errHandler.sync(this);
switch (_input.LA(1)) {
@ -2293,7 +2291,7 @@ public class il65Parser extends Parser {
sub_address();
}
break;
case T__81:
case T__75:
{
{
setState(344);
@ -2344,13 +2342,13 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(349);
match(T__81);
match(T__75);
setState(350);
match(EOL);
setState(355);
_errHandler.sync(this);
_la = _input.LA(1);
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22))) != 0) || ((((_la - 65)) & ~0x3f) == 0 && ((1L << (_la - 65)) & ((1L << (T__64 - 65)) | (1L << (T__66 - 65)) | (1L << (T__67 - 65)) | (1L << (T__68 - 65)) | (1L << (T__69 - 65)) | (1L << (T__70 - 65)) | (1L << (T__71 - 65)) | (1L << (T__72 - 65)) | (1L << (T__73 - 65)) | (1L << (T__74 - 65)) | (1L << (T__75 - 65)) | (1L << (T__78 - 65)) | (1L << (T__79 - 65)) | (1L << (T__84 - 65)) | (1L << (EOL - 65)) | (1L << (NAME - 65)))) != 0)) {
while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__2) | (1L << T__3) | (1L << T__4) | (1L << T__5) | (1L << T__6) | (1L << T__7) | (1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17) | (1L << T__18) | (1L << T__19) | (1L << T__20) | (1L << T__21) | (1L << T__22) | (1L << T__58) | (1L << T__60) | (1L << T__61) | (1L << T__62))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (T__63 - 64)) | (1L << (T__64 - 64)) | (1L << (T__65 - 64)) | (1L << (T__66 - 64)) | (1L << (T__67 - 64)) | (1L << (T__68 - 64)) | (1L << (T__69 - 64)) | (1L << (T__72 - 64)) | (1L << (T__73 - 64)) | (1L << (T__78 - 64)) | (1L << (EOL - 64)) | (1L << (NAME - 64)))) != 0)) {
{
setState(353);
_errHandler.sync(this);
@ -2374,20 +2372,20 @@ public class il65Parser extends Parser {
case T__20:
case T__21:
case T__22:
case T__58:
case T__60:
case T__61:
case T__62:
case T__63:
case T__64:
case T__65:
case T__66:
case T__67:
case T__68:
case T__69:
case T__70:
case T__71:
case T__72:
case T__73:
case T__74:
case T__75:
case T__78:
case T__79:
case T__84:
case NAME:
{
setState(351);
@ -2409,7 +2407,7 @@ public class il65Parser extends Parser {
_la = _input.LA(1);
}
setState(358);
match(T__82);
match(T__76);
}
}
catch (RecognitionException re) {
@ -2566,23 +2564,23 @@ public class il65Parser extends Parser {
setState(384);
_errHandler.sync(this);
switch (_input.LA(1)) {
case T__83:
case T__77:
enterOuterAlt(_localctx, 1);
{
setState(375);
match(T__83);
match(T__77);
}
break;
case T__60:
case T__61:
case T__62:
case T__63:
case T__64:
case T__65:
case T__66:
case T__67:
case T__68:
case T__69:
case T__70:
case T__71:
case T__72:
case T__73:
case T__74:
case T__75:
enterOuterAlt(_localctx, 2);
{
{
@ -2644,10 +2642,10 @@ public class il65Parser extends Parser {
setState(388);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__83) {
if (_la==T__77) {
{
setState(387);
match(T__83);
match(T__77);
}
}
@ -2695,13 +2693,13 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(390);
match(T__84);
match(T__78);
setState(391);
match(T__39);
match(T__35);
setState(392);
expression(0);
setState(393);
match(T__40);
match(T__36);
setState(395);
_errHandler.sync(this);
_la = _input.LA(1);
@ -2734,27 +2732,27 @@ public class il65Parser extends Parser {
case T__20:
case T__21:
case T__22:
case T__58:
case T__60:
case T__61:
case T__62:
case T__63:
case T__64:
case T__65:
case T__66:
case T__67:
case T__68:
case T__69:
case T__70:
case T__71:
case T__72:
case T__73:
case T__74:
case T__75:
case T__78:
case T__79:
case T__84:
case NAME:
{
setState(397);
statement();
}
break;
case T__81:
case T__75:
{
setState(398);
statement_block();
@ -2776,7 +2774,7 @@ public class il65Parser extends Parser {
setState(405);
_errHandler.sync(this);
_la = _input.LA(1);
if (_la==T__85) {
if (_la==T__79) {
{
setState(404);
else_part();
@ -2820,7 +2818,7 @@ public class il65Parser extends Parser {
enterOuterAlt(_localctx, 1);
{
setState(409);
match(T__85);
match(T__79);
setState(411);
_errHandler.sync(this);
_la = _input.LA(1);
@ -2853,27 +2851,27 @@ public class il65Parser extends Parser {
case T__20:
case T__21:
case T__22:
case T__58:
case T__60:
case T__61:
case T__62:
case T__63:
case T__64:
case T__65:
case T__66:
case T__67:
case T__68:
case T__69:
case T__70:
case T__71:
case T__72:
case T__73:
case T__74:
case T__75:
case T__78:
case T__79:
case T__84:
case NAME:
{
setState(413);
statement();
}
break;
case T__81:
case T__75:
{
setState(414);
statement_block();
@ -2937,7 +2935,7 @@ public class il65Parser extends Parser {
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3c\u01a4\4\2\t\2\4"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3]\u01a4\4\2\t\2\4"+
"\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+
"\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+
"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+
@ -2968,21 +2966,21 @@ public class il65Parser extends Parser {
"\5)\u0187\n)\3*\3*\3*\3*\3*\5*\u018e\n*\3*\3*\5*\u0192\n*\3*\5*\u0195"+
"\n*\3*\5*\u0198\n*\3*\3*\3+\3+\5+\u019e\n+\3+\3+\5+\u01a2\n+\3+\2\3&,"+
"\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFH"+
"JLNPRT\2\17\3\2\6\16\3\2\23\31\3\2\34\'\3\2()\4\2\3\3,-\3\2/\60\3\2,-"+
"\3\2\61\64\3\2\658\3\29:\3\2EN\3\2^`\3\2OP\2\u01c7\2Z\3\2\2\2\4a\3\2\2"+
"\2\6c\3\2\2\2\bz\3\2\2\2\n|\3\2\2\2\f\177\3\2\2\2\16\u0085\3\2\2\2\20"+
"\u0096\3\2\2\2\22\u0098\3\2\2\2\24\u009e\3\2\2\2\26\u00a6\3\2\2\2\30\u00a9"+
"\3\2\2\2\32\u00ac\3\2\2\2\34\u00ae\3\2\2\2\36\u00b6\3\2\2\2 \u00ba\3\2"+
"\2\2\"\u00c1\3\2\2\2$\u00c3\3\2\2\2&\u00d4\3\2\2\2(\u0106\3\2\2\2*\u0110"+
"JLNPRT\2\17\3\2\6\16\3\2\23\31\3\2\34#\3\2$%\4\2\3\3()\3\2+,\3\2()\3\2"+
"-.\3\2/\62\3\2\63\64\3\2?H\3\2XZ\3\2IJ\2\u01c7\2Z\3\2\2\2\4a\3\2\2\2\6"+
"c\3\2\2\2\bz\3\2\2\2\n|\3\2\2\2\f\177\3\2\2\2\16\u0085\3\2\2\2\20\u0096"+
"\3\2\2\2\22\u0098\3\2\2\2\24\u009e\3\2\2\2\26\u00a6\3\2\2\2\30\u00a9\3"+
"\2\2\2\32\u00ac\3\2\2\2\34\u00ae\3\2\2\2\36\u00b6\3\2\2\2 \u00ba\3\2\2"+
"\2\"\u00c1\3\2\2\2$\u00c3\3\2\2\2&\u00d4\3\2\2\2(\u0106\3\2\2\2*\u0110"+
"\3\2\2\2,\u0118\3\2\2\2.\u0120\3\2\2\2\60\u0124\3\2\2\2\62\u0126\3\2\2"+
"\2\64\u012d\3\2\2\2\66\u012f\3\2\2\28\u0131\3\2\2\2:\u0133\3\2\2\2<\u013e"+
"\3\2\2\2>\u0140\3\2\2\2@\u0147\3\2\2\2B\u0149\3\2\2\2D\u014c\3\2\2\2F"+
"\u015f\3\2\2\2H\u016a\3\2\2\2J\u016d\3\2\2\2L\u0175\3\2\2\2N\u0182\3\2"+
"\2\2P\u0184\3\2\2\2R\u0188\3\2\2\2T\u019b\3\2\2\2VY\5\4\3\2WY\7\\\2\2"+
"XV\3\2\2\2XW\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2[]\3\2\2\2\\Z\3\2\2"+
"\2\2P\u0184\3\2\2\2R\u0188\3\2\2\2T\u019b\3\2\2\2VY\5\4\3\2WY\7V\2\2X"+
"V\3\2\2\2XW\3\2\2\2Y\\\3\2\2\2ZX\3\2\2\2Z[\3\2\2\2[]\3\2\2\2\\Z\3\2\2"+
"\2]^\7\2\2\3^\3\3\2\2\2_b\5\16\b\2`b\5\6\4\2a_\3\2\2\2a`\3\2\2\2b\5\3"+
"\2\2\2cd\7\3\2\2df\5\60\31\2eg\5\66\34\2fe\3\2\2\2fg\3\2\2\2gh\3\2\2\2"+
"hi\5F$\2ij\7\\\2\2j\7\3\2\2\2k{\5\16\b\2l{\5\24\13\2m{\5\22\n\2n{\5\26"+
"hi\5F$\2ij\7V\2\2j\7\3\2\2\2k{\5\16\b\2l{\5\24\13\2m{\5\22\n\2n{\5\26"+
"\f\2o{\5\30\r\2p{\5\36\20\2q{\5 \21\2r{\5\f\7\2s{\5$\23\2t{\5*\26\2u{"+
"\5R*\2v{\5D#\2w{\5B\"\2x{\5\n\6\2y{\5.\30\2zk\3\2\2\2zl\3\2\2\2zm\3\2"+
"\2\2zn\3\2\2\2zo\3\2\2\2zp\3\2\2\2zq\3\2\2\2zr\3\2\2\2zs\3\2\2\2zt\3\2"+
@ -3011,24 +3009,24 @@ public class il65Parser extends Parser {
"\u00be\u00c2\5\64\33\2\u00bf\u00c2\5\60\31\2\u00c0\u00c2\5\62\32\2\u00c1"+
"\u00be\3\2\2\2\u00c1\u00bf\3\2\2\2\u00c1\u00c0\3\2\2\2\u00c2#\3\2\2\2"+
"\u00c3\u00c4\5\"\22\2\u00c4\u00c5\t\5\2\2\u00c5%\3\2\2\2\u00c6\u00c7\b"+
"\24\1\2\u00c7\u00c8\7*\2\2\u00c8\u00c9\5&\24\2\u00c9\u00ca\7+\2\2\u00ca"+
"\24\1\2\u00c7\u00c8\7&\2\2\u00c8\u00c9\5&\24\2\u00c9\u00ca\7\'\2\2\u00ca"+
"\u00d5\3\2\2\2\u00cb\u00d5\5(\25\2\u00cc\u00cd\t\6\2\2\u00cd\u00d5\5&"+
"\24\25\u00ce\u00cf\7B\2\2\u00cf\u00d5\5&\24\7\u00d0\u00d5\5@!\2\u00d1"+
"\24\25\u00ce\u00cf\7<\2\2\u00cf\u00d5\5&\24\7\u00d0\u00d5\5@!\2\u00d1"+
"\u00d5\5\64\33\2\u00d2\u00d5\5\60\31\2\u00d3\u00d5\5\62\32\2\u00d4\u00c6"+
"\3\2\2\2\u00d4\u00cb\3\2\2\2\u00d4\u00cc\3\2\2\2\u00d4\u00ce\3\2\2\2\u00d4"+
"\u00d0\3\2\2\2\u00d4\u00d1\3\2\2\2\u00d4\u00d2\3\2\2\2\u00d4\u00d3\3\2"+
"\2\2\u00d5\u0101\3\2\2\2\u00d6\u00d7\f\24\2\2\u00d7\u00d8\7.\2\2\u00d8"+
"\2\2\u00d5\u0101\3\2\2\2\u00d6\u00d7\f\24\2\2\u00d7\u00d8\7*\2\2\u00d8"+
"\u0100\5&\24\25\u00d9\u00da\f\23\2\2\u00da\u00db\t\7\2\2\u00db\u0100\5"+
"&\24\24\u00dc\u00dd\f\22\2\2\u00dd\u00de\t\b\2\2\u00de\u0100\5&\24\23"+
"\u00df\u00e0\f\21\2\2\u00e0\u00e1\t\t\2\2\u00e1\u0100\5&\24\22\u00e2\u00e3"+
"\f\20\2\2\u00e3\u00e4\t\n\2\2\u00e4\u0100\5&\24\21\u00e5\u00e6\f\17\2"+
"\2\u00e6\u00e7\t\13\2\2\u00e7\u0100\5&\24\20\u00e8\u00e9\f\16\2\2\u00e9"+
"\u00ea\7;\2\2\u00ea\u0100\5&\24\17\u00eb\u00ec\f\r\2\2\u00ec\u00ed\7<"+
"\2\2\u00ed\u0100\5&\24\16\u00ee\u00ef\f\f\2\2\u00ef\u00f0\7=\2\2\u00f0"+
"\u0100\5&\24\r\u00f1\u00f2\f\13\2\2\u00f2\u00f3\7>\2\2\u00f3\u0100\5&"+
"\24\f\u00f4\u00f5\f\n\2\2\u00f5\u00f6\7?\2\2\u00f6\u0100\5&\24\13\u00f7"+
"\u00f8\f\t\2\2\u00f8\u00f9\7@\2\2\u00f9\u0100\5&\24\n\u00fa\u00fb\f\b"+
"\2\2\u00fb\u00fc\7A\2\2\u00fc\u0100\5&\24\t\u00fd\u00fe\f\27\2\2\u00fe"+
"\u00ea\7\65\2\2\u00ea\u0100\5&\24\17\u00eb\u00ec\f\r\2\2\u00ec\u00ed\7"+
"\66\2\2\u00ed\u0100\5&\24\16\u00ee\u00ef\f\f\2\2\u00ef\u00f0\7\67\2\2"+
"\u00f0\u0100\5&\24\r\u00f1\u00f2\f\13\2\2\u00f2\u00f3\78\2\2\u00f3\u0100"+
"\5&\24\f\u00f4\u00f5\f\n\2\2\u00f5\u00f6\79\2\2\u00f6\u0100\5&\24\13\u00f7"+
"\u00f8\f\t\2\2\u00f8\u00f9\7:\2\2\u00f9\u0100\5&\24\n\u00fa\u00fb\f\b"+
"\2\2\u00fb\u00fc\7;\2\2\u00fc\u0100\5&\24\t\u00fd\u00fe\f\27\2\2\u00fe"+
"\u0100\5\34\17\2\u00ff\u00d6\3\2\2\2\u00ff\u00d9\3\2\2\2\u00ff\u00dc\3"+
"\2\2\2\u00ff\u00df\3\2\2\2\u00ff\u00e2\3\2\2\2\u00ff\u00e5\3\2\2\2\u00ff"+
"\u00e8\3\2\2\2\u00ff\u00eb\3\2\2\2\u00ff\u00ee\3\2\2\2\u00ff\u00f1\3\2"+
@ -3036,58 +3034,59 @@ public class il65Parser extends Parser {
"\u00fd\3\2\2\2\u0100\u0103\3\2\2\2\u0101\u00ff\3\2\2\2\u0101\u0102\3\2"+
"\2\2\u0102\'\3\2\2\2\u0103\u0101\3\2\2\2\u0104\u0107\5\60\31\2\u0105\u0107"+
"\5\62\32\2\u0106\u0104\3\2\2\2\u0106\u0105\3\2\2\2\u0107\u0108\3\2\2\2"+
"\u0108\u010a\7*\2\2\u0109\u010b\5,\27\2\u010a\u0109\3\2\2\2\u010a\u010b"+
"\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\7+\2\2\u010d)\3\2\2\2\u010e\u0111"+
"\5\60\31\2\u010f\u0111\5\62\32\2\u0110\u010e\3\2\2\2\u0110\u010f\3\2\2"+
"\2\u0111\u0112\3\2\2\2\u0112\u0114\7*\2\2\u0113\u0115\5,\27\2\u0114\u0113"+
"\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0117\7+\2\2\u0117"+
"+\3\2\2\2\u0118\u011d\5&\24\2\u0119\u011a\7\17\2\2\u011a\u011c\5&\24\2"+
"\u011b\u0119\3\2\2\2\u011c\u011f\3\2\2\2\u011d\u011b\3\2\2\2\u011d\u011e"+
"\3\2\2\2\u011e-\3\2\2\2\u011f\u011d\3\2\2\2\u0120\u0122\7C\2\2\u0121\u0123"+
"\5,\27\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2\2\u0123/\3\2\2\2\u0124"+
"\u0125\7]\2\2\u0125\61\3\2\2\2\u0126\u0129\7]\2\2\u0127\u0128\7D\2\2\u0128"+
"\u012a\7]\2\2\u0129\u0127\3\2\2\2\u012a\u012b\3\2\2\2\u012b\u0129\3\2"+
"\2\2\u012b\u012c\3\2\2\2\u012c\63\3\2\2\2\u012d\u012e\t\f\2\2\u012e\65"+
"\3\2\2\2\u012f\u0130\t\r\2\2\u0130\67\3\2\2\2\u0131\u0132\t\16\2\2\u0132"+
"9\3\2\2\2\u0133\u0134\7\32\2\2\u0134\u0139\5&\24\2\u0135\u0136\7\17\2"+
"\2\u0136\u0138\5&\24\2\u0137\u0135\3\2\2\2\u0138\u013b\3\2\2\2\u0139\u0137"+
"\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013c\3\2\2\2\u013b\u0139\3\2\2\2\u013c"+
"\u013d\7\33\2\2\u013d;\3\2\2\2\u013e\u013f\7b\2\2\u013f=\3\2\2\2\u0140"+
"\u0141\7a\2\2\u0141?\3\2\2\2\u0142\u0148\5\66\34\2\u0143\u0148\58\35\2"+
"\u0144\u0148\5:\36\2\u0145\u0148\5<\37\2\u0146\u0148\5> \2\u0147\u0142"+
"\3\2\2\2\u0147\u0143\3\2\2\2\u0147\u0144\3\2\2\2\u0147\u0145\3\2\2\2\u0147"+
"\u0146\3\2\2\2\u0148A\3\2\2\2\u0149\u014a\7Q\2\2\u014a\u014b\7c\2\2\u014b"+
"C\3\2\2\2\u014c\u014d\7R\2\2\u014d\u014e\5\60\31\2\u014e\u0150\7*\2\2"+
"\u014f\u0151\5J&\2\u0150\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0152"+
"\3\2\2\2\u0152\u0153\7+\2\2\u0153\u0154\7S\2\2\u0154\u0156\7*\2\2\u0155"+
"\u0157\5N(\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0158\3\2\2"+
"\2\u0158\u015d\7+\2\2\u0159\u015e\5H%\2\u015a\u015b\5F$\2\u015b\u015c"+
"\7\\\2\2\u015c\u015e\3\2\2\2\u015d\u0159\3\2\2\2\u015d\u015a\3\2\2\2\u015e"+
"E\3\2\2\2\u015f\u0160\7T\2\2\u0160\u0165\7\\\2\2\u0161\u0164\5\b\5\2\u0162"+
"\u0164\7\\\2\2\u0163\u0161\3\2\2\2\u0163\u0162\3\2\2\2\u0164\u0167\3\2"+
"\2\2\u0165\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0168\3\2\2\2\u0167"+
"\u0165\3\2\2\2\u0168\u0169\7U\2\2\u0169G\3\2\2\2\u016a\u016b\7\20\2\2"+
"\u016b\u016c\5\66\34\2\u016cI\3\2\2\2\u016d\u0172\5L\'\2\u016e\u016f\7"+
"\17\2\2\u016f\u0171\5L\'\2\u0170\u016e\3\2\2\2\u0171\u0174\3\2\2\2\u0172"+
"\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173K\3\2\2\2\u0174\u0172\3\2\2\2"+
"\u0175\u0176\5\60\31\2\u0176\u0177\7\4\2\2\u0177\u0178\5\64\33\2\u0178"+
"M\3\2\2\2\u0179\u0183\7V\2\2\u017a\u017f\5P)\2\u017b\u017c\7\17\2\2\u017c"+
"\u017e\5P)\2\u017d\u017b\3\2\2\2\u017e\u0181\3\2\2\2\u017f\u017d\3\2\2"+
"\2\u017f\u0180\3\2\2\2\u0180\u0183\3\2\2\2\u0181\u017f\3\2\2\2\u0182\u0179"+
"\3\2\2\2\u0182\u017a\3\2\2\2\u0183O\3\2\2\2\u0184\u0186\5\64\33\2\u0185"+
"\u0187\7V\2\2\u0186\u0185\3\2\2\2\u0186\u0187\3\2\2\2\u0187Q\3\2\2\2\u0188"+
"\u0189\7W\2\2\u0189\u018a\7*\2\2\u018a\u018b\5&\24\2\u018b\u018d\7+\2"+
"\2\u018c\u018e\7\\\2\2\u018d\u018c\3\2\2\2\u018d\u018e\3\2\2\2\u018e\u0191"+
"\3\2\2\2\u018f\u0192\5\b\5\2\u0190\u0192\5F$\2\u0191\u018f\3\2\2\2\u0191"+
"\u0190\3\2\2\2\u0192\u0194\3\2\2\2\u0193\u0195\7\\\2\2\u0194\u0193\3\2"+
"\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196\u0198\5T+\2\u0197\u0196"+
"\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2\2\u0199\u019a\7\\\2\2\u019a"+
"S\3\2\2\2\u019b\u019d\7X\2\2\u019c\u019e\7\\\2\2\u019d\u019c\3\2\2\2\u019d"+
"\u019e\3\2\2\2\u019e\u01a1\3\2\2\2\u019f\u01a2\5\b\5\2\u01a0\u01a2\5F"+
"$\2\u01a1\u019f\3\2\2\2\u01a1\u01a0\3\2\2\2\u01a2U\3\2\2\2+XZafz\u0083"+
"\u0087\u008e\u0091\u0096\u009a\u00a0\u00b2\u00c1\u00d4\u00ff\u0101\u0106"+
"\u010a\u0110\u0114\u011d\u0122\u012b\u0139\u0147\u0150\u0156\u015d\u0163"+
"\u0165\u0172\u017f\u0182\u0186\u018d\u0191\u0194\u0197\u019d\u01a1";
"\u0108\u010a\7&\2\2\u0109\u010b\5,\27\2\u010a\u0109\3\2\2\2\u010a\u010b"+
"\3\2\2\2\u010b\u010c\3\2\2\2\u010c\u010d\7\'\2\2\u010d)\3\2\2\2\u010e"+
"\u0111\5\60\31\2\u010f\u0111\5\62\32\2\u0110\u010e\3\2\2\2\u0110\u010f"+
"\3\2\2\2\u0111\u0112\3\2\2\2\u0112\u0114\7&\2\2\u0113\u0115\5,\27\2\u0114"+
"\u0113\3\2\2\2\u0114\u0115\3\2\2\2\u0115\u0116\3\2\2\2\u0116\u0117\7\'"+
"\2\2\u0117+\3\2\2\2\u0118\u011d\5&\24\2\u0119\u011a\7\17\2\2\u011a\u011c"+
"\5&\24\2\u011b\u0119\3\2\2\2\u011c\u011f\3\2\2\2\u011d\u011b\3\2\2\2\u011d"+
"\u011e\3\2\2\2\u011e-\3\2\2\2\u011f\u011d\3\2\2\2\u0120\u0122\7=\2\2\u0121"+
"\u0123\5,\27\2\u0122\u0121\3\2\2\2\u0122\u0123\3\2\2\2\u0123/\3\2\2\2"+
"\u0124\u0125\7W\2\2\u0125\61\3\2\2\2\u0126\u0129\7W\2\2\u0127\u0128\7"+
">\2\2\u0128\u012a\7W\2\2\u0129\u0127\3\2\2\2\u012a\u012b\3\2\2\2\u012b"+
"\u0129\3\2\2\2\u012b\u012c\3\2\2\2\u012c\63\3\2\2\2\u012d\u012e\t\f\2"+
"\2\u012e\65\3\2\2\2\u012f\u0130\t\r\2\2\u0130\67\3\2\2\2\u0131\u0132\t"+
"\16\2\2\u01329\3\2\2\2\u0133\u0134\7\32\2\2\u0134\u0139\5&\24\2\u0135"+
"\u0136\7\17\2\2\u0136\u0138\5&\24\2\u0137\u0135\3\2\2\2\u0138\u013b\3"+
"\2\2\2\u0139\u0137\3\2\2\2\u0139\u013a\3\2\2\2\u013a\u013c\3\2\2\2\u013b"+
"\u0139\3\2\2\2\u013c\u013d\7\33\2\2\u013d;\3\2\2\2\u013e\u013f\7\\\2\2"+
"\u013f=\3\2\2\2\u0140\u0141\7[\2\2\u0141?\3\2\2\2\u0142\u0148\5\66\34"+
"\2\u0143\u0148\58\35\2\u0144\u0148\5:\36\2\u0145\u0148\5<\37\2\u0146\u0148"+
"\5> \2\u0147\u0142\3\2\2\2\u0147\u0143\3\2\2\2\u0147\u0144\3\2\2\2\u0147"+
"\u0145\3\2\2\2\u0147\u0146\3\2\2\2\u0148A\3\2\2\2\u0149\u014a\7K\2\2\u014a"+
"\u014b\7]\2\2\u014bC\3\2\2\2\u014c\u014d\7L\2\2\u014d\u014e\5\60\31\2"+
"\u014e\u0150\7&\2\2\u014f\u0151\5J&\2\u0150\u014f\3\2\2\2\u0150\u0151"+
"\3\2\2\2\u0151\u0152\3\2\2\2\u0152\u0153\7\'\2\2\u0153\u0154\7M\2\2\u0154"+
"\u0156\7&\2\2\u0155\u0157\5N(\2\u0156\u0155\3\2\2\2\u0156\u0157\3\2\2"+
"\2\u0157\u0158\3\2\2\2\u0158\u015d\7\'\2\2\u0159\u015e\5H%\2\u015a\u015b"+
"\5F$\2\u015b\u015c\7V\2\2\u015c\u015e\3\2\2\2\u015d\u0159\3\2\2\2\u015d"+
"\u015a\3\2\2\2\u015eE\3\2\2\2\u015f\u0160\7N\2\2\u0160\u0165\7V\2\2\u0161"+
"\u0164\5\b\5\2\u0162\u0164\7V\2\2\u0163\u0161\3\2\2\2\u0163\u0162\3\2"+
"\2\2\u0164\u0167\3\2\2\2\u0165\u0163\3\2\2\2\u0165\u0166\3\2\2\2\u0166"+
"\u0168\3\2\2\2\u0167\u0165\3\2\2\2\u0168\u0169\7O\2\2\u0169G\3\2\2\2\u016a"+
"\u016b\7\20\2\2\u016b\u016c\5\66\34\2\u016cI\3\2\2\2\u016d\u0172\5L\'"+
"\2\u016e\u016f\7\17\2\2\u016f\u0171\5L\'\2\u0170\u016e\3\2\2\2\u0171\u0174"+
"\3\2\2\2\u0172\u0170\3\2\2\2\u0172\u0173\3\2\2\2\u0173K\3\2\2\2\u0174"+
"\u0172\3\2\2\2\u0175\u0176\5\60\31\2\u0176\u0177\7\4\2\2\u0177\u0178\5"+
"\64\33\2\u0178M\3\2\2\2\u0179\u0183\7P\2\2\u017a\u017f\5P)\2\u017b\u017c"+
"\7\17\2\2\u017c\u017e\5P)\2\u017d\u017b\3\2\2\2\u017e\u0181\3\2\2\2\u017f"+
"\u017d\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0183\3\2\2\2\u0181\u017f\3\2"+
"\2\2\u0182\u0179\3\2\2\2\u0182\u017a\3\2\2\2\u0183O\3\2\2\2\u0184\u0186"+
"\5\64\33\2\u0185\u0187\7P\2\2\u0186\u0185\3\2\2\2\u0186\u0187\3\2\2\2"+
"\u0187Q\3\2\2\2\u0188\u0189\7Q\2\2\u0189\u018a\7&\2\2\u018a\u018b\5&\24"+
"\2\u018b\u018d\7\'\2\2\u018c\u018e\7V\2\2\u018d\u018c\3\2\2\2\u018d\u018e"+
"\3\2\2\2\u018e\u0191\3\2\2\2\u018f\u0192\5\b\5\2\u0190\u0192\5F$\2\u0191"+
"\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192\u0194\3\2\2\2\u0193\u0195\7V"+
"\2\2\u0194\u0193\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196"+
"\u0198\5T+\2\u0197\u0196\3\2\2\2\u0197\u0198\3\2\2\2\u0198\u0199\3\2\2"+
"\2\u0199\u019a\7V\2\2\u019aS\3\2\2\2\u019b\u019d\7R\2\2\u019c\u019e\7"+
"V\2\2\u019d\u019c\3\2\2\2\u019d\u019e\3\2\2\2\u019e\u01a1\3\2\2\2\u019f"+
"\u01a2\5\b\5\2\u01a0\u01a2\5F$\2\u01a1\u019f\3\2\2\2\u01a1\u01a0\3\2\2"+
"\2\u01a2U\3\2\2\2+XZafz\u0083\u0087\u008e\u0091\u0096\u009a\u00a0\u00b2"+
"\u00c1\u00d4\u00ff\u0101\u0106\u010a\u0110\u0114\u011d\u0122\u012b\u0139"+
"\u0147\u0150\u0156\u015d\u0163\u0165\u0172\u017f\u0182\u0186\u018d\u0191"+
"\u0194\u0197\u019d\u01a1";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -1,88 +1,50 @@
package il65.stackvm
import kotlin.experimental.and
import il65.ast.DataType
import il65.compiler.Mflpt5
import il65.compiler.Petscii
import java.util.*
enum class Opcode {
// pushing values on the (evaluation) stack
PUSH, // push constant byte value
PUSH_W, // push constant word value
PUSH_F, // push constant float value
PUSH_LOCAL, // push block-local variable (byte)
PUSH_LOCAL_W, // push block-local variable (word)
PUSH_LOCAL_F, // push block-local variable (float)
PUSH_LOCAL, // push block-local variable
// popping values off the (evaluation) stack, possibly storing them in another location
DISCARD, // discard X bytes from the top of the stack
POP_MEM, // pop byte value into destination memory address
POP_MEM_W, // pop word value into destination memory address
POP_MEM_F, // pop float value into destination memory address
POP_LOCAL, // pop byte value into block-local variable
POP_LOCAL_W, // pop word value into block-local variable
POP_LOCAL_F, // pop float value into block-local variable
POP_MEM, // pop value into destination memory address
POP_LOCAL, // pop value into block-local variable
// integer and bitwise arithmetic
// numeric and bitwise arithmetic
ADD,
SUB,
MUL,
DIV,
ADD_W,
SUB_W,
MUL_W,
DIV_W,
NEG,
SHL,
SHR,
ROL,
ROR,
SHL_W,
SHR_W,
ROL_W,
ROR_W,
AND,
OR,
XOR,
NOT,
AND_W,
OR_W,
XOR_W,
NOT_W,
INV,
// floating point arithmetic
ADD_F,
SUB_F,
MUL_F,
DIV_F,
NEG_F,
// logical operations (?)
// increment, decrement
INC,
INC_W,
INC_F,
INC_MEM,
INC_MEM_W,
INC_MEM_F,
INC_LOCAL,
INC_LOCAL_W,
INC_LOCAL_F,
DEC,
DEC_W,
DEC_F,
DEC_MEM,
DEC_MEM_W,
DEC_MEM_F,
DEC_LOCAL,
DEC_LOCAL_W,
DEC_LOCAL_F,
// conversions
CV_F_B, // float -> byte (truncated)
CV_F_W, // float -> word (truncated)
CV_B_F, // byte -> float
CV_W_F, // word -> float
CV_B_W, // byte -> word
CV_W_B, // word -> byte
// comparisons (?)
@ -98,7 +60,12 @@ enum class Opcode {
TERMINATE
}
private class Memory {
enum class Syscall(val callNr: Short) {
WRITECHR(10),
WRITESTR(11)
}
class Memory {
private val mem = ShortArray(65536) // shorts because byte is signed and we store values 0..255
fun getByte(address: Int): Short {
@ -106,6 +73,7 @@ private class Memory {
}
fun setByte(address: Int, value: Short) {
if(value<0 || value>255) throw VmExecutionException("byte value not 0..255")
mem[address] = value
}
@ -113,28 +81,354 @@ private class Memory {
return 256*mem[address] + mem[address+1]
}
fun setWord(address: Int, value: Short) {
fun setWord(address: Int, value: Int) {
if(value<0 || value>65535) throw VmExecutionException("word value not 0..65535")
mem[address] = (value / 256).toShort()
mem[address+1] = value.and(255)
mem[address+1] = value.and(255).toShort()
}
fun getCopy() = mem.copyOf()
fun setFloat(address: Int, value: Double) {
val mflpt5 = Mflpt5.fromNumber(value)
mem[address] = mflpt5.b0
mem[address+1] = mflpt5.b1
mem[address+2] = mflpt5.b2
mem[address+3] = mflpt5.b3
mem[address+4] = mflpt5.b4
}
fun getFloat(address: Int): Double {
return Mflpt5(mem[address], mem[address+1], mem[address+2], mem[address+3], mem[address+4]).toDouble()
}
}
data class Instruction(val opcode: Opcode, val args: List<Any>) {
data class Value(val type: DataType,
val byteval: Short?,
val wordval: Int?,
val floatval: Double?)
{
fun add(other: Value): Value {
val v1: Number = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
floatval!=null -> floatval
else -> throw VmExecutionException("add missing value 1")
}
val v2: Number = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
other.floatval!=null -> other.floatval
else -> throw VmExecutionException("add missing value 2")
}
val result = v1.toDouble() + v2.toDouble()
return resultvalue(type, result)
}
fun sub(other: Value): Value {
val v1: Number = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
floatval!=null -> floatval
else -> throw VmExecutionException("sub missing value 1")
}
val v2: Number = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
other.floatval!=null -> other.floatval
else -> throw VmExecutionException("sub missing value 2")
}
val result = v1.toDouble() - v2.toDouble()
return resultvalue(type, result)
}
fun mul(other: Value): Value {
val v1: Number = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
floatval!=null -> floatval
else -> throw VmExecutionException("mul missing value 1")
}
val v2: Number = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
other.floatval!=null -> other.floatval
else -> throw VmExecutionException("mul missing value 2")
}
val result = v1.toDouble() * v2.toDouble()
return resultvalue(type, result)
}
fun div(other: Value): Value {
val v1: Number = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
floatval!=null -> floatval
else -> throw VmExecutionException("div missing value 1")
}
val v2: Number = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
other.floatval!=null -> other.floatval
else -> throw VmExecutionException("div missing value 2")
}
val result = v1.toDouble() / v2.toDouble()
return resultvalue(type, result)
}
fun shl(other: Value): Value {
val v1 = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
else -> throw VmExecutionException("shl can only work on byte/word")
}
val v2 = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
else -> throw VmExecutionException("shl can only work on byte/word")
}
val result = v1.shl(v2)
return resultvalue(type, result)
}
fun shr(other: Value): Value {
val v1 = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
else -> throw VmExecutionException("shr can only work on byte/word")
}
val v2 = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
else -> throw VmExecutionException("shr can only work on byte/word")
}
val result = v1.ushr(v2)
return resultvalue(type, result)
}
fun rol(other: Value): Value = TODO()
fun ror(other: Value): Value = TODO()
fun neg(): Value {
return when {
byteval!=null -> resultvalue(DataType.BYTE, -byteval)
wordval!=null -> resultvalue(DataType.WORD, -wordval)
floatval!=null -> resultvalue(DataType.FLOAT, -floatval)
else -> throw VmExecutionException("neg can only work on byte/word/float")
}
}
fun and(other: Value): Value {
val v1 = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
else -> throw VmExecutionException("and can only work on byte/word")
}
val v2 = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
else -> throw VmExecutionException("and can only work on byte/word")
}
val result = v1.and(v2)
return resultvalue(type, result)
}
fun or(other: Value): Value {
val v1 = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
else -> throw VmExecutionException("or can only work on byte/word")
}
val v2 = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
else -> throw VmExecutionException("or can only work on byte/word")
}
val result = v1.or(v2)
return resultvalue(type, result)
}
fun xor(other: Value): Value {
val v1 = when {
byteval!=null -> byteval.toInt()
wordval!=null -> wordval
else -> throw VmExecutionException("xor can only work on byte/word")
}
val v2 = when {
other.byteval!=null -> other.byteval.toInt()
other.wordval!=null -> other.wordval
else -> throw VmExecutionException("xor can only work on byte/word")
}
val result = v1.xor(v2)
return resultvalue(type, result)
}
fun inv(): Value {
return when {
byteval!=null -> resultvalue(DataType.BYTE, byteval.toInt().inv())
wordval!=null -> resultvalue(DataType.WORD, wordval.inv())
else -> throw VmExecutionException("not can only work on byte/word")
}
}
fun inc(): Value = TODO()
fun dec(): Value = TODO()
private fun resultvalue(type: DataType, value: Number) : Value {
return when (type) {
DataType.BYTE -> Value(DataType.BYTE, value.toShort(), null, null)
DataType.WORD -> Value(DataType.WORD, null, value.toInt(), null)
DataType.FLOAT -> Value(DataType.FLOAT, null, null, value.toDouble())
else -> throw VmExecutionException("can only work on byte/word/float")
}
}
}
data class Instruction(val opcode: Opcode, val args: List<Value>) {
lateinit var next: Instruction
lateinit var nextAlt: Instruction
}
private class VmExecutionException(msg: String?) : Exception(msg)
private class VmTerminationException(msg: String?) : Exception(msg)
class StackVm {
private val mem = Memory()
val mem = Memory()
private val es = Stack<Value>()
fun memDump() = mem.getCopy()
fun dispatch(ins: Instruction) : Instruction {
when(ins.opcode) {
Opcode.PUSH -> es.push(ins.args[0])
Opcode.DISCARD -> es.pop()
Opcode.POP_MEM -> {
val value = es.pop()
val address = ins.args[0].wordval!!
when(value.type) {
DataType.BYTE -> mem.setByte(address, value.byteval!!)
DataType.WORD -> mem.setWord(address, value.wordval!!)
DataType.FLOAT -> mem.setFloat(address, value.floatval!!)
else -> throw VmExecutionException("can only manipulate byte/word/float on stack")
}
}
Opcode.ADD -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.add(v2))
}
Opcode.SUB -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.sub(v2))
}
Opcode.MUL -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.mul(v2))
}
Opcode.DIV -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.div(v2))
}
Opcode.NEG -> {
val v = es.pop()
es.push(v.neg())
}
Opcode.SHL -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.shl(v2))
}
Opcode.SHR -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.shr(v2))
}
Opcode.ROL -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.rol(v2))
}
Opcode.ROR -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.ror(v2))
}
Opcode.AND -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.and(v2))
}
Opcode.OR -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.or(v2))
}
Opcode.XOR -> {
val v1 = es.pop()
val v2 = es.pop()
es.push(v1.xor(v2))
}
Opcode.INV -> {
val v = es.pop()
es.push(v.inv())
}
Opcode.INC -> {
val v = es.pop()
es.push(v.inc())
}
Opcode.DEC -> {
val v = es.pop()
es.push(v.dec())
}
Opcode.JUMP -> TODO()
Opcode.CALL -> TODO()
Opcode.RETURN -> TODO()
Opcode.SYSCALL -> {
val callId = ins.args[0].byteval
val syscall = Syscall.values().first { it.callNr==callId }
when(syscall){
Syscall.WRITECHR -> syscallWriteChr(ins.args[0].wordval!!)
Syscall.WRITESTR -> syscallWriteStr(ins.args[0].wordval!!)
}
}
init {
val x=Instruction(Opcode.ADD, emptyList())
Opcode.TERMINATE -> throw VmTerminationException("execution terminated")
Opcode.PUSH_LOCAL -> TODO()
Opcode.POP_LOCAL -> TODO()
Opcode.INC_LOCAL -> TODO()
Opcode.DEC_LOCAL -> TODO()
Opcode.INC_MEM -> TODO()
Opcode.INC_MEM_W -> TODO()
Opcode.INC_MEM_F -> TODO()
Opcode.DEC_MEM -> TODO()
Opcode.DEC_MEM_W -> TODO()
Opcode.DEC_MEM_F -> TODO()
}
return ins.next
}
private fun syscallWriteStr(strAddress: Int) {
val petscii = mutableListOf<Short>()
var addr = strAddress
while(true) {
val byte = mem.getByte(addr++)
if(byte==0.toShort()) break
petscii.add(byte)
}
print(Petscii.decodePetscii(petscii, true))
}
private fun syscallWriteChr(strAddress: Int) {
val petscii = listOf(mem.getByte(strAddress))
print(Petscii.decodePetscii(petscii, true))
}
}

View File

@ -216,9 +216,9 @@ class TestPetscii {
assertFailsWith<CompilerException> { Petscii.encodePetscii("π", true) }
assertFailsWith<CompilerException> { Petscii.encodePetscii("", true) }
assertThat(Petscii.decodePetscii(shortArrayOf(72, 0xd7, 0x5c, 0xfa, 0x12), true), equalTo("hW£✓\uF11A"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(shortArrayOf(-1), true) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(shortArrayOf(256), true) }
assertThat(Petscii.decodePetscii(listOf(72, 0xd7, 0x5c, 0xfa, 0x12), true), equalTo("hW£✓\uF11A"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(listOf(-1), true) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(listOf(256), true) }
}
@Test
@ -230,9 +230,9 @@ class TestPetscii {
assertThat(Petscii.encodePetscii("π"), equalTo(shortArrayOf(0xff)))
assertFailsWith<CompilerException> { Petscii.encodePetscii("") }
assertThat(Petscii.decodePetscii(shortArrayOf(72, 0x5c, 0xd3, 0xff)), equalTo("H£♥π"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(shortArrayOf(-1)) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(shortArrayOf(256)) }
assertThat(Petscii.decodePetscii(listOf(72, 0x5c, 0xd3, 0xff)), equalTo("H£♥π"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(listOf(-1)) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodePetscii(listOf(256)) }
}
@Test
@ -244,9 +244,9 @@ class TestPetscii {
assertFailsWith<CompilerException> { Petscii.encodeScreencode("", true) }
assertFailsWith<CompilerException> { Petscii.encodeScreencode("π", true) }
assertThat(Petscii.decodeScreencode(shortArrayOf(0x08, 0x57, 0x1c, 0x7a), true), equalTo("hW£✓"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(shortArrayOf(-1), true) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(shortArrayOf(256), true) }
assertThat(Petscii.decodeScreencode(listOf(0x08, 0x57, 0x1c, 0x7a), true), equalTo("hW£✓"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(listOf(-1), true) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(listOf(256), true) }
}
@Test
@ -258,8 +258,8 @@ class TestPetscii {
assertFailsWith<CompilerException> { Petscii.encodeScreencode("") }
assertFailsWith<CompilerException> { Petscii.encodeScreencode("hello") }
assertThat(Petscii.decodeScreencode(shortArrayOf(0x17, 0x1c, 0x53, 0x5e)), equalTo("W£♥π"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(shortArrayOf(-1)) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(shortArrayOf(256)) }
assertThat(Petscii.decodeScreencode(listOf(0x17, 0x1c, 0x53, 0x5e)), equalTo("W£♥π"))
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(listOf(-1)) }
assertFailsWith<ArrayIndexOutOfBoundsException> { Petscii.decodeScreencode(listOf(256)) }
}
}