more grammar

This commit is contained in:
Irmen de Jong 2018-08-10 23:56:30 +02:00
parent 1ccc73f1f8
commit d702dd1e74
18 changed files with 2202 additions and 822 deletions

View File

@ -124,13 +124,15 @@ Directives
Level: block, subroutine.
Defines a debugging breakpoint at this location. See :ref:`debugging`
.. data:: %asm { ... }
.. data:: %asm {{ ... }}
Level: block, subroutine.
Declares that there is *inline assembly code* in the lines enclosed by the curly braces.
This code will be written as-is into the generated output file.
The assembler syntax used should be for the 3rd party cross assembler tool that IL65 uses.
The ``%asm {`` and ``}`` start and end markers each have to be on their own unique line.
Note that the start and end markers are both *double curly braces* to minimize the chance
that the inline assembly itself contains either of those. If it does contain a ``}}``,
the parsing of the inline assembler block will end prematurely and cause compilation errors.
Identifiers
@ -160,10 +162,9 @@ can contain IL65 *code*, *directives*, *variable declarations* and *subroutines*
<subroutines>
}
The <blockname> must be a valid identifier or can be completely omitted.
In that case the <address> is required to tell the compiler to put the block at
a certain position in memory. Otherwise it would be impossible to access its contents.
The <address> is optional. It must be a valid memory address such as ``$c000``.
The <blockname> must be a valid identifier.
The <address> is optional. If specified it must be a valid memory address such as ``$c000``.
It's used to tell the compiler to put the block at a certain position in memory.
Also read :ref:`blocks`. Here is an example of a code block, to be loaded at ``$c000``::
~ main $c000 {
@ -280,97 +281,75 @@ The following names are reserved, they have a special meaning::
Operators
---------
.. data:: # (address-of)
Takes the address of the symbol following it: ``word address = #somevar``
address-of: ``#``
Takes the address of the symbol following it: ``word address = #somevar``
.. data:: + - * / // ** % (arithmetic)
``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations.
``//`` means *integer division* even when the operands are floating point values: ``9.5 // 2.5`` is 3 (and not 3.8)
``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243.
``%`` is the modulo operator: ``25 % 7`` is 4.
arithmetic: ``+`` ``-`` ``*`` ``/`` ``//`` ``**`` ``%``
``+``, ``-``, ``*``, ``/`` are the familiar arithmetic operations.
``//`` means *integer division* even when the operands are floating point values: ``9.5 // 2.5`` is 3 (and not 3.8)
``**`` is the power operator: ``3 ** 5`` is equal to 3*3*3*3*3 and is 243.
``%`` is the modulo operator: ``25 % 7`` is 4.
.. data:: << >> <<@ >>@ & | ^ ~ (bitwise arithmetic)
bitwise arithmetic: ``<<`` ``>>`` ``<<@`` ``>@`` ``&`` ``|`` ``^`` ``~``
``<<`` and ``>>`` are bitwise shifts (left and right), ``<<@`` and ``@>>`` are bitwise rotations (left and right)
``&`` is bitwise and, ``|`` is bitwise or, ``^`` is bitwise xor, ``~`` is bitwise invert (this one is an unary operator)
``<<`` and ``>>`` are bitwise shifts (left and right), ``<<@`` and ``@>>`` are bitwise rotations (left and right)
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).
``&`` is bitwise and, ``|`` is bitwise or, ``^`` is bitwise xor, ``~`` is bitwise invert (this one is an unary operator)
augmented assignment: ``+=`` ``-=`` ``*=`` ``/=`` ``//=`` ``**=`` ``<<=`` ``>>=`` ``<<@=`` ``>>@=`` ``&=`` ``|=`` ``^=``
Syntactic sugar; ``A += X`` is equivalent to ``A = A + X``
postfix increment and decrement: ``++`` ``--``
Syntactic sugar; ``A++`` is equivalent to ``A = A + 1``, and ``A--`` is equivalent to ``A = A - 1``.
Because these operations are so common, we have these short forms.
comparison: ``!=`` ``<`` ``>`` ``<=`` ``>=``
Equality, Inequality, Less-than, Greater-than, Less-or-Equal-than, Greater-or-Equal-than comparisons.
The result is a 'boolean' value 'true' or 'false' (which in reality is just a byte value of 1 or 0).
logical: ``not`` ``and`` ``or`` ``xor``
These operators are the usual logical operations that are part of a logical expression to reason
about truths (boolean values). The result of such an expression is a 'boolean' value 'true' or 'false'
(which in reality is just a byte value of 1 or 0).
range creation: ``to``
Creates a range of values from the LHS value to the RHS value, inclusive.
These are mainly used in for loops to set the loop range. Example::
0 to 7 ; range of values 0, 1, 2, 3, 4, 5, 6, 7 (constant)
A = 5
X = 10
A to X ; range of 5, 6, 7, 8, 9, 10
byte[4] array = 10 to 13 ; sets the array to [1, 2, 3, 4]
for i in 0 to 127 {
; i loops 0, 1, 2, ... 127
}
.. data:: = (assignment)
array indexing: ``[`` *index* ``]``
When put after a sequence type (array, string or matrix) it means to point to the given element in that sequence::
Sets the target on the LHS (left hand side) of the operator to the value of the expression on the RHS (right hand side).
array[2] ; the third byte in the array (index is 0-based)
matrix[4,2] ; the byte at the 5th column and 3rd row in the matrix
.. data:: += -= *= /= //= **= <<= >>= <<@= >>@= &= |= ^= (augmented assignment)
precedence grouping in expressions, or subroutine parameter list: ``(`` *expression* ``)``
Parentheses are used to group parts of an expression to change the order of evaluation.
(the subexpression inside the parentheses will be evaluated first):
``(4 + 8) * 2`` is 24 instead of 20.
Syntactic sugar; ``A += X`` is equivalent to ``A = A + X``
Parentheses are also used in a subroutine call, they follow the name of the subroutine and contain
the list of arguments to pass to the subroutine: ``big_function(1, 99)``
.. data:: ++ -- (postfix increment and decrement)
Syntactic sugar; ``A++`` is equivalent to ``A = A + 1``, and ``A--`` is equivalent to ``A = A - 1``.
Because these operations are so common, we have these short forms.
.. data:: == != < > <= >= (comparison)
Equality, Inequality, Less-than, Greater-than, Less-or-Equal-than, Greater-or-Equal-than comparisons.
The result is a 'boolean' value 'true' or 'false' (which in reality is just a byte value of 1 or 0).
.. data:: not and or xor (logical)
These operators are the usual logical operations that are part of a logical expression to reason
about truths (boolean values). The result of such an expression is a 'boolean' value 'true' or 'false'
(which in reality is just a byte value of 1 or 0).
.. data:: .. (range creation)
Creates a range of values from the LHS value to the RHS value, inclusive.
These are mainly used in for loops to set the loop range. Example::
0 .. 7 ; range of values 0, 1, 2, 3, 4, 5, 6, 7 (constant)
A = 5
X = 10
A .. X ; range of 5, 6, 7, 8, 9, 10
byte[4] array = 10 .. 13 ; sets the array to [1, 2, 3, 4]
for i in 0 .. 127 {
; i loops 0, 1, 2, ... 127
}
.. data:: [ ... ] (array indexing)
When put after a sequence type (array, string or matrix) it means to point to the given element in that sequence::
array[2] ; the third byte in the array (index is 0-based)
matrix[4,2] ; the byte at the 5th column and 3rd row in the matrix
.. data:: ( ... ) (precedence grouping in expressions, or subroutine parameter list)
Parentheses are used to group parts of an expression to change the order of evaluation.
(the subexpression inside the parentheses will be evaluated first):
``(4 + 8) * 2`` is 24 instead of 20.
Parentheses are also used in a subroutine call, they follow the name of the subroutine and contain
the list of arguments to pass to the subroutine: ``big_function(1, 99)``
Subroutine calls
----------------
Subroutine / function calls
---------------------------
You call a subroutine like this::
@ -439,6 +418,8 @@ for loop
for <loopvar> in <range> [ step <amount> ] {
; do something...
break ; break out of the loop
continue ; immediately enter next iteration
}
@ -448,6 +429,8 @@ while loop
while <condition> {
; do something...
break ; break out of the loop
continue ; immediately enter next iteration
}
@ -457,26 +440,36 @@ repeat--until loop
repeat {
; do something...
break ; break out of the loop
continue ; immediately enter next iteration
} until <condition>
Conditional Execution
---------------------
Conditional Execution and Jumps
-------------------------------
Must align this with the various status bits in the cpu... not only true/false....
unconditional jump
^^^^^^^^^^^^^^^^^^
@todo::
goto $c000 ; address
goto name ; label or subroutine
if <condition> {
; do something....
}
[ else {
; do something else...
} ]
conditional execution
^^^^^^^^^^^^^^^^^^^^^
@todo::
if <condition> <single_statement or subblock>
[else <single_statement or subblock>]
if <condition> goto <location>
condition = arithmetic expression
or logical expression
or comparison expression
or status_register_flags
single_statement = goto, assignment, ...
subblock = '{' statements (but no subroutine definition) '}'
if the single_statement or the subblock is just a single goto,
the efficient *conditional branching instructions* of the CPU will be used.

View File

