mirror of
https://github.com/irmen/prog8.git
synced 2025-01-11 13:29:45 +00:00
more builtin functions
This commit is contained in:
parent
dc3095956a
commit
d4341b7afe
@ -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>
|
||||
|
@ -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)
|
||||
|
@ -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: ``++`` ``--``
|
||||
|
@ -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
|
||||
------------------------------
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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]
|
||||
|
@ -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("")
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
|
@ -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 {
|
||||
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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)) }
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user