@ -1,3 +1,4 @@
parser:
./antlr.sh -o ../src/il65/parser -listener -visitor -package il65.parser tinybasic.g4
./antlr.sh -o ../src/il65/parser -no-listener -no-visitor -package il65.parser -Dlanguage=Java il65.g4
# ./antlr.sh -o ../src/il65/parser -no-listener -no-visitor -package il65.parser -Dlanguage=Python3 il65.g4

View File

@ -1,13 +1,18 @@
/*
IL65 lexer and parser grammar
IL65 combined lexer and parser grammar
NOTES:
- whitespace is ignored. (tabs/spaces)
- every line can be empty, be a comment, or contain ONE statement.
*/
grammar il65;
COMMENT : ';' ~[\r\n]* -> channel(1) ;
COMMENT : ';' ~[\r\n]* -> channel(HIDDEN) ;
WS : [ \t] -> skip ;
EOL : [\r\n]+ -> skip ;
EOL : [\r\n]+ ;
NAME : [a-zA-Z_][a-zA-Z0-9_]* ;
DEC_INTEGER : ('0'..'9') | (('1'..'9')('0'..'9')+);
HEX_INTEGER : '$' (('a'..'f') | ('A'..'F') | ('0'..'9'))+ ;
@ -25,9 +30,21 @@ STRING :
setText(s.substring(1, s.length() - 1));
}
;
INLINEASMBLOCK :
'{{' .+? '}}'
{
// get rid of the enclosing double braces
String s = getText();
setText(s.substring(2, s.length() - 2));
}
;
module : statement* EOF ;
module : EOL* (modulestatement | EOL)* EOF ;
modulestatement: directive | block ;
block: '~' identifier integerliteral? '{' EOL (statement EOL)* EOL* '}' ;
statement :
directive
@ -37,12 +54,26 @@ statement :
| memoryvardecl
| assignment
| augassignment
| unconditionaljump
| postincrdecr
| inlineasm
| label
// @todo forloop, whileloop, repeatloop, ifelse
;
label : identifier ':' ;
directive : '%' identifier (directivearg? | directivearg (',' directivearg)*) ;
call_location : integerliteral | identifier | scoped_identifier ;
directivearg : identifier | integerliteral ;
unconditionaljump : 'goto' call_location ;
directive :
directivename=('%output' | '%launcher' | '%zp' | '%address' | '%import' |
'%breakpoint' | '%asminclude' | '%asmbinary')
(directivearg? | directivearg (',' directivearg)*)
;
directivearg : stringliteral | identifier | integerliteral ;
vardecl: datatype arrayspec? identifier ;
@ -69,25 +100,36 @@ assign_target:
| scoped_identifier
;
postincrdecr : assign_target operator = ('++' | '--') ;
expression :
unaryexp = unary_expression
| '(' precedence_expr=expression ')'
| left = expression '**' right = expression
| left = expression ('*' | '/' | '//' | '**') right = expression
| left = expression ('+' | '-' | '%') right = expression
| left = expression ('<<' | '>>' | '<<@' | '>>@' | '&' | '|' | '^') right = expression
| left = expression ('and' | 'or' | 'xor') right = expression
| left = expression ('==' | '!=' | '<' | '>' | '<=' | '>=') right = expression
'(' expression ')'
| expression arrayspec
| functioncall
| prefix = ('+'|'-') expression
| prefix = ('~'|'not') expression
| left = expression bop = '**' right = expression
| left = expression bop = ('*' | '/' | '//' | '%') right = expression
| left = expression bop = ('+' | '-' ) right = expression
| left = expression bop = ('<<' | '>>' | '<<@' | '>>@' ) right = expression
| left = expression bop = ('<' | '>' | '<=' | '>=') right = expression
| left = expression bop = ('==' | '!=') right = expression
| left = expression bop = '&' right = expression
| left = expression bop = '^' right = expression
| left = expression bop = '|' right = expression
| left = expression bop = 'and' right = expression
| left = expression bop = 'or' right = expression
| left = expression bop = 'xor' right = expression
| rangefrom = expression 'to' rangeto = expression
| literalvalue
| register
| identifier
| scoped_identifier
;
unary_expression :
operator = '~' expression
| operator = ('+' | '-') expression
| operator = 'not' expression
functioncall :
call_location '(' expression? ')' // @todo arglist
;
identifier : NAME ;
@ -113,3 +155,5 @@ literalvalue :
| stringliteral
| floatliteral
;
inlineasm : '%asm' INLINEASMBLOCK;

View File

@ -10,18 +10,7 @@
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="lib" level="project" />
<orderEntry type="library" name="KotlinJavaRuntime" level="project" />
<orderEntry type="module-library">
<library name="JUnit5.2">
<CLASSES>
<root url="jar://$MODULE_DIR$/../lib/junit-jupiter-api-5.3.0-M1.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/apiguardian-api-1.0.0.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/opentest4j-1.1.0.jar!/" />
<root url="jar://$MODULE_DIR$/../lib/junit-platform-commons-1.3.0-M1.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="library" name="org.hamcrest:hamcrest-library:1.2.1" level="project" />
<orderEntry type="library" name="org.junit.jupiter:junit-jupiter-api:5.2.0" level="project" />
</component>
</module>

View File

@ -11,10 +11,14 @@ fun main(args: Array<String>) {
// println("Reading source file: ${args[0]}")
val input = CharStreams.fromString(
"byte derp=3"
// +
// "AX //= (5+8)*77\n" +
// "X = -3.44e-99"
"%zp clobber,derp,33,de\n" +
"~ main \$c000 { \n" +
" A=4 to 99\n" +
" %asm {{\n" +
" line 1\n"+
"\t\tline 2\n"+
" }}\n" +
"}\n"
)
val lexer = il65Lexer(input)
val tokens = CommonTokenStream(lexer)

View File

@ -31,9 +31,13 @@ interface IStatement : Node
data class Module(val lines: List<IStatement>) : Node
data class Block(val name: String, val address: Int?, val statements: List<IStatement>) : IStatement
data class Directive(val directive: String, val args: List<DirectiveArg>) : IStatement
data class DirectiveArg(val strval: String?, val intval: Int?) : Node
data class DirectiveArg(val str: String?, val name: String?, val int: Int?) : Node
data class Label(val name: String) : IStatement
interface IVarDecl : IStatement {
val datatype: DataType
@ -61,12 +65,12 @@ data class MemoryVarDecl(override val datatype: DataType,
data class Assignment(val target: AssignTarget, val aug_op : String?, val value: IExpression) : IStatement
data class AssignTarget(val register: Register?, val identifier: String?, val scoped_identifier: String?) : Node
data class AssignTarget(val register: Register?, val identifier: Identifier?) : Node
interface IExpression: Node
data class UnaryExpression(val operator: String, val expression: IExpression) : IExpression
data class PrefixExpression(val operator: String, val expression: IExpression) : IExpression
data class BinaryExpression(val left: IExpression, val operator: String, val right: IExpression) : IExpression
@ -76,13 +80,38 @@ data class LiteralValue(val intvalue: Int?,
val boolvalue: Boolean?,
val arrayvalue: List<IExpression>?) : IExpression
data class RangeExpr(val from: IExpression, val to: IExpression) : IExpression
data class RegisterExpr(val register: Register) : IExpression
data class Identifier(val name: String, val scope: String?) : IExpression
data class Identifier(val name: String, val scope: List<String>) : IExpression
data class CallTarget(val address: Int?, val identifier: Identifier?) : Node
data class PostIncrDecr(val target: AssignTarget, val operator: String) : IStatement
data class Jump(val target: CallTarget) : IStatement
data class FunctionCall(val target: CallTarget, val arglist: List<IExpression>) : IExpression
data class InlineAssembly(val assembly: String) : IStatement
fun il65Parser.ModuleContext.toAst() = Module(this.modulestatement().map { it.toAst() })
fun il65Parser.ModuleContext.toAst() = Module(this.statement().map { it.toAst() })
fun il65Parser.ModulestatementContext.toAst() : IStatement {
val directive = this.directive()?.toAst()
if(directive!=null) return directive
val block = this.block()?.toAst()
if(block!=null) return block
throw UnsupportedOperationException(this.text)
}
fun il65Parser.BlockContext.toAst() : IStatement {
return Block(this.identifier().text, this.integerliteral()?.toAst(), this.statement().map { it.toAst() })
}
fun il65Parser.StatementContext.toAst() : IStatement {
val vardecl = this.vardecl()
@ -131,14 +160,40 @@ fun il65Parser.StatementContext.toAst() : IStatement {
augassign.operator.text,
augassign.expression().toAst())
val post = this.postincrdecr()
if(post!=null)
return PostIncrDecr(post.assign_target().toAst(), post.operator.text)
val directive = this.directive()?.toAst()
if(directive!=null) return directive
val label=this.label()
if(label!=null)
return Label(label.text)
val jump = this.unconditionaljump()
if(jump!=null)
return Jump(jump.call_location().toAst())
val asm = this.inlineasm()
if(asm!=null)
return InlineAssembly(asm.INLINEASMBLOCK().text)
throw UnsupportedOperationException(this.text)
}
fun il65Parser.Assign_targetContext.toAst() =
AssignTarget(this.register()?.toAst(), this.identifier()?.text, this.scoped_identifier()?.text)
fun il65Parser.Call_locationContext.toAst() : CallTarget {
val address = this.integerliteral()?.toAst()
if(this.identifier()!=null) return CallTarget(address, Identifier(this.identifier().text, emptyList()))
return CallTarget(address, this.scoped_identifier().toAst())
}
fun il65Parser.Assign_targetContext.toAst() : AssignTarget {
val register = this.register()?.toAst()
val identifier = this.identifier()?.text
if(identifier!=null) return AssignTarget(register, Identifier(identifier, emptyList()))
return AssignTarget(register, this.scoped_identifier()?.toAst())
}
fun il65Parser.RegisterContext.toAst() = Register.valueOf(this.text.toUpperCase())
@ -150,53 +205,67 @@ fun il65Parser.ArrayspecContext.toAst() = ArraySpec(
)
fun il65Parser.DirectiveContext.toAst() = Directive(this.identifier().text, this.directivearg().map { it.toAst() })
fun il65Parser.DirectiveContext.toAst() = Directive(this.directivename.text, this.directivearg().map { it.toAst() })
fun il65Parser.DirectiveargContext.toAst() = DirectiveArg(this.identifier()?.text, this.integerliteral()?.toAst())
fun il65Parser.DirectiveargContext.toAst() =
DirectiveArg(this.stringliteral()?.text, this.identifier()?.text, this.integerliteral()?.toAst())
fun il65Parser.IntegerliteralContext.toAst(): Int {
val terminal: TerminalNode = this.children[0] as TerminalNode
return when (terminal.symbol.type) {
il65Parser.DEC_INTEGER -> this.text.toInt()
il65Parser.HEX_INTEGER -> this.text.toInt(16)
il65Parser.BIN_INTEGER -> this.text.toInt(2)
il65Parser.HEX_INTEGER -> this.text.substring(1).toInt(16)
il65Parser.BIN_INTEGER -> this.text.substring(1).toInt(2)
else -> throw UnsupportedOperationException(this.text)
}
}
fun il65Parser.ExpressionContext.toAst() : IExpression {
if(this.identifier()!=null)
return Identifier(this.identifier().text, null)
val litval = this.literalvalue()
if(litval!=null)
return LiteralValue(litval.integerliteral()?.toAst(),
litval.floatliteral()?.toAst(),
litval.stringliteral()?.text,
litval.booleanliteral()?.toAst(),
litval.arrayliteral()?.toAst()
)
if(this.scoped_identifier()!=null)
return Identifier(this.scoped_identifier().text, "SCOPE????") // todo!
litval.floatliteral()?.toAst(),
litval.stringliteral()?.text,
litval.booleanliteral()?.toAst(),
litval.arrayliteral()?.toAst()
)
if(this.register()!=null)
return RegisterExpr(this.register().toAst())
if(this.unaryexp!=null)
return UnaryExpression(this.unaryexp.operator.text, this.unaryexp.expression().toAst())
if(this.identifier()!=null)
return Identifier(this.identifier().text, emptyList())
if(this.left != null && this.right != null)
return BinaryExpression(this.left.toAst(), this.text, this.right.toAst())
if(this.scoped_identifier()!=null)
return this.scoped_identifier().toAst()
// ( expression )
if(this.precedence_expr!=null)
return this.precedence_expr.toAst()
if(this.bop!=null)
return BinaryExpression(this.left.toAst(), this.bop.text, this.right.toAst())
if(this.prefix!=null)
return PrefixExpression(this.prefix.text, this.expression(0).toAst())
val funcall = this.functioncall()
if(funcall!=null) {
val location = funcall.call_location().toAst()
if(funcall.expression()!=null) return FunctionCall(location, listOf(funcall.expression().toAst()))
return FunctionCall(location, emptyList())
}
if (this.rangefrom!=null && this.rangeto!=null)
return RangeExpr(this.rangefrom.toAst(), this.rangeto.toAst())
throw UnsupportedOperationException(this.text)
}
fun il65Parser.Scoped_identifierContext.toAst() : Identifier {
val names = this.NAME()
val name = names.last().text
val scope = names.take(names.size-1)
return Identifier(name, scope.map { it.text })
}
fun il65Parser.FloatliteralContext.toAst() = this.text.toDouble()
fun il65Parser.BooleanliteralContext.toAst() = when(this.text) {

File diff suppressed because one or more lines are too long

View File

@ -63,77 +63,110 @@ T__61=62
T__62=63
T__63=64
T__64=65
COMMENT=66
WS=67
EOL=68
NAME=69
DEC_INTEGER=70
HEX_INTEGER=71
BIN_INTEGER=72
FLOAT_NUMBER=73
STRING=74
'%'=1
','=2
'='=3
'const'=4
'memory'=5
'byte'=6
'word'=7
'float'=8
'str'=9
'str_p'=10
'str_s'=11
'str_ps'=12
'['=13
']'=14
'+='=15
'-='=16
'/='=17
'//='=18
'*='=19
'**='=20
'<<='=21
'>>='=22
'<<@='=23
'>>@='=24
'&='=25
'|='=26
'^='=27
'('=28
')'=29
'**'=30
'*'=31
'/'=32
'//'=33
'+'=34
'-'=35
'<<'=36
'>>'=37
'<<@'=38
'>>@'=39
'&'=40
'|'=41
'^'=42
'and'=43
'or'=44
'xor'=45
'=='=46
'!='=47
'<'=48
'>'=49
'<='=50
'>='=51
'~'=52
'not'=53
'.'=54
'A'=55
'X'=56
'Y'=57
'AX'=58
'AY'=59
'XY'=60
'SC'=61
'SI'=62
'SZ'=63
'true'=64
'false'=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
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
'}'=3
':'=4
'goto'=5
'%output'=6
'%launcher'=7
'%zp'=8
'%address'=9
'%import'=10
'%breakpoint'=11
'%asminclude'=12
'%asmbinary'=13
','=14
'='=15
'const'=16
'memory'=17
'byte'=18
'word'=19
'float'=20
'str'=21
'str_p'=22
'str_s'=23
'str_ps'=24
'['=25
']'=26
'+='=27
'-='=28
'/='=29
'//='=30
'*='=31
'**='=32
'<<='=33
'>>='=34
'<<@='=35
'>>@='=36
'&='=37
'|='=38
'^='=39
'++'=40
'--'=41
'('=42
')'=43
'+'=44
'-'=45
'not'=46
'**'=47
'*'=48
'/'=49
'//'=50
'%'=51
'<<'=52
'>>'=53
'<<@'=54
'>>@'=55
'<'=56
'>'=57
'<='=58
'>='=59
'=='=60
'!='=61
'&'=62
'^'=63
'|'=64
'and'=65
'or'=66
'xor'=67
'to'=68
'.'=69
'A'=70
'X'=71
'Y'=72
'AX'=73
'AY'=74
'XY'=75
'SC'=76
'SI'=77
'SZ'=78
'true'=79
'false'=80
'%asm'=81

File diff suppressed because one or more lines are too long

View File

@ -25,9 +25,11 @@ public class il65Lexer extends Lexer {
T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45,
T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52,
T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59,
T__59=60, T__60=61, T__61=62, T__62=63, T__63=64, T__64=65, COMMENT=66,
WS=67, EOL=68, NAME=69, DEC_INTEGER=70, HEX_INTEGER=71, BIN_INTEGER=72,
FLOAT_NUMBER=73, STRING=74;
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, 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"
};
@ -45,19 +47,23 @@ public class il65Lexer extends Lexer {
"T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48",
"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",
"COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER", "HEX_INTEGER", "BIN_INTEGER",
"FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING"
"FLOAT_NUMBER", "FNUMBER", "STRING_ESCAPE_SEQ", "STRING", "INLINEASMBLOCK"
};
private static final String[] _LITERAL_NAMES = {
null, "'%'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
null, "'~'", "'{'", "'}'", "':'", "'goto'", "'%output'", "'%launcher'",
"'%zp'", "'%address'", "'%import'", "'%breakpoint'", "'%asminclude'",
"'%asmbinary'", "','", "'='", "'const'", "'memory'", "'byte'", "'word'",
"'float'", "'str'", "'str_p'", "'str_s'", "'str_ps'", "'['", "']'", "'+='",
"'-='", "'/='", "'//='", "'*='", "'**='", "'<<='", "'>>='", "'<<@='",
"'>>@='", "'&='", "'|='", "'^='", "'('", "')'", "'**'", "'*'", "'/'",
"'//'", "'+'", "'-'", "'<<'", "'>>'", "'<<@'", "'>>@'", "'&'", "'|'",
"'^'", "'and'", "'or'", "'xor'", "'=='", "'!='", "'<'", "'>'", "'<='",
"'>='", "'~'", "'not'", "'.'", "'A'", "'X'", "'Y'", "'AX'", "'AY'", "'XY'",
"'SC'", "'SI'", "'SZ'", "'true'", "'false'"
"'>>@='", "'&='", "'|='", "'^='", "'++'", "'--'", "'('", "')'", "'+'",
"'-'", "'not'", "'**'", "'*'", "'/'", "'//'", "'%'", "'<<'", "'>>'", "'<<@'",
"'>>@'", "'<'", "'>'", "'<='", "'>='", "'=='", "'!='", "'&'", "'^'", "'|'",
"'and'", "'or'", "'xor'", "'to'", "'.'", "'A'", "'X'", "'Y'", "'AX'",
"'AY'", "'XY'", "'SC'", "'SI'", "'SZ'", "'true'", "'false'", "'%asm'"
};
private static final String[] _SYMBOLIC_NAMES = {
null, null, null, null, null, null, null, null, null, null, null, null,
@ -65,8 +71,10 @@ 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, "COMMENT", "WS", "EOL", "NAME", "DEC_INTEGER",
"HEX_INTEGER", "BIN_INTEGER", "FLOAT_NUMBER", "STRING"
null, null, null, null, null, null, null, null, null, null, null, null,
null, null, null, null, null, null, null, null, null, null, "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);
@ -128,9 +136,12 @@ public class il65Lexer extends Lexer {
@Override
public void action(RuleContext _localctx, int ruleIndex, int actionIndex) {
switch (ruleIndex) {
case 75:
case 91:
STRING_action((RuleContext)_localctx, actionIndex);
break;
case 92:
INLINEASMBLOCK_action((RuleContext)_localctx, actionIndex);
break;
}
}
private void STRING_action(RuleContext _localctx, int actionIndex) {
@ -144,9 +155,20 @@ public class il65Lexer extends Lexer {
break;
}
}
private void INLINEASMBLOCK_action(RuleContext _localctx, int actionIndex) {
switch (actionIndex) {
case 1:
// get rid of the enclosing double braces
String s = getText();
setText(s.substring(2, s.length() - 2));
break;
}
}
public static final String _serializedATN =
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2L\u01ca\b\1\4\2\t"+
"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2]\u025a\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"+
@ -155,148 +177,196 @@ public class il65Lexer extends Lexer {
",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+
"\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+
"\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+
"\tI\4J\tJ\4K\tK\4L\tL\4M\tM\3\2\3\2\3\3\3\3\3\4\3\4\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\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b"+
"\3\b\3\t\3\t\3\t\3\t\3\t\3\t\3\n\3\n\3\n\3\n\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\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\21\3\21\3\21\3\22\3\22\3\22\3\23\3\23\3\23\3"+
"\23\3\24\3\24\3\24\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3"+
"\27\3\27\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3"+
"\32\3\33\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\36\3\36\3\37\3\37\3\37\3"+
" \3 \3!\3!\3\"\3\"\3\"\3#\3#\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3\'\3"+
"(\3(\3(\3(\3)\3)\3*\3*\3+\3+\3,\3,\3,\3,\3-\3-\3-\3.\3.\3.\3.\3/\3/\3"+
"/\3\60\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\64\3\65"+
"\3\65\3\66\3\66\3\66\3\66\3\67\3\67\38\38\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\3A\3B\3B\3B\3B\3B\3"+
"B\3C\3C\7C\u0177\nC\fC\16C\u017a\13C\3C\3C\3D\3D\3D\3D\3E\6E\u0183\nE"+
"\rE\16E\u0184\3E\3E\3F\3F\7F\u018b\nF\fF\16F\u018e\13F\3G\3G\3G\6G\u0193"+
"\nG\rG\16G\u0194\5G\u0197\nG\3H\3H\6H\u019b\nH\rH\16H\u019c\3I\3I\6I\u01a1"+
"\nI\rI\16I\u01a2\3J\3J\3J\5J\u01a8\nJ\3J\5J\u01ab\nJ\3K\6K\u01ae\nK\r"+
"K\16K\u01af\3K\3K\6K\u01b4\nK\rK\16K\u01b5\5K\u01b8\nK\3L\3L\3L\3L\5L"+
"\u01be\nL\3M\3M\3M\7M\u01c3\nM\fM\16M\u01c6\13M\3M\3M\3M\2\2N\3\3\5\4"+
"\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22"+
"#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C"+
"#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u<w"+
"=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091"+
"J\u0093K\u0095\2\u0097\2\u0099L\3\2\n\4\2\f\f\17\17\4\2\13\13\"\"\5\2"+
"C\\aac|\6\2\62;C\\aac|\5\2\62;CHch\4\2GGgg\4\2--//\6\2\f\f\16\17$$^^\2"+
"\u01d6\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\2"+
"G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3"+
"\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\2"+
"m\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\u0099"+
"\3\2\2\2\3\u009b\3\2\2\2\5\u009d\3\2\2\2\7\u009f\3\2\2\2\t\u00a1\3\2\2"+
"\2\13\u00a7\3\2\2\2\r\u00ae\3\2\2\2\17\u00b3\3\2\2\2\21\u00b8\3\2\2\2"+
"\23\u00be\3\2\2\2\25\u00c2\3\2\2\2\27\u00c8\3\2\2\2\31\u00ce\3\2\2\2\33"+
"\u00d5\3\2\2\2\35\u00d7\3\2\2\2\37\u00d9\3\2\2\2!\u00dc\3\2\2\2#\u00df"+
"\3\2\2\2%\u00e2\3\2\2\2\'\u00e6\3\2\2\2)\u00e9\3\2\2\2+\u00ed\3\2\2\2"+
"-\u00f1\3\2\2\2/\u00f5\3\2\2\2\61\u00fa\3\2\2\2\63\u00ff\3\2\2\2\65\u0102"+
"\3\2\2\2\67\u0105\3\2\2\29\u0108\3\2\2\2;\u010a\3\2\2\2=\u010c\3\2\2\2"+
"?\u010f\3\2\2\2A\u0111\3\2\2\2C\u0113\3\2\2\2E\u0116\3\2\2\2G\u0118\3"+
"\2\2\2I\u011a\3\2\2\2K\u011d\3\2\2\2M\u0120\3\2\2\2O\u0124\3\2\2\2Q\u0128"+
"\3\2\2\2S\u012a\3\2\2\2U\u012c\3\2\2\2W\u012e\3\2\2\2Y\u0132\3\2\2\2["+
"\u0135\3\2\2\2]\u0139\3\2\2\2_\u013c\3\2\2\2a\u013f\3\2\2\2c\u0141\3\2"+
"\2\2e\u0143\3\2\2\2g\u0146\3\2\2\2i\u0149\3\2\2\2k\u014b\3\2\2\2m\u014f"+
"\3\2\2\2o\u0151\3\2\2\2q\u0153\3\2\2\2s\u0155\3\2\2\2u\u0157\3\2\2\2w"+
"\u015a\3\2\2\2y\u015d\3\2\2\2{\u0160\3\2\2\2}\u0163\3\2\2\2\177\u0166"+
"\3\2\2\2\u0081\u0169\3\2\2\2\u0083\u016e\3\2\2\2\u0085\u0174\3\2\2\2\u0087"+
"\u017d\3\2\2\2\u0089\u0182\3\2\2\2\u008b\u0188\3\2\2\2\u008d\u0196\3\2"+
"\2\2\u008f\u0198\3\2\2\2\u0091\u019e\3\2\2\2\u0093\u01a4\3\2\2\2\u0095"+
"\u01ad\3\2\2\2\u0097\u01bd\3\2\2\2\u0099\u01bf\3\2\2\2\u009b\u009c\7\'"+
"\2\2\u009c\4\3\2\2\2\u009d\u009e\7.\2\2\u009e\6\3\2\2\2\u009f\u00a0\7"+
"?\2\2\u00a0\b\3\2\2\2\u00a1\u00a2\7e\2\2\u00a2\u00a3\7q\2\2\u00a3\u00a4"+
"\7p\2\2\u00a4\u00a5\7u\2\2\u00a5\u00a6\7v\2\2\u00a6\n\3\2\2\2\u00a7\u00a8"+
"\7o\2\2\u00a8\u00a9\7g\2\2\u00a9\u00aa\7o\2\2\u00aa\u00ab\7q\2\2\u00ab"+
"\u00ac\7t\2\2\u00ac\u00ad\7{\2\2\u00ad\f\3\2\2\2\u00ae\u00af\7d\2\2\u00af"+
"\u00b0\7{\2\2\u00b0\u00b1\7v\2\2\u00b1\u00b2\7g\2\2\u00b2\16\3\2\2\2\u00b3"+
"\u00b4\7y\2\2\u00b4\u00b5\7q\2\2\u00b5\u00b6\7t\2\2\u00b6\u00b7\7f\2\2"+
"\u00b7\20\3\2\2\2\u00b8\u00b9\7h\2\2\u00b9\u00ba\7n\2\2\u00ba\u00bb\7"+
"q\2\2\u00bb\u00bc\7c\2\2\u00bc\u00bd\7v\2\2\u00bd\22\3\2\2\2\u00be\u00bf"+
"\7u\2\2\u00bf\u00c0\7v\2\2\u00c0\u00c1\7t\2\2\u00c1\24\3\2\2\2\u00c2\u00c3"+
"\7u\2\2\u00c3\u00c4\7v\2\2\u00c4\u00c5\7t\2\2\u00c5\u00c6\7a\2\2\u00c6"+
"\u00c7\7r\2\2\u00c7\26\3\2\2\2\u00c8\u00c9\7u\2\2\u00c9\u00ca\7v\2\2\u00ca"+
"\u00cb\7t\2\2\u00cb\u00cc\7a\2\2\u00cc\u00cd\7u\2\2\u00cd\30\3\2\2\2\u00ce"+
"\u00cf\7u\2\2\u00cf\u00d0\7v\2\2\u00d0\u00d1\7t\2\2\u00d1\u00d2\7a\2\2"+
"\u00d2\u00d3\7r\2\2\u00d3\u00d4\7u\2\2\u00d4\32\3\2\2\2\u00d5\u00d6\7"+
"]\2\2\u00d6\34\3\2\2\2\u00d7\u00d8\7_\2\2\u00d8\36\3\2\2\2\u00d9\u00da"+
"\7-\2\2\u00da\u00db\7?\2\2\u00db \3\2\2\2\u00dc\u00dd\7/\2\2\u00dd\u00de"+
"\7?\2\2\u00de\"\3\2\2\2\u00df\u00e0\7\61\2\2\u00e0\u00e1\7?\2\2\u00e1"+
"$\3\2\2\2\u00e2\u00e3\7\61\2\2\u00e3\u00e4\7\61\2\2\u00e4\u00e5\7?\2\2"+
"\u00e5&\3\2\2\2\u00e6\u00e7\7,\2\2\u00e7\u00e8\7?\2\2\u00e8(\3\2\2\2\u00e9"+
"\u00ea\7,\2\2\u00ea\u00eb\7,\2\2\u00eb\u00ec\7?\2\2\u00ec*\3\2\2\2\u00ed"+
"\u00ee\7>\2\2\u00ee\u00ef\7>\2\2\u00ef\u00f0\7?\2\2\u00f0,\3\2\2\2\u00f1"+
"\u00f2\7@\2\2\u00f2\u00f3\7@\2\2\u00f3\u00f4\7?\2\2\u00f4.\3\2\2\2\u00f5"+
"\u00f6\7>\2\2\u00f6\u00f7\7>\2\2\u00f7\u00f8\7B\2\2\u00f8\u00f9\7?\2\2"+
"\u00f9\60\3\2\2\2\u00fa\u00fb\7@\2\2\u00fb\u00fc\7@\2\2\u00fc\u00fd\7"+
"B\2\2\u00fd\u00fe\7?\2\2\u00fe\62\3\2\2\2\u00ff\u0100\7(\2\2\u0100\u0101"+
"\7?\2\2\u0101\64\3\2\2\2\u0102\u0103\7~\2\2\u0103\u0104\7?\2\2\u0104\66"+
"\3\2\2\2\u0105\u0106\7`\2\2\u0106\u0107\7?\2\2\u01078\3\2\2\2\u0108\u0109"+
"\7*\2\2\u0109:\3\2\2\2\u010a\u010b\7+\2\2\u010b<\3\2\2\2\u010c\u010d\7"+
",\2\2\u010d\u010e\7,\2\2\u010e>\3\2\2\2\u010f\u0110\7,\2\2\u0110@\3\2"+
"\2\2\u0111\u0112\7\61\2\2\u0112B\3\2\2\2\u0113\u0114\7\61\2\2\u0114\u0115"+
"\7\61\2\2\u0115D\3\2\2\2\u0116\u0117\7-\2\2\u0117F\3\2\2\2\u0118\u0119"+
"\7/\2\2\u0119H\3\2\2\2\u011a\u011b\7>\2\2\u011b\u011c\7>\2\2\u011cJ\3"+
"\2\2\2\u011d\u011e\7@\2\2\u011e\u011f\7@\2\2\u011fL\3\2\2\2\u0120\u0121"+
"\7>\2\2\u0121\u0122\7>\2\2\u0122\u0123\7B\2\2\u0123N\3\2\2\2\u0124\u0125"+
"\7@\2\2\u0125\u0126\7@\2\2\u0126\u0127\7B\2\2\u0127P\3\2\2\2\u0128\u0129"+
"\7(\2\2\u0129R\3\2\2\2\u012a\u012b\7~\2\2\u012bT\3\2\2\2\u012c\u012d\7"+
"`\2\2\u012dV\3\2\2\2\u012e\u012f\7c\2\2\u012f\u0130\7p\2\2\u0130\u0131"+
"\7f\2\2\u0131X\3\2\2\2\u0132\u0133\7q\2\2\u0133\u0134\7t\2\2\u0134Z\3"+
"\2\2\2\u0135\u0136\7z\2\2\u0136\u0137\7q\2\2\u0137\u0138\7t\2\2\u0138"+
"\\\3\2\2\2\u0139\u013a\7?\2\2\u013a\u013b\7?\2\2\u013b^\3\2\2\2\u013c"+
"\u013d\7#\2\2\u013d\u013e\7?\2\2\u013e`\3\2\2\2\u013f\u0140\7>\2\2\u0140"+
"b\3\2\2\2\u0141\u0142\7@\2\2\u0142d\3\2\2\2\u0143\u0144\7>\2\2\u0144\u0145"+
"\7?\2\2\u0145f\3\2\2\2\u0146\u0147\7@\2\2\u0147\u0148\7?\2\2\u0148h\3"+
"\2\2\2\u0149\u014a\7\u0080\2\2\u014aj\3\2\2\2\u014b\u014c\7p\2\2\u014c"+
"\u014d\7q\2\2\u014d\u014e\7v\2\2\u014el\3\2\2\2\u014f\u0150\7\60\2\2\u0150"+
"n\3\2\2\2\u0151\u0152\7C\2\2\u0152p\3\2\2\2\u0153\u0154\7Z\2\2\u0154r"+
"\3\2\2\2\u0155\u0156\7[\2\2\u0156t\3\2\2\2\u0157\u0158\7C\2\2\u0158\u0159"+
"\7Z\2\2\u0159v\3\2\2\2\u015a\u015b\7C\2\2\u015b\u015c\7[\2\2\u015cx\3"+
"\2\2\2\u015d\u015e\7Z\2\2\u015e\u015f\7[\2\2\u015fz\3\2\2\2\u0160\u0161"+
"\7U\2\2\u0161\u0162\7E\2\2\u0162|\3\2\2\2\u0163\u0164\7U\2\2\u0164\u0165"+
"\7K\2\2\u0165~\3\2\2\2\u0166\u0167\7U\2\2\u0167\u0168\7\\\2\2\u0168\u0080"+
"\3\2\2\2\u0169\u016a\7v\2\2\u016a\u016b\7t\2\2\u016b\u016c\7w\2\2\u016c"+
"\u016d\7g\2\2\u016d\u0082\3\2\2\2\u016e\u016f\7h\2\2\u016f\u0170\7c\2"+
"\2\u0170\u0171\7n\2\2\u0171\u0172\7u\2\2\u0172\u0173\7g\2\2\u0173\u0084"+
"\3\2\2\2\u0174\u0178\7=\2\2\u0175\u0177\n\2\2\2\u0176\u0175\3\2\2\2\u0177"+
"\u017a\3\2\2\2\u0178\u0176\3\2\2\2\u0178\u0179\3\2\2\2\u0179\u017b\3\2"+
"\2\2\u017a\u0178\3\2\2\2\u017b\u017c\bC\2\2\u017c\u0086\3\2\2\2\u017d"+
"\u017e\t\3\2\2\u017e\u017f\3\2\2\2\u017f\u0180\bD\3\2\u0180\u0088\3\2"+
"\2\2\u0181\u0183\t\2\2\2\u0182\u0181\3\2\2\2\u0183\u0184\3\2\2\2\u0184"+
"\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185\u0186\3\2\2\2\u0186\u0187\bE"+
"\3\2\u0187\u008a\3\2\2\2\u0188\u018c\t\4\2\2\u0189\u018b\t\5\2\2\u018a"+
"\u0189\3\2\2\2\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c\u018d\3\2"+
"\2\2\u018d\u008c\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0197\4\62;\2\u0190"+
"\u0192\4\63;\2\u0191\u0193\4\62;\2\u0192\u0191\3\2\2\2\u0193\u0194\3\2"+
"\2\2\u0194\u0192\3\2\2\2\u0194\u0195\3\2\2\2\u0195\u0197\3\2\2\2\u0196"+
"\u018f\3\2\2\2\u0196\u0190\3\2\2\2\u0197\u008e\3\2\2\2\u0198\u019a\7&"+
"\2\2\u0199\u019b\t\6\2\2\u019a\u0199\3\2\2\2\u019b\u019c\3\2\2\2\u019c"+
"\u019a\3\2\2\2\u019c\u019d\3\2\2\2\u019d\u0090\3\2\2\2\u019e\u01a0\7\'"+
"\2\2\u019f\u01a1\4\62\63\2\u01a0\u019f\3\2\2\2\u01a1\u01a2\3\2\2\2\u01a2"+
"\u01a0\3\2\2\2\u01a2\u01a3\3\2\2\2\u01a3\u0092\3\2\2\2\u01a4\u01aa\5\u0095"+
"K\2\u01a5\u01a7\t\7\2\2\u01a6\u01a8\t\b\2\2\u01a7\u01a6\3\2\2\2\u01a7"+
"\u01a8\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01ab\5\u0095K\2\u01aa\u01a5"+
"\3\2\2\2\u01aa\u01ab\3\2\2\2\u01ab\u0094\3\2\2\2\u01ac\u01ae\4\62;\2\u01ad"+
"\u01ac\3\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01ad\3\2\2\2\u01af\u01b0\3\2"+
"\2\2\u01b0\u01b7\3\2\2\2\u01b1\u01b3\7\60\2\2\u01b2\u01b4\4\62;\2\u01b3"+
"\u01b2\3\2\2\2\u01b4\u01b5\3\2\2\2\u01b5\u01b3\3\2\2\2\u01b5\u01b6\3\2"+
"\2\2\u01b6\u01b8\3\2\2\2\u01b7\u01b1\3\2\2\2\u01b7\u01b8\3\2\2\2\u01b8"+
"\u0096\3\2\2\2\u01b9\u01ba\7^\2\2\u01ba\u01be\13\2\2\2\u01bb\u01bc\7^"+
"\2\2\u01bc\u01be\5\u0089E\2\u01bd\u01b9\3\2\2\2\u01bd\u01bb\3\2\2\2\u01be"+
"\u0098\3\2\2\2\u01bf\u01c4\7$\2\2\u01c0\u01c3\5\u0097L\2\u01c1\u01c3\n"+
"\t\2\2\u01c2\u01c0\3\2\2\2\u01c2\u01c1\3\2\2\2\u01c3\u01c6\3\2\2\2\u01c4"+
"\u01c2\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5\u01c7\3\2\2\2\u01c6\u01c4\3\2"+
"\2\2\u01c7\u01c8\7$\2\2\u01c8\u01c9\bM\4\2\u01c9\u009a\3\2\2\2\23\2\u0178"+
"\u0184\u018c\u0194\u0196\u019a\u019c\u01a2\u01a7\u01aa\u01af\u01b5\u01b7"+
"\u01bd\u01c2\u01c4\5\2\3\2\b\2\2\3M\2";
"\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^\3\2\3\2"+
"\3\3\3\3\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\7\3"+
"\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n"+
"\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+
"\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r"+
"\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16\3\16"+
"\3\16\3\16\3\17\3\17\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22"+
"\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3\24"+
"\3\24\3\25\3\25\3\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\27\3\27\3\27"+
"\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\31"+
"\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\34\3\35\3\35\3\35\3\36\3\36"+
"\3\36\3\37\3\37\3\37\3\37\3 \3 \3 \3!\3!\3!\3!\3\"\3\"\3\"\3\"\3#\3#\3"+
"#\3#\3$\3$\3$\3$\3$\3%\3%\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3"+
")\3)\3*\3*\3*\3+\3+\3,\3,\3-\3-\3.\3.\3/\3/\3/\3/\3\60\3\60\3\60\3\61"+
"\3\61\3\62\3\62\3\63\3\63\3\63\3\64\3\64\3\65\3\65\3\65\3\66\3\66\3\66"+
"\3\67\3\67\3\67\3\67\38\38\38\38\39\39\3:\3:\3;\3;\3;\3<\3<\3<\3=\3=\3"+
"=\3>\3>\3>\3?\3?\3@\3@\3A\3A\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3E\3E\3"+
"E\3F\3F\3G\3G\3H\3H\3I\3I\3J\3J\3J\3K\3K\3K\3L\3L\3L\3M\3M\3M\3N\3N\3"+
"N\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3R\3R\3R\3R\3R\3S\3S\7S\u01fc"+
"\nS\fS\16S\u01ff\13S\3S\3S\3T\3T\3T\3T\3U\6U\u0208\nU\rU\16U\u0209\3V"+
"\3V\7V\u020e\nV\fV\16V\u0211\13V\3W\3W\3W\6W\u0216\nW\rW\16W\u0217\5W"+
"\u021a\nW\3X\3X\6X\u021e\nX\rX\16X\u021f\3Y\3Y\6Y\u0224\nY\rY\16Y\u0225"+
"\3Z\3Z\3Z\5Z\u022b\nZ\3Z\5Z\u022e\nZ\3[\6[\u0231\n[\r[\16[\u0232\3[\3"+
"[\6[\u0237\n[\r[\16[\u0238\5[\u023b\n[\3\\\3\\\3\\\3\\\5\\\u0241\n\\\3"+
"]\3]\3]\7]\u0246\n]\f]\16]\u0249\13]\3]\3]\3]\3^\3^\3^\3^\6^\u0252\n^"+
"\r^\16^\u0253\3^\3^\3^\3^\3^\3\u0253\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\u0267\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\u00c3"+
"\3\2\2\2\13\u00c5\3\2\2\2\r\u00ca\3\2\2\2\17\u00d2\3\2\2\2\21\u00dc\3"+
"\2\2\2\23\u00e0\3\2\2\2\25\u00e9\3\2\2\2\27\u00f1\3\2\2\2\31\u00fd\3\2"+
"\2\2\33\u0109\3\2\2\2\35\u0114\3\2\2\2\37\u0116\3\2\2\2!\u0118\3\2\2\2"+
"#\u011e\3\2\2\2%\u0125\3\2\2\2\'\u012a\3\2\2\2)\u012f\3\2\2\2+\u0135\3"+
"\2\2\2-\u0139\3\2\2\2/\u013f\3\2\2\2\61\u0145\3\2\2\2\63\u014c\3\2\2\2"+
"\65\u014e\3\2\2\2\67\u0150\3\2\2\29\u0153\3\2\2\2;\u0156\3\2\2\2=\u0159"+
"\3\2\2\2?\u015d\3\2\2\2A\u0160\3\2\2\2C\u0164\3\2\2\2E\u0168\3\2\2\2G"+
"\u016c\3\2\2\2I\u0171\3\2\2\2K\u0176\3\2\2\2M\u0179\3\2\2\2O\u017c\3\2"+
"\2\2Q\u017f\3\2\2\2S\u0182\3\2\2\2U\u0185\3\2\2\2W\u0187\3\2\2\2Y\u0189"+
"\3\2\2\2[\u018b\3\2\2\2]\u018d\3\2\2\2_\u0191\3\2\2\2a\u0194\3\2\2\2c"+
"\u0196\3\2\2\2e\u0198\3\2\2\2g\u019b\3\2\2\2i\u019d\3\2\2\2k\u01a0\3\2"+
"\2\2m\u01a3\3\2\2\2o\u01a7\3\2\2\2q\u01ab\3\2\2\2s\u01ad\3\2\2\2u\u01af"+
"\3\2\2\2w\u01b2\3\2\2\2y\u01b5\3\2\2\2{\u01b8\3\2\2\2}\u01bb\3\2\2\2\177"+
"\u01bd\3\2\2\2\u0081\u01bf\3\2\2\2\u0083\u01c1\3\2\2\2\u0085\u01c5\3\2"+
"\2\2\u0087\u01c8\3\2\2\2\u0089\u01cc\3\2\2\2\u008b\u01cf\3\2\2\2\u008d"+
"\u01d1\3\2\2\2\u008f\u01d3\3\2\2\2\u0091\u01d5\3\2\2\2\u0093\u01d7\3\2"+
"\2\2\u0095\u01da\3\2\2\2\u0097\u01dd\3\2\2\2\u0099\u01e0\3\2\2\2\u009b"+
"\u01e3\3\2\2\2\u009d\u01e6\3\2\2\2\u009f\u01e9\3\2\2\2\u00a1\u01ee\3\2"+
"\2\2\u00a3\u01f4\3\2\2\2\u00a5\u01f9\3\2\2\2\u00a7\u0202\3\2\2\2\u00a9"+
"\u0207\3\2\2\2\u00ab\u020b\3\2\2\2\u00ad\u0219\3\2\2\2\u00af\u021b\3\2"+
"\2\2\u00b1\u0221\3\2\2\2\u00b3\u0227\3\2\2\2\u00b5\u0230\3\2\2\2\u00b7"+
"\u0240\3\2\2\2\u00b9\u0242\3\2\2\2\u00bb\u024d\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"+
"\177\2\2\u00c2\b\3\2\2\2\u00c3\u00c4\7<\2\2\u00c4\n\3\2\2\2\u00c5\u00c6"+
"\7i\2\2\u00c6\u00c7\7q\2\2\u00c7\u00c8\7v\2\2\u00c8\u00c9\7q\2\2\u00c9"+
"\f\3\2\2\2\u00ca\u00cb\7\'\2\2\u00cb\u00cc\7q\2\2\u00cc\u00cd\7w\2\2\u00cd"+
"\u00ce\7v\2\2\u00ce\u00cf\7r\2\2\u00cf\u00d0\7w\2\2\u00d0\u00d1\7v\2\2"+
"\u00d1\16\3\2\2\2\u00d2\u00d3\7\'\2\2\u00d3\u00d4\7n\2\2\u00d4\u00d5\7"+
"c\2\2\u00d5\u00d6\7w\2\2\u00d6\u00d7\7p\2\2\u00d7\u00d8\7e\2\2\u00d8\u00d9"+
"\7j\2\2\u00d9\u00da\7g\2\2\u00da\u00db\7t\2\2\u00db\20\3\2\2\2\u00dc\u00dd"+
"\7\'\2\2\u00dd\u00de\7|\2\2\u00de\u00df\7r\2\2\u00df\22\3\2\2\2\u00e0"+
"\u00e1\7\'\2\2\u00e1\u00e2\7c\2\2\u00e2\u00e3\7f\2\2\u00e3\u00e4\7f\2"+
"\2\u00e4\u00e5\7t\2\2\u00e5\u00e6\7g\2\2\u00e6\u00e7\7u\2\2\u00e7\u00e8"+
"\7u\2\2\u00e8\24\3\2\2\2\u00e9\u00ea\7\'\2\2\u00ea\u00eb\7k\2\2\u00eb"+
"\u00ec\7o\2\2\u00ec\u00ed\7r\2\2\u00ed\u00ee\7q\2\2\u00ee\u00ef\7t\2\2"+
"\u00ef\u00f0\7v\2\2\u00f0\26\3\2\2\2\u00f1\u00f2\7\'\2\2\u00f2\u00f3\7"+
"d\2\2\u00f3\u00f4\7t\2\2\u00f4\u00f5\7g\2\2\u00f5\u00f6\7c\2\2\u00f6\u00f7"+
"\7m\2\2\u00f7\u00f8\7r\2\2\u00f8\u00f9\7q\2\2\u00f9\u00fa\7k\2\2\u00fa"+
"\u00fb\7p\2\2\u00fb\u00fc\7v\2\2\u00fc\30\3\2\2\2\u00fd\u00fe\7\'\2\2"+
"\u00fe\u00ff\7c\2\2\u00ff\u0100\7u\2\2\u0100\u0101\7o\2\2\u0101\u0102"+
"\7k\2\2\u0102\u0103\7p\2\2\u0103\u0104\7e\2\2\u0104\u0105\7n\2\2\u0105"+
"\u0106\7w\2\2\u0106\u0107\7f\2\2\u0107\u0108\7g\2\2\u0108\32\3\2\2\2\u0109"+
"\u010a\7\'\2\2\u010a\u010b\7c\2\2\u010b\u010c\7u\2\2\u010c\u010d\7o\2"+
"\2\u010d\u010e\7d\2\2\u010e\u010f\7k\2\2\u010f\u0110\7p\2\2\u0110\u0111"+
"\7c\2\2\u0111\u0112\7t\2\2\u0112\u0113\7{\2\2\u0113\34\3\2\2\2\u0114\u0115"+
"\7.\2\2\u0115\36\3\2\2\2\u0116\u0117\7?\2\2\u0117 \3\2\2\2\u0118\u0119"+
"\7e\2\2\u0119\u011a\7q\2\2\u011a\u011b\7p\2\2\u011b\u011c\7u\2\2\u011c"+
"\u011d\7v\2\2\u011d\"\3\2\2\2\u011e\u011f\7o\2\2\u011f\u0120\7g\2\2\u0120"+
"\u0121\7o\2\2\u0121\u0122\7q\2\2\u0122\u0123\7t\2\2\u0123\u0124\7{\2\2"+
"\u0124$\3\2\2\2\u0125\u0126\7d\2\2\u0126\u0127\7{\2\2\u0127\u0128\7v\2"+
"\2\u0128\u0129\7g\2\2\u0129&\3\2\2\2\u012a\u012b\7y\2\2\u012b\u012c\7"+
"q\2\2\u012c\u012d\7t\2\2\u012d\u012e\7f\2\2\u012e(\3\2\2\2\u012f\u0130"+
"\7h\2\2\u0130\u0131\7n\2\2\u0131\u0132\7q\2\2\u0132\u0133\7c\2\2\u0133"+
"\u0134\7v\2\2\u0134*\3\2\2\2\u0135\u0136\7u\2\2\u0136\u0137\7v\2\2\u0137"+
"\u0138\7t\2\2\u0138,\3\2\2\2\u0139\u013a\7u\2\2\u013a\u013b\7v\2\2\u013b"+
"\u013c\7t\2\2\u013c\u013d\7a\2\2\u013d\u013e\7r\2\2\u013e.\3\2\2\2\u013f"+
"\u0140\7u\2\2\u0140\u0141\7v\2\2\u0141\u0142\7t\2\2\u0142\u0143\7a\2\2"+
"\u0143\u0144\7u\2\2\u0144\60\3\2\2\2\u0145\u0146\7u\2\2\u0146\u0147\7"+
"v\2\2\u0147\u0148\7t\2\2\u0148\u0149\7a\2\2\u0149\u014a\7r\2\2\u014a\u014b"+
"\7u\2\2\u014b\62\3\2\2\2\u014c\u014d\7]\2\2\u014d\64\3\2\2\2\u014e\u014f"+
"\7_\2\2\u014f\66\3\2\2\2\u0150\u0151\7-\2\2\u0151\u0152\7?\2\2\u01528"+
"\3\2\2\2\u0153\u0154\7/\2\2\u0154\u0155\7?\2\2\u0155:\3\2\2\2\u0156\u0157"+
"\7\61\2\2\u0157\u0158\7?\2\2\u0158<\3\2\2\2\u0159\u015a\7\61\2\2\u015a"+
"\u015b\7\61\2\2\u015b\u015c\7?\2\2\u015c>\3\2\2\2\u015d\u015e\7,\2\2\u015e"+
"\u015f\7?\2\2\u015f@\3\2\2\2\u0160\u0161\7,\2\2\u0161\u0162\7,\2\2\u0162"+
"\u0163\7?\2\2\u0163B\3\2\2\2\u0164\u0165\7>\2\2\u0165\u0166\7>\2\2\u0166"+
"\u0167\7?\2\2\u0167D\3\2\2\2\u0168\u0169\7@\2\2\u0169\u016a\7@\2\2\u016a"+
"\u016b\7?\2\2\u016bF\3\2\2\2\u016c\u016d\7>\2\2\u016d\u016e\7>\2\2\u016e"+
"\u016f\7B\2\2\u016f\u0170\7?\2\2\u0170H\3\2\2\2\u0171\u0172\7@\2\2\u0172"+
"\u0173\7@\2\2\u0173\u0174\7B\2\2\u0174\u0175\7?\2\2\u0175J\3\2\2\2\u0176"+
"\u0177\7(\2\2\u0177\u0178\7?\2\2\u0178L\3\2\2\2\u0179\u017a\7~\2\2\u017a"+
"\u017b\7?\2\2\u017bN\3\2\2\2\u017c\u017d\7`\2\2\u017d\u017e\7?\2\2\u017e"+
"P\3\2\2\2\u017f\u0180\7-\2\2\u0180\u0181\7-\2\2\u0181R\3\2\2\2\u0182\u0183"+
"\7/\2\2\u0183\u0184\7/\2\2\u0184T\3\2\2\2\u0185\u0186\7*\2\2\u0186V\3"+
"\2\2\2\u0187\u0188\7+\2\2\u0188X\3\2\2\2\u0189\u018a\7-\2\2\u018aZ\3\2"+
"\2\2\u018b\u018c\7/\2\2\u018c\\\3\2\2\2\u018d\u018e\7p\2\2\u018e\u018f"+
"\7q\2\2\u018f\u0190\7v\2\2\u0190^\3\2\2\2\u0191\u0192\7,\2\2\u0192\u0193"+
"\7,\2\2\u0193`\3\2\2\2\u0194\u0195\7,\2\2\u0195b\3\2\2\2\u0196\u0197\7"+
"\61\2\2\u0197d\3\2\2\2\u0198\u0199\7\61\2\2\u0199\u019a\7\61\2\2\u019a"+
"f\3\2\2\2\u019b\u019c\7\'\2\2\u019ch\3\2\2\2\u019d\u019e\7>\2\2\u019e"+
"\u019f\7>\2\2\u019fj\3\2\2\2\u01a0\u01a1\7@\2\2\u01a1\u01a2\7@\2\2\u01a2"+
"l\3\2\2\2\u01a3\u01a4\7>\2\2\u01a4\u01a5\7>\2\2\u01a5\u01a6\7B\2\2\u01a6"+
"n\3\2\2\2\u01a7\u01a8\7@\2\2\u01a8\u01a9\7@\2\2\u01a9\u01aa\7B\2\2\u01aa"+
"p\3\2\2\2\u01ab\u01ac\7>\2\2\u01acr\3\2\2\2\u01ad\u01ae\7@\2\2\u01aet"+
"\3\2\2\2\u01af\u01b0\7>\2\2\u01b0\u01b1\7?\2\2\u01b1v\3\2\2\2\u01b2\u01b3"+
"\7@\2\2\u01b3\u01b4\7?\2\2\u01b4x\3\2\2\2\u01b5\u01b6\7?\2\2\u01b6\u01b7"+
"\7?\2\2\u01b7z\3\2\2\2\u01b8\u01b9\7#\2\2\u01b9\u01ba\7?\2\2\u01ba|\3"+
"\2\2\2\u01bb\u01bc\7(\2\2\u01bc~\3\2\2\2\u01bd\u01be\7`\2\2\u01be\u0080"+
"\3\2\2\2\u01bf\u01c0\7~\2\2\u01c0\u0082\3\2\2\2\u01c1\u01c2\7c\2\2\u01c2"+
"\u01c3\7p\2\2\u01c3\u01c4\7f\2\2\u01c4\u0084\3\2\2\2\u01c5\u01c6\7q\2"+
"\2\u01c6\u01c7\7t\2\2\u01c7\u0086\3\2\2\2\u01c8\u01c9\7z\2\2\u01c9\u01ca"+
"\7q\2\2\u01ca\u01cb\7t\2\2\u01cb\u0088\3\2\2\2\u01cc\u01cd\7v\2\2\u01cd"+
"\u01ce\7q\2\2\u01ce\u008a\3\2\2\2\u01cf\u01d0\7\60\2\2\u01d0\u008c\3\2"+
"\2\2\u01d1\u01d2\7C\2\2\u01d2\u008e\3\2\2\2\u01d3\u01d4\7Z\2\2\u01d4\u0090"+
"\3\2\2\2\u01d5\u01d6\7[\2\2\u01d6\u0092\3\2\2\2\u01d7\u01d8\7C\2\2\u01d8"+
"\u01d9\7Z\2\2\u01d9\u0094\3\2\2\2\u01da\u01db\7C\2\2\u01db\u01dc\7[\2"+
"\2\u01dc\u0096\3\2\2\2\u01dd\u01de\7Z\2\2\u01de\u01df\7[\2\2\u01df\u0098"+
"\3\2\2\2\u01e0\u01e1\7U\2\2\u01e1\u01e2\7E\2\2\u01e2\u009a\3\2\2\2\u01e3"+
"\u01e4\7U\2\2\u01e4\u01e5\7K\2\2\u01e5\u009c\3\2\2\2\u01e6\u01e7\7U\2"+
"\2\u01e7\u01e8\7\\\2\2\u01e8\u009e\3\2\2\2\u01e9\u01ea\7v\2\2\u01ea\u01eb"+
"\7t\2\2\u01eb\u01ec\7w\2\2\u01ec\u01ed\7g\2\2\u01ed\u00a0\3\2\2\2\u01ee"+
"\u01ef\7h\2\2\u01ef\u01f0\7c\2\2\u01f0\u01f1\7n\2\2\u01f1\u01f2\7u\2\2"+
"\u01f2\u01f3\7g\2\2\u01f3\u00a2\3\2\2\2\u01f4\u01f5\7\'\2\2\u01f5\u01f6"+
"\7c\2\2\u01f6\u01f7\7u\2\2\u01f7\u01f8\7o\2\2\u01f8\u00a4\3\2\2\2\u01f9"+
"\u01fd\7=\2\2\u01fa\u01fc\n\2\2\2\u01fb\u01fa\3\2\2\2\u01fc\u01ff\3\2"+
"\2\2\u01fd\u01fb\3\2\2\2\u01fd\u01fe\3\2\2\2\u01fe\u0200\3\2\2\2\u01ff"+
"\u01fd\3\2\2\2\u0200\u0201\bS\2\2\u0201\u00a6\3\2\2\2\u0202\u0203\t\3"+
"\2\2\u0203\u0204\3\2\2\2\u0204\u0205\bT\3\2\u0205\u00a8\3\2\2\2\u0206"+
"\u0208\t\2\2\2\u0207\u0206\3\2\2\2\u0208\u0209\3\2\2\2\u0209\u0207\3\2"+
"\2\2\u0209\u020a\3\2\2\2\u020a\u00aa\3\2\2\2\u020b\u020f\t\4\2\2\u020c"+
"\u020e\t\5\2\2\u020d\u020c\3\2\2\2\u020e\u0211\3\2\2\2\u020f\u020d\3\2"+
"\2\2\u020f\u0210\3\2\2\2\u0210\u00ac\3\2\2\2\u0211\u020f\3\2\2\2\u0212"+
"\u021a\4\62;\2\u0213\u0215\4\63;\2\u0214\u0216\4\62;\2\u0215\u0214\3\2"+
"\2\2\u0216\u0217\3\2\2\2\u0217\u0215\3\2\2\2\u0217\u0218\3\2\2\2\u0218"+
"\u021a\3\2\2\2\u0219\u0212\3\2\2\2\u0219\u0213\3\2\2\2\u021a\u00ae\3\2"+
"\2\2\u021b\u021d\7&\2\2\u021c\u021e\t\6\2\2\u021d\u021c\3\2\2\2\u021e"+
"\u021f\3\2\2\2\u021f\u021d\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u00b0\3\2"+
"\2\2\u0221\u0223\7\'\2\2\u0222\u0224\4\62\63\2\u0223\u0222\3\2\2\2\u0224"+
"\u0225\3\2\2\2\u0225\u0223\3\2\2\2\u0225\u0226\3\2\2\2\u0226\u00b2\3\2"+
"\2\2\u0227\u022d\5\u00b5[\2\u0228\u022a\t\7\2\2\u0229\u022b\t\b\2\2\u022a"+
"\u0229\3\2\2\2\u022a\u022b\3\2\2\2\u022b\u022c\3\2\2\2\u022c\u022e\5\u00b5"+
"[\2\u022d\u0228\3\2\2\2\u022d\u022e\3\2\2\2\u022e\u00b4\3\2\2\2\u022f"+
"\u0231\4\62;\2\u0230\u022f\3\2\2\2\u0231\u0232\3\2\2\2\u0232\u0230\3\2"+
"\2\2\u0232\u0233\3\2\2\2\u0233\u023a\3\2\2\2\u0234\u0236\7\60\2\2\u0235"+
"\u0237\4\62;\2\u0236\u0235\3\2\2\2\u0237\u0238\3\2\2\2\u0238\u0236\3\2"+
"\2\2\u0238\u0239\3\2\2\2\u0239\u023b\3\2\2\2\u023a\u0234\3\2\2\2\u023a"+
"\u023b\3\2\2\2\u023b\u00b6\3\2\2\2\u023c\u023d\7^\2\2\u023d\u0241\13\2"+
"\2\2\u023e\u023f\7^\2\2\u023f\u0241\5\u00a9U\2\u0240\u023c\3\2\2\2\u0240"+
"\u023e\3\2\2\2\u0241\u00b8\3\2\2\2\u0242\u0247\7$\2\2\u0243\u0246\5\u00b7"+
"\\\2\u0244\u0246\n\t\2\2\u0245\u0243\3\2\2\2\u0245\u0244\3\2\2\2\u0246"+
"\u0249\3\2\2\2\u0247\u0245\3\2\2\2\u0247\u0248\3\2\2\2\u0248\u024a\3\2"+
"\2\2\u0249\u0247\3\2\2\2\u024a\u024b\7$\2\2\u024b\u024c\b]\4\2\u024c\u00ba"+
"\3\2\2\2\u024d\u024e\7}\2\2\u024e\u024f\7}\2\2\u024f\u0251\3\2\2\2\u0250"+
"\u0252\13\2\2\2\u0251\u0250\3\2\2\2\u0252\u0253\3\2\2\2\u0253\u0254\3"+
"\2\2\2\u0253\u0251\3\2\2\2\u0254\u0255\3\2\2\2\u0255\u0256\7\177\2\2\u0256"+
"\u0257\7\177\2\2\u0257\u0258\3\2\2\2\u0258\u0259\b^\5\2\u0259\u00bc\3"+
"\2\2\2\24\2\u01fd\u0209\u020f\u0217\u0219\u021d\u021f\u0225\u022a\u022d"+
"\u0232\u0238\u023a\u0240\u0245\u0247\u0253\6\2\3\2\b\2\2\3]\2\3^\3";
public static final ATN _ATN =
new ATNDeserializer().deserialize(_serializedATN.toCharArray());
static {

View File

@ -63,77 +63,110 @@ T__61=62
T__62=63
T__63=64
T__64=65
COMMENT=66
WS=67
EOL=68
NAME=69
DEC_INTEGER=70
HEX_INTEGER=71
BIN_INTEGER=72
FLOAT_NUMBER=73
STRING=74
'%'=1
','=2
'='=3
'const'=4
'memory'=5
'byte'=6
'word'=7
'float'=8
'str'=9
'str_p'=10
'str_s'=11
'str_ps'=12
'['=13
']'=14
'+='=15
'-='=16
'/='=17
'//='=18
'*='=19
'**='=20
'<<='=21
'>>='=22
'<<@='=23
'>>@='=24
'&='=25
'|='=26
'^='=27
'('=28
')'=29
'**'=30
'*'=31
'/'=32
'//'=33
'+'=34
'-'=35
'<<'=36
'>>'=37
'<<@'=38
'>>@'=39
'&'=40
'|'=41
'^'=42
'and'=43
'or'=44
'xor'=45
'=='=46
'!='=47
'<'=48
'>'=49
'<='=50
'>='=51
'~'=52
'not'=53
'.'=54
'A'=55
'X'=56
'Y'=57
'AX'=58
'AY'=59
'XY'=60
'SC'=61
'SI'=62
'SZ'=63
'true'=64
'false'=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
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
'}'=3
':'=4
'goto'=5
'%output'=6
'%launcher'=7
'%zp'=8
'%address'=9
'%import'=10
'%breakpoint'=11
'%asminclude'=12
'%asmbinary'=13
','=14
'='=15
'const'=16
'memory'=17
'byte'=18
'word'=19
'float'=20
'str'=21
'str_p'=22
'str_s'=23
'str_ps'=24
'['=25
']'=26
'+='=27
'-='=28
'/='=29
'//='=30
'*='=31
'**='=32
'<<='=33
'>>='=34
'<<@='=35
'>>@='=36
'&='=37
'|='=38
'^='=39
'++'=40
'--'=41
'('=42
')'=43
'+'=44
'-'=45
'not'=46
'**'=47
'*'=48
'/'=49
'//'=50
'%'=51
'<<'=52
'>>'=53
'<<@'=54
'>>@'=55
'<'=56
'>'=57
'<='=58
'>='=59
'=='=60
'!='=61
'&'=62
'^'=63
'|'=64
'and'=65
'or'=66
'xor'=67
'to'=68
'.'=69
'A'=70
'X'=71
'Y'=72
'AX'=73
'AY'=74
'XY'=75
'SC'=76
'SI'=77
'SZ'=78
'true'=79
'false'=80
'%asm'=81

File diff suppressed because it is too large Load Diff

Binary file not shown.

BIN
lib/hamcrest-core-1.2.1.jar Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/opentest4j-1.1.0.jar Normal file

Binary file not shown.