Commit 1062ffb9 authored by Daniel Clifford's avatar Daniel Clifford Committed by Commit Bot

[torque]: Implement structs

Struct are bundles of value types. They are essentially just shorthand
for passing around a group of individually defined values.

Struct types are declared like this:

  struct A {
    x: Smi;
    y: int32;
  }

and can be constructed explicitly like this:

  A{0, 0}

Structs can be used wherever other types are used (e.g. variables,
parameters, return values) except for parameter/return types of
builtins and runtime functions.

Struct use field access notation to set/get their values like this:

  let a: A = A{0, 0};
  let b: Smi = a.x;
  a.y = 0;

Change-Id: I9fd36a6514c37882831256a49a50809c5db75b56
Reviewed-on: https://chromium-review.googlesource.com/1122133
Commit-Queue: Daniel Clifford <danno@chromium.org>
Reviewed-by: 's avatarTobias Tebbi <tebbi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#54501}
parent 16af1baa
...@@ -190,9 +190,11 @@ unaryExpression ...@@ -190,9 +190,11 @@ unaryExpression
| op=(PLUS | MINUS | BIT_NOT | NOT) unaryExpression; | op=(PLUS | MINUS | BIT_NOT | NOT) unaryExpression;
locationExpression locationExpression
: IDENTIFIER genericSpecializationTypeList? : IDENTIFIER
| locationExpression '.' IDENTIFIER | locationExpression '.' IDENTIFIER
| locationExpression '[' expression ']'; | primaryExpression '.' IDENTIFIER
| locationExpression '[' expression ']'
| primaryExpression '[' expression ']';
incrementDecrement incrementDecrement
: INCREMENT locationExpression : INCREMENT locationExpression
...@@ -206,14 +208,24 @@ assignment ...@@ -206,14 +208,24 @@ assignment
| locationExpression ((ASSIGNMENT | ASSIGNMENT_OPERATOR) expression)?; | locationExpression ((ASSIGNMENT | ASSIGNMENT_OPERATOR) expression)?;
assignmentExpression assignmentExpression
: primaryExpression : functionPointerExpression
| assignment; | assignment;
structExpression
: IDENTIFIER '{' (expression (',' expression)*)? '}';
functionPointerExpression
: primaryExpression
| IDENTIFIER genericSpecializationTypeList?
;
primaryExpression primaryExpression
: helperCall : helperCall
| structExpression
| DECIMAL_LITERAL | DECIMAL_LITERAL
| STRING_LITERAL | STRING_LITERAL
| ('(' expression ')'); | ('(' expression ')')
;
forInitialization : variableDeclarationWithInitialization?; forInitialization : variableDeclarationWithInitialization?;
forLoop: FOR '(' forInitialization ';' expression ';' assignment ')' statementBlock; forLoop: FOR '(' forInitialization ';' expression ';' assignment ')' statementBlock;
...@@ -266,6 +278,9 @@ statementBlock ...@@ -266,6 +278,9 @@ statementBlock
helperBody : statementScope; helperBody : statementScope;
fieldDeclaration: IDENTIFIER ':' type ';';
fieldListDeclaration: fieldDeclaration*;
extendsDeclaration: 'extends' IDENTIFIER; extendsDeclaration: 'extends' IDENTIFIER;
generatesDeclaration: 'generates' STRING_LITERAL; generatesDeclaration: 'generates' STRING_LITERAL;
constexprDeclaration: 'constexpr' STRING_LITERAL; constexprDeclaration: 'constexpr' STRING_LITERAL;
...@@ -280,9 +295,11 @@ genericSpecialization: IDENTIFIER genericSpecializationTypeList parameterList op ...@@ -280,9 +295,11 @@ genericSpecialization: IDENTIFIER genericSpecializationTypeList parameterList op
macroDeclaration : ('operator' STRING_LITERAL)? MACRO IDENTIFIER optionalGenericTypeList parameterList optionalType optionalLabelList (helperBody | ';'); macroDeclaration : ('operator' STRING_LITERAL)? MACRO IDENTIFIER optionalGenericTypeList parameterList optionalType optionalLabelList (helperBody | ';');
externConstDeclaration : CONST IDENTIFIER ':' type generatesDeclaration ';'; externConstDeclaration : CONST IDENTIFIER ':' type generatesDeclaration ';';
constDeclaration: CONST IDENTIFIER ':' type ASSIGNMENT expression ';'; constDeclaration: CONST IDENTIFIER ':' type ASSIGNMENT expression ';';
structDeclaration : 'struct' IDENTIFIER '{' fieldListDeclaration '}';
declaration declaration
: typeDeclaration : structDeclaration
| typeDeclaration
| typeAliasDeclaration | typeAliasDeclaration
| builtinDeclaration | builtinDeclaration
| genericSpecialization | genericSpecialization
......
token literal names:
null
'('
')'
'=>'
','
':'
'type'
'?'
'||'
'&&'
'.'
'['
']'
'{'
'}'
';'
'of'
'else'
'extends'
'generates'
'operator'
'struct'
'macro'
'builtin'
'runtime'
'module'
'javascript'
'deferred'
'if'
'for'
'while'
'return'
'constexpr'
'continue'
'break'
'goto'
'otherwise'
'try'
'label'
'labels'
'tail'
'isnt'
'is'
'let'
'const'
'extern'
'assert'
'check'
'unreachable'
'debug'
'='
null
'=='
'+'
'-'
'*'
'/'
'%'
'|'
'&'
'~'
'max'
'min'
'!='
'<'
'<='
'>'
'>='
'<<'
'>>'
'>>>'
'...'
null
'++'
'--'
'!'
null
null
null
null
null
null
token symbolic names:
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
MACRO
BUILTIN
RUNTIME
MODULE
JAVASCRIPT
DEFERRED
IF
FOR
WHILE
RETURN
CONSTEXPR
CONTINUE
BREAK
GOTO
OTHERWISE
TRY
LABEL
LABELS
TAIL
ISNT
IS
LET
CONST
EXTERN
ASSERT_TOKEN
CHECK_TOKEN
UNREACHABLE_TOKEN
DEBUG_TOKEN
ASSIGNMENT
ASSIGNMENT_OPERATOR
EQUAL
PLUS
MINUS
MULTIPLY
DIVIDE
MODULO
BIT_OR
BIT_AND
BIT_NOT
MAX
MIN
NOT_EQUAL
LESS_THAN
LESS_THAN_EQUAL
GREATER_THAN
GREATER_THAN_EQUAL
SHIFT_LEFT
SHIFT_RIGHT
SHIFT_RIGHT_ARITHMETIC
VARARGS
EQUALITY_OPERATOR
INCREMENT
DECREMENT
NOT
STRING_LITERAL
IDENTIFIER
WS
BLOCK_COMMENT
LINE_COMMENT
DECIMAL_LITERAL
rule names:
type
typeList
genericSpecializationTypeList
optionalGenericTypeList
typeListMaybeVarArgs
labelParameter
optionalType
optionalLabelList
optionalOtherwise
parameter
parameterList
labelDeclaration
expression
conditionalExpression
logicalORExpression
logicalANDExpression
bitwiseExpression
equalityExpression
relationalExpression
shiftExpression
additiveExpression
multiplicativeExpression
unaryExpression
locationExpression
incrementDecrement
assignment
assignmentExpression
structExpression
functionPointerExpression
primaryExpression
forInitialization
forLoop
rangeSpecifier
forOfRange
forOfLoop
argument
argumentList
helperCall
labelReference
variableDeclaration
variableDeclarationWithInitialization
helperCallStatement
expressionStatement
ifStatement
whileLoop
returnStatement
breakStatement
continueStatement
gotoStatement
handlerWithStatement
tryLabelStatement
diagnosticStatement
statement
statementList
statementScope
statementBlock
helperBody
fieldDeclaration
fieldListDeclaration
extendsDeclaration
generatesDeclaration
constexprDeclaration
typeDeclaration
typeAliasDeclaration
externalBuiltin
externalMacro
externalRuntime
builtinDeclaration
genericSpecialization
macroDeclaration
externConstDeclaration
constDeclaration
structDeclaration
declaration
moduleDeclaration
file
atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 83, 821, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 3, 2, 3, 2, 5, 2, 157, 10, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 5, 2, 171, 10, 2, 3, 2, 3, 2, 3, 2, 7, 2, 176, 10, 2, 12, 2, 14, 2, 179, 11, 2, 3, 3, 3, 3, 3, 3, 7, 3, 184, 10, 3, 12, 3, 14, 3, 187, 11, 3, 5, 3, 189, 10, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 7, 5, 203, 10, 5, 12, 5, 14, 5, 206, 11, 5, 3, 5, 5, 5, 209, 10, 5, 3, 6, 3, 6, 5, 6, 213, 10, 6, 3, 6, 3, 6, 7, 6, 217, 10, 6, 12, 6, 14, 6, 220, 11, 6, 3, 6, 3, 6, 5, 6, 224, 10, 6, 3, 6, 3, 6, 3, 6, 3, 6, 5, 6, 230, 10, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 5, 7, 237, 10, 7, 3, 8, 3, 8, 5, 8, 241, 10, 8, 3, 9, 3, 9, 3, 9, 3, 9, 7, 9, 247, 10, 9, 12, 9, 14, 9, 250, 11, 9, 5, 9, 252, 10, 9, 3, 10, 3, 10, 3, 10, 3, 10, 7, 10, 258, 10, 10, 12, 10, 14, 10, 261, 11, 10, 5, 10, 263, 10, 10, 3, 11, 3, 11, 3, 11, 5, 11, 268, 10, 11, 3, 12, 3, 12, 5, 12, 272, 10, 12, 3, 12, 3, 12, 7, 12, 276, 10, 12, 12, 12, 14, 12, 279, 11, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 291, 10, 12, 3, 13, 3, 13, 5, 13, 295, 10, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 7, 15, 308, 10, 15, 12, 15, 14, 15, 311, 11, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 7, 16, 319, 10, 16, 12, 16, 14, 16, 322, 11, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 7, 17, 330, 10, 17, 12, 17, 14, 17, 333, 11, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 7, 18, 341, 10, 18, 12, 18, 14, 18, 344, 11, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 7, 19, 352, 10, 19, 12, 19, 14, 19, 355, 11, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 7, 20, 363, 10, 20, 12, 20, 14, 20, 366, 11, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 7, 21, 374, 10, 21, 12, 21, 14, 21, 377, 11, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 7, 22, 385, 10, 22, 12, 22, 14, 22, 388, 11, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 7, 23, 396, 10, 23, 12, 23, 14, 23, 399, 11, 23, 3, 24, 3, 24, 3, 24, 5, 24, 404, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 417, 10, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 7, 25, 427, 10, 25, 12, 25, 14, 25, 430, 11, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 442, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 5, 27, 448, 10, 27, 5, 27, 450, 10, 27, 3, 28, 3, 28, 5, 28, 454, 10, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 461, 10, 29, 12, 29, 14, 29, 464, 11, 29, 5, 29, 466, 10, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 5, 30, 473, 10, 30, 5, 30, 475, 10, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 5, 31, 485, 10, 31, 3, 32, 5, 32, 488, 10, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 5, 34, 502, 10, 34, 3, 34, 3, 34, 5, 34, 506, 10, 34, 3, 34, 3, 34, 3, 35, 5, 35, 511, 10, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 5, 38, 526, 10, 38, 3, 38, 3, 38, 7, 38, 530, 10, 38, 12, 38, 14, 38, 533, 11, 38, 3, 38, 3, 38, 3, 39, 3, 39, 5, 39, 539, 10, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 5, 42, 554, 10, 42, 3, 43, 5, 43, 557, 10, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 5, 45, 565, 10, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 5, 45, 573, 10, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 5, 47, 583, 10, 47, 3, 48, 3, 48, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 5, 50, 592, 10, 50, 3, 51, 3, 51, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 6, 52, 601, 10, 52, 13, 52, 14, 52, 602, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 3, 53, 5, 53, 612, 10, 53, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 3, 54, 5, 54, 643, 10, 54, 3, 55, 7, 55, 646, 10, 55, 12, 55, 14, 55, 649, 11, 55, 3, 56, 5, 56, 652, 10, 56, 3, 56, 3, 56, 3, 56, 3, 56, 3, 57, 3, 57, 5, 57, 660, 10, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 59, 3, 59, 3, 59, 3, 60, 7, 60, 670, 10, 60, 12, 60, 14, 60, 673, 11, 60, 3, 61, 3, 61, 3, 61, 3, 62, 3, 62, 3, 62, 3, 63, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 5, 64, 687, 10, 64, 3, 64, 5, 64, 690, 10, 64, 3, 64, 5, 64, 693, 10, 64, 3, 64, 3, 64, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 65, 3, 66, 3, 66, 5, 66, 705, 10, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 67, 5, 67, 719, 10, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 68, 3, 69, 5, 69, 737, 10, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 3, 69, 5, 69, 746, 10, 69, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 5, 71, 757, 10, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 3, 71, 5, 71, 767, 10, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 73, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 3, 75, 5, 75, 801, 10, 75, 3, 76, 3, 76, 3, 76, 3, 76, 7, 76, 807, 10, 76, 12, 76, 14, 76, 810, 11, 76, 3, 76, 3, 76, 3, 77, 3, 77, 7, 77, 816, 10, 77, 12, 77, 14, 77, 819, 11, 77, 3, 77, 2, 13, 2, 28, 30, 32, 34, 36, 38, 40, 42, 44, 48, 78, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 2, 13, 3, 2, 60, 61, 4, 2, 54, 54, 65, 65, 3, 2, 66, 69, 3, 2, 70, 72, 3, 2, 55, 56, 3, 2, 57, 59, 5, 2, 55, 56, 62, 62, 77, 77, 3, 2, 52, 53, 4, 2, 63, 64, 79, 79, 3, 2, 45, 46, 3, 2, 48, 49, 2, 849, 2, 170, 3, 2, 2, 2, 4, 188, 3, 2, 2, 2, 6, 190, 3, 2, 2, 2, 8, 208, 3, 2, 2, 2, 10, 229, 3, 2, 2, 2, 12, 231, 3, 2, 2, 2, 14, 240, 3, 2, 2, 2, 16, 251, 3, 2, 2, 2, 18, 262, 3, 2, 2, 2, 20, 264, 3, 2, 2, 2, 22, 290, 3, 2, 2, 2, 24, 292, 3, 2, 2, 2, 26, 296, 3, 2, 2, 2, 28, 298, 3, 2, 2, 2, 30, 312, 3, 2, 2, 2, 32, 323, 3, 2, 2, 2, 34, 334, 3, 2, 2, 2, 36, 345, 3, 2, 2, 2, 38, 356, 3, 2, 2, 2, 40, 367, 3, 2, 2, 2, 42, 378, 3, 2, 2, 2, 44, 389, 3, 2, 2, 2, 46, 403, 3, 2, 2, 2, 48, 416, 3, 2, 2, 2, 50, 441, 3, 2, 2, 2, 52, 449, 3, 2, 2, 2, 54, 453, 3, 2, 2, 2, 56, 455, 3, 2, 2, 2, 58, 474, 3, 2, 2, 2, 60, 484, 3, 2, 2, 2, 62, 487, 3, 2, 2, 2, 64, 489, 3, 2, 2, 2, 66, 499, 3, 2, 2, 2, 68, 510, 3, 2, 2, 2, 70, 512, 3, 2, 2, 2, 72, 521, 3, 2, 2, 2, 74, 523, 3, 2, 2, 2, 76, 536, 3, 2, 2, 2, 78, 543, 3, 2, 2, 2, 80, 545, 3, 2, 2, 2, 82, 550, 3, 2, 2, 2, 84, 556, 3, 2, 2, 2, 86, 560, 3, 2, 2, 2, 88, 562, 3, 2, 2, 2, 90, 574, 3, 2, 2, 2, 92, 580, 3, 2, 2, 2, 94, 584, 3, 2, 2, 2, 96, 586, 3, 2, 2, 2, 98, 588, 3, 2, 2, 2, 100, 593, 3, 2, 2, 2, 102, 597, 3, 2, 2, 2, 104, 611, 3, 2, 2, 2, 106, 642, 3, 2, 2, 2, 108, 647, 3, 2, 2, 2, 110, 651, 3, 2, 2, 2, 112, 659, 3, 2, 2, 2, 114, 661, 3, 2, 2, 2, 116, 663, 3, 2, 2, 2, 118, 671, 3, 2, 2, 2, 120, 674, 3, 2, 2, 2, 122, 677, 3, 2, 2, 2, 124, 680, 3, 2, 2, 2, 126, 683, 3, 2, 2, 2, 128, 696, 3, 2, 2, 2, 130, 702, 3, 2, 2, 2, 132, 715, 3, 2, 2, 2, 134, 728, 3, 2, 2, 2, 136, 736, 3, 2, 2, 2, 138, 747, 3, 2, 2, 2, 140, 756, 3, 2, 2, 2, 142, 768, 3, 2, 2, 2, 144, 775, 3, 2, 2, 2, 146, 783, 3, 2, 2, 2, 148, 800, 3, 2, 2, 2, 150, 802, 3, 2, 2, 2, 152, 817, 3, 2, 2, 2, 154, 156, 8, 2, 1, 2, 155, 157, 7, 34, 2, 2, 156, 155, 3, 2, 2, 2, 156, 157, 3, 2, 2, 2, 157, 158, 3, 2, 2, 2, 158, 171, 7, 79, 2, 2, 159, 160, 7, 25, 2, 2, 160, 161, 7, 3, 2, 2, 161, 162, 5, 4, 3, 2, 162, 163, 7, 4, 2, 2, 163, 164, 7, 5, 2, 2, 164, 165, 5, 2, 2, 5, 165, 171, 3, 2, 2, 2, 166, 167, 7, 3, 2, 2, 167, 168, 5, 2, 2, 2, 168, 169, 7, 4, 2, 2, 169, 171, 3, 2, 2, 2, 170, 154, 3, 2, 2, 2, 170, 159, 3, 2, 2, 2, 170, 166, 3, 2, 2, 2, 171, 177, 3, 2, 2, 2, 172, 173, 12, 4, 2, 2, 173, 174, 7, 60, 2, 2, 174, 176, 5, 2, 2, 5, 175, 172, 3, 2, 2, 2, 176, 179, 3, 2, 2, 2, 177, 175, 3, 2, 2, 2, 177, 178, 3, 2, 2, 2, 178, 3, 3, 2, 2, 2, 179, 177, 3, 2, 2, 2, 180, 185, 5, 2, 2, 2, 181, 182, 7, 6, 2, 2, 182, 184, 5, 2, 2, 2, 183, 181, 3, 2, 2, 2, 184, 187, 3, 2, 2, 2, 185, 183, 3, 2, 2, 2, 185, 186, 3, 2, 2, 2, 186, 189, 3, 2, 2, 2, 187, 185, 3, 2, 2, 2, 188, 180, 3, 2, 2, 2, 188, 189, 3, 2, 2, 2, 189, 5, 3, 2, 2, 2, 190, 191, 7, 66, 2, 2, 191, 192, 5, 4, 3, 2, 192, 193, 7, 68, 2, 2, 193, 7, 3, 2, 2, 2, 194, 195, 7, 66, 2, 2, 195, 196, 7, 79, 2, 2, 196, 197, 7, 7, 2, 2, 197, 204, 7, 8, 2, 2, 198, 199, 7, 6, 2, 2, 199, 200, 7, 79, 2, 2, 200, 201, 7, 7, 2, 2, 201, 203, 7, 8, 2, 2, 202, 198, 3, 2, 2, 2, 203, 206, 3, 2, 2, 2, 204, 202, 3, 2, 2, 2, 204, 205, 3, 2, 2, 2, 205, 207, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 207, 209, 7, 68, 2, 2, 208, 194, 3, 2, 2, 2, 208, 209, 3, 2, 2, 2, 209, 9, 3, 2, 2, 2, 210, 212, 7, 3, 2, 2, 211, 213, 5, 2, 2, 2, 212, 211, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 218, 3, 2, 2, 2, 214, 215, 7, 6, 2, 2, 215, 217, 5, 2, 2, 2, 216, 214, 3, 2, 2, 2, 217, 220, 3, 2, 2, 2, 218, 216, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 223, 3, 2, 2, 2, 220, 218, 3, 2, 2, 2, 221, 222, 7, 6, 2, 2, 222, 224, 7, 73, 2, 2, 223, 221, 3, 2, 2, 2, 223, 224, 3, 2, 2, 2, 224, 225, 3, 2, 2, 2, 225, 230, 7, 4, 2, 2, 226, 227, 7, 3, 2, 2, 227, 228, 7, 73, 2, 2, 228, 230, 7, 4, 2, 2, 229, 210, 3, 2, 2, 2, 229, 226, 3, 2, 2, 2, 230, 11, 3, 2, 2, 2, 231, 236, 7, 79, 2, 2, 232, 233, 7, 3, 2, 2, 233, 234, 5, 4, 3, 2, 234, 235, 7, 4, 2, 2, 235, 237, 3, 2, 2, 2, 236, 232, 3, 2, 2, 2, 236, 237, 3, 2, 2, 2, 237, 13, 3, 2, 2, 2, 238, 239, 7, 7, 2, 2, 239, 241, 5, 2, 2, 2, 240, 238, 3, 2, 2, 2, 240, 241, 3, 2, 2, 2, 241, 15, 3, 2, 2, 2, 242, 243, 7, 41, 2, 2, 243, 248, 5, 12, 7, 2, 244, 245, 7, 6, 2, 2, 245, 247, 5, 12, 7, 2, 246, 244, 3, 2, 2, 2, 247, 250, 3, 2, 2, 2, 248, 246, 3, 2, 2, 2, 248, 249, 3, 2, 2, 2, 249, 252, 3, 2, 2, 2, 250, 248, 3, 2, 2, 2, 251, 242, 3, 2, 2, 2, 251, 252, 3, 2, 2, 2, 252, 17, 3, 2, 2, 2, 253, 254, 7, 38, 2, 2, 254, 259, 7, 79, 2, 2, 255, 256, 7, 6, 2, 2, 256, 258, 7, 79, 2, 2, 257, 255, 3, 2, 2, 2, 258, 261, 3, 2, 2, 2, 259, 257, 3, 2, 2, 2, 259, 260, 3, 2, 2, 2, 260, 263, 3, 2, 2, 2, 261, 259, 3, 2, 2, 2, 262, 253, 3, 2, 2, 2, 262, 263, 3, 2, 2, 2, 263, 19, 3, 2, 2, 2, 264, 265, 7, 79, 2, 2, 265, 267, 7, 7, 2, 2, 266, 268, 5, 2, 2, 2, 267, 266, 3, 2, 2, 2, 267, 268, 3, 2, 2, 2, 268, 21, 3, 2, 2, 2, 269, 271, 7, 3, 2, 2, 270, 272, 5, 20, 11, 2, 271, 270, 3, 2, 2, 2, 271, 272, 3, 2, 2, 2, 272, 277, 3, 2, 2, 2, 273, 274, 7, 6, 2, 2, 274, 276, 5, 20, 11, 2, 275, 273, 3, 2, 2, 2, 276, 279, 3, 2, 2, 2, 277, 275, 3, 2, 2, 2, 277, 278, 3, 2, 2, 2, 278, 280, 3, 2, 2, 2, 279, 277, 3, 2, 2, 2, 280, 291, 7, 4, 2, 2, 281, 282, 7, 3, 2, 2, 282, 283, 5, 20, 11, 2, 283, 284, 7, 6, 2, 2, 284, 285, 5, 20, 11, 2, 285, 286, 7, 6, 2, 2, 286, 287, 7, 73, 2, 2, 287, 288, 7, 79, 2, 2, 288, 289, 7, 4, 2, 2, 289, 291, 3, 2, 2, 2, 290, 269, 3, 2, 2, 2, 290, 281, 3, 2, 2, 2, 291, 23, 3, 2, 2, 2, 292, 294, 7, 79, 2, 2, 293, 295, 5, 22, 12, 2, 294, 293, 3, 2, 2, 2, 294, 295, 3, 2, 2, 2, 295, 25, 3, 2, 2, 2, 296, 297, 5, 28, 15, 2, 297, 27, 3, 2, 2, 2, 298, 299, 8, 15, 1, 2, 299, 300, 5, 30, 16, 2, 300, 309, 3, 2, 2, 2, 301, 302, 12, 3, 2, 2, 302, 303, 7, 9, 2, 2, 303, 304, 5, 30, 16, 2, 304, 305, 7, 7, 2, 2, 305, 306, 5, 30, 16, 2, 306, 308, 3, 2, 2, 2, 307, 301, 3, 2, 2, 2, 308, 311, 3, 2, 2, 2, 309, 307, 3, 2, 2, 2, 309, 310, 3, 2, 2, 2, 310, 29, 3, 2, 2, 2, 311, 309, 3, 2, 2, 2, 312, 313, 8, 16, 1, 2, 313, 314, 5, 32, 17, 2, 314, 320, 3, 2, 2, 2, 315, 316, 12, 3, 2, 2, 316, 317, 7, 10, 2, 2, 317, 319, 5, 32, 17, 2, 318, 315, 3, 2, 2, 2, 319, 322, 3, 2, 2, 2, 320, 318, 3, 2, 2, 2, 320, 321, 3, 2, 2, 2, 321, 31, 3, 2, 2, 2, 322, 320, 3, 2, 2, 2, 323, 324, 8, 17, 1, 2, 324, 325, 5, 34, 18, 2, 325, 331, 3, 2, 2, 2, 326, 327, 12, 3, 2, 2, 327, 328, 7, 11, 2, 2, 328, 330, 5, 34, 18, 2, 329, 326, 3, 2, 2, 2, 330, 333, 3, 2, 2, 2, 331, 329, 3, 2, 2, 2, 331, 332, 3, 2, 2, 2, 332, 33, 3, 2, 2, 2, 333, 331, 3, 2, 2, 2, 334, 335, 8, 18, 1, 2, 335, 336, 5, 36, 19, 2, 336, 342, 3, 2, 2, 2, 337, 338, 12, 3, 2, 2, 338, 339, 9, 2, 2, 2, 339, 341, 5, 36, 19, 2, 340, 337, 3, 2, 2, 2, 341, 344, 3, 2, 2, 2, 342, 340, 3, 2, 2, 2, 342, 343, 3, 2, 2, 2, 343, 35, 3, 2, 2, 2, 344, 342, 3, 2, 2, 2, 345, 346, 8, 19, 1, 2, 346, 347, 5, 38, 20, 2, 347, 353, 3, 2, 2, 2, 348, 349, 12, 3, 2, 2, 349, 350, 9, 3, 2, 2, 350, 352, 5, 38, 20, 2, 351, 348, 3, 2, 2, 2, 352, 355, 3, 2, 2, 2, 353, 351, 3, 2, 2, 2, 353, 354, 3, 2, 2, 2, 354, 37, 3, 2, 2, 2, 355, 353, 3, 2, 2, 2, 356, 357, 8, 20, 1, 2, 357, 358, 5, 40, 21, 2, 358, 364, 3, 2, 2, 2, 359, 360, 12, 3, 2, 2, 360, 361, 9, 4, 2, 2, 361, 363, 5, 40, 21, 2, 362, 359, 3, 2, 2, 2, 363, 366, 3, 2, 2, 2, 364, 362, 3, 2, 2, 2, 364, 365, 3, 2, 2, 2, 365, 39, 3, 2, 2, 2, 366, 364, 3, 2, 2, 2, 367, 368, 8, 21, 1, 2, 368, 369, 5, 42, 22, 2, 369, 375, 3, 2, 2, 2, 370, 371, 12, 3, 2, 2, 371, 372, 9, 5, 2, 2, 372, 374, 5, 42, 22, 2, 373, 370, 3, 2, 2, 2, 374, 377, 3, 2, 2, 2, 375, 373, 3, 2, 2, 2, 375, 376, 3, 2, 2, 2, 376, 41, 3, 2, 2, 2, 377, 375, 3, 2, 2, 2, 378, 379, 8, 22, 1, 2, 379, 380, 5, 44, 23, 2, 380, 386, 3, 2, 2, 2, 381, 382, 12, 3, 2, 2, 382, 383, 9, 6, 2, 2, 383, 385, 5, 44, 23, 2, 384, 381, 3, 2, 2, 2, 385, 388, 3, 2, 2, 2, 386, 384, 3, 2, 2, 2, 386, 387, 3, 2, 2, 2, 387, 43, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 389, 390, 8, 23, 1, 2, 390, 391, 5, 46, 24, 2, 391, 397, 3, 2, 2, 2, 392, 393, 12, 3, 2, 2, 393, 394, 9, 7, 2, 2, 394, 396, 5, 46, 24, 2, 395, 392, 3, 2, 2, 2, 396, 399, 3, 2, 2, 2, 397, 395, 3, 2, 2, 2, 397, 398, 3, 2, 2, 2, 398, 45, 3, 2, 2, 2, 399, 397, 3, 2, 2, 2, 400, 404, 5, 54, 28, 2, 401, 402, 9, 8, 2, 2, 402, 404, 5, 46, 24, 2, 403, 400, 3, 2, 2, 2, 403, 401, 3, 2, 2, 2, 404, 47, 3, 2, 2, 2, 405, 406, 8, 25, 1, 2, 406, 417, 7, 79, 2, 2, 407, 408, 5, 60, 31, 2, 408, 409, 7, 12, 2, 2, 409, 410, 7, 79, 2, 2, 410, 417, 3, 2, 2, 2, 411, 412, 5, 60, 31, 2, 412, 413, 7, 13, 2, 2, 413, 414, 5, 26, 14, 2, 414, 415, 7, 14, 2, 2, 415, 417, 3, 2, 2, 2, 416, 405, 3, 2, 2, 2, 416, 407, 3, 2, 2, 2, 416, 411, 3, 2, 2, 2, 417, 428, 3, 2, 2, 2, 418, 419, 12, 6, 2, 2, 419, 420, 7, 12, 2, 2, 420, 427, 7, 79, 2, 2, 421, 422, 12, 4, 2, 2, 422, 423, 7, 13, 2, 2, 423, 424, 5, 26, 14, 2, 424, 425, 7, 14, 2, 2, 425, 427, 3, 2, 2, 2, 426, 418, 3, 2, 2, 2, 426, 421, 3, 2, 2, 2, 427, 430, 3, 2, 2, 2, 428, 426, 3, 2, 2, 2, 428, 429, 3, 2, 2, 2, 429, 49, 3, 2, 2, 2, 430, 428, 3, 2, 2, 2, 431, 432, 7, 75, 2, 2, 432, 442, 5, 48, 25, 2, 433, 434, 7, 76, 2, 2, 434, 442, 5, 48, 25, 2, 435, 436, 5, 48, 25, 2, 436, 437, 7, 75, 2, 2, 437, 442, 3, 2, 2, 2, 438, 439, 5, 48, 25, 2, 439, 440, 7, 76, 2, 2, 440, 442, 3, 2, 2, 2, 441, 431, 3, 2, 2, 2, 441, 433, 3, 2, 2, 2, 441, 435, 3, 2, 2, 2, 441, 438, 3, 2, 2, 2, 442, 51, 3, 2, 2, 2, 443, 450, 5, 50, 26, 2, 444, 447, 5, 48, 25, 2, 445, 446, 9, 9, 2, 2, 446, 448, 5, 26, 14, 2, 447, 445, 3, 2, 2, 2, 447, 448, 3, 2, 2, 2, 448, 450, 3, 2, 2, 2, 449, 443, 3, 2, 2, 2, 449, 444, 3, 2, 2, 2, 450, 53, 3, 2, 2, 2, 451, 454, 5, 58, 30, 2, 452, 454, 5, 52, 27, 2, 453, 451, 3, 2, 2, 2, 453, 452, 3, 2, 2, 2, 454, 55, 3, 2, 2, 2, 455, 456, 7, 79, 2, 2, 456, 465, 7, 15, 2, 2, 457, 462, 5, 26, 14, 2, 458, 459, 7, 6, 2, 2, 459, 461, 5, 26, 14, 2, 460, 458, 3, 2, 2, 2, 461, 464, 3, 2, 2, 2, 462, 460, 3, 2, 2, 2, 462, 463, 3, 2, 2, 2, 463, 466, 3, 2, 2, 2, 464, 462, 3, 2, 2, 2, 465, 457, 3, 2, 2, 2, 465, 466, 3, 2, 2, 2, 466, 467, 3, 2, 2, 2, 467, 468, 7, 16, 2, 2, 468, 57, 3, 2, 2, 2, 469, 475, 5, 60, 31, 2, 470, 472, 7, 79, 2, 2, 471, 473, 5, 6, 4, 2, 472, 471, 3, 2, 2, 2, 472, 473, 3, 2, 2, 2, 473, 475, 3, 2, 2, 2, 474, 469, 3, 2, 2, 2, 474, 470, 3, 2, 2, 2, 475, 59, 3, 2, 2, 2, 476, 485, 5, 76, 39, 2, 477, 485, 5, 56, 29, 2, 478, 485, 7, 83, 2, 2, 479, 485, 7, 78, 2, 2, 480, 481, 7, 3, 2, 2, 481, 482, 5, 26, 14, 2, 482, 483, 7, 4, 2, 2, 483, 485, 3, 2, 2, 2, 484, 476, 3, 2, 2, 2, 484, 477, 3, 2, 2, 2, 484, 478, 3, 2, 2, 2, 484, 479, 3, 2, 2, 2, 484, 480, 3, 2, 2, 2, 485, 61, 3, 2, 2, 2, 486, 488, 5, 82, 42, 2, 487, 486, 3, 2, 2, 2, 487, 488, 3, 2, 2, 2, 488, 63, 3, 2, 2, 2, 489, 490, 7, 31, 2, 2, 490, 491, 7, 3, 2, 2, 491, 492, 5, 62, 32, 2, 492, 493, 7, 17, 2, 2, 493, 494, 5, 26, 14, 2, 494, 495, 7, 17, 2, 2, 495, 496, 5, 52, 27, 2, 496, 497, 7, 4, 2, 2, 497, 498, 5, 112, 57, 2, 498, 65, 3, 2, 2, 2, 499, 501, 7, 13, 2, 2, 500, 502, 5, 26, 14, 2, 501, 500, 3, 2, 2, 2, 501, 502, 3, 2, 2, 2, 502, 503, 3, 2, 2, 2, 503, 505, 7, 7, 2, 2, 504, 506, 5, 26, 14, 2, 505, 504, 3, 2, 2, 2, 505, 506, 3, 2, 2, 2, 506, 507, 3, 2, 2, 2, 507, 508, 7, 14, 2, 2, 508, 67, 3, 2, 2, 2, 509, 511, 5, 66, 34, 2, 510, 509, 3, 2, 2, 2, 510, 511, 3, 2, 2, 2, 511, 69, 3, 2, 2, 2, 512, 513, 7, 31, 2, 2, 513, 514, 7, 3, 2, 2, 514, 515, 5, 80, 41, 2, 515, 516, 7, 18, 2, 2, 516, 517, 5, 26, 14, 2, 517, 518, 5, 68, 35, 2, 518, 519, 7, 4, 2, 2, 519, 520, 5, 112, 57, 2, 520, 71, 3, 2, 2, 2, 521, 522, 5, 26, 14, 2, 522, 73, 3, 2, 2, 2, 523, 525, 7, 3, 2, 2, 524, 526, 5, 72, 37, 2, 525, 524, 3, 2, 2, 2, 525, 526, 3, 2, 2, 2, 526, 531, 3, 2, 2, 2, 527, 528, 7, 6, 2, 2, 528, 530, 5, 72, 37, 2, 529, 527, 3, 2, 2, 2, 530, 533, 3, 2, 2, 2, 531, 529, 3, 2, 2, 2, 531, 532, 3, 2, 2, 2, 532, 534, 3, 2, 2, 2, 533, 531, 3, 2, 2, 2, 534, 535, 7, 4, 2, 2, 535, 75, 3, 2, 2, 2, 536, 538, 9, 10, 2, 2, 537, 539, 5, 6, 4, 2, 538, 537, 3, 2, 2, 2, 538, 539, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 541, 5, 74, 38, 2, 541, 542, 5, 18, 10, 2, 542, 77, 3, 2, 2, 2, 543, 544, 7, 79, 2, 2, 544, 79, 3, 2, 2, 2, 545, 546, 9, 11, 2, 2, 546, 547, 7, 79, 2, 2, 547, 548, 7, 7, 2, 2, 548, 549, 5, 2, 2, 2, 549, 81, 3, 2, 2, 2, 550, 553, 5, 80, 41, 2, 551, 552, 7, 52, 2, 2, 552, 554, 5, 26, 14, 2, 553, 551, 3, 2, 2, 2, 553, 554, 3, 2, 2, 2, 554, 83, 3, 2, 2, 2, 555, 557, 7, 42, 2, 2, 556, 555, 3, 2, 2, 2, 556, 557, 3, 2, 2, 2, 557, 558, 3, 2, 2, 2, 558, 559, 5, 76, 39, 2, 559, 85, 3, 2, 2, 2, 560, 561, 5, 52, 27, 2, 561, 87, 3, 2, 2, 2, 562, 564, 7, 30, 2, 2, 563, 565, 7, 34, 2, 2, 564, 563, 3, 2, 2, 2, 564, 565, 3, 2, 2, 2, 565, 566, 3, 2, 2, 2, 566, 567, 7, 3, 2, 2, 567, 568, 5, 26, 14, 2, 568, 569, 7, 4, 2, 2, 569, 572, 5, 112, 57, 2, 570, 571, 7, 19, 2, 2, 571, 573, 5, 112, 57, 2, 572, 570, 3, 2, 2, 2, 572, 573, 3, 2, 2, 2, 573, 89, 3, 2, 2, 2, 574, 575, 7, 32, 2, 2, 575, 576, 7, 3, 2, 2, 576, 577, 5, 26, 14, 2, 577, 578, 7, 4, 2, 2, 578, 579, 5, 112, 57, 2, 579, 91, 3, 2, 2, 2, 580, 582, 7, 33, 2, 2, 581, 583, 5, 26, 14, 2, 582, 581, 3, 2, 2, 2, 582, 583, 3, 2, 2, 2, 583, 93, 3, 2, 2, 2, 584, 585, 7, 36, 2, 2, 585, 95, 3, 2, 2, 2, 586, 587, 7, 35, 2, 2, 587, 97, 3, 2, 2, 2, 588, 589, 7, 37, 2, 2, 589, 591, 5, 78, 40, 2, 590, 592, 5, 74, 38, 2, 591, 590, 3, 2, 2, 2, 591, 592, 3, 2, 2, 2, 592, 99, 3, 2, 2, 2, 593, 594, 7, 40, 2, 2, 594, 595, 5, 24, 13, 2, 595, 596, 5, 112, 57, 2, 596, 101, 3, 2, 2, 2, 597, 598, 7, 39, 2, 2, 598, 600, 5, 112, 57, 2, 599, 601, 5, 100, 51, 2, 600, 599, 3, 2, 2, 2, 601, 602, 3, 2, 2, 2, 602, 600, 3, 2, 2, 2, 602, 603, 3, 2, 2, 2, 603, 103, 3, 2, 2, 2, 604, 605, 9, 12, 2, 2, 605, 606, 7, 3, 2, 2, 606, 607, 5, 26, 14, 2, 607, 608, 7, 4, 2, 2, 608, 612, 3, 2, 2, 2, 609, 612, 7, 50, 2, 2, 610, 612, 7, 51, 2, 2, 611, 604, 3, 2, 2, 2, 611, 609, 3, 2, 2, 2, 611, 610, 3, 2, 2, 2, 612, 105, 3, 2, 2, 2, 613, 614, 5, 82, 42, 2, 614, 615, 7, 17, 2, 2, 615, 643, 3, 2, 2, 2, 616, 617, 5, 84, 43, 2, 617, 618, 7, 17, 2, 2, 618, 643, 3, 2, 2, 2, 619, 620, 5, 86, 44, 2, 620, 621, 7, 17, 2, 2, 621, 643, 3, 2, 2, 2, 622, 623, 5, 92, 47, 2, 623, 624, 7, 17, 2, 2, 624, 643, 3, 2, 2, 2, 625, 626, 5, 94, 48, 2, 626, 627, 7, 17, 2, 2, 627, 643, 3, 2, 2, 2, 628, 629, 5, 96, 49, 2, 629, 630, 7, 17, 2, 2, 630, 643, 3, 2, 2, 2, 631, 632, 5, 98, 50, 2, 632, 633, 7, 17, 2, 2, 633, 643, 3, 2, 2, 2, 634, 643, 5, 88, 45, 2, 635, 636, 5, 104, 53, 2, 636, 637, 7, 17, 2, 2, 637, 643, 3, 2, 2, 2, 638, 643, 5, 90, 46, 2, 639, 643, 5, 70, 36, 2, 640, 643, 5, 64, 33, 2, 641, 643, 5, 102, 52, 2, 642, 613, 3, 2, 2, 2, 642, 616, 3, 2, 2, 2, 642, 619, 3, 2, 2, 2, 642, 622, 3, 2, 2, 2, 642, 625, 3, 2, 2, 2, 642, 628, 3, 2, 2, 2, 642, 631, 3, 2, 2, 2, 642, 634, 3, 2, 2, 2, 642, 635, 3, 2, 2, 2, 642, 638, 3, 2, 2, 2, 642, 639, 3, 2, 2, 2, 642, 640, 3, 2, 2, 2, 642, 641, 3, 2, 2, 2, 643, 107, 3, 2, 2, 2, 644, 646, 5, 106, 54, 2, 645, 644, 3, 2, 2, 2, 646, 649, 3, 2, 2, 2, 647, 645, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 109, 3, 2, 2, 2, 649, 647, 3, 2, 2, 2, 650, 652, 7, 29, 2, 2, 651, 650, 3, 2, 2, 2, 651, 652, 3, 2, 2, 2, 652, 653, 3, 2, 2, 2, 653, 654, 7, 15, 2, 2, 654, 655, 5, 108, 55, 2, 655, 656, 7, 16, 2, 2, 656, 111, 3, 2, 2, 2, 657, 660, 5, 106, 54, 2, 658, 660, 5, 110, 56, 2, 659, 657, 3, 2, 2, 2, 659, 658, 3, 2, 2, 2, 660, 113, 3, 2, 2, 2, 661, 662, 5, 110, 56, 2, 662, 115, 3, 2, 2, 2, 663, 664, 7, 79, 2, 2, 664, 665, 7, 7, 2, 2, 665, 666, 5, 2, 2, 2, 666, 667, 7, 17, 2, 2, 667, 117, 3, 2, 2, 2, 668, 670, 5, 116, 59, 2, 669, 668, 3, 2, 2, 2, 670, 673, 3, 2, 2, 2, 671, 669, 3, 2, 2, 2, 671, 672, 3, 2, 2, 2, 672, 119, 3, 2, 2, 2, 673, 671, 3, 2, 2, 2, 674, 675, 7, 20, 2, 2, 675, 676, 7, 79, 2, 2, 676, 121, 3, 2, 2, 2, 677, 678, 7, 21, 2, 2, 678, 679, 7, 78, 2, 2, 679, 123, 3, 2, 2, 2, 680, 681, 7, 34, 2, 2, 681, 682, 7, 78, 2, 2, 682, 125, 3, 2, 2, 2, 683, 684, 7, 8, 2, 2, 684, 686, 7, 79, 2, 2, 685, 687, 5, 120, 61, 2, 686, 685, 3, 2, 2, 2, 686, 687, 3, 2, 2, 2, 687, 689, 3, 2, 2, 2, 688, 690, 5, 122, 62, 2, 689, 688, 3, 2, 2, 2, 689, 690, 3, 2, 2, 2, 690, 692, 3, 2, 2, 2, 691, 693, 5, 124, 63, 2, 692, 691, 3, 2, 2, 2, 692, 693, 3, 2, 2, 2, 693, 694, 3, 2, 2, 2, 694, 695, 7, 17, 2, 2, 695, 127, 3, 2, 2, 2, 696, 697, 7, 8, 2, 2, 697, 698, 7, 79, 2, 2, 698, 699, 7, 52, 2, 2, 699, 700, 5, 2, 2, 2, 700, 701, 7, 17, 2, 2, 701, 129, 3, 2, 2, 2, 702, 704, 7, 47, 2, 2, 703, 705, 7, 28, 2, 2, 704, 703, 3, 2, 2, 2, 704, 705, 3, 2, 2, 2, 705, 706, 3, 2, 2, 2, 706, 707, 7, 25, 2, 2, 707, 708, 7, 79, 2, 2, 708, 709, 5, 8, 5, 2, 709, 710, 7, 3, 2, 2, 710, 711, 5, 4, 3, 2, 711, 712, 7, 4, 2, 2, 712, 713, 5, 14, 8, 2, 713, 714, 7, 17, 2, 2, 714, 131, 3, 2, 2, 2, 715, 718, 7, 47, 2, 2, 716, 717, 7, 22, 2, 2, 717, 719, 7, 78, 2, 2, 718, 716, 3, 2, 2, 2, 718, 719, 3, 2, 2, 2, 719, 720, 3, 2, 2, 2, 720, 721, 7, 24, 2, 2, 721, 722, 7, 79, 2, 2, 722, 723, 5, 8, 5, 2, 723, 724, 5, 10, 6, 2, 724, 725, 5, 14, 8, 2, 725, 726, 5, 16, 9, 2, 726, 727, 7, 17, 2, 2, 727, 133, 3, 2, 2, 2, 728, 729, 7, 47, 2, 2, 729, 730, 7, 26, 2, 2, 730, 731, 7, 79, 2, 2, 731, 732, 5, 10, 6, 2, 732, 733, 5, 14, 8, 2, 733, 734, 7, 17, 2, 2, 734, 135, 3, 2, 2, 2, 735, 737, 7, 28, 2, 2, 736, 735, 3, 2, 2, 2, 736, 737, 3, 2, 2, 2, 737, 738, 3, 2, 2, 2, 738, 739, 7, 25, 2, 2, 739, 740, 7, 79, 2, 2, 740, 741, 5, 8, 5, 2, 741, 742, 5, 22, 12, 2, 742, 745, 5, 14, 8, 2, 743, 746, 5, 114, 58, 2, 744, 746, 7, 17, 2, 2, 745, 743, 3, 2, 2, 2, 745, 744, 3, 2, 2, 2, 746, 137, 3, 2, 2, 2, 747, 748, 7, 79, 2, 2, 748, 749, 5, 6, 4, 2, 749, 750, 5, 22, 12, 2, 750, 751, 5, 14, 8, 2, 751, 752, 5, 16, 9, 2, 752, 753, 5, 114, 58, 2, 753, 139, 3, 2, 2, 2, 754, 755, 7, 22, 2, 2, 755, 757, 7, 78, 2, 2, 756, 754, 3, 2, 2, 2, 756, 757, 3, 2, 2, 2, 757, 758, 3, 2, 2, 2, 758, 759, 7, 24, 2, 2, 759, 760, 7, 79, 2, 2, 760, 761, 5, 8, 5, 2, 761, 762, 5, 22, 12, 2, 762, 763, 5, 14, 8, 2, 763, 766, 5, 16, 9, 2, 764, 767, 5, 114, 58, 2, 765, 767, 7, 17, 2, 2, 766, 764, 3, 2, 2, 2, 766, 765, 3, 2, 2, 2, 767, 141, 3, 2, 2, 2, 768, 769, 7, 46, 2, 2, 769, 770, 7, 79, 2, 2, 770, 771, 7, 7, 2, 2, 771, 772, 5, 2, 2, 2, 772, 773, 5, 122, 62, 2, 773, 774, 7, 17, 2, 2, 774, 143, 3, 2, 2, 2, 775, 776, 7, 46, 2, 2, 776, 777, 7, 79, 2, 2, 777, 778, 7, 7, 2, 2, 778, 779, 5, 2, 2, 2, 779, 780, 7, 52, 2, 2, 780, 781, 5, 26, 14, 2, 781, 782, 7, 17, 2, 2, 782, 145, 3, 2, 2, 2, 783, 784, 7, 23, 2, 2, 784, 785, 7, 79, 2, 2, 785, 786, 7, 15, 2, 2, 786, 787, 5, 118, 60, 2, 787, 788, 7, 16, 2, 2, 788, 147, 3, 2, 2, 2, 789, 801, 5, 146, 74, 2, 790, 801, 5, 126, 64, 2, 791, 801, 5, 128, 65, 2, 792, 801, 5, 136, 69, 2, 793, 801, 5, 138, 70, 2, 794, 801, 5, 140, 71, 2, 795, 801, 5, 132, 67, 2, 796, 801, 5, 130, 66, 2, 797, 801, 5, 134, 68, 2, 798, 801, 5, 142, 72, 2, 799, 801, 5, 144, 73, 2, 800, 789, 3, 2, 2, 2, 800, 790, 3, 2, 2, 2, 800, 791, 3, 2, 2, 2, 800, 792, 3, 2, 2, 2, 800, 793, 3, 2, 2, 2, 800, 794, 3, 2, 2, 2, 800, 795, 3, 2, 2, 2, 800, 796, 3, 2, 2, 2, 800, 797, 3, 2, 2, 2, 800, 798, 3, 2, 2, 2, 800, 799, 3, 2, 2, 2, 801, 149, 3, 2, 2, 2, 802, 803, 7, 27, 2, 2, 803, 804, 7, 79, 2, 2, 804, 808, 7, 15, 2, 2, 805, 807, 5, 148, 75, 2, 806, 805, 3, 2, 2, 2, 807, 810, 3, 2, 2, 2, 808, 806, 3, 2, 2, 2, 808, 809, 3, 2, 2, 2, 809, 811, 3, 2, 2, 2, 810, 808, 3, 2, 2, 2, 811, 812, 7, 16, 2, 2, 812, 151, 3, 2, 2, 2, 813, 816, 5, 150, 76, 2, 814, 816, 5, 148, 75, 2, 815, 813, 3, 2, 2, 2, 815, 814, 3, 2, 2, 2, 816, 819, 3, 2, 2, 2, 817, 815, 3, 2, 2, 2, 817, 818, 3, 2, 2, 2, 818, 153, 3, 2, 2, 2, 819, 817, 3, 2, 2, 2, 79, 156, 170, 177, 185, 188, 204, 208, 212, 218, 223, 229, 236, 240, 248, 251, 259, 262, 267, 271, 277, 290, 294, 309, 320, 331, 342, 353, 364, 375, 386, 397, 403, 416, 426, 428, 441, 447, 449, 453, 462, 465, 472, 474, 484, 487, 501, 505, 510, 525, 531, 538, 553, 556, 564, 572, 582, 591, 602, 611, 642, 647, 651, 659, 671, 686, 689, 692, 704, 718, 736, 745, 756, 766, 800, 808, 815, 817]
\ No newline at end of file
T__0=1
T__1=2
T__2=3
T__3=4
T__4=5
T__5=6
T__6=7
T__7=8
T__8=9
T__9=10
T__10=11
T__11=12
T__12=13
T__13=14
T__14=15
T__15=16
T__16=17
T__17=18
T__18=19
T__19=20
T__20=21
MACRO=22
BUILTIN=23
RUNTIME=24
MODULE=25
JAVASCRIPT=26
DEFERRED=27
IF=28
FOR=29
WHILE=30
RETURN=31
CONSTEXPR=32
CONTINUE=33
BREAK=34
GOTO=35
OTHERWISE=36
TRY=37
LABEL=38
LABELS=39
TAIL=40
ISNT=41
IS=42
LET=43
CONST=44
EXTERN=45
ASSERT_TOKEN=46
CHECK_TOKEN=47
UNREACHABLE_TOKEN=48
DEBUG_TOKEN=49
ASSIGNMENT=50
ASSIGNMENT_OPERATOR=51
EQUAL=52
PLUS=53
MINUS=54
MULTIPLY=55
DIVIDE=56
MODULO=57
BIT_OR=58
BIT_AND=59
BIT_NOT=60
MAX=61
MIN=62
NOT_EQUAL=63
LESS_THAN=64
LESS_THAN_EQUAL=65
GREATER_THAN=66
GREATER_THAN_EQUAL=67
SHIFT_LEFT=68
SHIFT_RIGHT=69
SHIFT_RIGHT_ARITHMETIC=70
VARARGS=71
EQUALITY_OPERATOR=72
INCREMENT=73
DECREMENT=74
NOT=75
STRING_LITERAL=76
IDENTIFIER=77
WS=78
BLOCK_COMMENT=79
LINE_COMMENT=80
DECIMAL_LITERAL=81
'('=1
')'=2
'=>'=3
','=4
':'=5
'type'=6
'?'=7
'||'=8
'&&'=9
'.'=10
'['=11
']'=12
'{'=13
'}'=14
';'=15
'of'=16
'else'=17
'extends'=18
'generates'=19
'operator'=20
'struct'=21
'macro'=22
'builtin'=23
'runtime'=24
'module'=25
'javascript'=26
'deferred'=27
'if'=28
'for'=29
'while'=30
'return'=31
'constexpr'=32
'continue'=33
'break'=34
'goto'=35
'otherwise'=36
'try'=37
'label'=38
'labels'=39
'tail'=40
'isnt'=41
'is'=42
'let'=43
'const'=44
'extern'=45
'assert'=46
'check'=47
'unreachable'=48
'debug'=49
'='=50
'=='=52
'+'=53
'-'=54
'*'=55
'/'=56
'%'=57
'|'=58
'&'=59
'~'=60
'max'=61
'min'=62
'!='=63
'<'=64
'<='=65
'>'=66
'>='=67
'<<'=68
'>>'=69
'>>>'=70
'...'=71
'++'=73
'--'=74
'!'=75
...@@ -141,6 +141,16 @@ class TorqueBaseListener : public TorqueListener { ...@@ -141,6 +141,16 @@ class TorqueBaseListener : public TorqueListener {
void exitAssignmentExpression( void exitAssignmentExpression(
TorqueParser::AssignmentExpressionContext* /*ctx*/) override {} TorqueParser::AssignmentExpressionContext* /*ctx*/) override {}
void enterStructExpression(
TorqueParser::StructExpressionContext* /*ctx*/) override {}
void exitStructExpression(
TorqueParser::StructExpressionContext* /*ctx*/) override {}
void enterFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* /*ctx*/) override {}
void exitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* /*ctx*/) override {}
void enterPrimaryExpression( void enterPrimaryExpression(
TorqueParser::PrimaryExpressionContext* /*ctx*/) override {} TorqueParser::PrimaryExpressionContext* /*ctx*/) override {}
void exitPrimaryExpression( void exitPrimaryExpression(
...@@ -263,6 +273,16 @@ class TorqueBaseListener : public TorqueListener { ...@@ -263,6 +273,16 @@ class TorqueBaseListener : public TorqueListener {
void enterHelperBody(TorqueParser::HelperBodyContext* /*ctx*/) override {} void enterHelperBody(TorqueParser::HelperBodyContext* /*ctx*/) override {}
void exitHelperBody(TorqueParser::HelperBodyContext* /*ctx*/) override {} void exitHelperBody(TorqueParser::HelperBodyContext* /*ctx*/) override {}
void enterFieldDeclaration(
TorqueParser::FieldDeclarationContext* /*ctx*/) override {}
void exitFieldDeclaration(
TorqueParser::FieldDeclarationContext* /*ctx*/) override {}
void enterFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* /*ctx*/) override {}
void exitFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* /*ctx*/) override {}
void enterExtendsDeclaration( void enterExtendsDeclaration(
TorqueParser::ExtendsDeclarationContext* /*ctx*/) override {} TorqueParser::ExtendsDeclarationContext* /*ctx*/) override {}
void exitExtendsDeclaration( void exitExtendsDeclaration(
...@@ -328,6 +348,11 @@ class TorqueBaseListener : public TorqueListener { ...@@ -328,6 +348,11 @@ class TorqueBaseListener : public TorqueListener {
void exitConstDeclaration( void exitConstDeclaration(
TorqueParser::ConstDeclarationContext* /*ctx*/) override {} TorqueParser::ConstDeclarationContext* /*ctx*/) override {}
void enterStructDeclaration(
TorqueParser::StructDeclarationContext* /*ctx*/) override {}
void exitStructDeclaration(
TorqueParser::StructDeclarationContext* /*ctx*/) override {}
void enterDeclaration(TorqueParser::DeclarationContext* /*ctx*/) override {} void enterDeclaration(TorqueParser::DeclarationContext* /*ctx*/) override {}
void exitDeclaration(TorqueParser::DeclarationContext* /*ctx*/) override {} void exitDeclaration(TorqueParser::DeclarationContext* /*ctx*/) override {}
......
...@@ -148,6 +148,16 @@ class TorqueBaseVisitor : public TorqueVisitor { ...@@ -148,6 +148,16 @@ class TorqueBaseVisitor : public TorqueVisitor {
return visitChildren(ctx); return visitChildren(ctx);
} }
antlrcpp::Any visitStructExpression(
TorqueParser::StructExpressionContext* ctx) override {
return visitChildren(ctx);
}
antlrcpp::Any visitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* ctx) override {
return visitChildren(ctx);
}
antlrcpp::Any visitPrimaryExpression( antlrcpp::Any visitPrimaryExpression(
TorqueParser::PrimaryExpressionContext* ctx) override { TorqueParser::PrimaryExpressionContext* ctx) override {
return visitChildren(ctx); return visitChildren(ctx);
...@@ -281,6 +291,16 @@ class TorqueBaseVisitor : public TorqueVisitor { ...@@ -281,6 +291,16 @@ class TorqueBaseVisitor : public TorqueVisitor {
return visitChildren(ctx); return visitChildren(ctx);
} }
antlrcpp::Any visitFieldDeclaration(
TorqueParser::FieldDeclarationContext* ctx) override {
return visitChildren(ctx);
}
antlrcpp::Any visitFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* ctx) override {
return visitChildren(ctx);
}
antlrcpp::Any visitExtendsDeclaration( antlrcpp::Any visitExtendsDeclaration(
TorqueParser::ExtendsDeclarationContext* ctx) override { TorqueParser::ExtendsDeclarationContext* ctx) override {
return visitChildren(ctx); return visitChildren(ctx);
...@@ -346,6 +366,11 @@ class TorqueBaseVisitor : public TorqueVisitor { ...@@ -346,6 +366,11 @@ class TorqueBaseVisitor : public TorqueVisitor {
return visitChildren(ctx); return visitChildren(ctx);
} }
antlrcpp::Any visitStructDeclaration(
TorqueParser::StructDeclarationContext* ctx) override {
return visitChildren(ctx);
}
antlrcpp::Any visitDeclaration( antlrcpp::Any visitDeclaration(
TorqueParser::DeclarationContext* ctx) override { TorqueParser::DeclarationContext* ctx) override {
return visitChildren(ctx); return visitChildren(ctx);
......
...@@ -69,6 +69,7 @@ std::vector<std::string> TorqueLexer::_ruleNames = {u8"T__0", ...@@ -69,6 +69,7 @@ std::vector<std::string> TorqueLexer::_ruleNames = {u8"T__0",
u8"T__17", u8"T__17",
u8"T__18", u8"T__18",
u8"T__19", u8"T__19",
u8"T__20",
u8"MACRO", u8"MACRO",
u8"BUILTIN", u8"BUILTIN",
u8"RUNTIME", u8"RUNTIME",
...@@ -152,14 +153,15 @@ std::vector<std::string> TorqueLexer::_literalNames = {"", ...@@ -152,14 +153,15 @@ std::vector<std::string> TorqueLexer::_literalNames = {"",
u8"'.'", u8"'.'",
u8"'['", u8"'['",
u8"']'", u8"']'",
u8"'{'",
u8"'}'",
u8"';'", u8"';'",
u8"'of'", u8"'of'",
u8"'else'", u8"'else'",
u8"'{'",
u8"'}'",
u8"'extends'", u8"'extends'",
u8"'generates'", u8"'generates'",
u8"'operator'", u8"'operator'",
u8"'struct'",
u8"'macro'", u8"'macro'",
u8"'builtin'", u8"'builtin'",
u8"'runtime'", u8"'runtime'",
...@@ -216,6 +218,7 @@ std::vector<std::string> TorqueLexer::_literalNames = {"", ...@@ -216,6 +218,7 @@ std::vector<std::string> TorqueLexer::_literalNames = {"",
u8"'!'"}; u8"'!'"};
std::vector<std::string> TorqueLexer::_symbolicNames = { std::vector<std::string> TorqueLexer::_symbolicNames = {
"",
"", "",
"", "",
"", "",
...@@ -320,7 +323,7 @@ TorqueLexer::Initializer::Initializer() { ...@@ -320,7 +323,7 @@ TorqueLexer::Initializer::Initializer() {
_serializedATN = { _serializedATN = {
0x3, 0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964, 0x3, 0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964,
0x2, 0x52, 0x290, 0x8, 0x1, 0x4, 0x2, 0x9, 0x2, 0x2, 0x53, 0x299, 0x8, 0x1, 0x4, 0x2, 0x9, 0x2,
0x4, 0x3, 0x9, 0x3, 0x4, 0x4, 0x9, 0x4, 0x4, 0x4, 0x3, 0x9, 0x3, 0x4, 0x4, 0x9, 0x4, 0x4,
0x5, 0x9, 0x5, 0x4, 0x6, 0x9, 0x6, 0x4, 0x7, 0x5, 0x9, 0x5, 0x4, 0x6, 0x9, 0x6, 0x4, 0x7,
0x9, 0x7, 0x4, 0x8, 0x9, 0x8, 0x4, 0x9, 0x9, 0x9, 0x7, 0x4, 0x8, 0x9, 0x8, 0x4, 0x9, 0x9,
...@@ -357,120 +360,122 @@ TorqueLexer::Initializer::Initializer() { ...@@ -357,120 +360,122 @@ TorqueLexer::Initializer::Initializer() {
0x4d, 0x9, 0x4d, 0x4, 0x4e, 0x9, 0x4e, 0x4, 0x4f, 0x4d, 0x9, 0x4d, 0x4, 0x4e, 0x9, 0x4e, 0x4, 0x4f,
0x9, 0x4f, 0x4, 0x50, 0x9, 0x50, 0x4, 0x51, 0x9, 0x9, 0x4f, 0x4, 0x50, 0x9, 0x50, 0x4, 0x51, 0x9,
0x51, 0x4, 0x52, 0x9, 0x52, 0x4, 0x53, 0x9, 0x53, 0x51, 0x4, 0x52, 0x9, 0x52, 0x4, 0x53, 0x9, 0x53,
0x4, 0x54, 0x9, 0x54, 0x4, 0x55, 0x9, 0x55, 0x3, 0x4, 0x54, 0x9, 0x54, 0x4, 0x55, 0x9, 0x55, 0x4,
0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x56, 0x9, 0x56, 0x3, 0x2, 0x3, 0x2, 0x3, 0x3,
0x3, 0x4, 0x3, 0x4, 0x3, 0x5, 0x3, 0x5, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3,
0x6, 0x3, 0x6, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x5, 0x3, 0x5, 0x3, 0x6, 0x3, 0x6, 0x3, 0x7,
0x3, 0x7, 0x3, 0x7, 0x3, 0x8, 0x3, 0x8, 0x3, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x3,
0x9, 0x3, 0x9, 0x3, 0x9, 0x3, 0xa, 0x3, 0xa, 0x8, 0x3, 0x8, 0x3, 0x9, 0x3, 0x9, 0x3, 0x9,
0x3, 0xa, 0x3, 0xb, 0x3, 0xb, 0x3, 0xc, 0x3, 0x3, 0xa, 0x3, 0xa, 0x3, 0xa, 0x3, 0xb, 0x3,
0xc, 0x3, 0xd, 0x3, 0xd, 0x3, 0xe, 0x3, 0xe, 0xb, 0x3, 0xc, 0x3, 0xc, 0x3, 0xd, 0x3, 0xd,
0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0x10, 0x3, 0x3, 0xe, 0x3, 0xe, 0x3, 0xf, 0x3, 0xf, 0x3,
0x10, 0x3, 0x10, 0x3, 0x10, 0x3, 0x10, 0x3, 0x11, 0x10, 0x3, 0x10, 0x3, 0x11, 0x3, 0x11, 0x3, 0x11,
0x3, 0x11, 0x3, 0x12, 0x3, 0x12, 0x3, 0x13, 0x3, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x3,
0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x12, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13,
0x3, 0x13, 0x3, 0x13, 0x3, 0x14, 0x3, 0x14, 0x3, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3,
0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14,
0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x15, 0x3, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3,
0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x14, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15,
0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x16, 0x3, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3,
0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x15, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16,
0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x17, 0x3,
0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x18, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17,
0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3,
0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x19, 0x3, 0x19, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x19,
0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3,
0x19, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x1a, 0x3, 0x1a,
0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3,
0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1b, 0x3, 0x1b, 0x1a, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b,
0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3,
0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c,
0x3, 0x1c, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3,
0x1d, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1d, 0x3, 0x1d,
0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x3, 0x1d, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x3,
0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x1e, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f,
0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x20, 0x3, 0x20, 0x3,
0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20,
0x3, 0x20, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3,
0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21,
0x3, 0x21, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x3, 0x21, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3,
0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22,
0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3,
0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3, 0x24,
0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x25, 0x3,
0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x26, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25,
0x3, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3,
0x26, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3, 0x27,
0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x28, 0x3, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3,
0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x29, 0x27, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28,
0x3, 0x29, 0x3, 0x29, 0x3, 0x29, 0x3, 0x29, 0x3, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x29, 0x3,
0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2b, 0x3, 0x2b, 0x29, 0x3, 0x29, 0x3, 0x29, 0x3, 0x29, 0x3, 0x2a,
0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
0x2c, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2d, 0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2c, 0x3, 0x2c,
0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2d, 0x3, 0x2d, 0x3,
0x2d, 0x3, 0x2d, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2e,
0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3,
0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x2e, 0x3, 0x2e, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f,
0x3, 0x2f, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f, 0x3,
0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30,
0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x3, 0x30, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3,
0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31,
0x3, 0x31, 0x3, 0x32, 0x3, 0x32, 0x3, 0x33, 0x3, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3,
0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32,
0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x3, 0x32, 0x3, 0x33, 0x3, 0x33, 0x3, 0x34, 0x3,
0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34,
0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3,
0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34,
0x3, 0x33, 0x3, 0x33, 0x5, 0x33, 0x1ca, 0xa, 0x33, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3,
0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x35, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34,
0x35, 0x3, 0x36, 0x3, 0x36, 0x3, 0x37, 0x3, 0x37, 0x3, 0x34, 0x3, 0x34, 0x5, 0x34, 0x1d3, 0xa, 0x34,
0x3, 0x38, 0x3, 0x38, 0x3, 0x39, 0x3, 0x39, 0x3, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x36, 0x3,
0x3a, 0x3, 0x3a, 0x3, 0x3b, 0x3, 0x3b, 0x3, 0x3c, 0x36, 0x3, 0x37, 0x3, 0x37, 0x3, 0x38, 0x3, 0x38,
0x3, 0x3c, 0x3, 0x3d, 0x3, 0x3d, 0x3, 0x3d, 0x3, 0x3, 0x39, 0x3, 0x39, 0x3, 0x3a, 0x3, 0x3a, 0x3,
0x3d, 0x3, 0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x3b, 0x3, 0x3b, 0x3, 0x3c, 0x3, 0x3c, 0x3, 0x3d,
0x3, 0x3f, 0x3, 0x3f, 0x3, 0x3f, 0x3, 0x40, 0x3, 0x3, 0x3d, 0x3, 0x3e, 0x3, 0x3e, 0x3, 0x3e, 0x3,
0x40, 0x3, 0x41, 0x3, 0x41, 0x3, 0x41, 0x3, 0x42, 0x3e, 0x3, 0x3f, 0x3, 0x3f, 0x3, 0x3f, 0x3, 0x3f,
0x3, 0x42, 0x3, 0x43, 0x3, 0x43, 0x3, 0x43, 0x3, 0x3, 0x40, 0x3, 0x40, 0x3, 0x40, 0x3, 0x41, 0x3,
0x44, 0x3, 0x44, 0x3, 0x44, 0x3, 0x45, 0x3, 0x45, 0x41, 0x3, 0x42, 0x3, 0x42, 0x3, 0x42, 0x3, 0x43,
0x3, 0x45, 0x3, 0x46, 0x3, 0x46, 0x3, 0x46, 0x3, 0x3, 0x43, 0x3, 0x44, 0x3, 0x44, 0x3, 0x44, 0x3,
0x46, 0x3, 0x47, 0x3, 0x47, 0x3, 0x47, 0x3, 0x47, 0x45, 0x3, 0x45, 0x3, 0x45, 0x3, 0x46, 0x3, 0x46,
0x3, 0x48, 0x3, 0x48, 0x5, 0x48, 0x204, 0xa, 0x48, 0x3, 0x46, 0x3, 0x47, 0x3, 0x47, 0x3, 0x47, 0x3,
0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 0x3, 0x4a, 0x3, 0x47, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48,
0x4a, 0x3, 0x4a, 0x3, 0x4b, 0x3, 0x4b, 0x3, 0x4c, 0x3, 0x49, 0x3, 0x49, 0x5, 0x49, 0x20d, 0xa, 0x49,
0x3, 0x4c, 0x3, 0x4c, 0x7, 0x4c, 0x211, 0xa, 0x4c, 0x3, 0x4a, 0x3, 0x4a, 0x3, 0x4a, 0x3, 0x4b, 0x3,
0xc, 0x4c, 0xe, 0x4c, 0x214, 0xb, 0x4c, 0x3, 0x4c, 0x4b, 0x3, 0x4b, 0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4d,
0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4c, 0x7, 0x4c, 0x21a, 0x3, 0x4d, 0x3, 0x4d, 0x7, 0x4d, 0x21a, 0xa, 0x4d,
0xa, 0x4c, 0xc, 0x4c, 0xe, 0x4c, 0x21d, 0xb, 0x4c, 0xc, 0x4d, 0xe, 0x4d, 0x21d, 0xb, 0x4d, 0x3, 0x4d,
0x3, 0x4c, 0x5, 0x4c, 0x220, 0xa, 0x4c, 0x3, 0x4d, 0x3, 0x4d, 0x3, 0x4d, 0x3, 0x4d, 0x7, 0x4d, 0x223,
0x3, 0x4d, 0x3, 0x4d, 0x3, 0x4e, 0x3, 0x4e, 0x7, 0xa, 0x4d, 0xc, 0x4d, 0xe, 0x4d, 0x226, 0xb, 0x4d,
0x4e, 0x227, 0xa, 0x4e, 0xc, 0x4e, 0xe, 0x4e, 0x22a, 0x3, 0x4d, 0x5, 0x4d, 0x229, 0xa, 0x4d, 0x3, 0x4e,
0xb, 0x4e, 0x3, 0x4f, 0x6, 0x4f, 0x22d, 0xa, 0x4f, 0x3, 0x4e, 0x3, 0x4e, 0x3, 0x4f, 0x3, 0x4f, 0x7,
0xd, 0x4f, 0xe, 0x4f, 0x22e, 0x3, 0x4f, 0x3, 0x4f, 0x4f, 0x230, 0xa, 0x4f, 0xc, 0x4f, 0xe, 0x4f, 0x233,
0x3, 0x50, 0x3, 0x50, 0x3, 0x50, 0x3, 0x50, 0x7, 0xb, 0x4f, 0x3, 0x50, 0x6, 0x50, 0x236, 0xa, 0x50,
0x50, 0x237, 0xa, 0x50, 0xc, 0x50, 0xe, 0x50, 0x23a, 0xd, 0x50, 0xe, 0x50, 0x237, 0x3, 0x50, 0x3, 0x50,
0xb, 0x50, 0x3, 0x50, 0x3, 0x50, 0x3, 0x50, 0x5, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x7,
0x50, 0x23f, 0xa, 0x50, 0x3, 0x50, 0x3, 0x50, 0x3, 0x51, 0x240, 0xa, 0x51, 0xc, 0x51, 0xe, 0x51, 0x243,
0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x7, 0x51, 0xb, 0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x51, 0x5,
0x247, 0xa, 0x51, 0xc, 0x51, 0xe, 0x51, 0x24a, 0xb, 0x51, 0x248, 0xa, 0x51, 0x3, 0x51, 0x3, 0x51, 0x3,
0x51, 0x3, 0x51, 0x3, 0x51, 0x3, 0x52, 0x3, 0x52, 0x52, 0x3, 0x52, 0x3, 0x52, 0x3, 0x52, 0x7, 0x52,
0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x7, 0x53, 0x253, 0x250, 0xa, 0x52, 0xc, 0x52, 0xe, 0x52, 0x253, 0xb,
0xa, 0x53, 0xc, 0x53, 0xe, 0x53, 0x256, 0xb, 0x53, 0x52, 0x3, 0x52, 0x3, 0x52, 0x3, 0x53, 0x3, 0x53,
0x5, 0x53, 0x258, 0xa, 0x53, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54, 0x7, 0x54, 0x25c,
0x5, 0x54, 0x25c, 0xa, 0x54, 0x3, 0x54, 0x6, 0x54, 0xa, 0x54, 0xc, 0x54, 0xe, 0x54, 0x25f, 0xb, 0x54,
0x25f, 0xa, 0x54, 0xd, 0x54, 0xe, 0x54, 0x260, 0x3, 0x5, 0x54, 0x261, 0xa, 0x54, 0x3, 0x55, 0x3, 0x55,
0x55, 0x5, 0x55, 0x264, 0xa, 0x55, 0x3, 0x55, 0x3, 0x5, 0x55, 0x265, 0xa, 0x55, 0x3, 0x55, 0x6, 0x55,
0x55, 0x3, 0x55, 0x7, 0x55, 0x269, 0xa, 0x55, 0xc, 0x268, 0xa, 0x55, 0xd, 0x55, 0xe, 0x55, 0x269, 0x3,
0x55, 0xe, 0x55, 0x26c, 0xb, 0x55, 0x3, 0x55, 0x5, 0x56, 0x5, 0x56, 0x26d, 0xa, 0x56, 0x3, 0x56, 0x3,
0x55, 0x26f, 0xa, 0x55, 0x3, 0x55, 0x5, 0x55, 0x272, 0x56, 0x3, 0x56, 0x7, 0x56, 0x272, 0xa, 0x56, 0xc,
0xa, 0x55, 0x3, 0x55, 0x3, 0x55, 0x6, 0x55, 0x276, 0x56, 0xe, 0x56, 0x275, 0xb, 0x56, 0x3, 0x56, 0x5,
0xa, 0x55, 0xd, 0x55, 0xe, 0x55, 0x277, 0x3, 0x55, 0x56, 0x278, 0xa, 0x56, 0x3, 0x56, 0x5, 0x56, 0x27b,
0x5, 0x55, 0x27b, 0xa, 0x55, 0x3, 0x55, 0x5, 0x55, 0xa, 0x56, 0x3, 0x56, 0x3, 0x56, 0x6, 0x56, 0x27f,
0x27e, 0xa, 0x55, 0x3, 0x55, 0x3, 0x55, 0x5, 0x55, 0xa, 0x56, 0xd, 0x56, 0xe, 0x56, 0x280, 0x3, 0x56,
0x282, 0xa, 0x55, 0x3, 0x55, 0x5, 0x55, 0x285, 0xa, 0x5, 0x56, 0x284, 0xa, 0x56, 0x3, 0x56, 0x5, 0x56,
0x55, 0x3, 0x55, 0x3, 0x55, 0x3, 0x55, 0x3, 0x55, 0x287, 0xa, 0x56, 0x3, 0x56, 0x3, 0x56, 0x5, 0x56,
0x6, 0x55, 0x28b, 0xa, 0x55, 0xd, 0x55, 0xe, 0x55, 0x28b, 0xa, 0x56, 0x3, 0x56, 0x5, 0x56, 0x28e, 0xa,
0x28c, 0x5, 0x55, 0x28f, 0xa, 0x55, 0x3, 0x238, 0x2, 0x56, 0x3, 0x56, 0x3, 0x56, 0x3, 0x56, 0x3, 0x56,
0x56, 0x3, 0x3, 0x5, 0x4, 0x7, 0x5, 0x9, 0x6, 0x6, 0x56, 0x294, 0xa, 0x56, 0xd, 0x56, 0xe, 0x56,
0x295, 0x5, 0x56, 0x298, 0xa, 0x56, 0x3, 0x241, 0x2,
0x57, 0x3, 0x3, 0x5, 0x4, 0x7, 0x5, 0x9, 0x6,
0xb, 0x7, 0xd, 0x8, 0xf, 0x9, 0x11, 0xa, 0x13, 0xb, 0x7, 0xd, 0x8, 0xf, 0x9, 0x11, 0xa, 0x13,
0xb, 0x15, 0xc, 0x17, 0xd, 0x19, 0xe, 0x1b, 0xf, 0xb, 0x15, 0xc, 0x17, 0xd, 0x19, 0xe, 0x1b, 0xf,
0x1d, 0x10, 0x1f, 0x11, 0x21, 0x12, 0x23, 0x13, 0x25, 0x1d, 0x10, 0x1f, 0x11, 0x21, 0x12, 0x23, 0x13, 0x25,
...@@ -486,481 +491,488 @@ TorqueLexer::Initializer::Initializer() { ...@@ -486,481 +491,488 @@ TorqueLexer::Initializer::Initializer() {
0x77, 0x3d, 0x79, 0x3e, 0x7b, 0x3f, 0x7d, 0x40, 0x7f, 0x77, 0x3d, 0x79, 0x3e, 0x7b, 0x3f, 0x7d, 0x40, 0x7f,
0x41, 0x81, 0x42, 0x83, 0x43, 0x85, 0x44, 0x87, 0x45, 0x41, 0x81, 0x42, 0x83, 0x43, 0x85, 0x44, 0x87, 0x45,
0x89, 0x46, 0x8b, 0x47, 0x8d, 0x48, 0x8f, 0x49, 0x91, 0x89, 0x46, 0x8b, 0x47, 0x8d, 0x48, 0x8f, 0x49, 0x91,
0x4a, 0x93, 0x4b, 0x95, 0x4c, 0x97, 0x4d, 0x99, 0x2, 0x4a, 0x93, 0x4b, 0x95, 0x4c, 0x97, 0x4d, 0x99, 0x4e,
0x9b, 0x4e, 0x9d, 0x4f, 0x9f, 0x50, 0xa1, 0x51, 0xa3, 0x9b, 0x2, 0x9d, 0x4f, 0x9f, 0x50, 0xa1, 0x51, 0xa3,
0x2, 0xa5, 0x2, 0xa7, 0x2, 0xa9, 0x52, 0x3, 0x2, 0x52, 0xa5, 0x2, 0xa7, 0x2, 0xa9, 0x2, 0xab, 0x53,
0xe, 0x6, 0x2, 0xc, 0xc, 0xf, 0xf, 0x24, 0x24, 0x3, 0x2, 0xe, 0x6, 0x2, 0xc, 0xc, 0xf, 0xf,
0x5e, 0x5e, 0x6, 0x2, 0xc, 0xc, 0xf, 0xf, 0x29, 0x24, 0x24, 0x5e, 0x5e, 0x6, 0x2, 0xc, 0xc, 0xf,
0x29, 0x5e, 0x5e, 0x7, 0x2, 0x24, 0x24, 0x29, 0x29, 0xf, 0x29, 0x29, 0x5e, 0x5e, 0x7, 0x2, 0x24, 0x24,
0x5e, 0x5e, 0x70, 0x70, 0x74, 0x74, 0x4, 0x2, 0x43, 0x29, 0x29, 0x5e, 0x5e, 0x70, 0x70, 0x74, 0x74, 0x4,
0x5c, 0x63, 0x7c, 0x6, 0x2, 0x32, 0x3b, 0x43, 0x5c, 0x2, 0x43, 0x5c, 0x63, 0x7c, 0x6, 0x2, 0x32, 0x3b,
0x61, 0x61, 0x63, 0x7c, 0x5, 0x2, 0xb, 0xc, 0xe, 0x43, 0x5c, 0x61, 0x61, 0x63, 0x7c, 0x5, 0x2, 0xb,
0xf, 0x22, 0x22, 0x4, 0x2, 0xc, 0xc, 0xf, 0xf, 0xc, 0xe, 0xf, 0x22, 0x22, 0x4, 0x2, 0xc, 0xc,
0x3, 0x2, 0x32, 0x3b, 0x3, 0x2, 0x33, 0x3b, 0x4, 0xf, 0xf, 0x3, 0x2, 0x32, 0x3b, 0x3, 0x2, 0x33,
0x2, 0x47, 0x47, 0x67, 0x67, 0x4, 0x2, 0x2d, 0x2d, 0x3b, 0x4, 0x2, 0x47, 0x47, 0x67, 0x67, 0x4, 0x2,
0x2f, 0x2f, 0x5, 0x2, 0x32, 0x3b, 0x43, 0x48, 0x63, 0x2d, 0x2d, 0x2f, 0x2f, 0x5, 0x2, 0x32, 0x3b, 0x43,
0x68, 0x2, 0x2b1, 0x2, 0x3, 0x3, 0x2, 0x2, 0x2, 0x48, 0x63, 0x68, 0x2, 0x2ba, 0x2, 0x3, 0x3, 0x2,
0x2, 0x5, 0x3, 0x2, 0x2, 0x2, 0x2, 0x7, 0x3, 0x2, 0x2, 0x2, 0x5, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x9, 0x3, 0x2, 0x2, 0x2, 0x7, 0x3, 0x2, 0x2, 0x2, 0x2, 0x9, 0x3, 0x2,
0x2, 0xb, 0x3, 0x2, 0x2, 0x2, 0x2, 0xd, 0x3, 0x2, 0x2, 0x2, 0xb, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0xf, 0x3, 0x2, 0x2, 0x2, 0xd, 0x3, 0x2, 0x2, 0x2, 0x2, 0xf, 0x3, 0x2,
0x2, 0x11, 0x3, 0x2, 0x2, 0x2, 0x2, 0x13, 0x3, 0x2, 0x2, 0x2, 0x11, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x15, 0x3, 0x2, 0x2, 0x2, 0x13, 0x3, 0x2, 0x2, 0x2, 0x2, 0x15, 0x3, 0x2,
0x2, 0x17, 0x3, 0x2, 0x2, 0x2, 0x2, 0x19, 0x3, 0x2, 0x2, 0x2, 0x17, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x1b, 0x3, 0x2, 0x2, 0x2, 0x19, 0x3, 0x2, 0x2, 0x2, 0x2, 0x1b, 0x3, 0x2,
0x2, 0x1d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x1d, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x21, 0x3, 0x2, 0x2, 0x2, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x21, 0x3, 0x2,
0x2, 0x23, 0x3, 0x2, 0x2, 0x2, 0x2, 0x25, 0x3, 0x2, 0x2, 0x2, 0x23, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x27, 0x3, 0x2, 0x2, 0x2, 0x25, 0x3, 0x2, 0x2, 0x2, 0x2, 0x27, 0x3, 0x2,
0x2, 0x29, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2b, 0x3, 0x2, 0x2, 0x2, 0x29, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x2d, 0x3, 0x2, 0x2, 0x2, 0x2b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2d, 0x3, 0x2,
0x2, 0x2f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x31, 0x3, 0x2, 0x2, 0x2, 0x2f, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x33, 0x3, 0x2, 0x2, 0x2, 0x31, 0x3, 0x2, 0x2, 0x2, 0x2, 0x33, 0x3, 0x2,
0x2, 0x35, 0x3, 0x2, 0x2, 0x2, 0x2, 0x37, 0x3, 0x2, 0x2, 0x2, 0x35, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x39, 0x3, 0x2, 0x2, 0x2, 0x37, 0x3, 0x2, 0x2, 0x2, 0x2, 0x39, 0x3, 0x2,
0x2, 0x3b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x3d, 0x3, 0x2, 0x2, 0x2, 0x3b, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x3f, 0x3, 0x2, 0x2, 0x2, 0x3d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x3f, 0x3, 0x2,
0x2, 0x41, 0x3, 0x2, 0x2, 0x2, 0x2, 0x43, 0x3, 0x2, 0x2, 0x2, 0x41, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x45, 0x3, 0x2, 0x2, 0x2, 0x43, 0x3, 0x2, 0x2, 0x2, 0x2, 0x45, 0x3, 0x2,
0x2, 0x47, 0x3, 0x2, 0x2, 0x2, 0x2, 0x49, 0x3, 0x2, 0x2, 0x2, 0x47, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x4b, 0x3, 0x2, 0x2, 0x2, 0x49, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4b, 0x3, 0x2,
0x2, 0x4d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4f, 0x3, 0x2, 0x2, 0x2, 0x4d, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x51, 0x3, 0x2, 0x2, 0x2, 0x4f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x51, 0x3, 0x2,
0x2, 0x53, 0x3, 0x2, 0x2, 0x2, 0x2, 0x55, 0x3, 0x2, 0x2, 0x2, 0x53, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x57, 0x3, 0x2, 0x2, 0x2, 0x55, 0x3, 0x2, 0x2, 0x2, 0x2, 0x57, 0x3, 0x2,
0x2, 0x59, 0x3, 0x2, 0x2, 0x2, 0x2, 0x5b, 0x3, 0x2, 0x2, 0x2, 0x59, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x5d, 0x3, 0x2, 0x2, 0x2, 0x5b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x5d, 0x3, 0x2,
0x2, 0x5f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x61, 0x3, 0x2, 0x2, 0x2, 0x5f, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x63, 0x3, 0x2, 0x2, 0x2, 0x61, 0x3, 0x2, 0x2, 0x2, 0x2, 0x63, 0x3, 0x2,
0x2, 0x65, 0x3, 0x2, 0x2, 0x2, 0x2, 0x67, 0x3, 0x2, 0x2, 0x2, 0x65, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x69, 0x3, 0x2, 0x2, 0x2, 0x67, 0x3, 0x2, 0x2, 0x2, 0x2, 0x69, 0x3, 0x2,
0x2, 0x6b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x6d, 0x3, 0x2, 0x2, 0x2, 0x6b, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x6f, 0x3, 0x2, 0x2, 0x2, 0x6d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x6f, 0x3, 0x2,
0x2, 0x71, 0x3, 0x2, 0x2, 0x2, 0x2, 0x73, 0x3, 0x2, 0x2, 0x2, 0x71, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x75, 0x3, 0x2, 0x2, 0x2, 0x73, 0x3, 0x2, 0x2, 0x2, 0x2, 0x75, 0x3, 0x2,
0x2, 0x77, 0x3, 0x2, 0x2, 0x2, 0x2, 0x79, 0x3, 0x2, 0x2, 0x2, 0x77, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x7b, 0x3, 0x2, 0x2, 0x2, 0x79, 0x3, 0x2, 0x2, 0x2, 0x2, 0x7b, 0x3, 0x2,
0x2, 0x7d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x7f, 0x3, 0x2, 0x2, 0x2, 0x7d, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x81, 0x3, 0x2, 0x2, 0x2, 0x7f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x81, 0x3, 0x2,
0x2, 0x83, 0x3, 0x2, 0x2, 0x2, 0x2, 0x85, 0x3, 0x2, 0x2, 0x2, 0x83, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x87, 0x3, 0x2, 0x2, 0x2, 0x85, 0x3, 0x2, 0x2, 0x2, 0x2, 0x87, 0x3, 0x2,
0x2, 0x89, 0x3, 0x2, 0x2, 0x2, 0x2, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x89, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x8d, 0x3, 0x2, 0x2, 0x2, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x8d, 0x3, 0x2,
0x2, 0x8f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x91, 0x3, 0x2, 0x2, 0x2, 0x8f, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x93, 0x3, 0x2, 0x2, 0x2, 0x91, 0x3, 0x2, 0x2, 0x2, 0x2, 0x93, 0x3, 0x2,
0x2, 0x95, 0x3, 0x2, 0x2, 0x2, 0x2, 0x97, 0x3, 0x2, 0x2, 0x2, 0x95, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x9b, 0x3, 0x2, 0x2, 0x2, 0x97, 0x3, 0x2, 0x2, 0x2, 0x2, 0x99, 0x3, 0x2,
0x2, 0x9d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x9f, 0x3, 0x2, 0x2, 0x2, 0x9d, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0xa1, 0x3, 0x2, 0x2, 0x2, 0x9f, 0x3, 0x2, 0x2, 0x2, 0x2, 0xa1, 0x3, 0x2,
0x2, 0xa9, 0x3, 0x2, 0x2, 0x2, 0x3, 0xab, 0x3, 0x2, 0x2, 0x2, 0xa3, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x5, 0xad, 0x3, 0x2, 0x2, 0x2, 0xab, 0x3, 0x2, 0x2, 0x2, 0x3, 0xad, 0x3, 0x2,
0x7, 0xaf, 0x3, 0x2, 0x2, 0x2, 0x9, 0xb2, 0x3, 0x2, 0x2, 0x5, 0xaf, 0x3, 0x2, 0x2, 0x2, 0x7,
0x2, 0x2, 0x2, 0xb, 0xb4, 0x3, 0x2, 0x2, 0x2, 0xb1, 0x3, 0x2, 0x2, 0x2, 0x9, 0xb4, 0x3, 0x2,
0xd, 0xb6, 0x3, 0x2, 0x2, 0x2, 0xf, 0xbb, 0x3, 0x2, 0x2, 0xb, 0xb6, 0x3, 0x2, 0x2, 0x2, 0xd,
0x2, 0x2, 0x2, 0x11, 0xbd, 0x3, 0x2, 0x2, 0x2, 0xb8, 0x3, 0x2, 0x2, 0x2, 0xf, 0xbd, 0x3, 0x2,
0x13, 0xc0, 0x3, 0x2, 0x2, 0x2, 0x15, 0xc3, 0x3, 0x2, 0x2, 0x11, 0xbf, 0x3, 0x2, 0x2, 0x2, 0x13,
0x2, 0x2, 0x2, 0x17, 0xc5, 0x3, 0x2, 0x2, 0x2, 0xc2, 0x3, 0x2, 0x2, 0x2, 0x15, 0xc5, 0x3, 0x2,
0x19, 0xc7, 0x3, 0x2, 0x2, 0x2, 0x1b, 0xc9, 0x3, 0x2, 0x2, 0x17, 0xc7, 0x3, 0x2, 0x2, 0x2, 0x19,
0x2, 0x2, 0x2, 0x1d, 0xcb, 0x3, 0x2, 0x2, 0x2, 0xc9, 0x3, 0x2, 0x2, 0x2, 0x1b, 0xcb, 0x3, 0x2,
0x1f, 0xce, 0x3, 0x2, 0x2, 0x2, 0x21, 0xd3, 0x3, 0x2, 0x2, 0x1d, 0xcd, 0x3, 0x2, 0x2, 0x2, 0x1f,
0x2, 0x2, 0x2, 0x23, 0xd5, 0x3, 0x2, 0x2, 0x2, 0xcf, 0x3, 0x2, 0x2, 0x2, 0x21, 0xd1, 0x3, 0x2,
0x25, 0xd7, 0x3, 0x2, 0x2, 0x2, 0x27, 0xdf, 0x3, 0x2, 0x2, 0x23, 0xd4, 0x3, 0x2, 0x2, 0x2, 0x25,
0x2, 0x2, 0x2, 0x29, 0xe9, 0x3, 0x2, 0x2, 0x2, 0xd9, 0x3, 0x2, 0x2, 0x2, 0x27, 0xe1, 0x3, 0x2,
0x2b, 0xf2, 0x3, 0x2, 0x2, 0x2, 0x2d, 0xf8, 0x3, 0x2, 0x2, 0x29, 0xeb, 0x3, 0x2, 0x2, 0x2, 0x2b,
0x2, 0x2, 0x2, 0x2f, 0x100, 0x3, 0x2, 0x2, 0x2, 0xf4, 0x3, 0x2, 0x2, 0x2, 0x2d, 0xfb, 0x3, 0x2,
0x31, 0x108, 0x3, 0x2, 0x2, 0x2, 0x33, 0x10f, 0x3, 0x2, 0x2, 0x2f, 0x101, 0x3, 0x2, 0x2, 0x2, 0x31,
0x2, 0x2, 0x2, 0x35, 0x11a, 0x3, 0x2, 0x2, 0x2, 0x109, 0x3, 0x2, 0x2, 0x2, 0x33, 0x111, 0x3, 0x2,
0x37, 0x123, 0x3, 0x2, 0x2, 0x2, 0x39, 0x126, 0x3, 0x2, 0x2, 0x35, 0x118, 0x3, 0x2, 0x2, 0x2, 0x37,
0x2, 0x2, 0x2, 0x3b, 0x12a, 0x3, 0x2, 0x2, 0x2, 0x123, 0x3, 0x2, 0x2, 0x2, 0x39, 0x12c, 0x3, 0x2,
0x3d, 0x130, 0x3, 0x2, 0x2, 0x2, 0x3f, 0x137, 0x3, 0x2, 0x2, 0x3b, 0x12f, 0x3, 0x2, 0x2, 0x2, 0x3d,
0x2, 0x2, 0x2, 0x41, 0x141, 0x3, 0x2, 0x2, 0x2, 0x133, 0x3, 0x2, 0x2, 0x2, 0x3f, 0x139, 0x3, 0x2,
0x43, 0x14a, 0x3, 0x2, 0x2, 0x2, 0x45, 0x150, 0x3, 0x2, 0x2, 0x41, 0x140, 0x3, 0x2, 0x2, 0x2, 0x43,
0x2, 0x2, 0x2, 0x47, 0x155, 0x3, 0x2, 0x2, 0x2, 0x14a, 0x3, 0x2, 0x2, 0x2, 0x45, 0x153, 0x3, 0x2,
0x49, 0x15f, 0x3, 0x2, 0x2, 0x2, 0x4b, 0x163, 0x3, 0x2, 0x2, 0x47, 0x159, 0x3, 0x2, 0x2, 0x2, 0x49,
0x2, 0x2, 0x2, 0x4d, 0x169, 0x3, 0x2, 0x2, 0x2, 0x15e, 0x3, 0x2, 0x2, 0x2, 0x4b, 0x168, 0x3, 0x2,
0x4f, 0x170, 0x3, 0x2, 0x2, 0x2, 0x51, 0x175, 0x3, 0x2, 0x2, 0x4d, 0x16c, 0x3, 0x2, 0x2, 0x2, 0x4f,
0x2, 0x2, 0x2, 0x53, 0x17a, 0x3, 0x2, 0x2, 0x2, 0x172, 0x3, 0x2, 0x2, 0x2, 0x51, 0x179, 0x3, 0x2,
0x55, 0x17d, 0x3, 0x2, 0x2, 0x2, 0x57, 0x181, 0x3, 0x2, 0x2, 0x53, 0x17e, 0x3, 0x2, 0x2, 0x2, 0x55,
0x2, 0x2, 0x2, 0x59, 0x187, 0x3, 0x2, 0x2, 0x2, 0x183, 0x3, 0x2, 0x2, 0x2, 0x57, 0x186, 0x3, 0x2,
0x5b, 0x18e, 0x3, 0x2, 0x2, 0x2, 0x5d, 0x195, 0x3, 0x2, 0x2, 0x59, 0x18a, 0x3, 0x2, 0x2, 0x2, 0x5b,
0x2, 0x2, 0x2, 0x5f, 0x19b, 0x3, 0x2, 0x2, 0x2, 0x190, 0x3, 0x2, 0x2, 0x2, 0x5d, 0x197, 0x3, 0x2,
0x61, 0x1a7, 0x3, 0x2, 0x2, 0x2, 0x63, 0x1ad, 0x3, 0x2, 0x2, 0x5f, 0x19e, 0x3, 0x2, 0x2, 0x2, 0x61,
0x2, 0x2, 0x2, 0x65, 0x1c9, 0x3, 0x2, 0x2, 0x2, 0x1a4, 0x3, 0x2, 0x2, 0x2, 0x63, 0x1b0, 0x3, 0x2,
0x67, 0x1cb, 0x3, 0x2, 0x2, 0x2, 0x69, 0x1ce, 0x3, 0x2, 0x2, 0x65, 0x1b6, 0x3, 0x2, 0x2, 0x2, 0x67,
0x2, 0x2, 0x2, 0x6b, 0x1d0, 0x3, 0x2, 0x2, 0x2, 0x1d2, 0x3, 0x2, 0x2, 0x2, 0x69, 0x1d4, 0x3, 0x2,
0x6d, 0x1d2, 0x3, 0x2, 0x2, 0x2, 0x6f, 0x1d4, 0x3, 0x2, 0x2, 0x6b, 0x1d7, 0x3, 0x2, 0x2, 0x2, 0x6d,
0x2, 0x2, 0x2, 0x71, 0x1d6, 0x3, 0x2, 0x2, 0x2, 0x1d9, 0x3, 0x2, 0x2, 0x2, 0x6f, 0x1db, 0x3, 0x2,
0x73, 0x1d8, 0x3, 0x2, 0x2, 0x2, 0x75, 0x1da, 0x3, 0x2, 0x2, 0x71, 0x1dd, 0x3, 0x2, 0x2, 0x2, 0x73,
0x2, 0x2, 0x2, 0x77, 0x1dc, 0x3, 0x2, 0x2, 0x2, 0x1df, 0x3, 0x2, 0x2, 0x2, 0x75, 0x1e1, 0x3, 0x2,
0x79, 0x1de, 0x3, 0x2, 0x2, 0x2, 0x7b, 0x1e2, 0x3, 0x2, 0x2, 0x77, 0x1e3, 0x3, 0x2, 0x2, 0x2, 0x79,
0x2, 0x2, 0x2, 0x7d, 0x1e6, 0x3, 0x2, 0x2, 0x2, 0x1e5, 0x3, 0x2, 0x2, 0x2, 0x7b, 0x1e7, 0x3, 0x2,
0x7f, 0x1e9, 0x3, 0x2, 0x2, 0x2, 0x81, 0x1eb, 0x3, 0x2, 0x2, 0x7d, 0x1eb, 0x3, 0x2, 0x2, 0x2, 0x7f,
0x2, 0x2, 0x2, 0x83, 0x1ee, 0x3, 0x2, 0x2, 0x2, 0x1ef, 0x3, 0x2, 0x2, 0x2, 0x81, 0x1f2, 0x3, 0x2,
0x85, 0x1f0, 0x3, 0x2, 0x2, 0x2, 0x87, 0x1f3, 0x3, 0x2, 0x2, 0x83, 0x1f4, 0x3, 0x2, 0x2, 0x2, 0x85,
0x2, 0x2, 0x2, 0x89, 0x1f6, 0x3, 0x2, 0x2, 0x2, 0x1f7, 0x3, 0x2, 0x2, 0x2, 0x87, 0x1f9, 0x3, 0x2,
0x8b, 0x1f9, 0x3, 0x2, 0x2, 0x2, 0x8d, 0x1fd, 0x3, 0x2, 0x2, 0x89, 0x1fc, 0x3, 0x2, 0x2, 0x2, 0x8b,
0x2, 0x2, 0x2, 0x8f, 0x203, 0x3, 0x2, 0x2, 0x2, 0x1ff, 0x3, 0x2, 0x2, 0x2, 0x8d, 0x202, 0x3, 0x2,
0x91, 0x205, 0x3, 0x2, 0x2, 0x2, 0x93, 0x208, 0x3, 0x2, 0x2, 0x8f, 0x206, 0x3, 0x2, 0x2, 0x2, 0x91,
0x2, 0x2, 0x2, 0x95, 0x20b, 0x3, 0x2, 0x2, 0x2, 0x20c, 0x3, 0x2, 0x2, 0x2, 0x93, 0x20e, 0x3, 0x2,
0x97, 0x21f, 0x3, 0x2, 0x2, 0x2, 0x99, 0x221, 0x3, 0x2, 0x2, 0x95, 0x211, 0x3, 0x2, 0x2, 0x2, 0x97,
0x2, 0x2, 0x2, 0x9b, 0x224, 0x3, 0x2, 0x2, 0x2, 0x214, 0x3, 0x2, 0x2, 0x2, 0x99, 0x228, 0x3, 0x2,
0x9d, 0x22c, 0x3, 0x2, 0x2, 0x2, 0x9f, 0x232, 0x3, 0x2, 0x2, 0x9b, 0x22a, 0x3, 0x2, 0x2, 0x2, 0x9d,
0x2, 0x2, 0x2, 0xa1, 0x242, 0x3, 0x2, 0x2, 0x2, 0x22d, 0x3, 0x2, 0x2, 0x2, 0x9f, 0x235, 0x3, 0x2,
0xa3, 0x24d, 0x3, 0x2, 0x2, 0x2, 0xa5, 0x257, 0x3, 0x2, 0x2, 0xa1, 0x23b, 0x3, 0x2, 0x2, 0x2, 0xa3,
0x2, 0x2, 0x2, 0xa7, 0x259, 0x3, 0x2, 0x2, 0x2, 0x24b, 0x3, 0x2, 0x2, 0x2, 0xa5, 0x256, 0x3, 0x2,
0xa9, 0x28e, 0x3, 0x2, 0x2, 0x2, 0xab, 0xac, 0x7, 0x2, 0x2, 0xa7, 0x260, 0x3, 0x2, 0x2, 0x2, 0xa9,
0x2a, 0x2, 0x2, 0xac, 0x4, 0x3, 0x2, 0x2, 0x2, 0x262, 0x3, 0x2, 0x2, 0x2, 0xab, 0x297, 0x3, 0x2,
0xad, 0xae, 0x7, 0x2b, 0x2, 0x2, 0xae, 0x6, 0x3, 0x2, 0x2, 0xad, 0xae, 0x7, 0x2a, 0x2, 0x2, 0xae,
0x2, 0x2, 0x2, 0xaf, 0xb0, 0x7, 0x3f, 0x2, 0x2, 0x4, 0x3, 0x2, 0x2, 0x2, 0xaf, 0xb0, 0x7, 0x2b,
0xb0, 0xb1, 0x7, 0x40, 0x2, 0x2, 0xb1, 0x8, 0x3, 0x2, 0x2, 0xb0, 0x6, 0x3, 0x2, 0x2, 0x2, 0xb1,
0x2, 0x2, 0x2, 0xb2, 0xb3, 0x7, 0x2e, 0x2, 0x2, 0xb2, 0x7, 0x3f, 0x2, 0x2, 0xb2, 0xb3, 0x7, 0x40,
0xb3, 0xa, 0x3, 0x2, 0x2, 0x2, 0xb4, 0xb5, 0x7, 0x2, 0x2, 0xb3, 0x8, 0x3, 0x2, 0x2, 0x2, 0xb4,
0x3c, 0x2, 0x2, 0xb5, 0xc, 0x3, 0x2, 0x2, 0x2, 0xb5, 0x7, 0x2e, 0x2, 0x2, 0xb5, 0xa, 0x3, 0x2,
0xb6, 0xb7, 0x7, 0x76, 0x2, 0x2, 0xb7, 0xb8, 0x7, 0x2, 0x2, 0xb6, 0xb7, 0x7, 0x3c, 0x2, 0x2, 0xb7,
0x7b, 0x2, 0x2, 0xb8, 0xb9, 0x7, 0x72, 0x2, 0x2, 0xc, 0x3, 0x2, 0x2, 0x2, 0xb8, 0xb9, 0x7, 0x76,
0xb9, 0xba, 0x7, 0x67, 0x2, 0x2, 0xba, 0xe, 0x3, 0x2, 0x2, 0xb9, 0xba, 0x7, 0x7b, 0x2, 0x2, 0xba,
0x2, 0x2, 0x2, 0xbb, 0xbc, 0x7, 0x41, 0x2, 0x2, 0xbb, 0x7, 0x72, 0x2, 0x2, 0xbb, 0xbc, 0x7, 0x67,
0xbc, 0x10, 0x3, 0x2, 0x2, 0x2, 0xbd, 0xbe, 0x7, 0x2, 0x2, 0xbc, 0xe, 0x3, 0x2, 0x2, 0x2, 0xbd,
0x7e, 0x2, 0x2, 0xbe, 0xbf, 0x7, 0x7e, 0x2, 0x2, 0xbe, 0x7, 0x41, 0x2, 0x2, 0xbe, 0x10, 0x3, 0x2,
0xbf, 0x12, 0x3, 0x2, 0x2, 0x2, 0xc0, 0xc1, 0x7, 0x2, 0x2, 0xbf, 0xc0, 0x7, 0x7e, 0x2, 0x2, 0xc0,
0x28, 0x2, 0x2, 0xc1, 0xc2, 0x7, 0x28, 0x2, 0x2, 0xc1, 0x7, 0x7e, 0x2, 0x2, 0xc1, 0x12, 0x3, 0x2,
0xc2, 0x14, 0x3, 0x2, 0x2, 0x2, 0xc3, 0xc4, 0x7, 0x2, 0x2, 0xc2, 0xc3, 0x7, 0x28, 0x2, 0x2, 0xc3,
0x30, 0x2, 0x2, 0xc4, 0x16, 0x3, 0x2, 0x2, 0x2, 0xc4, 0x7, 0x28, 0x2, 0x2, 0xc4, 0x14, 0x3, 0x2,
0xc5, 0xc6, 0x7, 0x5d, 0x2, 0x2, 0xc6, 0x18, 0x3, 0x2, 0x2, 0xc5, 0xc6, 0x7, 0x30, 0x2, 0x2, 0xc6,
0x2, 0x2, 0x2, 0xc7, 0xc8, 0x7, 0x5f, 0x2, 0x2, 0x16, 0x3, 0x2, 0x2, 0x2, 0xc7, 0xc8, 0x7, 0x5d,
0xc8, 0x1a, 0x3, 0x2, 0x2, 0x2, 0xc9, 0xca, 0x7, 0x2, 0x2, 0xc8, 0x18, 0x3, 0x2, 0x2, 0x2, 0xc9,
0x3d, 0x2, 0x2, 0xca, 0x1c, 0x3, 0x2, 0x2, 0x2, 0xca, 0x7, 0x5f, 0x2, 0x2, 0xca, 0x1a, 0x3, 0x2,
0xcb, 0xcc, 0x7, 0x71, 0x2, 0x2, 0xcc, 0xcd, 0x7, 0x2, 0x2, 0xcb, 0xcc, 0x7, 0x7d, 0x2, 0x2, 0xcc,
0x68, 0x2, 0x2, 0xcd, 0x1e, 0x3, 0x2, 0x2, 0x2, 0x1c, 0x3, 0x2, 0x2, 0x2, 0xcd, 0xce, 0x7, 0x7f,
0xce, 0xcf, 0x7, 0x67, 0x2, 0x2, 0xcf, 0xd0, 0x7, 0x2, 0x2, 0xce, 0x1e, 0x3, 0x2, 0x2, 0x2, 0xcf,
0x6e, 0x2, 0x2, 0xd0, 0xd1, 0x7, 0x75, 0x2, 0x2, 0xd0, 0x7, 0x3d, 0x2, 0x2, 0xd0, 0x20, 0x3, 0x2,
0xd1, 0xd2, 0x7, 0x67, 0x2, 0x2, 0xd2, 0x20, 0x3, 0x2, 0x2, 0xd1, 0xd2, 0x7, 0x71, 0x2, 0x2, 0xd2,
0x2, 0x2, 0x2, 0xd3, 0xd4, 0x7, 0x7d, 0x2, 0x2, 0xd3, 0x7, 0x68, 0x2, 0x2, 0xd3, 0x22, 0x3, 0x2,
0xd4, 0x22, 0x3, 0x2, 0x2, 0x2, 0xd5, 0xd6, 0x7, 0x2, 0x2, 0xd4, 0xd5, 0x7, 0x67, 0x2, 0x2, 0xd5,
0x7f, 0x2, 0x2, 0xd6, 0x24, 0x3, 0x2, 0x2, 0x2, 0xd6, 0x7, 0x6e, 0x2, 0x2, 0xd6, 0xd7, 0x7, 0x75,
0xd7, 0xd8, 0x7, 0x67, 0x2, 0x2, 0xd8, 0xd9, 0x7, 0x2, 0x2, 0xd7, 0xd8, 0x7, 0x67, 0x2, 0x2, 0xd8,
0x7a, 0x2, 0x2, 0xd9, 0xda, 0x7, 0x76, 0x2, 0x2, 0x24, 0x3, 0x2, 0x2, 0x2, 0xd9, 0xda, 0x7, 0x67,
0xda, 0xdb, 0x7, 0x67, 0x2, 0x2, 0xdb, 0xdc, 0x7, 0x2, 0x2, 0xda, 0xdb, 0x7, 0x7a, 0x2, 0x2, 0xdb,
0x70, 0x2, 0x2, 0xdc, 0xdd, 0x7, 0x66, 0x2, 0x2, 0xdc, 0x7, 0x76, 0x2, 0x2, 0xdc, 0xdd, 0x7, 0x67,
0xdd, 0xde, 0x7, 0x75, 0x2, 0x2, 0xde, 0x26, 0x3, 0x2, 0x2, 0xdd, 0xde, 0x7, 0x70, 0x2, 0x2, 0xde,
0x2, 0x2, 0x2, 0xdf, 0xe0, 0x7, 0x69, 0x2, 0x2, 0xdf, 0x7, 0x66, 0x2, 0x2, 0xdf, 0xe0, 0x7, 0x75,
0xe0, 0xe1, 0x7, 0x67, 0x2, 0x2, 0xe1, 0xe2, 0x7, 0x2, 0x2, 0xe0, 0x26, 0x3, 0x2, 0x2, 0x2, 0xe1,
0x70, 0x2, 0x2, 0xe2, 0xe3, 0x7, 0x67, 0x2, 0x2, 0xe2, 0x7, 0x69, 0x2, 0x2, 0xe2, 0xe3, 0x7, 0x67,
0xe3, 0xe4, 0x7, 0x74, 0x2, 0x2, 0xe4, 0xe5, 0x7, 0x2, 0x2, 0xe3, 0xe4, 0x7, 0x70, 0x2, 0x2, 0xe4,
0x63, 0x2, 0x2, 0xe5, 0xe6, 0x7, 0x76, 0x2, 0x2, 0xe5, 0x7, 0x67, 0x2, 0x2, 0xe5, 0xe6, 0x7, 0x74,
0xe6, 0xe7, 0x7, 0x67, 0x2, 0x2, 0xe7, 0xe8, 0x7, 0x2, 0x2, 0xe6, 0xe7, 0x7, 0x63, 0x2, 0x2, 0xe7,
0x75, 0x2, 0x2, 0xe8, 0x28, 0x3, 0x2, 0x2, 0x2, 0xe8, 0x7, 0x76, 0x2, 0x2, 0xe8, 0xe9, 0x7, 0x67,
0xe9, 0xea, 0x7, 0x71, 0x2, 0x2, 0xea, 0xeb, 0x7, 0x2, 0x2, 0xe9, 0xea, 0x7, 0x75, 0x2, 0x2, 0xea,
0x72, 0x2, 0x2, 0xeb, 0xec, 0x7, 0x67, 0x2, 0x2, 0x28, 0x3, 0x2, 0x2, 0x2, 0xeb, 0xec, 0x7, 0x71,
0xec, 0xed, 0x7, 0x74, 0x2, 0x2, 0xed, 0xee, 0x7, 0x2, 0x2, 0xec, 0xed, 0x7, 0x72, 0x2, 0x2, 0xed,
0x63, 0x2, 0x2, 0xee, 0xef, 0x7, 0x76, 0x2, 0x2, 0xee, 0x7, 0x67, 0x2, 0x2, 0xee, 0xef, 0x7, 0x74,
0xef, 0xf0, 0x7, 0x71, 0x2, 0x2, 0xf0, 0xf1, 0x7, 0x2, 0x2, 0xef, 0xf0, 0x7, 0x63, 0x2, 0x2, 0xf0,
0x74, 0x2, 0x2, 0xf1, 0x2a, 0x3, 0x2, 0x2, 0x2, 0xf1, 0x7, 0x76, 0x2, 0x2, 0xf1, 0xf2, 0x7, 0x71,
0xf2, 0xf3, 0x7, 0x6f, 0x2, 0x2, 0xf3, 0xf4, 0x7, 0x2, 0x2, 0xf2, 0xf3, 0x7, 0x74, 0x2, 0x2, 0xf3,
0x63, 0x2, 0x2, 0xf4, 0xf5, 0x7, 0x65, 0x2, 0x2, 0x2a, 0x3, 0x2, 0x2, 0x2, 0xf4, 0xf5, 0x7, 0x75,
0xf5, 0xf6, 0x7, 0x74, 0x2, 0x2, 0xf6, 0xf7, 0x7, 0x2, 0x2, 0xf5, 0xf6, 0x7, 0x76, 0x2, 0x2, 0xf6,
0x71, 0x2, 0x2, 0xf7, 0x2c, 0x3, 0x2, 0x2, 0x2, 0xf7, 0x7, 0x74, 0x2, 0x2, 0xf7, 0xf8, 0x7, 0x77,
0xf8, 0xf9, 0x7, 0x64, 0x2, 0x2, 0xf9, 0xfa, 0x7, 0x2, 0x2, 0xf8, 0xf9, 0x7, 0x65, 0x2, 0x2, 0xf9,
0x77, 0x2, 0x2, 0xfa, 0xfb, 0x7, 0x6b, 0x2, 0x2, 0xfa, 0x7, 0x76, 0x2, 0x2, 0xfa, 0x2c, 0x3, 0x2,
0xfb, 0xfc, 0x7, 0x6e, 0x2, 0x2, 0xfc, 0xfd, 0x7, 0x2, 0x2, 0xfb, 0xfc, 0x7, 0x6f, 0x2, 0x2, 0xfc,
0x76, 0x2, 0x2, 0xfd, 0xfe, 0x7, 0x6b, 0x2, 0x2, 0xfd, 0x7, 0x63, 0x2, 0x2, 0xfd, 0xfe, 0x7, 0x65,
0xfe, 0xff, 0x7, 0x70, 0x2, 0x2, 0xff, 0x2e, 0x3, 0x2, 0x2, 0xfe, 0xff, 0x7, 0x74, 0x2, 0x2, 0xff,
0x2, 0x2, 0x2, 0x100, 0x101, 0x7, 0x74, 0x2, 0x2, 0x100, 0x7, 0x71, 0x2, 0x2, 0x100, 0x2e, 0x3, 0x2,
0x101, 0x102, 0x7, 0x77, 0x2, 0x2, 0x102, 0x103, 0x7, 0x2, 0x2, 0x101, 0x102, 0x7, 0x64, 0x2, 0x2, 0x102,
0x70, 0x2, 0x2, 0x103, 0x104, 0x7, 0x76, 0x2, 0x2, 0x103, 0x7, 0x77, 0x2, 0x2, 0x103, 0x104, 0x7, 0x6b,
0x104, 0x105, 0x7, 0x6b, 0x2, 0x2, 0x105, 0x106, 0x7, 0x2, 0x2, 0x104, 0x105, 0x7, 0x6e, 0x2, 0x2, 0x105,
0x6f, 0x2, 0x2, 0x106, 0x107, 0x7, 0x67, 0x2, 0x2, 0x106, 0x7, 0x76, 0x2, 0x2, 0x106, 0x107, 0x7, 0x6b,
0x107, 0x30, 0x3, 0x2, 0x2, 0x2, 0x108, 0x109, 0x7, 0x2, 0x2, 0x107, 0x108, 0x7, 0x70, 0x2, 0x2, 0x108,
0x6f, 0x2, 0x2, 0x109, 0x10a, 0x7, 0x71, 0x2, 0x2, 0x30, 0x3, 0x2, 0x2, 0x2, 0x109, 0x10a, 0x7, 0x74,
0x10a, 0x10b, 0x7, 0x66, 0x2, 0x2, 0x10b, 0x10c, 0x7, 0x2, 0x2, 0x10a, 0x10b, 0x7, 0x77, 0x2, 0x2, 0x10b,
0x77, 0x2, 0x2, 0x10c, 0x10d, 0x7, 0x6e, 0x2, 0x2, 0x10c, 0x7, 0x70, 0x2, 0x2, 0x10c, 0x10d, 0x7, 0x76,
0x10d, 0x10e, 0x7, 0x67, 0x2, 0x2, 0x10e, 0x32, 0x3, 0x2, 0x2, 0x10d, 0x10e, 0x7, 0x6b, 0x2, 0x2, 0x10e,
0x2, 0x2, 0x2, 0x10f, 0x110, 0x7, 0x6c, 0x2, 0x2, 0x10f, 0x7, 0x6f, 0x2, 0x2, 0x10f, 0x110, 0x7, 0x67,
0x110, 0x111, 0x7, 0x63, 0x2, 0x2, 0x111, 0x112, 0x7, 0x2, 0x2, 0x110, 0x32, 0x3, 0x2, 0x2, 0x2, 0x111,
0x78, 0x2, 0x2, 0x112, 0x113, 0x7, 0x63, 0x2, 0x2, 0x112, 0x7, 0x6f, 0x2, 0x2, 0x112, 0x113, 0x7, 0x71,
0x113, 0x114, 0x7, 0x75, 0x2, 0x2, 0x114, 0x115, 0x7, 0x2, 0x2, 0x113, 0x114, 0x7, 0x66, 0x2, 0x2, 0x114,
0x65, 0x2, 0x2, 0x115, 0x116, 0x7, 0x74, 0x2, 0x2, 0x115, 0x7, 0x77, 0x2, 0x2, 0x115, 0x116, 0x7, 0x6e,
0x116, 0x117, 0x7, 0x6b, 0x2, 0x2, 0x117, 0x118, 0x7, 0x2, 0x2, 0x116, 0x117, 0x7, 0x67, 0x2, 0x2, 0x117,
0x72, 0x2, 0x2, 0x118, 0x119, 0x7, 0x76, 0x2, 0x2, 0x34, 0x3, 0x2, 0x2, 0x2, 0x118, 0x119, 0x7, 0x6c,
0x119, 0x34, 0x3, 0x2, 0x2, 0x2, 0x11a, 0x11b, 0x7, 0x2, 0x2, 0x119, 0x11a, 0x7, 0x63, 0x2, 0x2, 0x11a,
0x66, 0x2, 0x2, 0x11b, 0x11c, 0x7, 0x67, 0x2, 0x2, 0x11b, 0x7, 0x78, 0x2, 0x2, 0x11b, 0x11c, 0x7, 0x63,
0x11c, 0x11d, 0x7, 0x68, 0x2, 0x2, 0x11d, 0x11e, 0x7, 0x2, 0x2, 0x11c, 0x11d, 0x7, 0x75, 0x2, 0x2, 0x11d,
0x67, 0x2, 0x2, 0x11e, 0x11f, 0x7, 0x74, 0x2, 0x2, 0x11e, 0x7, 0x65, 0x2, 0x2, 0x11e, 0x11f, 0x7, 0x74,
0x11f, 0x120, 0x7, 0x74, 0x2, 0x2, 0x120, 0x121, 0x7, 0x2, 0x2, 0x11f, 0x120, 0x7, 0x6b, 0x2, 0x2, 0x120,
0x67, 0x2, 0x2, 0x121, 0x122, 0x7, 0x66, 0x2, 0x2, 0x121, 0x7, 0x72, 0x2, 0x2, 0x121, 0x122, 0x7, 0x76,
0x122, 0x36, 0x3, 0x2, 0x2, 0x2, 0x123, 0x124, 0x7, 0x2, 0x2, 0x122, 0x36, 0x3, 0x2, 0x2, 0x2, 0x123,
0x6b, 0x2, 0x2, 0x124, 0x125, 0x7, 0x68, 0x2, 0x2, 0x124, 0x7, 0x66, 0x2, 0x2, 0x124, 0x125, 0x7, 0x67,
0x125, 0x38, 0x3, 0x2, 0x2, 0x2, 0x126, 0x127, 0x7, 0x2, 0x2, 0x125, 0x126, 0x7, 0x68, 0x2, 0x2, 0x126,
0x68, 0x2, 0x2, 0x127, 0x128, 0x7, 0x71, 0x2, 0x2, 0x127, 0x7, 0x67, 0x2, 0x2, 0x127, 0x128, 0x7, 0x74,
0x128, 0x129, 0x7, 0x74, 0x2, 0x2, 0x129, 0x3a, 0x3, 0x2, 0x2, 0x128, 0x129, 0x7, 0x74, 0x2, 0x2, 0x129,
0x2, 0x2, 0x2, 0x12a, 0x12b, 0x7, 0x79, 0x2, 0x2, 0x12a, 0x7, 0x67, 0x2, 0x2, 0x12a, 0x12b, 0x7, 0x66,
0x12b, 0x12c, 0x7, 0x6a, 0x2, 0x2, 0x12c, 0x12d, 0x7, 0x2, 0x2, 0x12b, 0x38, 0x3, 0x2, 0x2, 0x2, 0x12c,
0x6b, 0x2, 0x2, 0x12d, 0x12e, 0x7, 0x6e, 0x2, 0x2, 0x12d, 0x7, 0x6b, 0x2, 0x2, 0x12d, 0x12e, 0x7, 0x68,
0x12e, 0x12f, 0x7, 0x67, 0x2, 0x2, 0x12f, 0x3c, 0x3, 0x2, 0x2, 0x12e, 0x3a, 0x3, 0x2, 0x2, 0x2, 0x12f,
0x2, 0x2, 0x2, 0x130, 0x131, 0x7, 0x74, 0x2, 0x2, 0x130, 0x7, 0x68, 0x2, 0x2, 0x130, 0x131, 0x7, 0x71,
0x131, 0x132, 0x7, 0x67, 0x2, 0x2, 0x132, 0x133, 0x7, 0x2, 0x2, 0x131, 0x132, 0x7, 0x74, 0x2, 0x2, 0x132,
0x76, 0x2, 0x2, 0x133, 0x134, 0x7, 0x77, 0x2, 0x2, 0x3c, 0x3, 0x2, 0x2, 0x2, 0x133, 0x134, 0x7, 0x79,
0x134, 0x135, 0x7, 0x74, 0x2, 0x2, 0x135, 0x136, 0x7, 0x2, 0x2, 0x134, 0x135, 0x7, 0x6a, 0x2, 0x2, 0x135,
0x70, 0x2, 0x2, 0x136, 0x3e, 0x3, 0x2, 0x2, 0x2, 0x136, 0x7, 0x6b, 0x2, 0x2, 0x136, 0x137, 0x7, 0x6e,
0x137, 0x138, 0x7, 0x65, 0x2, 0x2, 0x138, 0x139, 0x7, 0x2, 0x2, 0x137, 0x138, 0x7, 0x67, 0x2, 0x2, 0x138,
0x71, 0x2, 0x2, 0x139, 0x13a, 0x7, 0x70, 0x2, 0x2, 0x3e, 0x3, 0x2, 0x2, 0x2, 0x139, 0x13a, 0x7, 0x74,
0x13a, 0x13b, 0x7, 0x75, 0x2, 0x2, 0x13b, 0x13c, 0x7, 0x2, 0x2, 0x13a, 0x13b, 0x7, 0x67, 0x2, 0x2, 0x13b,
0x76, 0x2, 0x2, 0x13c, 0x13d, 0x7, 0x67, 0x2, 0x2, 0x13c, 0x7, 0x76, 0x2, 0x2, 0x13c, 0x13d, 0x7, 0x77,
0x13d, 0x13e, 0x7, 0x7a, 0x2, 0x2, 0x13e, 0x13f, 0x7, 0x2, 0x2, 0x13d, 0x13e, 0x7, 0x74, 0x2, 0x2, 0x13e,
0x72, 0x2, 0x2, 0x13f, 0x140, 0x7, 0x74, 0x2, 0x2, 0x13f, 0x7, 0x70, 0x2, 0x2, 0x13f, 0x40, 0x3, 0x2,
0x140, 0x40, 0x3, 0x2, 0x2, 0x2, 0x141, 0x142, 0x7, 0x2, 0x2, 0x140, 0x141, 0x7, 0x65, 0x2, 0x2, 0x141,
0x65, 0x2, 0x2, 0x142, 0x143, 0x7, 0x71, 0x2, 0x2, 0x142, 0x7, 0x71, 0x2, 0x2, 0x142, 0x143, 0x7, 0x70,
0x143, 0x144, 0x7, 0x70, 0x2, 0x2, 0x144, 0x145, 0x7, 0x2, 0x2, 0x143, 0x144, 0x7, 0x75, 0x2, 0x2, 0x144,
0x76, 0x2, 0x2, 0x145, 0x146, 0x7, 0x6b, 0x2, 0x2, 0x145, 0x7, 0x76, 0x2, 0x2, 0x145, 0x146, 0x7, 0x67,
0x146, 0x147, 0x7, 0x70, 0x2, 0x2, 0x147, 0x148, 0x7, 0x2, 0x2, 0x146, 0x147, 0x7, 0x7a, 0x2, 0x2, 0x147,
0x77, 0x2, 0x2, 0x148, 0x149, 0x7, 0x67, 0x2, 0x2, 0x148, 0x7, 0x72, 0x2, 0x2, 0x148, 0x149, 0x7, 0x74,
0x149, 0x42, 0x3, 0x2, 0x2, 0x2, 0x14a, 0x14b, 0x7, 0x2, 0x2, 0x149, 0x42, 0x3, 0x2, 0x2, 0x2, 0x14a,
0x64, 0x2, 0x2, 0x14b, 0x14c, 0x7, 0x74, 0x2, 0x2, 0x14b, 0x7, 0x65, 0x2, 0x2, 0x14b, 0x14c, 0x7, 0x71,
0x14c, 0x14d, 0x7, 0x67, 0x2, 0x2, 0x14d, 0x14e, 0x7, 0x2, 0x2, 0x14c, 0x14d, 0x7, 0x70, 0x2, 0x2, 0x14d,
0x63, 0x2, 0x2, 0x14e, 0x14f, 0x7, 0x6d, 0x2, 0x2, 0x14e, 0x7, 0x76, 0x2, 0x2, 0x14e, 0x14f, 0x7, 0x6b,
0x14f, 0x44, 0x3, 0x2, 0x2, 0x2, 0x150, 0x151, 0x7, 0x2, 0x2, 0x14f, 0x150, 0x7, 0x70, 0x2, 0x2, 0x150,
0x69, 0x2, 0x2, 0x151, 0x152, 0x7, 0x71, 0x2, 0x2, 0x151, 0x7, 0x77, 0x2, 0x2, 0x151, 0x152, 0x7, 0x67,
0x152, 0x153, 0x7, 0x76, 0x2, 0x2, 0x153, 0x154, 0x7, 0x2, 0x2, 0x152, 0x44, 0x3, 0x2, 0x2, 0x2, 0x153,
0x71, 0x2, 0x2, 0x154, 0x46, 0x3, 0x2, 0x2, 0x2, 0x154, 0x7, 0x64, 0x2, 0x2, 0x154, 0x155, 0x7, 0x74,
0x155, 0x156, 0x7, 0x71, 0x2, 0x2, 0x156, 0x157, 0x7, 0x2, 0x2, 0x155, 0x156, 0x7, 0x67, 0x2, 0x2, 0x156,
0x76, 0x2, 0x2, 0x157, 0x158, 0x7, 0x6a, 0x2, 0x2, 0x157, 0x7, 0x63, 0x2, 0x2, 0x157, 0x158, 0x7, 0x6d,
0x158, 0x159, 0x7, 0x67, 0x2, 0x2, 0x159, 0x15a, 0x7, 0x2, 0x2, 0x158, 0x46, 0x3, 0x2, 0x2, 0x2, 0x159,
0x74, 0x2, 0x2, 0x15a, 0x15b, 0x7, 0x79, 0x2, 0x2, 0x15a, 0x7, 0x69, 0x2, 0x2, 0x15a, 0x15b, 0x7, 0x71,
0x15b, 0x15c, 0x7, 0x6b, 0x2, 0x2, 0x15c, 0x15d, 0x7, 0x2, 0x2, 0x15b, 0x15c, 0x7, 0x76, 0x2, 0x2, 0x15c,
0x75, 0x2, 0x2, 0x15d, 0x15e, 0x7, 0x67, 0x2, 0x2, 0x15d, 0x7, 0x71, 0x2, 0x2, 0x15d, 0x48, 0x3, 0x2,
0x15e, 0x48, 0x3, 0x2, 0x2, 0x2, 0x15f, 0x160, 0x7, 0x2, 0x2, 0x15e, 0x15f, 0x7, 0x71, 0x2, 0x2, 0x15f,
0x76, 0x2, 0x2, 0x160, 0x161, 0x7, 0x74, 0x2, 0x2, 0x160, 0x7, 0x76, 0x2, 0x2, 0x160, 0x161, 0x7, 0x6a,
0x161, 0x162, 0x7, 0x7b, 0x2, 0x2, 0x162, 0x4a, 0x3, 0x2, 0x2, 0x161, 0x162, 0x7, 0x67, 0x2, 0x2, 0x162,
0x2, 0x2, 0x2, 0x163, 0x164, 0x7, 0x6e, 0x2, 0x2, 0x163, 0x7, 0x74, 0x2, 0x2, 0x163, 0x164, 0x7, 0x79,
0x164, 0x165, 0x7, 0x63, 0x2, 0x2, 0x165, 0x166, 0x7, 0x2, 0x2, 0x164, 0x165, 0x7, 0x6b, 0x2, 0x2, 0x165,
0x64, 0x2, 0x2, 0x166, 0x167, 0x7, 0x67, 0x2, 0x2, 0x166, 0x7, 0x75, 0x2, 0x2, 0x166, 0x167, 0x7, 0x67,
0x167, 0x168, 0x7, 0x6e, 0x2, 0x2, 0x168, 0x4c, 0x3, 0x2, 0x2, 0x167, 0x4a, 0x3, 0x2, 0x2, 0x2, 0x168,
0x2, 0x2, 0x2, 0x169, 0x16a, 0x7, 0x6e, 0x2, 0x2, 0x169, 0x7, 0x76, 0x2, 0x2, 0x169, 0x16a, 0x7, 0x74,
0x16a, 0x16b, 0x7, 0x63, 0x2, 0x2, 0x16b, 0x16c, 0x7, 0x2, 0x2, 0x16a, 0x16b, 0x7, 0x7b, 0x2, 0x2, 0x16b,
0x64, 0x2, 0x2, 0x16c, 0x16d, 0x7, 0x67, 0x2, 0x2, 0x4c, 0x3, 0x2, 0x2, 0x2, 0x16c, 0x16d, 0x7, 0x6e,
0x16d, 0x16e, 0x7, 0x6e, 0x2, 0x2, 0x16e, 0x16f, 0x7, 0x2, 0x2, 0x16d, 0x16e, 0x7, 0x63, 0x2, 0x2, 0x16e,
0x75, 0x2, 0x2, 0x16f, 0x4e, 0x3, 0x2, 0x2, 0x2, 0x16f, 0x7, 0x64, 0x2, 0x2, 0x16f, 0x170, 0x7, 0x67,
0x170, 0x171, 0x7, 0x76, 0x2, 0x2, 0x171, 0x172, 0x7, 0x2, 0x2, 0x170, 0x171, 0x7, 0x6e, 0x2, 0x2, 0x171,
0x63, 0x2, 0x2, 0x172, 0x173, 0x7, 0x6b, 0x2, 0x2, 0x4e, 0x3, 0x2, 0x2, 0x2, 0x172, 0x173, 0x7, 0x6e,
0x173, 0x174, 0x7, 0x6e, 0x2, 0x2, 0x174, 0x50, 0x3, 0x2, 0x2, 0x173, 0x174, 0x7, 0x63, 0x2, 0x2, 0x174,
0x2, 0x2, 0x2, 0x175, 0x176, 0x7, 0x6b, 0x2, 0x2, 0x175, 0x7, 0x64, 0x2, 0x2, 0x175, 0x176, 0x7, 0x67,
0x176, 0x177, 0x7, 0x75, 0x2, 0x2, 0x177, 0x178, 0x7, 0x2, 0x2, 0x176, 0x177, 0x7, 0x6e, 0x2, 0x2, 0x177,
0x70, 0x2, 0x2, 0x178, 0x179, 0x7, 0x76, 0x2, 0x2, 0x178, 0x7, 0x75, 0x2, 0x2, 0x178, 0x50, 0x3, 0x2,
0x179, 0x52, 0x3, 0x2, 0x2, 0x2, 0x17a, 0x17b, 0x7, 0x2, 0x2, 0x179, 0x17a, 0x7, 0x76, 0x2, 0x2, 0x17a,
0x6b, 0x2, 0x2, 0x17b, 0x17c, 0x7, 0x75, 0x2, 0x2, 0x17b, 0x7, 0x63, 0x2, 0x2, 0x17b, 0x17c, 0x7, 0x6b,
0x17c, 0x54, 0x3, 0x2, 0x2, 0x2, 0x17d, 0x17e, 0x7, 0x2, 0x2, 0x17c, 0x17d, 0x7, 0x6e, 0x2, 0x2, 0x17d,
0x6e, 0x2, 0x2, 0x17e, 0x17f, 0x7, 0x67, 0x2, 0x2, 0x52, 0x3, 0x2, 0x2, 0x2, 0x17e, 0x17f, 0x7, 0x6b,
0x17f, 0x180, 0x7, 0x76, 0x2, 0x2, 0x180, 0x56, 0x3, 0x2, 0x2, 0x17f, 0x180, 0x7, 0x75, 0x2, 0x2, 0x180,
0x2, 0x2, 0x2, 0x181, 0x182, 0x7, 0x65, 0x2, 0x2, 0x181, 0x7, 0x70, 0x2, 0x2, 0x181, 0x182, 0x7, 0x76,
0x182, 0x183, 0x7, 0x71, 0x2, 0x2, 0x183, 0x184, 0x7, 0x2, 0x2, 0x182, 0x54, 0x3, 0x2, 0x2, 0x2, 0x183,
0x70, 0x2, 0x2, 0x184, 0x185, 0x7, 0x75, 0x2, 0x2, 0x184, 0x7, 0x6b, 0x2, 0x2, 0x184, 0x185, 0x7, 0x75,
0x185, 0x186, 0x7, 0x76, 0x2, 0x2, 0x186, 0x58, 0x3, 0x2, 0x2, 0x185, 0x56, 0x3, 0x2, 0x2, 0x2, 0x186,
0x2, 0x2, 0x2, 0x187, 0x188, 0x7, 0x67, 0x2, 0x2, 0x187, 0x7, 0x6e, 0x2, 0x2, 0x187, 0x188, 0x7, 0x67,
0x188, 0x189, 0x7, 0x7a, 0x2, 0x2, 0x189, 0x18a, 0x7, 0x2, 0x2, 0x188, 0x189, 0x7, 0x76, 0x2, 0x2, 0x189,
0x76, 0x2, 0x2, 0x18a, 0x18b, 0x7, 0x67, 0x2, 0x2, 0x58, 0x3, 0x2, 0x2, 0x2, 0x18a, 0x18b, 0x7, 0x65,
0x18b, 0x18c, 0x7, 0x74, 0x2, 0x2, 0x18c, 0x18d, 0x7, 0x2, 0x2, 0x18b, 0x18c, 0x7, 0x71, 0x2, 0x2, 0x18c,
0x70, 0x2, 0x2, 0x18d, 0x5a, 0x3, 0x2, 0x2, 0x2, 0x18d, 0x7, 0x70, 0x2, 0x2, 0x18d, 0x18e, 0x7, 0x75,
0x18e, 0x18f, 0x7, 0x63, 0x2, 0x2, 0x18f, 0x190, 0x7, 0x2, 0x2, 0x18e, 0x18f, 0x7, 0x76, 0x2, 0x2, 0x18f,
0x75, 0x2, 0x2, 0x190, 0x191, 0x7, 0x75, 0x2, 0x2, 0x5a, 0x3, 0x2, 0x2, 0x2, 0x190, 0x191, 0x7, 0x67,
0x191, 0x192, 0x7, 0x67, 0x2, 0x2, 0x192, 0x193, 0x7, 0x2, 0x2, 0x191, 0x192, 0x7, 0x7a, 0x2, 0x2, 0x192,
0x74, 0x2, 0x2, 0x193, 0x194, 0x7, 0x76, 0x2, 0x2, 0x193, 0x7, 0x76, 0x2, 0x2, 0x193, 0x194, 0x7, 0x67,
0x194, 0x5c, 0x3, 0x2, 0x2, 0x2, 0x195, 0x196, 0x7, 0x2, 0x2, 0x194, 0x195, 0x7, 0x74, 0x2, 0x2, 0x195,
0x65, 0x2, 0x2, 0x196, 0x197, 0x7, 0x6a, 0x2, 0x2, 0x196, 0x7, 0x70, 0x2, 0x2, 0x196, 0x5c, 0x3, 0x2,
0x197, 0x198, 0x7, 0x67, 0x2, 0x2, 0x198, 0x199, 0x7, 0x2, 0x2, 0x197, 0x198, 0x7, 0x63, 0x2, 0x2, 0x198,
0x65, 0x2, 0x2, 0x199, 0x19a, 0x7, 0x6d, 0x2, 0x2, 0x199, 0x7, 0x75, 0x2, 0x2, 0x199, 0x19a, 0x7, 0x75,
0x19a, 0x5e, 0x3, 0x2, 0x2, 0x2, 0x19b, 0x19c, 0x7, 0x2, 0x2, 0x19a, 0x19b, 0x7, 0x67, 0x2, 0x2, 0x19b,
0x77, 0x2, 0x2, 0x19c, 0x19d, 0x7, 0x70, 0x2, 0x2, 0x19c, 0x7, 0x74, 0x2, 0x2, 0x19c, 0x19d, 0x7, 0x76,
0x19d, 0x19e, 0x7, 0x74, 0x2, 0x2, 0x19e, 0x19f, 0x7, 0x2, 0x2, 0x19d, 0x5e, 0x3, 0x2, 0x2, 0x2, 0x19e,
0x67, 0x2, 0x2, 0x19f, 0x1a0, 0x7, 0x63, 0x2, 0x2, 0x19f, 0x7, 0x65, 0x2, 0x2, 0x19f, 0x1a0, 0x7, 0x6a,
0x1a0, 0x1a1, 0x7, 0x65, 0x2, 0x2, 0x1a1, 0x1a2, 0x7, 0x2, 0x2, 0x1a0, 0x1a1, 0x7, 0x67, 0x2, 0x2, 0x1a1,
0x6a, 0x2, 0x2, 0x1a2, 0x1a3, 0x7, 0x63, 0x2, 0x2, 0x1a2, 0x7, 0x65, 0x2, 0x2, 0x1a2, 0x1a3, 0x7, 0x6d,
0x1a3, 0x1a4, 0x7, 0x64, 0x2, 0x2, 0x1a4, 0x1a5, 0x7, 0x2, 0x2, 0x1a3, 0x60, 0x3, 0x2, 0x2, 0x2, 0x1a4,
0x6e, 0x2, 0x2, 0x1a5, 0x1a6, 0x7, 0x67, 0x2, 0x2, 0x1a5, 0x7, 0x77, 0x2, 0x2, 0x1a5, 0x1a6, 0x7, 0x70,
0x1a6, 0x60, 0x3, 0x2, 0x2, 0x2, 0x1a7, 0x1a8, 0x7, 0x2, 0x2, 0x1a6, 0x1a7, 0x7, 0x74, 0x2, 0x2, 0x1a7,
0x66, 0x2, 0x2, 0x1a8, 0x1a9, 0x7, 0x67, 0x2, 0x2, 0x1a8, 0x7, 0x67, 0x2, 0x2, 0x1a8, 0x1a9, 0x7, 0x63,
0x1a9, 0x1aa, 0x7, 0x64, 0x2, 0x2, 0x1aa, 0x1ab, 0x7, 0x2, 0x2, 0x1a9, 0x1aa, 0x7, 0x65, 0x2, 0x2, 0x1aa,
0x77, 0x2, 0x2, 0x1ab, 0x1ac, 0x7, 0x69, 0x2, 0x2, 0x1ab, 0x7, 0x6a, 0x2, 0x2, 0x1ab, 0x1ac, 0x7, 0x63,
0x1ac, 0x62, 0x3, 0x2, 0x2, 0x2, 0x1ad, 0x1ae, 0x7, 0x2, 0x2, 0x1ac, 0x1ad, 0x7, 0x64, 0x2, 0x2, 0x1ad,
0x3f, 0x2, 0x2, 0x1ae, 0x64, 0x3, 0x2, 0x2, 0x2, 0x1ae, 0x7, 0x6e, 0x2, 0x2, 0x1ae, 0x1af, 0x7, 0x67,
0x1af, 0x1b0, 0x7, 0x2c, 0x2, 0x2, 0x1b0, 0x1ca, 0x7, 0x2, 0x2, 0x1af, 0x62, 0x3, 0x2, 0x2, 0x2, 0x1b0,
0x3f, 0x2, 0x2, 0x1b1, 0x1b2, 0x7, 0x31, 0x2, 0x2, 0x1b1, 0x7, 0x66, 0x2, 0x2, 0x1b1, 0x1b2, 0x7, 0x67,
0x1b2, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1b3, 0x1b4, 0x7, 0x2, 0x2, 0x1b2, 0x1b3, 0x7, 0x64, 0x2, 0x2, 0x1b3,
0x27, 0x2, 0x2, 0x1b4, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1b4, 0x7, 0x77, 0x2, 0x2, 0x1b4, 0x1b5, 0x7, 0x69,
0x1b5, 0x1b6, 0x7, 0x2d, 0x2, 0x2, 0x1b6, 0x1ca, 0x7, 0x2, 0x2, 0x1b5, 0x64, 0x3, 0x2, 0x2, 0x2, 0x1b6,
0x3f, 0x2, 0x2, 0x1b7, 0x1b8, 0x7, 0x2f, 0x2, 0x2, 0x1b7, 0x7, 0x3f, 0x2, 0x2, 0x1b7, 0x66, 0x3, 0x2,
0x1b8, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1b9, 0x1ba, 0x7, 0x2, 0x2, 0x1b8, 0x1b9, 0x7, 0x2c, 0x2, 0x2, 0x1b9,
0x3e, 0x2, 0x2, 0x1ba, 0x1bb, 0x7, 0x3e, 0x2, 0x2, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1ba, 0x1bb, 0x7, 0x31,
0x1bb, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1bc, 0x1bd, 0x7, 0x2, 0x2, 0x1bb, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1bc,
0x40, 0x2, 0x2, 0x1bd, 0x1be, 0x7, 0x40, 0x2, 0x2, 0x1bd, 0x7, 0x27, 0x2, 0x2, 0x1bd, 0x1d3, 0x7, 0x3f,
0x1be, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1bf, 0x1c0, 0x7, 0x2, 0x2, 0x1be, 0x1bf, 0x7, 0x2d, 0x2, 0x2, 0x1bf,
0x40, 0x2, 0x2, 0x1c0, 0x1c1, 0x7, 0x40, 0x2, 0x2, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1c0, 0x1c1, 0x7, 0x2f,
0x1c1, 0x1c2, 0x7, 0x40, 0x2, 0x2, 0x1c2, 0x1ca, 0x7, 0x2, 0x2, 0x1c1, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1c2,
0x3f, 0x2, 0x2, 0x1c3, 0x1c4, 0x7, 0x28, 0x2, 0x2, 0x1c3, 0x7, 0x3e, 0x2, 0x2, 0x1c3, 0x1c4, 0x7, 0x3e,
0x1c4, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1c5, 0x1c6, 0x7, 0x2, 0x2, 0x1c4, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1c5,
0x60, 0x2, 0x2, 0x1c6, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1c6, 0x7, 0x40, 0x2, 0x2, 0x1c6, 0x1c7, 0x7, 0x40,
0x1c7, 0x1c8, 0x7, 0x7e, 0x2, 0x2, 0x1c8, 0x1ca, 0x7, 0x2, 0x2, 0x1c7, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1c8,
0x3f, 0x2, 0x2, 0x1c9, 0x1af, 0x3, 0x2, 0x2, 0x2, 0x1c9, 0x7, 0x40, 0x2, 0x2, 0x1c9, 0x1ca, 0x7, 0x40,
0x1c9, 0x1b1, 0x3, 0x2, 0x2, 0x2, 0x1c9, 0x1b3, 0x3, 0x2, 0x2, 0x1ca, 0x1cb, 0x7, 0x40, 0x2, 0x2, 0x1cb,
0x2, 0x2, 0x2, 0x1c9, 0x1b5, 0x3, 0x2, 0x2, 0x2, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1cc, 0x1cd, 0x7, 0x28,
0x1c9, 0x1b7, 0x3, 0x2, 0x2, 0x2, 0x1c9, 0x1b9, 0x3, 0x2, 0x2, 0x1cd, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1ce,
0x2, 0x2, 0x2, 0x1c9, 0x1bc, 0x3, 0x2, 0x2, 0x2, 0x1cf, 0x7, 0x60, 0x2, 0x2, 0x1cf, 0x1d3, 0x7, 0x3f,
0x1c9, 0x1bf, 0x3, 0x2, 0x2, 0x2, 0x1c9, 0x1c3, 0x3, 0x2, 0x2, 0x1d0, 0x1d1, 0x7, 0x7e, 0x2, 0x2, 0x1d1,
0x2, 0x2, 0x2, 0x1c9, 0x1c5, 0x3, 0x2, 0x2, 0x2, 0x1d3, 0x7, 0x3f, 0x2, 0x2, 0x1d2, 0x1b8, 0x3, 0x2,
0x1c9, 0x1c7, 0x3, 0x2, 0x2, 0x2, 0x1ca, 0x66, 0x3, 0x2, 0x2, 0x1d2, 0x1ba, 0x3, 0x2, 0x2, 0x2, 0x1d2,
0x2, 0x2, 0x2, 0x1cb, 0x1cc, 0x7, 0x3f, 0x2, 0x2, 0x1bc, 0x3, 0x2, 0x2, 0x2, 0x1d2, 0x1be, 0x3, 0x2,
0x1cc, 0x1cd, 0x7, 0x3f, 0x2, 0x2, 0x1cd, 0x68, 0x3, 0x2, 0x2, 0x1d2, 0x1c0, 0x3, 0x2, 0x2, 0x2, 0x1d2,
0x2, 0x2, 0x2, 0x1ce, 0x1cf, 0x7, 0x2d, 0x2, 0x2, 0x1c2, 0x3, 0x2, 0x2, 0x2, 0x1d2, 0x1c5, 0x3, 0x2,
0x1cf, 0x6a, 0x3, 0x2, 0x2, 0x2, 0x1d0, 0x1d1, 0x7, 0x2, 0x2, 0x1d2, 0x1c8, 0x3, 0x2, 0x2, 0x2, 0x1d2,
0x2f, 0x2, 0x2, 0x1d1, 0x6c, 0x3, 0x2, 0x2, 0x2, 0x1cc, 0x3, 0x2, 0x2, 0x2, 0x1d2, 0x1ce, 0x3, 0x2,
0x1d2, 0x1d3, 0x7, 0x2c, 0x2, 0x2, 0x1d3, 0x6e, 0x3, 0x2, 0x2, 0x1d2, 0x1d0, 0x3, 0x2, 0x2, 0x2, 0x1d3,
0x2, 0x2, 0x2, 0x1d4, 0x1d5, 0x7, 0x31, 0x2, 0x2, 0x68, 0x3, 0x2, 0x2, 0x2, 0x1d4, 0x1d5, 0x7, 0x3f,
0x1d5, 0x70, 0x3, 0x2, 0x2, 0x2, 0x1d6, 0x1d7, 0x7, 0x2, 0x2, 0x1d5, 0x1d6, 0x7, 0x3f, 0x2, 0x2, 0x1d6,
0x27, 0x2, 0x2, 0x1d7, 0x72, 0x3, 0x2, 0x2, 0x2, 0x6a, 0x3, 0x2, 0x2, 0x2, 0x1d7, 0x1d8, 0x7, 0x2d,
0x1d8, 0x1d9, 0x7, 0x7e, 0x2, 0x2, 0x1d9, 0x74, 0x3, 0x2, 0x2, 0x1d8, 0x6c, 0x3, 0x2, 0x2, 0x2, 0x1d9,
0x2, 0x2, 0x2, 0x1da, 0x1db, 0x7, 0x28, 0x2, 0x2, 0x1da, 0x7, 0x2f, 0x2, 0x2, 0x1da, 0x6e, 0x3, 0x2,
0x1db, 0x76, 0x3, 0x2, 0x2, 0x2, 0x1dc, 0x1dd, 0x7, 0x2, 0x2, 0x1db, 0x1dc, 0x7, 0x2c, 0x2, 0x2, 0x1dc,
0x80, 0x2, 0x2, 0x1dd, 0x78, 0x3, 0x2, 0x2, 0x2, 0x70, 0x3, 0x2, 0x2, 0x2, 0x1dd, 0x1de, 0x7, 0x31,
0x1de, 0x1df, 0x7, 0x6f, 0x2, 0x2, 0x1df, 0x1e0, 0x7, 0x2, 0x2, 0x1de, 0x72, 0x3, 0x2, 0x2, 0x2, 0x1df,
0x63, 0x2, 0x2, 0x1e0, 0x1e1, 0x7, 0x7a, 0x2, 0x2, 0x1e0, 0x7, 0x27, 0x2, 0x2, 0x1e0, 0x74, 0x3, 0x2,
0x1e1, 0x7a, 0x3, 0x2, 0x2, 0x2, 0x1e2, 0x1e3, 0x7, 0x2, 0x2, 0x1e1, 0x1e2, 0x7, 0x7e, 0x2, 0x2, 0x1e2,
0x6f, 0x2, 0x2, 0x1e3, 0x1e4, 0x7, 0x6b, 0x2, 0x2, 0x76, 0x3, 0x2, 0x2, 0x2, 0x1e3, 0x1e4, 0x7, 0x28,
0x1e4, 0x1e5, 0x7, 0x70, 0x2, 0x2, 0x1e5, 0x7c, 0x3, 0x2, 0x2, 0x1e4, 0x78, 0x3, 0x2, 0x2, 0x2, 0x1e5,
0x2, 0x2, 0x2, 0x1e6, 0x1e7, 0x7, 0x23, 0x2, 0x2, 0x1e6, 0x7, 0x80, 0x2, 0x2, 0x1e6, 0x7a, 0x3, 0x2,
0x1e7, 0x1e8, 0x7, 0x3f, 0x2, 0x2, 0x1e8, 0x7e, 0x3, 0x2, 0x2, 0x1e7, 0x1e8, 0x7, 0x6f, 0x2, 0x2, 0x1e8,
0x2, 0x2, 0x2, 0x1e9, 0x1ea, 0x7, 0x3e, 0x2, 0x2, 0x1e9, 0x7, 0x63, 0x2, 0x2, 0x1e9, 0x1ea, 0x7, 0x7a,
0x1ea, 0x80, 0x3, 0x2, 0x2, 0x2, 0x1eb, 0x1ec, 0x7, 0x2, 0x2, 0x1ea, 0x7c, 0x3, 0x2, 0x2, 0x2, 0x1eb,
0x3e, 0x2, 0x2, 0x1ec, 0x1ed, 0x7, 0x3f, 0x2, 0x2, 0x1ec, 0x7, 0x6f, 0x2, 0x2, 0x1ec, 0x1ed, 0x7, 0x6b,
0x1ed, 0x82, 0x3, 0x2, 0x2, 0x2, 0x1ee, 0x1ef, 0x7, 0x2, 0x2, 0x1ed, 0x1ee, 0x7, 0x70, 0x2, 0x2, 0x1ee,
0x40, 0x2, 0x2, 0x1ef, 0x84, 0x3, 0x2, 0x2, 0x2, 0x7e, 0x3, 0x2, 0x2, 0x2, 0x1ef, 0x1f0, 0x7, 0x23,
0x1f0, 0x1f1, 0x7, 0x40, 0x2, 0x2, 0x1f1, 0x1f2, 0x7, 0x2, 0x2, 0x1f0, 0x1f1, 0x7, 0x3f, 0x2, 0x2, 0x1f1,
0x3f, 0x2, 0x2, 0x1f2, 0x86, 0x3, 0x2, 0x2, 0x2, 0x80, 0x3, 0x2, 0x2, 0x2, 0x1f2, 0x1f3, 0x7, 0x3e,
0x1f3, 0x1f4, 0x7, 0x3e, 0x2, 0x2, 0x1f4, 0x1f5, 0x7, 0x2, 0x2, 0x1f3, 0x82, 0x3, 0x2, 0x2, 0x2, 0x1f4,
0x3e, 0x2, 0x2, 0x1f5, 0x88, 0x3, 0x2, 0x2, 0x2, 0x1f5, 0x7, 0x3e, 0x2, 0x2, 0x1f5, 0x1f6, 0x7, 0x3f,
0x1f6, 0x1f7, 0x7, 0x40, 0x2, 0x2, 0x1f7, 0x1f8, 0x7, 0x2, 0x2, 0x1f6, 0x84, 0x3, 0x2, 0x2, 0x2, 0x1f7,
0x40, 0x2, 0x2, 0x1f8, 0x8a, 0x3, 0x2, 0x2, 0x2, 0x1f8, 0x7, 0x40, 0x2, 0x2, 0x1f8, 0x86, 0x3, 0x2,
0x1f9, 0x1fa, 0x7, 0x40, 0x2, 0x2, 0x1fa, 0x1fb, 0x7, 0x2, 0x2, 0x1f9, 0x1fa, 0x7, 0x40, 0x2, 0x2, 0x1fa,
0x40, 0x2, 0x2, 0x1fb, 0x1fc, 0x7, 0x40, 0x2, 0x2, 0x1fb, 0x7, 0x3f, 0x2, 0x2, 0x1fb, 0x88, 0x3, 0x2,
0x1fc, 0x8c, 0x3, 0x2, 0x2, 0x2, 0x1fd, 0x1fe, 0x7, 0x2, 0x2, 0x1fc, 0x1fd, 0x7, 0x3e, 0x2, 0x2, 0x1fd,
0x30, 0x2, 0x2, 0x1fe, 0x1ff, 0x7, 0x30, 0x2, 0x2, 0x1fe, 0x7, 0x3e, 0x2, 0x2, 0x1fe, 0x8a, 0x3, 0x2,
0x1ff, 0x200, 0x7, 0x30, 0x2, 0x2, 0x200, 0x8e, 0x3, 0x2, 0x2, 0x1ff, 0x200, 0x7, 0x40, 0x2, 0x2, 0x200,
0x2, 0x2, 0x2, 0x201, 0x204, 0x5, 0x67, 0x34, 0x2, 0x201, 0x7, 0x40, 0x2, 0x2, 0x201, 0x8c, 0x3, 0x2,
0x202, 0x204, 0x5, 0x7d, 0x3f, 0x2, 0x203, 0x201, 0x3, 0x2, 0x2, 0x202, 0x203, 0x7, 0x40, 0x2, 0x2, 0x203,
0x2, 0x2, 0x2, 0x203, 0x202, 0x3, 0x2, 0x2, 0x2, 0x204, 0x7, 0x40, 0x2, 0x2, 0x204, 0x205, 0x7, 0x40,
0x204, 0x90, 0x3, 0x2, 0x2, 0x2, 0x205, 0x206, 0x7, 0x2, 0x2, 0x205, 0x8e, 0x3, 0x2, 0x2, 0x2, 0x206,
0x2d, 0x2, 0x2, 0x206, 0x207, 0x7, 0x2d, 0x2, 0x2, 0x207, 0x7, 0x30, 0x2, 0x2, 0x207, 0x208, 0x7, 0x30,
0x207, 0x92, 0x3, 0x2, 0x2, 0x2, 0x208, 0x209, 0x7, 0x2, 0x2, 0x208, 0x209, 0x7, 0x30, 0x2, 0x2, 0x209,
0x2f, 0x2, 0x2, 0x209, 0x20a, 0x7, 0x2f, 0x2, 0x2, 0x90, 0x3, 0x2, 0x2, 0x2, 0x20a, 0x20d, 0x5, 0x69,
0x20a, 0x94, 0x3, 0x2, 0x2, 0x2, 0x20b, 0x20c, 0x7, 0x35, 0x2, 0x20b, 0x20d, 0x5, 0x7f, 0x40, 0x2, 0x20c,
0x23, 0x2, 0x2, 0x20c, 0x96, 0x3, 0x2, 0x2, 0x2, 0x20a, 0x3, 0x2, 0x2, 0x2, 0x20c, 0x20b, 0x3, 0x2,
0x20d, 0x212, 0x7, 0x24, 0x2, 0x2, 0x20e, 0x211, 0x5, 0x2, 0x2, 0x20d, 0x92, 0x3, 0x2, 0x2, 0x2, 0x20e,
0x99, 0x4d, 0x2, 0x20f, 0x211, 0xa, 0x2, 0x2, 0x2, 0x20f, 0x7, 0x2d, 0x2, 0x2, 0x20f, 0x210, 0x7, 0x2d,
0x210, 0x20e, 0x3, 0x2, 0x2, 0x2, 0x210, 0x20f, 0x3, 0x2, 0x2, 0x210, 0x94, 0x3, 0x2, 0x2, 0x2, 0x211,
0x2, 0x2, 0x2, 0x211, 0x214, 0x3, 0x2, 0x2, 0x2, 0x212, 0x7, 0x2f, 0x2, 0x2, 0x212, 0x213, 0x7, 0x2f,
0x212, 0x210, 0x3, 0x2, 0x2, 0x2, 0x212, 0x213, 0x3, 0x2, 0x2, 0x213, 0x96, 0x3, 0x2, 0x2, 0x2, 0x214,
0x2, 0x2, 0x2, 0x213, 0x215, 0x3, 0x2, 0x2, 0x2, 0x215, 0x7, 0x23, 0x2, 0x2, 0x215, 0x98, 0x3, 0x2,
0x214, 0x212, 0x3, 0x2, 0x2, 0x2, 0x215, 0x220, 0x7, 0x2, 0x2, 0x216, 0x21b, 0x7, 0x24, 0x2, 0x2, 0x217,
0x24, 0x2, 0x2, 0x216, 0x21b, 0x7, 0x29, 0x2, 0x2, 0x21a, 0x5, 0x9b, 0x4e, 0x2, 0x218, 0x21a, 0xa, 0x2,
0x217, 0x21a, 0x5, 0x99, 0x4d, 0x2, 0x218, 0x21a, 0xa, 0x2, 0x2, 0x219, 0x217, 0x3, 0x2, 0x2, 0x2, 0x219,
0x3, 0x2, 0x2, 0x219, 0x217, 0x3, 0x2, 0x2, 0x2, 0x218, 0x3, 0x2, 0x2, 0x2, 0x21a, 0x21d, 0x3, 0x2,
0x219, 0x218, 0x3, 0x2, 0x2, 0x2, 0x21a, 0x21d, 0x3, 0x2, 0x2, 0x21b, 0x219, 0x3, 0x2, 0x2, 0x2, 0x21b,
0x2, 0x2, 0x2, 0x21b, 0x219, 0x3, 0x2, 0x2, 0x2, 0x21c, 0x3, 0x2, 0x2, 0x2, 0x21c, 0x21e, 0x3, 0x2,
0x21b, 0x21c, 0x3, 0x2, 0x2, 0x2, 0x21c, 0x21e, 0x3, 0x2, 0x2, 0x21d, 0x21b, 0x3, 0x2, 0x2, 0x2, 0x21e,
0x2, 0x2, 0x2, 0x21d, 0x21b, 0x3, 0x2, 0x2, 0x2, 0x229, 0x7, 0x24, 0x2, 0x2, 0x21f, 0x224, 0x7, 0x29,
0x21e, 0x220, 0x7, 0x29, 0x2, 0x2, 0x21f, 0x20d, 0x3, 0x2, 0x2, 0x220, 0x223, 0x5, 0x9b, 0x4e, 0x2, 0x221,
0x2, 0x2, 0x2, 0x21f, 0x216, 0x3, 0x2, 0x2, 0x2, 0x223, 0xa, 0x3, 0x2, 0x2, 0x222, 0x220, 0x3, 0x2,
0x220, 0x98, 0x3, 0x2, 0x2, 0x2, 0x221, 0x222, 0x7, 0x2, 0x2, 0x222, 0x221, 0x3, 0x2, 0x2, 0x2, 0x223,
0x5e, 0x2, 0x2, 0x222, 0x223, 0x9, 0x4, 0x2, 0x2, 0x226, 0x3, 0x2, 0x2, 0x2, 0x224, 0x222, 0x3, 0x2,
0x223, 0x9a, 0x3, 0x2, 0x2, 0x2, 0x224, 0x228, 0x9, 0x2, 0x2, 0x224, 0x225, 0x3, 0x2, 0x2, 0x2, 0x225,
0x5, 0x2, 0x2, 0x225, 0x227, 0x9, 0x6, 0x2, 0x2, 0x227, 0x3, 0x2, 0x2, 0x2, 0x226, 0x224, 0x3, 0x2,
0x226, 0x225, 0x3, 0x2, 0x2, 0x2, 0x227, 0x22a, 0x3, 0x2, 0x2, 0x227, 0x229, 0x7, 0x29, 0x2, 0x2, 0x228,
0x2, 0x2, 0x2, 0x228, 0x226, 0x3, 0x2, 0x2, 0x2, 0x216, 0x3, 0x2, 0x2, 0x2, 0x228, 0x21f, 0x3, 0x2,
0x228, 0x229, 0x3, 0x2, 0x2, 0x2, 0x229, 0x9c, 0x3, 0x2, 0x2, 0x229, 0x9a, 0x3, 0x2, 0x2, 0x2, 0x22a,
0x2, 0x2, 0x2, 0x22a, 0x228, 0x3, 0x2, 0x2, 0x2, 0x22b, 0x7, 0x5e, 0x2, 0x2, 0x22b, 0x22c, 0x9, 0x4,
0x22b, 0x22d, 0x9, 0x7, 0x2, 0x2, 0x22c, 0x22b, 0x3, 0x2, 0x2, 0x22c, 0x9c, 0x3, 0x2, 0x2, 0x2, 0x22d,
0x2, 0x2, 0x2, 0x22d, 0x22e, 0x3, 0x2, 0x2, 0x2, 0x231, 0x9, 0x5, 0x2, 0x2, 0x22e, 0x230, 0x9, 0x6,
0x22e, 0x22c, 0x3, 0x2, 0x2, 0x2, 0x22e, 0x22f, 0x3, 0x2, 0x2, 0x22f, 0x22e, 0x3, 0x2, 0x2, 0x2, 0x230,
0x2, 0x2, 0x2, 0x22f, 0x230, 0x3, 0x2, 0x2, 0x2, 0x233, 0x3, 0x2, 0x2, 0x2, 0x231, 0x22f, 0x3, 0x2,
0x230, 0x231, 0x8, 0x4f, 0x2, 0x2, 0x231, 0x9e, 0x3, 0x2, 0x2, 0x231, 0x232, 0x3, 0x2, 0x2, 0x2, 0x232,
0x2, 0x2, 0x2, 0x232, 0x233, 0x7, 0x31, 0x2, 0x2, 0x9e, 0x3, 0x2, 0x2, 0x2, 0x233, 0x231, 0x3, 0x2,
0x233, 0x234, 0x7, 0x2c, 0x2, 0x2, 0x234, 0x238, 0x3, 0x2, 0x2, 0x234, 0x236, 0x9, 0x7, 0x2, 0x2, 0x235,
0x2, 0x2, 0x2, 0x235, 0x237, 0xb, 0x2, 0x2, 0x2, 0x234, 0x3, 0x2, 0x2, 0x2, 0x236, 0x237, 0x3, 0x2,
0x236, 0x235, 0x3, 0x2, 0x2, 0x2, 0x237, 0x23a, 0x3, 0x2, 0x2, 0x237, 0x235, 0x3, 0x2, 0x2, 0x2, 0x237,
0x2, 0x2, 0x2, 0x238, 0x239, 0x3, 0x2, 0x2, 0x2, 0x238, 0x3, 0x2, 0x2, 0x2, 0x238, 0x239, 0x3, 0x2,
0x238, 0x236, 0x3, 0x2, 0x2, 0x2, 0x239, 0x23e, 0x3, 0x2, 0x2, 0x239, 0x23a, 0x8, 0x50, 0x2, 0x2, 0x23a,
0x2, 0x2, 0x2, 0x23a, 0x238, 0x3, 0x2, 0x2, 0x2, 0xa0, 0x3, 0x2, 0x2, 0x2, 0x23b, 0x23c, 0x7, 0x31,
0x23b, 0x23c, 0x7, 0x2c, 0x2, 0x2, 0x23c, 0x23f, 0x7, 0x2, 0x2, 0x23c, 0x23d, 0x7, 0x2c, 0x2, 0x2, 0x23d,
0x31, 0x2, 0x2, 0x23d, 0x23f, 0x7, 0x2, 0x2, 0x3, 0x241, 0x3, 0x2, 0x2, 0x2, 0x23e, 0x240, 0xb, 0x2,
0x23e, 0x23b, 0x3, 0x2, 0x2, 0x2, 0x23e, 0x23d, 0x3, 0x2, 0x2, 0x23f, 0x23e, 0x3, 0x2, 0x2, 0x2, 0x240,
0x2, 0x2, 0x2, 0x23f, 0x240, 0x3, 0x2, 0x2, 0x2, 0x243, 0x3, 0x2, 0x2, 0x2, 0x241, 0x242, 0x3, 0x2,
0x240, 0x241, 0x8, 0x50, 0x2, 0x2, 0x241, 0xa0, 0x3, 0x2, 0x2, 0x241, 0x23f, 0x3, 0x2, 0x2, 0x2, 0x242,
0x2, 0x2, 0x2, 0x242, 0x243, 0x7, 0x31, 0x2, 0x2, 0x247, 0x3, 0x2, 0x2, 0x2, 0x243, 0x241, 0x3, 0x2,
0x243, 0x244, 0x7, 0x31, 0x2, 0x2, 0x244, 0x248, 0x3, 0x2, 0x2, 0x244, 0x245, 0x7, 0x2c, 0x2, 0x2, 0x245,
0x2, 0x2, 0x2, 0x245, 0x247, 0xa, 0x8, 0x2, 0x2, 0x248, 0x7, 0x31, 0x2, 0x2, 0x246, 0x248, 0x7, 0x2,
0x246, 0x245, 0x3, 0x2, 0x2, 0x2, 0x247, 0x24a, 0x3, 0x2, 0x3, 0x247, 0x244, 0x3, 0x2, 0x2, 0x2, 0x247,
0x2, 0x2, 0x2, 0x248, 0x246, 0x3, 0x2, 0x2, 0x2, 0x246, 0x3, 0x2, 0x2, 0x2, 0x248, 0x249, 0x3, 0x2,
0x248, 0x249, 0x3, 0x2, 0x2, 0x2, 0x249, 0x24b, 0x3, 0x2, 0x2, 0x249, 0x24a, 0x8, 0x51, 0x2, 0x2, 0x24a,
0x2, 0x2, 0x2, 0x24a, 0x248, 0x3, 0x2, 0x2, 0x2, 0xa2, 0x3, 0x2, 0x2, 0x2, 0x24b, 0x24c, 0x7, 0x31,
0x24b, 0x24c, 0x8, 0x51, 0x2, 0x2, 0x24c, 0xa2, 0x3, 0x2, 0x2, 0x24c, 0x24d, 0x7, 0x31, 0x2, 0x2, 0x24d,
0x2, 0x2, 0x2, 0x24d, 0x24e, 0x9, 0x9, 0x2, 0x2, 0x251, 0x3, 0x2, 0x2, 0x2, 0x24e, 0x250, 0xa, 0x8,
0x24e, 0xa4, 0x3, 0x2, 0x2, 0x2, 0x24f, 0x258, 0x7, 0x2, 0x2, 0x24f, 0x24e, 0x3, 0x2, 0x2, 0x2, 0x250,
0x32, 0x2, 0x2, 0x250, 0x254, 0x9, 0xa, 0x2, 0x2, 0x253, 0x3, 0x2, 0x2, 0x2, 0x251, 0x24f, 0x3, 0x2,
0x251, 0x253, 0x5, 0xa3, 0x52, 0x2, 0x252, 0x251, 0x3, 0x2, 0x2, 0x251, 0x252, 0x3, 0x2, 0x2, 0x2, 0x252,
0x2, 0x2, 0x2, 0x253, 0x256, 0x3, 0x2, 0x2, 0x2, 0x254, 0x3, 0x2, 0x2, 0x2, 0x253, 0x251, 0x3, 0x2,
0x254, 0x252, 0x3, 0x2, 0x2, 0x2, 0x254, 0x255, 0x3, 0x2, 0x2, 0x254, 0x255, 0x8, 0x52, 0x2, 0x2, 0x255,
0x2, 0x2, 0x2, 0x255, 0x258, 0x3, 0x2, 0x2, 0x2, 0xa4, 0x3, 0x2, 0x2, 0x2, 0x256, 0x257, 0x9, 0x9,
0x256, 0x254, 0x3, 0x2, 0x2, 0x2, 0x257, 0x24f, 0x3, 0x2, 0x2, 0x257, 0xa6, 0x3, 0x2, 0x2, 0x2, 0x258,
0x2, 0x2, 0x2, 0x257, 0x250, 0x3, 0x2, 0x2, 0x2, 0x261, 0x7, 0x32, 0x2, 0x2, 0x259, 0x25d, 0x9, 0xa,
0x258, 0xa6, 0x3, 0x2, 0x2, 0x2, 0x259, 0x25b, 0x9, 0x2, 0x2, 0x25a, 0x25c, 0x5, 0xa5, 0x53, 0x2, 0x25b,
0xb, 0x2, 0x2, 0x25a, 0x25c, 0x9, 0xc, 0x2, 0x2, 0x25a, 0x3, 0x2, 0x2, 0x2, 0x25c, 0x25f, 0x3, 0x2,
0x25b, 0x25a, 0x3, 0x2, 0x2, 0x2, 0x25b, 0x25c, 0x3, 0x2, 0x2, 0x25d, 0x25b, 0x3, 0x2, 0x2, 0x2, 0x25d,
0x2, 0x2, 0x2, 0x25c, 0x25e, 0x3, 0x2, 0x2, 0x2, 0x25e, 0x3, 0x2, 0x2, 0x2, 0x25e, 0x261, 0x3, 0x2,
0x25d, 0x25f, 0x5, 0xa3, 0x52, 0x2, 0x25e, 0x25d, 0x3, 0x2, 0x2, 0x25f, 0x25d, 0x3, 0x2, 0x2, 0x2, 0x260,
0x2, 0x2, 0x2, 0x25f, 0x260, 0x3, 0x2, 0x2, 0x2, 0x258, 0x3, 0x2, 0x2, 0x2, 0x260, 0x259, 0x3, 0x2,
0x260, 0x25e, 0x3, 0x2, 0x2, 0x2, 0x260, 0x261, 0x3, 0x2, 0x2, 0x261, 0xa8, 0x3, 0x2, 0x2, 0x2, 0x262,
0x2, 0x2, 0x2, 0x261, 0xa8, 0x3, 0x2, 0x2, 0x2, 0x264, 0x9, 0xb, 0x2, 0x2, 0x263, 0x265, 0x9, 0xc,
0x262, 0x264, 0x5, 0x6b, 0x36, 0x2, 0x263, 0x262, 0x3, 0x2, 0x2, 0x264, 0x263, 0x3, 0x2, 0x2, 0x2, 0x264,
0x2, 0x2, 0x2, 0x263, 0x264, 0x3, 0x2, 0x2, 0x2, 0x265, 0x3, 0x2, 0x2, 0x2, 0x265, 0x267, 0x3, 0x2,
0x264, 0x265, 0x3, 0x2, 0x2, 0x2, 0x265, 0x266, 0x5, 0x2, 0x2, 0x266, 0x268, 0x5, 0xa5, 0x53, 0x2, 0x267,
0xa5, 0x53, 0x2, 0x266, 0x26a, 0x7, 0x30, 0x2, 0x2, 0x266, 0x3, 0x2, 0x2, 0x2, 0x268, 0x269, 0x3, 0x2,
0x267, 0x269, 0x5, 0xa3, 0x52, 0x2, 0x268, 0x267, 0x3, 0x2, 0x2, 0x269, 0x267, 0x3, 0x2, 0x2, 0x2, 0x269,
0x2, 0x2, 0x2, 0x269, 0x26c, 0x3, 0x2, 0x2, 0x2, 0x26a, 0x3, 0x2, 0x2, 0x2, 0x26a, 0xaa, 0x3, 0x2,
0x26a, 0x268, 0x3, 0x2, 0x2, 0x2, 0x26a, 0x26b, 0x3, 0x2, 0x2, 0x26b, 0x26d, 0x5, 0x6d, 0x37, 0x2, 0x26c,
0x2, 0x2, 0x2, 0x26b, 0x26e, 0x3, 0x2, 0x2, 0x2, 0x26b, 0x3, 0x2, 0x2, 0x2, 0x26c, 0x26d, 0x3, 0x2,
0x26c, 0x26a, 0x3, 0x2, 0x2, 0x2, 0x26d, 0x26f, 0x5, 0x2, 0x2, 0x26d, 0x26e, 0x3, 0x2, 0x2, 0x2, 0x26e,
0xa7, 0x54, 0x2, 0x26e, 0x26d, 0x3, 0x2, 0x2, 0x2, 0x26f, 0x5, 0xa7, 0x54, 0x2, 0x26f, 0x273, 0x7, 0x30,
0x26e, 0x26f, 0x3, 0x2, 0x2, 0x2, 0x26f, 0x28f, 0x3, 0x2, 0x2, 0x270, 0x272, 0x5, 0xa5, 0x53, 0x2, 0x271,
0x2, 0x2, 0x2, 0x270, 0x272, 0x5, 0x6b, 0x36, 0x2, 0x270, 0x3, 0x2, 0x2, 0x2, 0x272, 0x275, 0x3, 0x2,
0x271, 0x270, 0x3, 0x2, 0x2, 0x2, 0x271, 0x272, 0x3, 0x2, 0x2, 0x273, 0x271, 0x3, 0x2, 0x2, 0x2, 0x273,
0x2, 0x2, 0x2, 0x272, 0x273, 0x3, 0x2, 0x2, 0x2, 0x274, 0x3, 0x2, 0x2, 0x2, 0x274, 0x277, 0x3, 0x2,
0x273, 0x275, 0x7, 0x30, 0x2, 0x2, 0x274, 0x276, 0x5, 0x2, 0x2, 0x275, 0x273, 0x3, 0x2, 0x2, 0x2, 0x276,
0xa3, 0x52, 0x2, 0x275, 0x274, 0x3, 0x2, 0x2, 0x2, 0x278, 0x5, 0xa9, 0x55, 0x2, 0x277, 0x276, 0x3, 0x2,
0x276, 0x277, 0x3, 0x2, 0x2, 0x2, 0x277, 0x275, 0x3, 0x2, 0x2, 0x277, 0x278, 0x3, 0x2, 0x2, 0x2, 0x278,
0x2, 0x2, 0x2, 0x277, 0x278, 0x3, 0x2, 0x2, 0x2, 0x298, 0x3, 0x2, 0x2, 0x2, 0x279, 0x27b, 0x5, 0x6d,
0x278, 0x27a, 0x3, 0x2, 0x2, 0x2, 0x279, 0x27b, 0x5, 0x37, 0x2, 0x27a, 0x279, 0x3, 0x2, 0x2, 0x2, 0x27a,
0xa7, 0x54, 0x2, 0x27a, 0x279, 0x3, 0x2, 0x2, 0x2, 0x27b, 0x3, 0x2, 0x2, 0x2, 0x27b, 0x27c, 0x3, 0x2,
0x27a, 0x27b, 0x3, 0x2, 0x2, 0x2, 0x27b, 0x28f, 0x3, 0x2, 0x2, 0x27c, 0x27e, 0x7, 0x30, 0x2, 0x2, 0x27d,
0x2, 0x2, 0x2, 0x27c, 0x27e, 0x5, 0x6b, 0x36, 0x2, 0x27f, 0x5, 0xa5, 0x53, 0x2, 0x27e, 0x27d, 0x3, 0x2,
0x27d, 0x27c, 0x3, 0x2, 0x2, 0x2, 0x27d, 0x27e, 0x3, 0x2, 0x2, 0x27f, 0x280, 0x3, 0x2, 0x2, 0x2, 0x280,
0x2, 0x2, 0x2, 0x27e, 0x27f, 0x3, 0x2, 0x2, 0x2, 0x27e, 0x3, 0x2, 0x2, 0x2, 0x280, 0x281, 0x3, 0x2,
0x27f, 0x281, 0x5, 0xa5, 0x53, 0x2, 0x280, 0x282, 0x5, 0x2, 0x2, 0x281, 0x283, 0x3, 0x2, 0x2, 0x2, 0x282,
0xa7, 0x54, 0x2, 0x281, 0x280, 0x3, 0x2, 0x2, 0x2, 0x284, 0x5, 0xa9, 0x55, 0x2, 0x283, 0x282, 0x3, 0x2,
0x281, 0x282, 0x3, 0x2, 0x2, 0x2, 0x282, 0x28f, 0x3, 0x2, 0x2, 0x283, 0x284, 0x3, 0x2, 0x2, 0x2, 0x284,
0x2, 0x2, 0x2, 0x283, 0x285, 0x5, 0x6b, 0x36, 0x2, 0x298, 0x3, 0x2, 0x2, 0x2, 0x285, 0x287, 0x5, 0x6d,
0x284, 0x283, 0x3, 0x2, 0x2, 0x2, 0x284, 0x285, 0x3, 0x37, 0x2, 0x286, 0x285, 0x3, 0x2, 0x2, 0x2, 0x286,
0x2, 0x2, 0x2, 0x285, 0x286, 0x3, 0x2, 0x2, 0x2, 0x287, 0x3, 0x2, 0x2, 0x2, 0x287, 0x288, 0x3, 0x2,
0x286, 0x287, 0x7, 0x32, 0x2, 0x2, 0x287, 0x288, 0x7, 0x2, 0x2, 0x288, 0x28a, 0x5, 0xa7, 0x54, 0x2, 0x289,
0x7a, 0x2, 0x2, 0x288, 0x28a, 0x3, 0x2, 0x2, 0x2, 0x28b, 0x5, 0xa9, 0x55, 0x2, 0x28a, 0x289, 0x3, 0x2,
0x289, 0x28b, 0x9, 0xd, 0x2, 0x2, 0x28a, 0x289, 0x3, 0x2, 0x2, 0x28a, 0x28b, 0x3, 0x2, 0x2, 0x2, 0x28b,
0x2, 0x2, 0x2, 0x28b, 0x28c, 0x3, 0x2, 0x2, 0x2, 0x298, 0x3, 0x2, 0x2, 0x2, 0x28c, 0x28e, 0x5, 0x6d,
0x28c, 0x28a, 0x3, 0x2, 0x2, 0x2, 0x28c, 0x28d, 0x3, 0x37, 0x2, 0x28d, 0x28c, 0x3, 0x2, 0x2, 0x2, 0x28d,
0x2, 0x2, 0x2, 0x28d, 0x28f, 0x3, 0x2, 0x2, 0x2, 0x28e, 0x3, 0x2, 0x2, 0x2, 0x28e, 0x28f, 0x3, 0x2,
0x28e, 0x263, 0x3, 0x2, 0x2, 0x2, 0x28e, 0x271, 0x3, 0x2, 0x2, 0x28f, 0x290, 0x7, 0x32, 0x2, 0x2, 0x290,
0x2, 0x2, 0x2, 0x28e, 0x27d, 0x3, 0x2, 0x2, 0x2, 0x291, 0x7, 0x7a, 0x2, 0x2, 0x291, 0x293, 0x3, 0x2,
0x28e, 0x284, 0x3, 0x2, 0x2, 0x2, 0x28f, 0xaa, 0x3, 0x2, 0x2, 0x292, 0x294, 0x9, 0xd, 0x2, 0x2, 0x293,
0x2, 0x2, 0x2, 0x1e, 0x2, 0x1c9, 0x203, 0x210, 0x212, 0x292, 0x3, 0x2, 0x2, 0x2, 0x294, 0x295, 0x3, 0x2,
0x219, 0x21b, 0x21f, 0x228, 0x22e, 0x238, 0x23e, 0x248, 0x254, 0x2, 0x2, 0x295, 0x293, 0x3, 0x2, 0x2, 0x2, 0x295,
0x257, 0x25b, 0x260, 0x263, 0x26a, 0x26e, 0x271, 0x277, 0x27a, 0x296, 0x3, 0x2, 0x2, 0x2, 0x296, 0x298, 0x3, 0x2,
0x27d, 0x281, 0x284, 0x28c, 0x28e, 0x3, 0x2, 0x3, 0x2, 0x2, 0x2, 0x297, 0x26c, 0x3, 0x2, 0x2, 0x2, 0x297,
0x27a, 0x3, 0x2, 0x2, 0x2, 0x297, 0x286, 0x3, 0x2,
0x2, 0x2, 0x297, 0x28d, 0x3, 0x2, 0x2, 0x2, 0x298,
0xac, 0x3, 0x2, 0x2, 0x2, 0x1e, 0x2, 0x1d2, 0x20c,
0x219, 0x21b, 0x222, 0x224, 0x228, 0x231, 0x237, 0x241, 0x247,
0x251, 0x25d, 0x260, 0x264, 0x269, 0x26c, 0x273, 0x277, 0x27a,
0x280, 0x283, 0x286, 0x28a, 0x28d, 0x295, 0x297, 0x3, 0x2,
0x3, 0x2,
}; };
atn::ATNDeserializer deserializer; atn::ATNDeserializer deserializer;
......
...@@ -33,66 +33,67 @@ class TorqueLexer : public antlr4::Lexer { ...@@ -33,66 +33,67 @@ class TorqueLexer : public antlr4::Lexer {
T__17 = 18, T__17 = 18,
T__18 = 19, T__18 = 19,
T__19 = 20, T__19 = 20,
MACRO = 21, T__20 = 21,
BUILTIN = 22, MACRO = 22,
RUNTIME = 23, BUILTIN = 23,
MODULE = 24, RUNTIME = 24,
JAVASCRIPT = 25, MODULE = 25,
DEFERRED = 26, JAVASCRIPT = 26,
IF = 27, DEFERRED = 27,
FOR = 28, IF = 28,
WHILE = 29, FOR = 29,
RETURN = 30, WHILE = 30,
CONSTEXPR = 31, RETURN = 31,
CONTINUE = 32, CONSTEXPR = 32,
BREAK = 33, CONTINUE = 33,
GOTO = 34, BREAK = 34,
OTHERWISE = 35, GOTO = 35,
TRY = 36, OTHERWISE = 36,
LABEL = 37, TRY = 37,
LABELS = 38, LABEL = 38,
TAIL = 39, LABELS = 39,
ISNT = 40, TAIL = 40,
IS = 41, ISNT = 41,
LET = 42, IS = 42,
CONST = 43, LET = 43,
EXTERN = 44, CONST = 44,
ASSERT_TOKEN = 45, EXTERN = 45,
CHECK_TOKEN = 46, ASSERT_TOKEN = 46,
UNREACHABLE_TOKEN = 47, CHECK_TOKEN = 47,
DEBUG_TOKEN = 48, UNREACHABLE_TOKEN = 48,
ASSIGNMENT = 49, DEBUG_TOKEN = 49,
ASSIGNMENT_OPERATOR = 50, ASSIGNMENT = 50,
EQUAL = 51, ASSIGNMENT_OPERATOR = 51,
PLUS = 52, EQUAL = 52,
MINUS = 53, PLUS = 53,
MULTIPLY = 54, MINUS = 54,
DIVIDE = 55, MULTIPLY = 55,
MODULO = 56, DIVIDE = 56,
BIT_OR = 57, MODULO = 57,
BIT_AND = 58, BIT_OR = 58,
BIT_NOT = 59, BIT_AND = 59,
MAX = 60, BIT_NOT = 60,
MIN = 61, MAX = 61,
NOT_EQUAL = 62, MIN = 62,
LESS_THAN = 63, NOT_EQUAL = 63,
LESS_THAN_EQUAL = 64, LESS_THAN = 64,
GREATER_THAN = 65, LESS_THAN_EQUAL = 65,
GREATER_THAN_EQUAL = 66, GREATER_THAN = 66,
SHIFT_LEFT = 67, GREATER_THAN_EQUAL = 67,
SHIFT_RIGHT = 68, SHIFT_LEFT = 68,
SHIFT_RIGHT_ARITHMETIC = 69, SHIFT_RIGHT = 69,
VARARGS = 70, SHIFT_RIGHT_ARITHMETIC = 70,
EQUALITY_OPERATOR = 71, VARARGS = 71,
INCREMENT = 72, EQUALITY_OPERATOR = 72,
DECREMENT = 73, INCREMENT = 73,
NOT = 74, DECREMENT = 74,
STRING_LITERAL = 75, NOT = 75,
IDENTIFIER = 76, STRING_LITERAL = 76,
WS = 77, IDENTIFIER = 77,
BLOCK_COMMENT = 78, WS = 78,
LINE_COMMENT = 79, BLOCK_COMMENT = 79,
DECIMAL_LITERAL = 80 LINE_COMMENT = 80,
DECIMAL_LITERAL = 81
}; };
explicit TorqueLexer(antlr4::CharStream* input); explicit TorqueLexer(antlr4::CharStream* input);
......
token literal names:
null
'('
')'
'=>'
','
':'
'type'
'?'
'||'
'&&'
'.'
'['
']'
'{'
'}'
';'
'of'
'else'
'extends'
'generates'
'operator'
'struct'
'macro'
'builtin'
'runtime'
'module'
'javascript'
'deferred'
'if'
'for'
'while'
'return'
'constexpr'
'continue'
'break'
'goto'
'otherwise'
'try'
'label'
'labels'
'tail'
'isnt'
'is'
'let'
'const'
'extern'
'assert'
'check'
'unreachable'
'debug'
'='
null
'=='
'+'
'-'
'*'
'/'
'%'
'|'
'&'
'~'
'max'
'min'
'!='
'<'
'<='
'>'
'>='
'<<'
'>>'
'>>>'
'...'
null
'++'
'--'
'!'
null
null
null
null
null
null
token symbolic names:
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
null
MACRO
BUILTIN
RUNTIME
MODULE
JAVASCRIPT
DEFERRED
IF
FOR
WHILE
RETURN
CONSTEXPR
CONTINUE
BREAK
GOTO
OTHERWISE
TRY
LABEL
LABELS
TAIL
ISNT
IS
LET
CONST
EXTERN
ASSERT_TOKEN
CHECK_TOKEN
UNREACHABLE_TOKEN
DEBUG_TOKEN
ASSIGNMENT
ASSIGNMENT_OPERATOR
EQUAL
PLUS
MINUS
MULTIPLY
DIVIDE
MODULO
BIT_OR
BIT_AND
BIT_NOT
MAX
MIN
NOT_EQUAL
LESS_THAN
LESS_THAN_EQUAL
GREATER_THAN
GREATER_THAN_EQUAL
SHIFT_LEFT
SHIFT_RIGHT
SHIFT_RIGHT_ARITHMETIC
VARARGS
EQUALITY_OPERATOR
INCREMENT
DECREMENT
NOT
STRING_LITERAL
IDENTIFIER
WS
BLOCK_COMMENT
LINE_COMMENT
DECIMAL_LITERAL
rule names:
T__0
T__1
T__2
T__3
T__4
T__5
T__6
T__7
T__8
T__9
T__10
T__11
T__12
T__13
T__14
T__15
T__16
T__17
T__18
T__19
T__20
MACRO
BUILTIN
RUNTIME
MODULE
JAVASCRIPT
DEFERRED
IF
FOR
WHILE
RETURN
CONSTEXPR
CONTINUE
BREAK
GOTO
OTHERWISE
TRY
LABEL
LABELS
TAIL
ISNT
IS
LET
CONST
EXTERN
ASSERT_TOKEN
CHECK_TOKEN
UNREACHABLE_TOKEN
DEBUG_TOKEN
ASSIGNMENT
ASSIGNMENT_OPERATOR
EQUAL
PLUS
MINUS
MULTIPLY
DIVIDE
MODULO
BIT_OR
BIT_AND
BIT_NOT
MAX
MIN
NOT_EQUAL
LESS_THAN
LESS_THAN_EQUAL
GREATER_THAN
GREATER_THAN_EQUAL
SHIFT_LEFT
SHIFT_RIGHT
SHIFT_RIGHT_ARITHMETIC
VARARGS
EQUALITY_OPERATOR
INCREMENT
DECREMENT
NOT
STRING_LITERAL
ESCAPE
IDENTIFIER
WS
BLOCK_COMMENT
LINE_COMMENT
DECIMAL_DIGIT
DECIMAL_INTEGER_LITERAL
EXPONENT_PART
DECIMAL_LITERAL
channel names:
DEFAULT_TOKEN_CHANNEL
HIDDEN
mode names:
DEFAULT_MODE
atn:
[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 83, 665, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 4, 66, 9, 66, 4, 67, 9, 67, 4, 68, 9, 68, 4, 69, 9, 69, 4, 70, 9, 70, 4, 71, 9, 71, 4, 72, 9, 72, 4, 73, 9, 73, 4, 74, 9, 74, 4, 75, 9, 75, 4, 76, 9, 76, 4, 77, 9, 77, 4, 78, 9, 78, 4, 79, 9, 79, 4, 80, 9, 80, 4, 81, 9, 81, 4, 82, 9, 82, 4, 83, 9, 83, 4, 84, 9, 84, 4, 85, 9, 85, 4, 86, 9, 86, 3, 2, 3, 2, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 12, 3, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 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, 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, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 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, 27, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 3, 38, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 39, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 40, 3, 41, 3, 41, 3, 41, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 50, 3, 51, 3, 51, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 3, 52, 5, 52, 467, 10, 52, 3, 53, 3, 53, 3, 53, 3, 54, 3, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 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, 64, 3, 65, 3, 65, 3, 66, 3, 66, 3, 66, 3, 67, 3, 67, 3, 68, 3, 68, 3, 68, 3, 69, 3, 69, 3, 69, 3, 70, 3, 70, 3, 70, 3, 71, 3, 71, 3, 71, 3, 71, 3, 72, 3, 72, 3, 72, 3, 72, 3, 73, 3, 73, 5, 73, 525, 10, 73, 3, 74, 3, 74, 3, 74, 3, 75, 3, 75, 3, 75, 3, 76, 3, 76, 3, 77, 3, 77, 3, 77, 7, 77, 538, 10, 77, 12, 77, 14, 77, 541, 11, 77, 3, 77, 3, 77, 3, 77, 3, 77, 7, 77, 547, 10, 77, 12, 77, 14, 77, 550, 11, 77, 3, 77, 5, 77, 553, 10, 77, 3, 78, 3, 78, 3, 78, 3, 79, 3, 79, 7, 79, 560, 10, 79, 12, 79, 14, 79, 563, 11, 79, 3, 80, 6, 80, 566, 10, 80, 13, 80, 14, 80, 567, 3, 80, 3, 80, 3, 81, 3, 81, 3, 81, 3, 81, 7, 81, 576, 10, 81, 12, 81, 14, 81, 579, 11, 81, 3, 81, 3, 81, 3, 81, 5, 81, 584, 10, 81, 3, 81, 3, 81, 3, 82, 3, 82, 3, 82, 3, 82, 7, 82, 592, 10, 82, 12, 82, 14, 82, 595, 11, 82, 3, 82, 3, 82, 3, 83, 3, 83, 3, 84, 3, 84, 3, 84, 7, 84, 604, 10, 84, 12, 84, 14, 84, 607, 11, 84, 5, 84, 609, 10, 84, 3, 85, 3, 85, 5, 85, 613, 10, 85, 3, 85, 6, 85, 616, 10, 85, 13, 85, 14, 85, 617, 3, 86, 5, 86, 621, 10, 86, 3, 86, 3, 86, 3, 86, 7, 86, 626, 10, 86, 12, 86, 14, 86, 629, 11, 86, 3, 86, 5, 86, 632, 10, 86, 3, 86, 5, 86, 635, 10, 86, 3, 86, 3, 86, 6, 86, 639, 10, 86, 13, 86, 14, 86, 640, 3, 86, 5, 86, 644, 10, 86, 3, 86, 5, 86, 647, 10, 86, 3, 86, 3, 86, 5, 86, 651, 10, 86, 3, 86, 5, 86, 654, 10, 86, 3, 86, 3, 86, 3, 86, 3, 86, 6, 86, 660, 10, 86, 13, 86, 14, 86, 661, 5, 86, 664, 10, 86, 3, 577, 2, 87, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 55, 109, 56, 111, 57, 113, 58, 115, 59, 117, 60, 119, 61, 121, 62, 123, 63, 125, 64, 127, 65, 129, 66, 131, 67, 133, 68, 135, 69, 137, 70, 139, 71, 141, 72, 143, 73, 145, 74, 147, 75, 149, 76, 151, 77, 153, 78, 155, 2, 157, 79, 159, 80, 161, 81, 163, 82, 165, 2, 167, 2, 169, 2, 171, 83, 3, 2, 14, 6, 2, 12, 12, 15, 15, 36, 36, 94, 94, 6, 2, 12, 12, 15, 15, 41, 41, 94, 94, 7, 2, 36, 36, 41, 41, 94, 94, 112, 112, 116, 116, 4, 2, 67, 92, 99, 124, 6, 2, 50, 59, 67, 92, 97, 97, 99, 124, 5, 2, 11, 12, 14, 15, 34, 34, 4, 2, 12, 12, 15, 15, 3, 2, 50, 59, 3, 2, 51, 59, 4, 2, 71, 71, 103, 103, 4, 2, 45, 45, 47, 47, 5, 2, 50, 59, 67, 72, 99, 104, 2, 698, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 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, 29, 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, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 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, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 107, 3, 2, 2, 2, 2, 109, 3, 2, 2, 2, 2, 111, 3, 2, 2, 2, 2, 113, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 2, 129, 3, 2, 2, 2, 2, 131, 3, 2, 2, 2, 2, 133, 3, 2, 2, 2, 2, 135, 3, 2, 2, 2, 2, 137, 3, 2, 2, 2, 2, 139, 3, 2, 2, 2, 2, 141, 3, 2, 2, 2, 2, 143, 3, 2, 2, 2, 2, 145, 3, 2, 2, 2, 2, 147, 3, 2, 2, 2, 2, 149, 3, 2, 2, 2, 2, 151, 3, 2, 2, 2, 2, 153, 3, 2, 2, 2, 2, 157, 3, 2, 2, 2, 2, 159, 3, 2, 2, 2, 2, 161, 3, 2, 2, 2, 2, 163, 3, 2, 2, 2, 2, 171, 3, 2, 2, 2, 3, 173, 3, 2, 2, 2, 5, 175, 3, 2, 2, 2, 7, 177, 3, 2, 2, 2, 9, 180, 3, 2, 2, 2, 11, 182, 3, 2, 2, 2, 13, 184, 3, 2, 2, 2, 15, 189, 3, 2, 2, 2, 17, 191, 3, 2, 2, 2, 19, 194, 3, 2, 2, 2, 21, 197, 3, 2, 2, 2, 23, 199, 3, 2, 2, 2, 25, 201, 3, 2, 2, 2, 27, 203, 3, 2, 2, 2, 29, 205, 3, 2, 2, 2, 31, 207, 3, 2, 2, 2, 33, 209, 3, 2, 2, 2, 35, 212, 3, 2, 2, 2, 37, 217, 3, 2, 2, 2, 39, 225, 3, 2, 2, 2, 41, 235, 3, 2, 2, 2, 43, 244, 3, 2, 2, 2, 45, 251, 3, 2, 2, 2, 47, 257, 3, 2, 2, 2, 49, 265, 3, 2, 2, 2, 51, 273, 3, 2, 2, 2, 53, 280, 3, 2, 2, 2, 55, 291, 3, 2, 2, 2, 57, 300, 3, 2, 2, 2, 59, 303, 3, 2, 2, 2, 61, 307, 3, 2, 2, 2, 63, 313, 3, 2, 2, 2, 65, 320, 3, 2, 2, 2, 67, 330, 3, 2, 2, 2, 69, 339, 3, 2, 2, 2, 71, 345, 3, 2, 2, 2, 73, 350, 3, 2, 2, 2, 75, 360, 3, 2, 2, 2, 77, 364, 3, 2, 2, 2, 79, 370, 3, 2, 2, 2, 81, 377, 3, 2, 2, 2, 83, 382, 3, 2, 2, 2, 85, 387, 3, 2, 2, 2, 87, 390, 3, 2, 2, 2, 89, 394, 3, 2, 2, 2, 91, 400, 3, 2, 2, 2, 93, 407, 3, 2, 2, 2, 95, 414, 3, 2, 2, 2, 97, 420, 3, 2, 2, 2, 99, 432, 3, 2, 2, 2, 101, 438, 3, 2, 2, 2, 103, 466, 3, 2, 2, 2, 105, 468, 3, 2, 2, 2, 107, 471, 3, 2, 2, 2, 109, 473, 3, 2, 2, 2, 111, 475, 3, 2, 2, 2, 113, 477, 3, 2, 2, 2, 115, 479, 3, 2, 2, 2, 117, 481, 3, 2, 2, 2, 119, 483, 3, 2, 2, 2, 121, 485, 3, 2, 2, 2, 123, 487, 3, 2, 2, 2, 125, 491, 3, 2, 2, 2, 127, 495, 3, 2, 2, 2, 129, 498, 3, 2, 2, 2, 131, 500, 3, 2, 2, 2, 133, 503, 3, 2, 2, 2, 135, 505, 3, 2, 2, 2, 137, 508, 3, 2, 2, 2, 139, 511, 3, 2, 2, 2, 141, 514, 3, 2, 2, 2, 143, 518, 3, 2, 2, 2, 145, 524, 3, 2, 2, 2, 147, 526, 3, 2, 2, 2, 149, 529, 3, 2, 2, 2, 151, 532, 3, 2, 2, 2, 153, 552, 3, 2, 2, 2, 155, 554, 3, 2, 2, 2, 157, 557, 3, 2, 2, 2, 159, 565, 3, 2, 2, 2, 161, 571, 3, 2, 2, 2, 163, 587, 3, 2, 2, 2, 165, 598, 3, 2, 2, 2, 167, 608, 3, 2, 2, 2, 169, 610, 3, 2, 2, 2, 171, 663, 3, 2, 2, 2, 173, 174, 7, 42, 2, 2, 174, 4, 3, 2, 2, 2, 175, 176, 7, 43, 2, 2, 176, 6, 3, 2, 2, 2, 177, 178, 7, 63, 2, 2, 178, 179, 7, 64, 2, 2, 179, 8, 3, 2, 2, 2, 180, 181, 7, 46, 2, 2, 181, 10, 3, 2, 2, 2, 182, 183, 7, 60, 2, 2, 183, 12, 3, 2, 2, 2, 184, 185, 7, 118, 2, 2, 185, 186, 7, 123, 2, 2, 186, 187, 7, 114, 2, 2, 187, 188, 7, 103, 2, 2, 188, 14, 3, 2, 2, 2, 189, 190, 7, 65, 2, 2, 190, 16, 3, 2, 2, 2, 191, 192, 7, 126, 2, 2, 192, 193, 7, 126, 2, 2, 193, 18, 3, 2, 2, 2, 194, 195, 7, 40, 2, 2, 195, 196, 7, 40, 2, 2, 196, 20, 3, 2, 2, 2, 197, 198, 7, 48, 2, 2, 198, 22, 3, 2, 2, 2, 199, 200, 7, 93, 2, 2, 200, 24, 3, 2, 2, 2, 201, 202, 7, 95, 2, 2, 202, 26, 3, 2, 2, 2, 203, 204, 7, 125, 2, 2, 204, 28, 3, 2, 2, 2, 205, 206, 7, 127, 2, 2, 206, 30, 3, 2, 2, 2, 207, 208, 7, 61, 2, 2, 208, 32, 3, 2, 2, 2, 209, 210, 7, 113, 2, 2, 210, 211, 7, 104, 2, 2, 211, 34, 3, 2, 2, 2, 212, 213, 7, 103, 2, 2, 213, 214, 7, 110, 2, 2, 214, 215, 7, 117, 2, 2, 215, 216, 7, 103, 2, 2, 216, 36, 3, 2, 2, 2, 217, 218, 7, 103, 2, 2, 218, 219, 7, 122, 2, 2, 219, 220, 7, 118, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 112, 2, 2, 222, 223, 7, 102, 2, 2, 223, 224, 7, 117, 2, 2, 224, 38, 3, 2, 2, 2, 225, 226, 7, 105, 2, 2, 226, 227, 7, 103, 2, 2, 227, 228, 7, 112, 2, 2, 228, 229, 7, 103, 2, 2, 229, 230, 7, 116, 2, 2, 230, 231, 7, 99, 2, 2, 231, 232, 7, 118, 2, 2, 232, 233, 7, 103, 2, 2, 233, 234, 7, 117, 2, 2, 234, 40, 3, 2, 2, 2, 235, 236, 7, 113, 2, 2, 236, 237, 7, 114, 2, 2, 237, 238, 7, 103, 2, 2, 238, 239, 7, 116, 2, 2, 239, 240, 7, 99, 2, 2, 240, 241, 7, 118, 2, 2, 241, 242, 7, 113, 2, 2, 242, 243, 7, 116, 2, 2, 243, 42, 3, 2, 2, 2, 244, 245, 7, 117, 2, 2, 245, 246, 7, 118, 2, 2, 246, 247, 7, 116, 2, 2, 247, 248, 7, 119, 2, 2, 248, 249, 7, 101, 2, 2, 249, 250, 7, 118, 2, 2, 250, 44, 3, 2, 2, 2, 251, 252, 7, 111, 2, 2, 252, 253, 7, 99, 2, 2, 253, 254, 7, 101, 2, 2, 254, 255, 7, 116, 2, 2, 255, 256, 7, 113, 2, 2, 256, 46, 3, 2, 2, 2, 257, 258, 7, 100, 2, 2, 258, 259, 7, 119, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 110, 2, 2, 261, 262, 7, 118, 2, 2, 262, 263, 7, 107, 2, 2, 263, 264, 7, 112, 2, 2, 264, 48, 3, 2, 2, 2, 265, 266, 7, 116, 2, 2, 266, 267, 7, 119, 2, 2, 267, 268, 7, 112, 2, 2, 268, 269, 7, 118, 2, 2, 269, 270, 7, 107, 2, 2, 270, 271, 7, 111, 2, 2, 271, 272, 7, 103, 2, 2, 272, 50, 3, 2, 2, 2, 273, 274, 7, 111, 2, 2, 274, 275, 7, 113, 2, 2, 275, 276, 7, 102, 2, 2, 276, 277, 7, 119, 2, 2, 277, 278, 7, 110, 2, 2, 278, 279, 7, 103, 2, 2, 279, 52, 3, 2, 2, 2, 280, 281, 7, 108, 2, 2, 281, 282, 7, 99, 2, 2, 282, 283, 7, 120, 2, 2, 283, 284, 7, 99, 2, 2, 284, 285, 7, 117, 2, 2, 285, 286, 7, 101, 2, 2, 286, 287, 7, 116, 2, 2, 287, 288, 7, 107, 2, 2, 288, 289, 7, 114, 2, 2, 289, 290, 7, 118, 2, 2, 290, 54, 3, 2, 2, 2, 291, 292, 7, 102, 2, 2, 292, 293, 7, 103, 2, 2, 293, 294, 7, 104, 2, 2, 294, 295, 7, 103, 2, 2, 295, 296, 7, 116, 2, 2, 296, 297, 7, 116, 2, 2, 297, 298, 7, 103, 2, 2, 298, 299, 7, 102, 2, 2, 299, 56, 3, 2, 2, 2, 300, 301, 7, 107, 2, 2, 301, 302, 7, 104, 2, 2, 302, 58, 3, 2, 2, 2, 303, 304, 7, 104, 2, 2, 304, 305, 7, 113, 2, 2, 305, 306, 7, 116, 2, 2, 306, 60, 3, 2, 2, 2, 307, 308, 7, 121, 2, 2, 308, 309, 7, 106, 2, 2, 309, 310, 7, 107, 2, 2, 310, 311, 7, 110, 2, 2, 311, 312, 7, 103, 2, 2, 312, 62, 3, 2, 2, 2, 313, 314, 7, 116, 2, 2, 314, 315, 7, 103, 2, 2, 315, 316, 7, 118, 2, 2, 316, 317, 7, 119, 2, 2, 317, 318, 7, 116, 2, 2, 318, 319, 7, 112, 2, 2, 319, 64, 3, 2, 2, 2, 320, 321, 7, 101, 2, 2, 321, 322, 7, 113, 2, 2, 322, 323, 7, 112, 2, 2, 323, 324, 7, 117, 2, 2, 324, 325, 7, 118, 2, 2, 325, 326, 7, 103, 2, 2, 326, 327, 7, 122, 2, 2, 327, 328, 7, 114, 2, 2, 328, 329, 7, 116, 2, 2, 329, 66, 3, 2, 2, 2, 330, 331, 7, 101, 2, 2, 331, 332, 7, 113, 2, 2, 332, 333, 7, 112, 2, 2, 333, 334, 7, 118, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 112, 2, 2, 336, 337, 7, 119, 2, 2, 337, 338, 7, 103, 2, 2, 338, 68, 3, 2, 2, 2, 339, 340, 7, 100, 2, 2, 340, 341, 7, 116, 2, 2, 341, 342, 7, 103, 2, 2, 342, 343, 7, 99, 2, 2, 343, 344, 7, 109, 2, 2, 344, 70, 3, 2, 2, 2, 345, 346, 7, 105, 2, 2, 346, 347, 7, 113, 2, 2, 347, 348, 7, 118, 2, 2, 348, 349, 7, 113, 2, 2, 349, 72, 3, 2, 2, 2, 350, 351, 7, 113, 2, 2, 351, 352, 7, 118, 2, 2, 352, 353, 7, 106, 2, 2, 353, 354, 7, 103, 2, 2, 354, 355, 7, 116, 2, 2, 355, 356, 7, 121, 2, 2, 356, 357, 7, 107, 2, 2, 357, 358, 7, 117, 2, 2, 358, 359, 7, 103, 2, 2, 359, 74, 3, 2, 2, 2, 360, 361, 7, 118, 2, 2, 361, 362, 7, 116, 2, 2, 362, 363, 7, 123, 2, 2, 363, 76, 3, 2, 2, 2, 364, 365, 7, 110, 2, 2, 365, 366, 7, 99, 2, 2, 366, 367, 7, 100, 2, 2, 367, 368, 7, 103, 2, 2, 368, 369, 7, 110, 2, 2, 369, 78, 3, 2, 2, 2, 370, 371, 7, 110, 2, 2, 371, 372, 7, 99, 2, 2, 372, 373, 7, 100, 2, 2, 373, 374, 7, 103, 2, 2, 374, 375, 7, 110, 2, 2, 375, 376, 7, 117, 2, 2, 376, 80, 3, 2, 2, 2, 377, 378, 7, 118, 2, 2, 378, 379, 7, 99, 2, 2, 379, 380, 7, 107, 2, 2, 380, 381, 7, 110, 2, 2, 381, 82, 3, 2, 2, 2, 382, 383, 7, 107, 2, 2, 383, 384, 7, 117, 2, 2, 384, 385, 7, 112, 2, 2, 385, 386, 7, 118, 2, 2, 386, 84, 3, 2, 2, 2, 387, 388, 7, 107, 2, 2, 388, 389, 7, 117, 2, 2, 389, 86, 3, 2, 2, 2, 390, 391, 7, 110, 2, 2, 391, 392, 7, 103, 2, 2, 392, 393, 7, 118, 2, 2, 393, 88, 3, 2, 2, 2, 394, 395, 7, 101, 2, 2, 395, 396, 7, 113, 2, 2, 396, 397, 7, 112, 2, 2, 397, 398, 7, 117, 2, 2, 398, 399, 7, 118, 2, 2, 399, 90, 3, 2, 2, 2, 400, 401, 7, 103, 2, 2, 401, 402, 7, 122, 2, 2, 402, 403, 7, 118, 2, 2, 403, 404, 7, 103, 2, 2, 404, 405, 7, 116, 2, 2, 405, 406, 7, 112, 2, 2, 406, 92, 3, 2, 2, 2, 407, 408, 7, 99, 2, 2, 408, 409, 7, 117, 2, 2, 409, 410, 7, 117, 2, 2, 410, 411, 7, 103, 2, 2, 411, 412, 7, 116, 2, 2, 412, 413, 7, 118, 2, 2, 413, 94, 3, 2, 2, 2, 414, 415, 7, 101, 2, 2, 415, 416, 7, 106, 2, 2, 416, 417, 7, 103, 2, 2, 417, 418, 7, 101, 2, 2, 418, 419, 7, 109, 2, 2, 419, 96, 3, 2, 2, 2, 420, 421, 7, 119, 2, 2, 421, 422, 7, 112, 2, 2, 422, 423, 7, 116, 2, 2, 423, 424, 7, 103, 2, 2, 424, 425, 7, 99, 2, 2, 425, 426, 7, 101, 2, 2, 426, 427, 7, 106, 2, 2, 427, 428, 7, 99, 2, 2, 428, 429, 7, 100, 2, 2, 429, 430, 7, 110, 2, 2, 430, 431, 7, 103, 2, 2, 431, 98, 3, 2, 2, 2, 432, 433, 7, 102, 2, 2, 433, 434, 7, 103, 2, 2, 434, 435, 7, 100, 2, 2, 435, 436, 7, 119, 2, 2, 436, 437, 7, 105, 2, 2, 437, 100, 3, 2, 2, 2, 438, 439, 7, 63, 2, 2, 439, 102, 3, 2, 2, 2, 440, 441, 7, 44, 2, 2, 441, 467, 7, 63, 2, 2, 442, 443, 7, 49, 2, 2, 443, 467, 7, 63, 2, 2, 444, 445, 7, 39, 2, 2, 445, 467, 7, 63, 2, 2, 446, 447, 7, 45, 2, 2, 447, 467, 7, 63, 2, 2, 448, 449, 7, 47, 2, 2, 449, 467, 7, 63, 2, 2, 450, 451, 7, 62, 2, 2, 451, 452, 7, 62, 2, 2, 452, 467, 7, 63, 2, 2, 453, 454, 7, 64, 2, 2, 454, 455, 7, 64, 2, 2, 455, 467, 7, 63, 2, 2, 456, 457, 7, 64, 2, 2, 457, 458, 7, 64, 2, 2, 458, 459, 7, 64, 2, 2, 459, 467, 7, 63, 2, 2, 460, 461, 7, 40, 2, 2, 461, 467, 7, 63, 2, 2, 462, 463, 7, 96, 2, 2, 463, 467, 7, 63, 2, 2, 464, 465, 7, 126, 2, 2, 465, 467, 7, 63, 2, 2, 466, 440, 3, 2, 2, 2, 466, 442, 3, 2, 2, 2, 466, 444, 3, 2, 2, 2, 466, 446, 3, 2, 2, 2, 466, 448, 3, 2, 2, 2, 466, 450, 3, 2, 2, 2, 466, 453, 3, 2, 2, 2, 466, 456, 3, 2, 2, 2, 466, 460, 3, 2, 2, 2, 466, 462, 3, 2, 2, 2, 466, 464, 3, 2, 2, 2, 467, 104, 3, 2, 2, 2, 468, 469, 7, 63, 2, 2, 469, 470, 7, 63, 2, 2, 470, 106, 3, 2, 2, 2, 471, 472, 7, 45, 2, 2, 472, 108, 3, 2, 2, 2, 473, 474, 7, 47, 2, 2, 474, 110, 3, 2, 2, 2, 475, 476, 7, 44, 2, 2, 476, 112, 3, 2, 2, 2, 477, 478, 7, 49, 2, 2, 478, 114, 3, 2, 2, 2, 479, 480, 7, 39, 2, 2, 480, 116, 3, 2, 2, 2, 481, 482, 7, 126, 2, 2, 482, 118, 3, 2, 2, 2, 483, 484, 7, 40, 2, 2, 484, 120, 3, 2, 2, 2, 485, 486, 7, 128, 2, 2, 486, 122, 3, 2, 2, 2, 487, 488, 7, 111, 2, 2, 488, 489, 7, 99, 2, 2, 489, 490, 7, 122, 2, 2, 490, 124, 3, 2, 2, 2, 491, 492, 7, 111, 2, 2, 492, 493, 7, 107, 2, 2, 493, 494, 7, 112, 2, 2, 494, 126, 3, 2, 2, 2, 495, 496, 7, 35, 2, 2, 496, 497, 7, 63, 2, 2, 497, 128, 3, 2, 2, 2, 498, 499, 7, 62, 2, 2, 499, 130, 3, 2, 2, 2, 500, 501, 7, 62, 2, 2, 501, 502, 7, 63, 2, 2, 502, 132, 3, 2, 2, 2, 503, 504, 7, 64, 2, 2, 504, 134, 3, 2, 2, 2, 505, 506, 7, 64, 2, 2, 506, 507, 7, 63, 2, 2, 507, 136, 3, 2, 2, 2, 508, 509, 7, 62, 2, 2, 509, 510, 7, 62, 2, 2, 510, 138, 3, 2, 2, 2, 511, 512, 7, 64, 2, 2, 512, 513, 7, 64, 2, 2, 513, 140, 3, 2, 2, 2, 514, 515, 7, 64, 2, 2, 515, 516, 7, 64, 2, 2, 516, 517, 7, 64, 2, 2, 517, 142, 3, 2, 2, 2, 518, 519, 7, 48, 2, 2, 519, 520, 7, 48, 2, 2, 520, 521, 7, 48, 2, 2, 521, 144, 3, 2, 2, 2, 522, 525, 5, 105, 53, 2, 523, 525, 5, 127, 64, 2, 524, 522, 3, 2, 2, 2, 524, 523, 3, 2, 2, 2, 525, 146, 3, 2, 2, 2, 526, 527, 7, 45, 2, 2, 527, 528, 7, 45, 2, 2, 528, 148, 3, 2, 2, 2, 529, 530, 7, 47, 2, 2, 530, 531, 7, 47, 2, 2, 531, 150, 3, 2, 2, 2, 532, 533, 7, 35, 2, 2, 533, 152, 3, 2, 2, 2, 534, 539, 7, 36, 2, 2, 535, 538, 5, 155, 78, 2, 536, 538, 10, 2, 2, 2, 537, 535, 3, 2, 2, 2, 537, 536, 3, 2, 2, 2, 538, 541, 3, 2, 2, 2, 539, 537, 3, 2, 2, 2, 539, 540, 3, 2, 2, 2, 540, 542, 3, 2, 2, 2, 541, 539, 3, 2, 2, 2, 542, 553, 7, 36, 2, 2, 543, 548, 7, 41, 2, 2, 544, 547, 5, 155, 78, 2, 545, 547, 10, 3, 2, 2, 546, 544, 3, 2, 2, 2, 546, 545, 3, 2, 2, 2, 547, 550, 3, 2, 2, 2, 548, 546, 3, 2, 2, 2, 548, 549, 3, 2, 2, 2, 549, 551, 3, 2, 2, 2, 550, 548, 3, 2, 2, 2, 551, 553, 7, 41, 2, 2, 552, 534, 3, 2, 2, 2, 552, 543, 3, 2, 2, 2, 553, 154, 3, 2, 2, 2, 554, 555, 7, 94, 2, 2, 555, 556, 9, 4, 2, 2, 556, 156, 3, 2, 2, 2, 557, 561, 9, 5, 2, 2, 558, 560, 9, 6, 2, 2, 559, 558, 3, 2, 2, 2, 560, 563, 3, 2, 2, 2, 561, 559, 3, 2, 2, 2, 561, 562, 3, 2, 2, 2, 562, 158, 3, 2, 2, 2, 563, 561, 3, 2, 2, 2, 564, 566, 9, 7, 2, 2, 565, 564, 3, 2, 2, 2, 566, 567, 3, 2, 2, 2, 567, 565, 3, 2, 2, 2, 567, 568, 3, 2, 2, 2, 568, 569, 3, 2, 2, 2, 569, 570, 8, 80, 2, 2, 570, 160, 3, 2, 2, 2, 571, 572, 7, 49, 2, 2, 572, 573, 7, 44, 2, 2, 573, 577, 3, 2, 2, 2, 574, 576, 11, 2, 2, 2, 575, 574, 3, 2, 2, 2, 576, 579, 3, 2, 2, 2, 577, 578, 3, 2, 2, 2, 577, 575, 3, 2, 2, 2, 578, 583, 3, 2, 2, 2, 579, 577, 3, 2, 2, 2, 580, 581, 7, 44, 2, 2, 581, 584, 7, 49, 2, 2, 582, 584, 7, 2, 2, 3, 583, 580, 3, 2, 2, 2, 583, 582, 3, 2, 2, 2, 584, 585, 3, 2, 2, 2, 585, 586, 8, 81, 2, 2, 586, 162, 3, 2, 2, 2, 587, 588, 7, 49, 2, 2, 588, 589, 7, 49, 2, 2, 589, 593, 3, 2, 2, 2, 590, 592, 10, 8, 2, 2, 591, 590, 3, 2, 2, 2, 592, 595, 3, 2, 2, 2, 593, 591, 3, 2, 2, 2, 593, 594, 3, 2, 2, 2, 594, 596, 3, 2, 2, 2, 595, 593, 3, 2, 2, 2, 596, 597, 8, 82, 2, 2, 597, 164, 3, 2, 2, 2, 598, 599, 9, 9, 2, 2, 599, 166, 3, 2, 2, 2, 600, 609, 7, 50, 2, 2, 601, 605, 9, 10, 2, 2, 602, 604, 5, 165, 83, 2, 603, 602, 3, 2, 2, 2, 604, 607, 3, 2, 2, 2, 605, 603, 3, 2, 2, 2, 605, 606, 3, 2, 2, 2, 606, 609, 3, 2, 2, 2, 607, 605, 3, 2, 2, 2, 608, 600, 3, 2, 2, 2, 608, 601, 3, 2, 2, 2, 609, 168, 3, 2, 2, 2, 610, 612, 9, 11, 2, 2, 611, 613, 9, 12, 2, 2, 612, 611, 3, 2, 2, 2, 612, 613, 3, 2, 2, 2, 613, 615, 3, 2, 2, 2, 614, 616, 5, 165, 83, 2, 615, 614, 3, 2, 2, 2, 616, 617, 3, 2, 2, 2, 617, 615, 3, 2, 2, 2, 617, 618, 3, 2, 2, 2, 618, 170, 3, 2, 2, 2, 619, 621, 5, 109, 55, 2, 620, 619, 3, 2, 2, 2, 620, 621, 3, 2, 2, 2, 621, 622, 3, 2, 2, 2, 622, 623, 5, 167, 84, 2, 623, 627, 7, 48, 2, 2, 624, 626, 5, 165, 83, 2, 625, 624, 3, 2, 2, 2, 626, 629, 3, 2, 2, 2, 627, 625, 3, 2, 2, 2, 627, 628, 3, 2, 2, 2, 628, 631, 3, 2, 2, 2, 629, 627, 3, 2, 2, 2, 630, 632, 5, 169, 85, 2, 631, 630, 3, 2, 2, 2, 631, 632, 3, 2, 2, 2, 632, 664, 3, 2, 2, 2, 633, 635, 5, 109, 55, 2, 634, 633, 3, 2, 2, 2, 634, 635, 3, 2, 2, 2, 635, 636, 3, 2, 2, 2, 636, 638, 7, 48, 2, 2, 637, 639, 5, 165, 83, 2, 638, 637, 3, 2, 2, 2, 639, 640, 3, 2, 2, 2, 640, 638, 3, 2, 2, 2, 640, 641, 3, 2, 2, 2, 641, 643, 3, 2, 2, 2, 642, 644, 5, 169, 85, 2, 643, 642, 3, 2, 2, 2, 643, 644, 3, 2, 2, 2, 644, 664, 3, 2, 2, 2, 645, 647, 5, 109, 55, 2, 646, 645, 3, 2, 2, 2, 646, 647, 3, 2, 2, 2, 647, 648, 3, 2, 2, 2, 648, 650, 5, 167, 84, 2, 649, 651, 5, 169, 85, 2, 650, 649, 3, 2, 2, 2, 650, 651, 3, 2, 2, 2, 651, 664, 3, 2, 2, 2, 652, 654, 5, 109, 55, 2, 653, 652, 3, 2, 2, 2, 653, 654, 3, 2, 2, 2, 654, 655, 3, 2, 2, 2, 655, 656, 7, 50, 2, 2, 656, 657, 7, 122, 2, 2, 657, 659, 3, 2, 2, 2, 658, 660, 9, 13, 2, 2, 659, 658, 3, 2, 2, 2, 660, 661, 3, 2, 2, 2, 661, 659, 3, 2, 2, 2, 661, 662, 3, 2, 2, 2, 662, 664, 3, 2, 2, 2, 663, 620, 3, 2, 2, 2, 663, 634, 3, 2, 2, 2, 663, 646, 3, 2, 2, 2, 663, 653, 3, 2, 2, 2, 664, 172, 3, 2, 2, 2, 30, 2, 466, 524, 537, 539, 546, 548, 552, 561, 567, 577, 583, 593, 605, 608, 612, 617, 620, 627, 631, 634, 640, 643, 646, 650, 653, 661, 663, 3, 2, 3, 2]
\ No newline at end of file
T__0=1
T__1=2
T__2=3
T__3=4
T__4=5
T__5=6
T__6=7
T__7=8
T__8=9
T__9=10
T__10=11
T__11=12
T__12=13
T__13=14
T__14=15
T__15=16
T__16=17
T__17=18
T__18=19
T__19=20
T__20=21
MACRO=22
BUILTIN=23
RUNTIME=24
MODULE=25
JAVASCRIPT=26
DEFERRED=27
IF=28
FOR=29
WHILE=30
RETURN=31
CONSTEXPR=32
CONTINUE=33
BREAK=34
GOTO=35
OTHERWISE=36
TRY=37
LABEL=38
LABELS=39
TAIL=40
ISNT=41
IS=42
LET=43
CONST=44
EXTERN=45
ASSERT_TOKEN=46
CHECK_TOKEN=47
UNREACHABLE_TOKEN=48
DEBUG_TOKEN=49
ASSIGNMENT=50
ASSIGNMENT_OPERATOR=51
EQUAL=52
PLUS=53
MINUS=54
MULTIPLY=55
DIVIDE=56
MODULO=57
BIT_OR=58
BIT_AND=59
BIT_NOT=60
MAX=61
MIN=62
NOT_EQUAL=63
LESS_THAN=64
LESS_THAN_EQUAL=65
GREATER_THAN=66
GREATER_THAN_EQUAL=67
SHIFT_LEFT=68
SHIFT_RIGHT=69
SHIFT_RIGHT_ARITHMETIC=70
VARARGS=71
EQUALITY_OPERATOR=72
INCREMENT=73
DECREMENT=74
NOT=75
STRING_LITERAL=76
IDENTIFIER=77
WS=78
BLOCK_COMMENT=79
LINE_COMMENT=80
DECIMAL_LITERAL=81
'('=1
')'=2
'=>'=3
','=4
':'=5
'type'=6
'?'=7
'||'=8
'&&'=9
'.'=10
'['=11
']'=12
'{'=13
'}'=14
';'=15
'of'=16
'else'=17
'extends'=18
'generates'=19
'operator'=20
'struct'=21
'macro'=22
'builtin'=23
'runtime'=24
'module'=25
'javascript'=26
'deferred'=27
'if'=28
'for'=29
'while'=30
'return'=31
'constexpr'=32
'continue'=33
'break'=34
'goto'=35
'otherwise'=36
'try'=37
'label'=38
'labels'=39
'tail'=40
'isnt'=41
'is'=42
'let'=43
'const'=44
'extern'=45
'assert'=46
'check'=47
'unreachable'=48
'debug'=49
'='=50
'=='=52
'+'=53
'-'=54
'*'=55
'/'=56
'%'=57
'|'=58
'&'=59
'~'=60
'max'=61
'min'=62
'!='=63
'<'=64
'<='=65
'>'=66
'>='=67
'<<'=68
'>>'=69
'>>>'=70
'...'=71
'++'=73
'--'=74
'!'=75
...@@ -137,6 +137,16 @@ class TorqueListener : public antlr4::tree::ParseTreeListener { ...@@ -137,6 +137,16 @@ class TorqueListener : public antlr4::tree::ParseTreeListener {
virtual void exitAssignmentExpression( virtual void exitAssignmentExpression(
TorqueParser::AssignmentExpressionContext* ctx) = 0; TorqueParser::AssignmentExpressionContext* ctx) = 0;
virtual void enterStructExpression(
TorqueParser::StructExpressionContext* ctx) = 0;
virtual void exitStructExpression(
TorqueParser::StructExpressionContext* ctx) = 0;
virtual void enterFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* ctx) = 0;
virtual void exitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* ctx) = 0;
virtual void enterPrimaryExpression( virtual void enterPrimaryExpression(
TorqueParser::PrimaryExpressionContext* ctx) = 0; TorqueParser::PrimaryExpressionContext* ctx) = 0;
virtual void exitPrimaryExpression( virtual void exitPrimaryExpression(
...@@ -248,6 +258,16 @@ class TorqueListener : public antlr4::tree::ParseTreeListener { ...@@ -248,6 +258,16 @@ class TorqueListener : public antlr4::tree::ParseTreeListener {
virtual void enterHelperBody(TorqueParser::HelperBodyContext* ctx) = 0; virtual void enterHelperBody(TorqueParser::HelperBodyContext* ctx) = 0;
virtual void exitHelperBody(TorqueParser::HelperBodyContext* ctx) = 0; virtual void exitHelperBody(TorqueParser::HelperBodyContext* ctx) = 0;
virtual void enterFieldDeclaration(
TorqueParser::FieldDeclarationContext* ctx) = 0;
virtual void exitFieldDeclaration(
TorqueParser::FieldDeclarationContext* ctx) = 0;
virtual void enterFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* ctx) = 0;
virtual void exitFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* ctx) = 0;
virtual void enterExtendsDeclaration( virtual void enterExtendsDeclaration(
TorqueParser::ExtendsDeclarationContext* ctx) = 0; TorqueParser::ExtendsDeclarationContext* ctx) = 0;
virtual void exitExtendsDeclaration( virtual void exitExtendsDeclaration(
...@@ -311,6 +331,11 @@ class TorqueListener : public antlr4::tree::ParseTreeListener { ...@@ -311,6 +331,11 @@ class TorqueListener : public antlr4::tree::ParseTreeListener {
virtual void exitConstDeclaration( virtual void exitConstDeclaration(
TorqueParser::ConstDeclarationContext* ctx) = 0; TorqueParser::ConstDeclarationContext* ctx) = 0;
virtual void enterStructDeclaration(
TorqueParser::StructDeclarationContext* ctx) = 0;
virtual void exitStructDeclaration(
TorqueParser::StructDeclarationContext* ctx) = 0;
virtual void enterDeclaration(TorqueParser::DeclarationContext* ctx) = 0; virtual void enterDeclaration(TorqueParser::DeclarationContext* ctx) = 0;
virtual void exitDeclaration(TorqueParser::DeclarationContext* ctx) = 0; virtual void exitDeclaration(TorqueParser::DeclarationContext* ctx) = 0;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -33,66 +33,67 @@ class TorqueParser : public antlr4::Parser { ...@@ -33,66 +33,67 @@ class TorqueParser : public antlr4::Parser {
T__17 = 18, T__17 = 18,
T__18 = 19, T__18 = 19,
T__19 = 20, T__19 = 20,
MACRO = 21, T__20 = 21,
BUILTIN = 22, MACRO = 22,
RUNTIME = 23, BUILTIN = 23,
MODULE = 24, RUNTIME = 24,
JAVASCRIPT = 25, MODULE = 25,
DEFERRED = 26, JAVASCRIPT = 26,
IF = 27, DEFERRED = 27,
FOR = 28, IF = 28,
WHILE = 29, FOR = 29,
RETURN = 30, WHILE = 30,
CONSTEXPR = 31, RETURN = 31,
CONTINUE = 32, CONSTEXPR = 32,
BREAK = 33, CONTINUE = 33,
GOTO = 34, BREAK = 34,
OTHERWISE = 35, GOTO = 35,
TRY = 36, OTHERWISE = 36,
LABEL = 37, TRY = 37,
LABELS = 38, LABEL = 38,
TAIL = 39, LABELS = 39,
ISNT = 40, TAIL = 40,
IS = 41, ISNT = 41,
LET = 42, IS = 42,
CONST = 43, LET = 43,
EXTERN = 44, CONST = 44,
ASSERT_TOKEN = 45, EXTERN = 45,
CHECK_TOKEN = 46, ASSERT_TOKEN = 46,
UNREACHABLE_TOKEN = 47, CHECK_TOKEN = 47,
DEBUG_TOKEN = 48, UNREACHABLE_TOKEN = 48,
ASSIGNMENT = 49, DEBUG_TOKEN = 49,
ASSIGNMENT_OPERATOR = 50, ASSIGNMENT = 50,
EQUAL = 51, ASSIGNMENT_OPERATOR = 51,
PLUS = 52, EQUAL = 52,
MINUS = 53, PLUS = 53,
MULTIPLY = 54, MINUS = 54,
DIVIDE = 55, MULTIPLY = 55,
MODULO = 56, DIVIDE = 56,
BIT_OR = 57, MODULO = 57,
BIT_AND = 58, BIT_OR = 58,
BIT_NOT = 59, BIT_AND = 59,
MAX = 60, BIT_NOT = 60,
MIN = 61, MAX = 61,
NOT_EQUAL = 62, MIN = 62,
LESS_THAN = 63, NOT_EQUAL = 63,
LESS_THAN_EQUAL = 64, LESS_THAN = 64,
GREATER_THAN = 65, LESS_THAN_EQUAL = 65,
GREATER_THAN_EQUAL = 66, GREATER_THAN = 66,
SHIFT_LEFT = 67, GREATER_THAN_EQUAL = 67,
SHIFT_RIGHT = 68, SHIFT_LEFT = 68,
SHIFT_RIGHT_ARITHMETIC = 69, SHIFT_RIGHT = 69,
VARARGS = 70, SHIFT_RIGHT_ARITHMETIC = 70,
EQUALITY_OPERATOR = 71, VARARGS = 71,
INCREMENT = 72, EQUALITY_OPERATOR = 72,
DECREMENT = 73, INCREMENT = 73,
NOT = 74, DECREMENT = 74,
STRING_LITERAL = 75, NOT = 75,
IDENTIFIER = 76, STRING_LITERAL = 76,
WS = 77, IDENTIFIER = 77,
BLOCK_COMMENT = 78, WS = 78,
LINE_COMMENT = 79, BLOCK_COMMENT = 79,
DECIMAL_LITERAL = 80 LINE_COMMENT = 80,
DECIMAL_LITERAL = 81
}; };
enum { enum {
...@@ -123,50 +124,55 @@ class TorqueParser : public antlr4::Parser { ...@@ -123,50 +124,55 @@ class TorqueParser : public antlr4::Parser {
RuleIncrementDecrement = 24, RuleIncrementDecrement = 24,
RuleAssignment = 25, RuleAssignment = 25,
RuleAssignmentExpression = 26, RuleAssignmentExpression = 26,
RulePrimaryExpression = 27, RuleStructExpression = 27,
RuleForInitialization = 28, RuleFunctionPointerExpression = 28,
RuleForLoop = 29, RulePrimaryExpression = 29,
RuleRangeSpecifier = 30, RuleForInitialization = 30,
RuleForOfRange = 31, RuleForLoop = 31,
RuleForOfLoop = 32, RuleRangeSpecifier = 32,
RuleArgument = 33, RuleForOfRange = 33,
RuleArgumentList = 34, RuleForOfLoop = 34,
RuleHelperCall = 35, RuleArgument = 35,
RuleLabelReference = 36, RuleArgumentList = 36,
RuleVariableDeclaration = 37, RuleHelperCall = 37,
RuleVariableDeclarationWithInitialization = 38, RuleLabelReference = 38,
RuleHelperCallStatement = 39, RuleVariableDeclaration = 39,
RuleExpressionStatement = 40, RuleVariableDeclarationWithInitialization = 40,
RuleIfStatement = 41, RuleHelperCallStatement = 41,
RuleWhileLoop = 42, RuleExpressionStatement = 42,
RuleReturnStatement = 43, RuleIfStatement = 43,
RuleBreakStatement = 44, RuleWhileLoop = 44,
RuleContinueStatement = 45, RuleReturnStatement = 45,
RuleGotoStatement = 46, RuleBreakStatement = 46,
RuleHandlerWithStatement = 47, RuleContinueStatement = 47,
RuleTryLabelStatement = 48, RuleGotoStatement = 48,
RuleDiagnosticStatement = 49, RuleHandlerWithStatement = 49,
RuleStatement = 50, RuleTryLabelStatement = 50,
RuleStatementList = 51, RuleDiagnosticStatement = 51,
RuleStatementScope = 52, RuleStatement = 52,
RuleStatementBlock = 53, RuleStatementList = 53,
RuleHelperBody = 54, RuleStatementScope = 54,
RuleExtendsDeclaration = 55, RuleStatementBlock = 55,
RuleGeneratesDeclaration = 56, RuleHelperBody = 56,
RuleConstexprDeclaration = 57, RuleFieldDeclaration = 57,
RuleTypeDeclaration = 58, RuleFieldListDeclaration = 58,
RuleTypeAliasDeclaration = 59, RuleExtendsDeclaration = 59,
RuleExternalBuiltin = 60, RuleGeneratesDeclaration = 60,
RuleExternalMacro = 61, RuleConstexprDeclaration = 61,
RuleExternalRuntime = 62, RuleTypeDeclaration = 62,
RuleBuiltinDeclaration = 63, RuleTypeAliasDeclaration = 63,
RuleGenericSpecialization = 64, RuleExternalBuiltin = 64,
RuleMacroDeclaration = 65, RuleExternalMacro = 65,
RuleExternConstDeclaration = 66, RuleExternalRuntime = 66,
RuleConstDeclaration = 67, RuleBuiltinDeclaration = 67,
RuleDeclaration = 68, RuleGenericSpecialization = 68,
RuleModuleDeclaration = 69, RuleMacroDeclaration = 69,
RuleFile = 70 RuleExternConstDeclaration = 70,
RuleConstDeclaration = 71,
RuleStructDeclaration = 72,
RuleDeclaration = 73,
RuleModuleDeclaration = 74,
RuleFile = 75
}; };
explicit TorqueParser(antlr4::TokenStream* input); explicit TorqueParser(antlr4::TokenStream* input);
...@@ -207,6 +213,8 @@ class TorqueParser : public antlr4::Parser { ...@@ -207,6 +213,8 @@ class TorqueParser : public antlr4::Parser {
class IncrementDecrementContext; class IncrementDecrementContext;
class AssignmentContext; class AssignmentContext;
class AssignmentExpressionContext; class AssignmentExpressionContext;
class StructExpressionContext;
class FunctionPointerExpressionContext;
class PrimaryExpressionContext; class PrimaryExpressionContext;
class ForInitializationContext; class ForInitializationContext;
class ForLoopContext; class ForLoopContext;
...@@ -235,6 +243,8 @@ class TorqueParser : public antlr4::Parser { ...@@ -235,6 +243,8 @@ class TorqueParser : public antlr4::Parser {
class StatementScopeContext; class StatementScopeContext;
class StatementBlockContext; class StatementBlockContext;
class HelperBodyContext; class HelperBodyContext;
class FieldDeclarationContext;
class FieldListDeclarationContext;
class ExtendsDeclarationContext; class ExtendsDeclarationContext;
class GeneratesDeclarationContext; class GeneratesDeclarationContext;
class ConstexprDeclarationContext; class ConstexprDeclarationContext;
...@@ -248,6 +258,7 @@ class TorqueParser : public antlr4::Parser { ...@@ -248,6 +258,7 @@ class TorqueParser : public antlr4::Parser {
class MacroDeclarationContext; class MacroDeclarationContext;
class ExternConstDeclarationContext; class ExternConstDeclarationContext;
class ConstDeclarationContext; class ConstDeclarationContext;
class StructDeclarationContext;
class DeclarationContext; class DeclarationContext;
class ModuleDeclarationContext; class ModuleDeclarationContext;
class FileContext; class FileContext;
...@@ -658,9 +669,9 @@ class TorqueParser : public antlr4::Parser { ...@@ -658,9 +669,9 @@ class TorqueParser : public antlr4::Parser {
size_t invokingState); size_t invokingState);
size_t getRuleIndex() const override; size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER(); antlr4::tree::TerminalNode* IDENTIFIER();
GenericSpecializationTypeListContext* genericSpecializationTypeList(); PrimaryExpressionContext* primaryExpression();
LocationExpressionContext* locationExpression();
ExpressionContext* expression(); ExpressionContext* expression();
LocationExpressionContext* locationExpression();
void enterRule(antlr4::tree::ParseTreeListener* listener) override; void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override; void exitRule(antlr4::tree::ParseTreeListener* listener) override;
...@@ -711,7 +722,7 @@ class TorqueParser : public antlr4::Parser { ...@@ -711,7 +722,7 @@ class TorqueParser : public antlr4::Parser {
AssignmentExpressionContext(antlr4::ParserRuleContext* parent, AssignmentExpressionContext(antlr4::ParserRuleContext* parent,
size_t invokingState); size_t invokingState);
size_t getRuleIndex() const override; size_t getRuleIndex() const override;
PrimaryExpressionContext* primaryExpression(); FunctionPointerExpressionContext* functionPointerExpression();
AssignmentContext* assignment(); AssignmentContext* assignment();
void enterRule(antlr4::tree::ParseTreeListener* listener) override; void enterRule(antlr4::tree::ParseTreeListener* listener) override;
...@@ -722,12 +733,47 @@ class TorqueParser : public antlr4::Parser { ...@@ -722,12 +733,47 @@ class TorqueParser : public antlr4::Parser {
AssignmentExpressionContext* assignmentExpression(); AssignmentExpressionContext* assignmentExpression();
class StructExpressionContext : public antlr4::ParserRuleContext {
public:
StructExpressionContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER();
std::vector<ExpressionContext*> expression();
ExpressionContext* expression(size_t i);
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
StructExpressionContext* structExpression();
class FunctionPointerExpressionContext : public antlr4::ParserRuleContext {
public:
FunctionPointerExpressionContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
PrimaryExpressionContext* primaryExpression();
antlr4::tree::TerminalNode* IDENTIFIER();
GenericSpecializationTypeListContext* genericSpecializationTypeList();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
FunctionPointerExpressionContext* functionPointerExpression();
class PrimaryExpressionContext : public antlr4::ParserRuleContext { class PrimaryExpressionContext : public antlr4::ParserRuleContext {
public: public:
PrimaryExpressionContext(antlr4::ParserRuleContext* parent, PrimaryExpressionContext(antlr4::ParserRuleContext* parent,
size_t invokingState); size_t invokingState);
size_t getRuleIndex() const override; size_t getRuleIndex() const override;
HelperCallContext* helperCall(); HelperCallContext* helperCall();
StructExpressionContext* structExpression();
antlr4::tree::TerminalNode* DECIMAL_LITERAL(); antlr4::tree::TerminalNode* DECIMAL_LITERAL();
antlr4::tree::TerminalNode* STRING_LITERAL(); antlr4::tree::TerminalNode* STRING_LITERAL();
ExpressionContext* expression(); ExpressionContext* expression();
...@@ -1196,6 +1242,38 @@ class TorqueParser : public antlr4::Parser { ...@@ -1196,6 +1242,38 @@ class TorqueParser : public antlr4::Parser {
HelperBodyContext* helperBody(); HelperBodyContext* helperBody();
class FieldDeclarationContext : public antlr4::ParserRuleContext {
public:
FieldDeclarationContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER();
TypeContext* type();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
FieldDeclarationContext* fieldDeclaration();
class FieldListDeclarationContext : public antlr4::ParserRuleContext {
public:
FieldListDeclarationContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
std::vector<FieldDeclarationContext*> fieldDeclaration();
FieldDeclarationContext* fieldDeclaration(size_t i);
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
FieldListDeclarationContext* fieldListDeclaration();
class ExtendsDeclarationContext : public antlr4::ParserRuleContext { class ExtendsDeclarationContext : public antlr4::ParserRuleContext {
public: public:
ExtendsDeclarationContext(antlr4::ParserRuleContext* parent, ExtendsDeclarationContext(antlr4::ParserRuleContext* parent,
...@@ -1437,10 +1515,27 @@ class TorqueParser : public antlr4::Parser { ...@@ -1437,10 +1515,27 @@ class TorqueParser : public antlr4::Parser {
ConstDeclarationContext* constDeclaration(); ConstDeclarationContext* constDeclaration();
class StructDeclarationContext : public antlr4::ParserRuleContext {
public:
StructDeclarationContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER();
FieldListDeclarationContext* fieldListDeclaration();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
StructDeclarationContext* structDeclaration();
class DeclarationContext : public antlr4::ParserRuleContext { class DeclarationContext : public antlr4::ParserRuleContext {
public: public:
DeclarationContext(antlr4::ParserRuleContext* parent, size_t invokingState); DeclarationContext(antlr4::ParserRuleContext* parent, size_t invokingState);
size_t getRuleIndex() const override; size_t getRuleIndex() const override;
StructDeclarationContext* structDeclaration();
TypeDeclarationContext* typeDeclaration(); TypeDeclarationContext* typeDeclaration();
TypeAliasDeclarationContext* typeAliasDeclaration(); TypeAliasDeclarationContext* typeAliasDeclaration();
BuiltinDeclarationContext* builtinDeclaration(); BuiltinDeclarationContext* builtinDeclaration();
......
...@@ -100,6 +100,12 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor { ...@@ -100,6 +100,12 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor {
virtual antlrcpp::Any visitAssignmentExpression( virtual antlrcpp::Any visitAssignmentExpression(
TorqueParser::AssignmentExpressionContext* context) = 0; TorqueParser::AssignmentExpressionContext* context) = 0;
virtual antlrcpp::Any visitStructExpression(
TorqueParser::StructExpressionContext* context) = 0;
virtual antlrcpp::Any visitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* context) = 0;
virtual antlrcpp::Any visitPrimaryExpression( virtual antlrcpp::Any visitPrimaryExpression(
TorqueParser::PrimaryExpressionContext* context) = 0; TorqueParser::PrimaryExpressionContext* context) = 0;
...@@ -183,6 +189,12 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor { ...@@ -183,6 +189,12 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor {
virtual antlrcpp::Any visitHelperBody( virtual antlrcpp::Any visitHelperBody(
TorqueParser::HelperBodyContext* context) = 0; TorqueParser::HelperBodyContext* context) = 0;
virtual antlrcpp::Any visitFieldDeclaration(
TorqueParser::FieldDeclarationContext* context) = 0;
virtual antlrcpp::Any visitFieldListDeclaration(
TorqueParser::FieldListDeclarationContext* context) = 0;
virtual antlrcpp::Any visitExtendsDeclaration( virtual antlrcpp::Any visitExtendsDeclaration(
TorqueParser::ExtendsDeclarationContext* context) = 0; TorqueParser::ExtendsDeclarationContext* context) = 0;
...@@ -222,6 +234,9 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor { ...@@ -222,6 +234,9 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor {
virtual antlrcpp::Any visitConstDeclaration( virtual antlrcpp::Any visitConstDeclaration(
TorqueParser::ConstDeclarationContext* context) = 0; TorqueParser::ConstDeclarationContext* context) = 0;
virtual antlrcpp::Any visitStructDeclaration(
TorqueParser::StructDeclarationContext* context) = 0;
virtual antlrcpp::Any visitDeclaration( virtual antlrcpp::Any visitDeclaration(
TorqueParser::DeclarationContext* context) = 0; TorqueParser::DeclarationContext* context) = 0;
......
...@@ -545,6 +545,21 @@ antlrcpp::Any AstGenerator::visitTryLabelStatement( ...@@ -545,6 +545,21 @@ antlrcpp::Any AstGenerator::visitTryLabelStatement(
return implicit_cast<Statement*>(result); return implicit_cast<Statement*>(result);
} }
antlrcpp::Any AstGenerator::visitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* context) {
if (context->IDENTIFIER()) {
std::vector<TypeExpression*> templateArguments;
if (context->genericSpecializationTypeList()) {
templateArguments =
GetTypeVector(context->genericSpecializationTypeList()->typeList());
}
return implicit_cast<Expression*>(RegisterNode(new IdentifierExpression{
Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
std::move(templateArguments)}));
}
return context->primaryExpression()->accept(this);
}
antlrcpp::Any AstGenerator::visitPrimaryExpression( antlrcpp::Any AstGenerator::visitPrimaryExpression(
TorqueParser::PrimaryExpressionContext* context) { TorqueParser::PrimaryExpressionContext* context) {
if (auto* e = context->helperCall()) return e->accept(this); if (auto* e = context->helperCall()) return e->accept(this);
...@@ -554,9 +569,23 @@ antlrcpp::Any AstGenerator::visitPrimaryExpression( ...@@ -554,9 +569,23 @@ antlrcpp::Any AstGenerator::visitPrimaryExpression(
if (auto* e = context->STRING_LITERAL()) if (auto* e = context->STRING_LITERAL())
return implicit_cast<Expression*>(RegisterNode( return implicit_cast<Expression*>(RegisterNode(
new StringLiteralExpression{Pos(context), e->getSymbol()->getText()})); new StringLiteralExpression{Pos(context), e->getSymbol()->getText()}));
if (context->structExpression()) {
return context->structExpression()->accept(this);
}
return context->expression()->accept(this); return context->expression()->accept(this);
} }
antlrcpp::Any AstGenerator::visitStructExpression(
TorqueParser::StructExpressionContext* context) {
std::vector<Expression*> expressions;
for (auto& e : context->expression()) {
expressions.push_back(e->accept(this).as<Expression*>());
}
return implicit_cast<Expression*>(RegisterNode(new StructExpression{
Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
expressions}));
}
antlrcpp::Any AstGenerator::visitAssignment( antlrcpp::Any AstGenerator::visitAssignment(
TorqueParser::AssignmentContext* context) { TorqueParser::AssignmentContext* context) {
if (auto* e = context->incrementDecrement()) return e->accept(this); if (auto* e = context->incrementDecrement()) return e->accept(this);
...@@ -589,25 +618,23 @@ antlrcpp::Any AstGenerator::visitIncrementDecrement( ...@@ -589,25 +618,23 @@ antlrcpp::Any AstGenerator::visitIncrementDecrement(
antlrcpp::Any AstGenerator::visitLocationExpression( antlrcpp::Any AstGenerator::visitLocationExpression(
TorqueParser::LocationExpressionContext* context) { TorqueParser::LocationExpressionContext* context) {
if (auto* l = context->locationExpression()) { Expression* location = nullptr;
Expression* location = l->accept(this).as<Expression*>(); if (auto* p = context->primaryExpression()) {
location = p->accept(this).as<Expression*>();
} else if (auto* l = context->locationExpression()) {
location = l->accept(this).as<Expression*>();
} else {
return implicit_cast<Expression*>(RegisterNode(new IdentifierExpression{
Pos(context), context->IDENTIFIER()->getSymbol()->getText(), {}}));
}
if (auto* e = context->expression()) { if (auto* e = context->expression()) {
return implicit_cast<Expression*>( return implicit_cast<Expression*>(RegisterNode(new ElementAccessExpression{
RegisterNode(new ElementAccessExpression{
Pos(context), location, e->accept(this).as<Expression*>()})); Pos(context), location, e->accept(this).as<Expression*>()}));
} }
return implicit_cast<Expression*>(RegisterNode(new FieldAccessExpression{ return implicit_cast<Expression*>(RegisterNode(new FieldAccessExpression{
Pos(context), location, Pos(context), location, context->IDENTIFIER()->getSymbol()->getText()}));
context->IDENTIFIER()->getSymbol()->getText()}));
}
std::vector<TypeExpression*> templateArguments;
if (context->genericSpecializationTypeList()) {
templateArguments =
GetTypeVector(context->genericSpecializationTypeList()->typeList());
}
return implicit_cast<Expression*>(RegisterNode(new IdentifierExpression{
Pos(context), context->IDENTIFIER()->getSymbol()->getText(),
std::move(templateArguments)}));
} }
antlrcpp::Any AstGenerator::visitUnaryExpression( antlrcpp::Any AstGenerator::visitUnaryExpression(
...@@ -768,6 +795,22 @@ antlrcpp::Any AstGenerator::visitDiagnosticStatement( ...@@ -768,6 +795,22 @@ antlrcpp::Any AstGenerator::visitDiagnosticStatement(
} }
} }
antlrcpp::Any AstGenerator::visitStructDeclaration(
TorqueParser::StructDeclarationContext* context) {
StructDeclaration* struct_declaration = RegisterNode(new StructDeclaration{
Pos(context), context->IDENTIFIER()->getSymbol()->getText()});
for (auto* fieldDeclaration :
context->fieldListDeclaration()->fieldDeclaration()) {
FieldNameAndType field = {
fieldDeclaration->IDENTIFIER()->getSymbol()->getText(),
GetType(fieldDeclaration->type())};
struct_declaration->fields.push_back(field);
}
return implicit_cast<Declaration*>(struct_declaration);
}
void AstGenerator::visitSourceFile(SourceFileContext* context) { void AstGenerator::visitSourceFile(SourceFileContext* context) {
source_file_context_ = context; source_file_context_ = context;
current_source_file_ = SourceFileMap::Get().AddSource(context->name); current_source_file_ = SourceFileMap::Get().AddSource(context->name);
......
...@@ -69,6 +69,9 @@ class AstGenerator : public TorqueBaseVisitor { ...@@ -69,6 +69,9 @@ class AstGenerator : public TorqueBaseVisitor {
antlrcpp::Any visitHelperCallStatement( antlrcpp::Any visitHelperCallStatement(
TorqueParser::HelperCallStatementContext* context) override; TorqueParser::HelperCallStatementContext* context) override;
antlrcpp::Any visitStructExpression(
TorqueParser::StructExpressionContext* context) override;
antlrcpp::Any visitConditionalExpression( antlrcpp::Any visitConditionalExpression(
TorqueParser::ConditionalExpressionContext* context) override; TorqueParser::ConditionalExpressionContext* context) override;
...@@ -108,6 +111,9 @@ class AstGenerator : public TorqueBaseVisitor { ...@@ -108,6 +111,9 @@ class AstGenerator : public TorqueBaseVisitor {
antlrcpp::Any visitAssignment( antlrcpp::Any visitAssignment(
TorqueParser::AssignmentContext* context) override; TorqueParser::AssignmentContext* context) override;
antlrcpp::Any visitFunctionPointerExpression(
TorqueParser::FunctionPointerExpressionContext* context) override;
antlrcpp::Any visitPrimaryExpression( antlrcpp::Any visitPrimaryExpression(
TorqueParser::PrimaryExpressionContext* context) override; TorqueParser::PrimaryExpressionContext* context) override;
...@@ -146,6 +152,9 @@ class AstGenerator : public TorqueBaseVisitor { ...@@ -146,6 +152,9 @@ class AstGenerator : public TorqueBaseVisitor {
antlrcpp::Any visitDiagnosticStatement( antlrcpp::Any visitDiagnosticStatement(
TorqueParser::DiagnosticStatementContext* context) override; TorqueParser::DiagnosticStatementContext* context) override;
antlrcpp::Any visitStructDeclaration(
TorqueParser::StructDeclarationContext* context) override;
antlrcpp::Any aggregateResult(antlrcpp::Any aggregate, antlrcpp::Any aggregateResult(antlrcpp::Any aggregate,
const antlrcpp::Any& nextResult) override { const antlrcpp::Any& nextResult) override {
if (aggregate.isNull()) if (aggregate.isNull())
......
...@@ -29,6 +29,7 @@ DECLARE_CONTEXTUAL_VARIABLE(CurrentSourcePosition, SourcePosition) ...@@ -29,6 +29,7 @@ DECLARE_CONTEXTUAL_VARIABLE(CurrentSourcePosition, SourcePosition)
#define AST_EXPRESSION_NODE_KIND_LIST(V) \ #define AST_EXPRESSION_NODE_KIND_LIST(V) \
V(CallExpression) \ V(CallExpression) \
V(StructExpression) \
V(LogicalOrExpression) \ V(LogicalOrExpression) \
V(LogicalAndExpression) \ V(LogicalAndExpression) \
V(ConditionalExpression) \ V(ConditionalExpression) \
...@@ -69,6 +70,7 @@ DECLARE_CONTEXTUAL_VARIABLE(CurrentSourcePosition, SourcePosition) ...@@ -69,6 +70,7 @@ DECLARE_CONTEXTUAL_VARIABLE(CurrentSourcePosition, SourcePosition)
V(GenericDeclaration) \ V(GenericDeclaration) \
V(SpecializationDeclaration) \ V(SpecializationDeclaration) \
V(ExternConstDeclaration) \ V(ExternConstDeclaration) \
V(StructDeclaration) \
V(DefaultModuleDeclaration) \ V(DefaultModuleDeclaration) \
V(ExplicitModuleDeclaration) \ V(ExplicitModuleDeclaration) \
V(ConstDeclaration) V(ConstDeclaration)
...@@ -260,6 +262,14 @@ struct CallExpression : Expression { ...@@ -260,6 +262,14 @@ struct CallExpression : Expression {
std::vector<std::string> labels; std::vector<std::string> labels;
}; };
struct StructExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(StructExpression)
StructExpression(SourcePosition p, std::string n, std::vector<Expression*> e)
: Expression(kKind, p), name(n), expressions(std::move(e)) {}
std::string name;
std::vector<Expression*> expressions;
};
struct LogicalOrExpression : Expression { struct LogicalOrExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(LogicalOrExpression) DEFINE_AST_NODE_LEAF_BOILERPLATE(LogicalOrExpression)
LogicalOrExpression(SourcePosition p, Expression* l, Expression* r) LogicalOrExpression(SourcePosition p, Expression* l, Expression* r)
...@@ -552,6 +562,11 @@ struct TypeAliasDeclaration : Declaration { ...@@ -552,6 +562,11 @@ struct TypeAliasDeclaration : Declaration {
TypeExpression* type; TypeExpression* type;
}; };
struct FieldNameAndType {
std::string name;
TypeExpression* type;
};
struct LabelAndTypes { struct LabelAndTypes {
std::string name; std::string name;
std::vector<TypeExpression*> types; std::vector<TypeExpression*> types;
...@@ -693,6 +708,14 @@ struct ExternConstDeclaration : Declaration { ...@@ -693,6 +708,14 @@ struct ExternConstDeclaration : Declaration {
std::string literal; std::string literal;
}; };
struct StructDeclaration : Declaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(StructDeclaration)
StructDeclaration(SourcePosition p, std::string n)
: Declaration(kKind, p), name(std::move(n)) {}
std::string name;
std::vector<FieldNameAndType> fields;
};
#define ENUM_ITEM(name) \ #define ENUM_ITEM(name) \
case AstNode::Kind::k##name: \ case AstNode::Kind::k##name: \
return std::is_base_of<T, name>::value; \ return std::is_base_of<T, name>::value; \
......
...@@ -34,6 +34,18 @@ std::ostream& operator<<(std::ostream& os, const RuntimeFunction& b) { ...@@ -34,6 +34,18 @@ std::ostream& operator<<(std::ostream& os, const RuntimeFunction& b) {
return os; return os;
} }
std::string Variable::RValue() const {
if (!IsDefined()) {
ReportError("Reading uninitialized variable.");
}
if (type()->IsStructType()) {
return value();
}
std::string result = "(*" + value() + ")";
if (!IsConst()) result += ".value()";
return result;
}
void PrintLabel(std::ostream& os, const Label& l, bool with_names) { void PrintLabel(std::ostream& os, const Label& l, bool with_names) {
os << l.name(); os << l.name();
if (l.GetParameterCount() != 0) { if (l.GetParameterCount() != 0) {
......
...@@ -134,14 +134,7 @@ class Variable : public Value { ...@@ -134,14 +134,7 @@ class Variable : public Value {
DECLARE_DECLARABLE_BOILERPLATE(Variable, variable); DECLARE_DECLARABLE_BOILERPLATE(Variable, variable);
bool IsConst() const override { return const_; } bool IsConst() const override { return const_; }
std::string value() const override { return value_; } std::string value() const override { return value_; }
std::string RValue() const override { std::string RValue() const override;
if (!IsDefined()) {
ReportError("Reading uninitialized variable.");
}
std::string result = "(*" + value() + ")";
if (!IsConst()) result += ".value()";
return result;
}
void Define() { void Define() {
if (defined_ && IsConst()) { if (defined_ && IsConst()) {
ReportError("Cannot re-define a const-bound variable."); ReportError("Cannot re-define a const-bound variable.");
......
...@@ -95,6 +95,15 @@ Builtin* DeclarationVisitor::BuiltinDeclarationCommon( ...@@ -95,6 +95,15 @@ Builtin* DeclarationVisitor::BuiltinDeclarationCommon(
} }
} }
if (const StructType* struct_type =
StructType::DynamicCast(signature.return_type)) {
std::stringstream stream;
stream << "builtins (in this case" << decl->name
<< ") cannot return structs (in this case " << struct_type->name()
<< ")";
ReportError(stream.str());
}
std::string generated_name = GetGeneratedCallableName( std::string generated_name = GetGeneratedCallableName(
decl->name, declarations()->GetCurrentSpecializationTypeNamesVector()); decl->name, declarations()->GetCurrentSpecializationTypeNamesVector());
return declarations()->DeclareBuiltin(generated_name, kind, external, return declarations()->DeclareBuiltin(generated_name, kind, external,
...@@ -117,6 +126,15 @@ void DeclarationVisitor::Visit(ExternalRuntimeDeclaration* decl, ...@@ -117,6 +126,15 @@ void DeclarationVisitor::Visit(ExternalRuntimeDeclaration* decl,
ReportError(stream.str()); ReportError(stream.str());
} }
if (signature.return_type->IsStructType()) {
std::stringstream stream;
stream << "runtime functions (in this case" << decl->name
<< ") cannot return structs (in this case "
<< static_cast<const StructType*>(signature.return_type)->name()
<< ")";
ReportError(stream.str());
}
declarations()->DeclareRuntimeFunction(decl->name, signature); declarations()->DeclareRuntimeFunction(decl->name, signature);
} }
...@@ -158,8 +176,8 @@ void DeclarationVisitor::Visit(TorqueMacroDeclaration* decl, ...@@ -158,8 +176,8 @@ void DeclarationVisitor::Visit(TorqueMacroDeclaration* decl,
DeclareSignature(signature); DeclareSignature(signature);
Variable* return_variable = nullptr; Variable* return_variable = nullptr;
if (!signature.return_type->IsVoidOrNever()) { if (!signature.return_type->IsVoidOrNever()) {
return_variable = declarations()->DeclareVariable( return_variable =
kReturnValueVariable, signature.return_type, DeclareVariable(kReturnValueVariable, signature.return_type,
signature.return_type->IsConstexpr()); signature.return_type->IsConstexpr());
} }
...@@ -252,6 +270,33 @@ void DeclarationVisitor::Visit(ReturnStatement* stmt) { ...@@ -252,6 +270,33 @@ void DeclarationVisitor::Visit(ReturnStatement* stmt) {
} }
} }
Variable* DeclarationVisitor::DeclareVariable(const std::string& name,
const Type* type, bool is_const) {
Variable* result = declarations()->DeclareVariable(name, type, is_const);
if (type->IsStructType()) {
const StructType* struct_type = StructType::cast(type);
for (auto& field : struct_type->fields()) {
std::string field_var_name = name + "." + field.name;
DeclareVariable(field_var_name, field.type, is_const);
}
}
return result;
}
Parameter* DeclarationVisitor::DeclareParameter(const std::string& name,
const Type* type) {
Parameter* result = declarations()->DeclareParameter(
name, GetParameterVariableFromName(name), type);
if (type->IsStructType()) {
const StructType* struct_type = StructType::cast(type);
for (auto& field : struct_type->fields()) {
std::string field_var_name = name + "." + field.name;
DeclareParameter(field_var_name, field.type);
}
}
return result;
}
void DeclarationVisitor::Visit(VarDeclarationStatement* stmt) { void DeclarationVisitor::Visit(VarDeclarationStatement* stmt) {
std::string variable_name = stmt->name; std::string variable_name = stmt->name;
const Type* type = declarations()->GetType(stmt->type); const Type* type = declarations()->GetType(stmt->type);
...@@ -259,7 +304,7 @@ void DeclarationVisitor::Visit(VarDeclarationStatement* stmt) { ...@@ -259,7 +304,7 @@ void DeclarationVisitor::Visit(VarDeclarationStatement* stmt) {
ReportError( ReportError(
"cannot declare variable with constexpr type. Use 'const' instead."); "cannot declare variable with constexpr type. Use 'const' instead.");
} }
declarations()->DeclareVariable(variable_name, type, stmt->const_qualified); DeclareVariable(variable_name, type, stmt->const_qualified);
if (global_context_.verbose()) { if (global_context_.verbose()) {
std::cout << "declared variable " << variable_name << " with type " << *type std::cout << "declared variable " << variable_name << " with type " << *type
<< "\n"; << "\n";
...@@ -293,6 +338,15 @@ void DeclarationVisitor::Visit(ExternConstDeclaration* decl) { ...@@ -293,6 +338,15 @@ void DeclarationVisitor::Visit(ExternConstDeclaration* decl) {
declarations()->DeclareExternConstant(decl->name, type, decl->literal); declarations()->DeclareExternConstant(decl->name, type, decl->literal);
} }
void DeclarationVisitor::Visit(StructDeclaration* decl) {
std::vector<NameAndType> fields;
for (auto& field : decl->fields) {
const Type* field_type = declarations()->GetType(field.type);
fields.push_back({field.name, field_type});
}
declarations()->DeclareStruct(CurrentModule(), decl->name, fields);
}
void DeclarationVisitor::Visit(LogicalOrExpression* expr) { void DeclarationVisitor::Visit(LogicalOrExpression* expr) {
{ {
Declarations::NodeScopeActivator scope(declarations(), expr->left); Declarations::NodeScopeActivator scope(declarations(), expr->left);
...@@ -415,8 +469,7 @@ void DeclarationVisitor::Visit(TryLabelStatement* stmt) { ...@@ -415,8 +469,7 @@ void DeclarationVisitor::Visit(TryLabelStatement* stmt) {
ReportError("no constexpr type allowed for label arguments"); ReportError("no constexpr type allowed for label arguments");
} }
shared_label->AddVariable( shared_label->AddVariable(DeclareVariable(p, type, false));
declarations()->DeclareVariable(p, type, false));
++i; ++i;
} }
} }
...@@ -556,8 +609,7 @@ void DeclarationVisitor::DeclareSignature(const Signature& signature) { ...@@ -556,8 +609,7 @@ void DeclarationVisitor::DeclareSignature(const Signature& signature) {
for (auto name : signature.parameter_names) { for (auto name : signature.parameter_names) {
const Type* t(*type_iterator++); const Type* t(*type_iterator++);
if (name.size() != 0) { if (name.size() != 0) {
declarations()->DeclareParameter(name, GetParameterVariableFromName(name), DeclareParameter(name, t);
t);
} }
} }
for (auto& label : signature.labels) { for (auto& label : signature.labels) {
...@@ -570,8 +622,7 @@ void DeclarationVisitor::DeclareSignature(const Signature& signature) { ...@@ -570,8 +622,7 @@ void DeclarationVisitor::DeclareSignature(const Signature& signature) {
} }
std::string var_name = label.name + std::to_string(i++); std::string var_name = label.name + std::to_string(i++);
new_label->AddVariable( new_label->AddVariable(DeclareVariable(var_name, var_type, false));
declarations()->DeclareVariable(var_name, var_type, false));
} }
} }
} }
......
...@@ -108,6 +108,10 @@ class DeclarationVisitor : public FileVisitor { ...@@ -108,6 +108,10 @@ class DeclarationVisitor : public FileVisitor {
void Visit(VarDeclarationStatement* stmt); void Visit(VarDeclarationStatement* stmt);
void Visit(ExternConstDeclaration* decl); void Visit(ExternConstDeclaration* decl);
void Visit(StructDeclaration* decl);
void Visit(StructExpression* decl) {}
void Visit(LogicalOrExpression* expr); void Visit(LogicalOrExpression* expr);
void Visit(LogicalAndExpression* expr); void Visit(LogicalAndExpression* expr);
void DeclareExpressionForBranch(Expression* node); void DeclareExpressionForBranch(Expression* node);
...@@ -148,6 +152,10 @@ class DeclarationVisitor : public FileVisitor { ...@@ -148,6 +152,10 @@ class DeclarationVisitor : public FileVisitor {
live_and_changed_variables_.push_back(live_and_changed); live_and_changed_variables_.push_back(live_and_changed);
} }
Variable* DeclareVariable(const std::string& name, const Type* type,
bool is_const);
Parameter* DeclareParameter(const std::string& name, const Type* type);
std::set<const Variable*> PopControlSplit() { std::set<const Variable*> PopControlSplit() {
auto result = live_and_changed_variables_.back().changed; auto result = live_and_changed_variables_.back().changed;
live_and_changed_variables_.pop_back(); live_and_changed_variables_.pop_back();
......
...@@ -224,6 +224,12 @@ void Declarations::DeclareType(const std::string& name, const Type* type) { ...@@ -224,6 +224,12 @@ void Declarations::DeclareType(const std::string& name, const Type* type) {
Declare(name, std::unique_ptr<TypeAlias>(result)); Declare(name, std::unique_ptr<TypeAlias>(result));
} }
void Declarations::DeclareStruct(Module* module, const std::string& name,
const std::vector<NameAndType>& fields) {
const StructType* new_type = TypeOracle::GetStructType(module, name, fields);
DeclareType(name, new_type);
}
Label* Declarations::DeclareLabel(const std::string& name) { Label* Declarations::DeclareLabel(const std::string& name) {
CheckAlreadyDeclared(name, "label"); CheckAlreadyDeclared(name, "label");
Label* result = new Label(name); Label* result = new Label(name);
...@@ -289,7 +295,9 @@ RuntimeFunction* Declarations::DeclareRuntimeFunction( ...@@ -289,7 +295,9 @@ RuntimeFunction* Declarations::DeclareRuntimeFunction(
Variable* Declarations::DeclareVariable(const std::string& var, Variable* Declarations::DeclareVariable(const std::string& var,
const Type* type, bool is_const) { const Type* type, bool is_const) {
std::string name(var + std::to_string(GetNextUniqueDeclarationNumber())); std::string name(var + "_" +
std::to_string(GetNextUniqueDeclarationNumber()));
std::replace(name.begin(), name.end(), '.', '_');
CheckAlreadyDeclared(var, "variable"); CheckAlreadyDeclared(var, "variable");
Variable* result = new Variable(var, name, type, is_const); Variable* result = new Variable(var, name, type, is_const);
Declare(var, std::unique_ptr<Declarable>(result)); Declare(var, std::unique_ptr<Declarable>(result));
......
...@@ -76,6 +76,9 @@ class Declarations { ...@@ -76,6 +76,9 @@ class Declarations {
void DeclareType(const std::string& name, const Type* type); void DeclareType(const std::string& name, const Type* type);
void DeclareStruct(Module* module, const std::string& name,
const std::vector<NameAndType>& fields);
Label* DeclareLabel(const std::string& name); Label* DeclareLabel(const std::string& name);
Macro* DeclareMacro(const std::string& name, const Signature& signature, Macro* DeclareMacro(const std::string& name, const Signature& signature,
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include <algorithm>
#include "src/torque/implementation-visitor.h" #include "src/torque/implementation-visitor.h"
#include "src/torque/parameter-difference.h" #include "src/torque/parameter-difference.h"
...@@ -188,6 +190,18 @@ void ImplementationVisitor::Visit(ConstDeclaration* decl) { ...@@ -188,6 +190,18 @@ void ImplementationVisitor::Visit(ConstDeclaration* decl) {
source_out() << "}\n\n"; source_out() << "}\n\n";
} }
void ImplementationVisitor::Visit(StructDeclaration* decl) {
header_out() << " struct " << decl->name << " {\n";
const StructType* struct_type =
static_cast<const StructType*>(declarations()->LookupType(decl->name));
for (auto& field : struct_type->fields()) {
header_out() << " " << field.type->GetGeneratedTypeName();
header_out() << " " << field.name << ";\n";
}
header_out() << " } "
<< ";\n";
}
void ImplementationVisitor::Visit(TorqueMacroDeclaration* decl, void ImplementationVisitor::Visit(TorqueMacroDeclaration* decl,
const Signature& sig, Statement* body) { const Signature& sig, Statement* body) {
Signature signature = MakeSignature(decl->signature.get()); Signature signature = MakeSignature(decl->signature.get());
...@@ -246,7 +260,8 @@ void ImplementationVisitor::Visit(TorqueMacroDeclaration* decl, ...@@ -246,7 +260,8 @@ void ImplementationVisitor::Visit(TorqueMacroDeclaration* decl,
if (result_var != nullptr) { if (result_var != nullptr) {
GenerateIndent(); GenerateIndent();
source_out() << "return " source_out() << "return "
<< VisitResult(result_var->type(), result_var).RValue() << RValueFlattenStructs(
VisitResult(result_var->type(), result_var))
<< ";" << std::endl; << ";" << std::endl;
} }
source_out() << "}" << std::endl << std::endl; source_out() << "}" << std::endl << std::endl;
...@@ -335,7 +350,7 @@ VisitResult ImplementationVisitor::Visit(ConditionalExpression* expr) { ...@@ -335,7 +350,7 @@ VisitResult ImplementationVisitor::Visit(ConditionalExpression* expr) {
source_out() << "" << std::endl; source_out() << "" << std::endl;
left = Visit(expr->if_true); left = Visit(expr->if_true);
GenerateIndent(); GenerateIndent();
source_out() << "return " << left.RValue() << ";" << std::endl; source_out() << "return " << RValueFlattenStructs(left) << ";" << std::endl;
} }
source_out() << ";" << std::endl; source_out() << ";" << std::endl;
GenerateIndent(); GenerateIndent();
...@@ -345,7 +360,8 @@ VisitResult ImplementationVisitor::Visit(ConditionalExpression* expr) { ...@@ -345,7 +360,8 @@ VisitResult ImplementationVisitor::Visit(ConditionalExpression* expr) {
source_out() << "" << std::endl; source_out() << "" << std::endl;
right = Visit(expr->if_false); right = Visit(expr->if_false);
GenerateIndent(); GenerateIndent();
source_out() << "return " << right.RValue() << ";" << std::endl; source_out() << "return " << RValueFlattenStructs(right) << ";"
<< std::endl;
} }
source_out() << ";" << std::endl; source_out() << ";" << std::endl;
...@@ -397,7 +413,7 @@ VisitResult ImplementationVisitor::Visit(LogicalOrExpression* expr) { ...@@ -397,7 +413,7 @@ VisitResult ImplementationVisitor::Visit(LogicalOrExpression* expr) {
if (left_result.type()->IsBool()) { if (left_result.type()->IsBool()) {
Label* true_label = declarations()->LookupLabel(kTrueLabelName); Label* true_label = declarations()->LookupLabel(kTrueLabelName);
GenerateIndent(); GenerateIndent();
source_out() << "GotoIf(" << left_result.RValue() << ", " source_out() << "GotoIf(" << RValueFlattenStructs(left_result) << ", "
<< true_label->generated() << ");" << std::endl; << true_label->generated() << ");" << std::endl;
} else if (!left_result.type()->IsConstexprBool()) { } else if (!left_result.type()->IsConstexprBool()) {
GenerateLabelBind(false_label); GenerateLabelBind(false_label);
...@@ -412,9 +428,9 @@ VisitResult ImplementationVisitor::Visit(LogicalOrExpression* expr) { ...@@ -412,9 +428,9 @@ VisitResult ImplementationVisitor::Visit(LogicalOrExpression* expr) {
ReportError(stream.str()); ReportError(stream.str());
} }
if (left_result.type()->IsConstexprBool()) { if (left_result.type()->IsConstexprBool()) {
return VisitResult(left_result.type(), std::string("(") + return VisitResult(left_result.type(),
left_result.RValue() + " || " + std::string("(") + RValueFlattenStructs(left_result) +
right_result.RValue() + ")"); " || " + RValueFlattenStructs(right_result) + ")");
} else { } else {
return right_result; return right_result;
} }
...@@ -430,7 +446,7 @@ VisitResult ImplementationVisitor::Visit(LogicalAndExpression* expr) { ...@@ -430,7 +446,7 @@ VisitResult ImplementationVisitor::Visit(LogicalAndExpression* expr) {
if (left_result.type()->IsBool()) { if (left_result.type()->IsBool()) {
Label* false_label = declarations()->LookupLabel(kFalseLabelName); Label* false_label = declarations()->LookupLabel(kFalseLabelName);
GenerateIndent(); GenerateIndent();
source_out() << "GotoIfNot(" << left_result.RValue() << ", " source_out() << "GotoIfNot(" << RValueFlattenStructs(left_result) << ", "
<< false_label->generated() << ");" << std::endl; << false_label->generated() << ");" << std::endl;
} else if (!left_result.type()->IsConstexprBool()) { } else if (!left_result.type()->IsConstexprBool()) {
GenerateLabelBind(true_label); GenerateLabelBind(true_label);
...@@ -445,9 +461,9 @@ VisitResult ImplementationVisitor::Visit(LogicalAndExpression* expr) { ...@@ -445,9 +461,9 @@ VisitResult ImplementationVisitor::Visit(LogicalAndExpression* expr) {
ReportError(stream.str()); ReportError(stream.str());
} }
if (left_result.type()->IsConstexprBool()) { if (left_result.type()->IsConstexprBool()) {
return VisitResult(left_result.type(), std::string("(") + return VisitResult(left_result.type(),
left_result.RValue() + " && " + std::string("(") + RValueFlattenStructs(left_result) +
right_result.RValue() + ")"); " && " + RValueFlattenStructs(right_result) + ")");
} else { } else {
return right_result; return right_result;
} }
...@@ -591,7 +607,8 @@ const Type* ImplementationVisitor::Visit(IfStatement* stmt) { ...@@ -591,7 +607,8 @@ const Type* ImplementationVisitor::Visit(IfStatement* stmt) {
const Type* right_result = TypeOracle::GetVoidType(); const Type* right_result = TypeOracle::GetVoidType();
{ {
GenerateIndent(); GenerateIndent();
source_out() << "if ((" << expression_result.RValue() << ")) "; source_out() << "if ((" << RValueFlattenStructs(expression_result)
<< ")) ";
ScopedIndent indent(this, false); ScopedIndent indent(this, false);
source_out() << std::endl; source_out() << std::endl;
left_result = Visit(stmt->if_true); left_result = Visit(stmt->if_true);
...@@ -807,11 +824,12 @@ const Type* ImplementationVisitor::Visit(ReturnStatement* stmt) { ...@@ -807,11 +824,12 @@ const Type* ImplementationVisitor::Visit(ReturnStatement* stmt) {
} else if (current_callable->IsBuiltin()) { } else if (current_callable->IsBuiltin()) {
if (Builtin::cast(current_callable)->IsVarArgsJavaScript()) { if (Builtin::cast(current_callable)->IsVarArgsJavaScript()) {
GenerateIndent(); GenerateIndent();
source_out() << "arguments->PopAndReturn(" << return_result.RValue() source_out() << "arguments->PopAndReturn("
<< ");" << std::endl; << RValueFlattenStructs(return_result) << ");"
<< std::endl;
} else { } else {
GenerateIndent(); GenerateIndent();
source_out() << "Return(" << return_result.RValue() << ");" source_out() << "Return(" << RValueFlattenStructs(return_result) << ");"
<< std::endl; << std::endl;
} }
} else { } else {
...@@ -1070,7 +1088,10 @@ void ImplementationVisitor::GenerateFunctionDeclaration( ...@@ -1070,7 +1088,10 @@ void ImplementationVisitor::GenerateFunctionDeclaration(
// Quite a hack here. Make sure that TNode is namespace qualified if the // Quite a hack here. Make sure that TNode is namespace qualified if the
// macro/constant name is also qualified. // macro/constant name is also qualified.
std::string return_type_name(signature.return_type->GetGeneratedTypeName()); std::string return_type_name(signature.return_type->GetGeneratedTypeName());
if (macro_prefix != "" && (return_type_name.length() > 5) && if (const StructType* struct_type =
StructType::DynamicCast(signature.return_type)) {
o << GetDSLAssemblerName(struct_type->module()) << "::";
} else if (macro_prefix != "" && (return_type_name.length() > 5) &&
(return_type_name.substr(0, 5) == "TNode")) { (return_type_name.substr(0, 5) == "TNode")) {
o << "compiler::"; o << "compiler::";
} }
...@@ -1220,21 +1241,33 @@ Callable* ImplementationVisitor::LookupCall(const std::string& name, ...@@ -1220,21 +1241,33 @@ Callable* ImplementationVisitor::LookupCall(const std::string& name,
return result; return result;
} }
void ImplementationVisitor::GetFlattenedStructsVars(
const Variable* base, std::set<const Variable*>& vars) {
const Type* type = base->type();
if (base->IsConst()) return;
if (type->IsStructType()) {
const StructType* struct_type = StructType::cast(type);
for (auto& field : struct_type->fields()) {
std::string field_var_name = base->name() + "." + field.name;
GetFlattenedStructsVars(
Variable::cast(declarations()->LookupValue(field_var_name)), vars);
}
} else {
vars.insert(base);
}
}
void ImplementationVisitor::GenerateChangedVarsFromControlSplit(AstNode* node) { void ImplementationVisitor::GenerateChangedVarsFromControlSplit(AstNode* node) {
const std::set<const Variable*>& changed_vars = const std::set<const Variable*>& changed_vars =
global_context_.GetControlSplitChangedVariables( global_context_.GetControlSplitChangedVariables(
node, declarations()->GetCurrentSpecializationTypeNamesVector()); node, declarations()->GetCurrentSpecializationTypeNamesVector());
source_out() << "{"; std::set<const Variable*> flattened_vars;
bool first = true;
for (auto v : changed_vars) { for (auto v : changed_vars) {
if (v->IsConst()) continue; GetFlattenedStructsVars(v, flattened_vars);
if (first) {
first = false;
} else {
source_out() << ", ";
}
source_out() << v->value();
} }
source_out() << "{";
PrintCommaSeparatedList(source_out(), flattened_vars,
[&](const Variable* v) { return v->value(); });
source_out() << "}"; source_out() << "}";
} }
...@@ -1254,12 +1287,42 @@ const Type* ImplementationVisitor::GetCommonType(const Type* left, ...@@ -1254,12 +1287,42 @@ const Type* ImplementationVisitor::GetCommonType(const Type* left,
VisitResult ImplementationVisitor::GenerateCopy(const VisitResult& to_copy) { VisitResult ImplementationVisitor::GenerateCopy(const VisitResult& to_copy) {
std::string temp = GenerateNewTempVariable(to_copy.type()); std::string temp = GenerateNewTempVariable(to_copy.type());
source_out() << to_copy.RValue() << ";" << std::endl; source_out() << RValueFlattenStructs(to_copy) << ";" << std::endl;
GenerateIndent(); GenerateIndent();
source_out() << "USE(" << temp << ");" << std::endl; source_out() << "USE(" << temp << ");" << std::endl;
return VisitResult(to_copy.type(), temp); return VisitResult(to_copy.type(), temp);
} }
VisitResult ImplementationVisitor::Visit(StructExpression* decl) {
const Type* raw_type = declarations()->LookupType(decl->name);
if (!raw_type->IsStructType()) {
std::stringstream s;
s << decl->name << " is not a struct but used like one ";
ReportError(s.str());
}
const StructType* struct_type = StructType::cast(raw_type);
if (struct_type->fields().size() != decl->expressions.size()) {
std::stringstream s;
s << "initializer count mismatch for struct " << decl->name << " (expected "
<< struct_type->fields().size() << ", found " << decl->expressions.size()
<< ")";
ReportError(s.str());
}
std::vector<VisitResult> expression_results;
for (auto& field : struct_type->fields()) {
VisitResult value = Visit(decl->expressions[expression_results.size()]);
value = GenerateImplicitConvert(field.type, value);
expression_results.push_back(value);
}
std::string result_var_name = GenerateNewTempVariable(struct_type);
source_out() << "{";
PrintCommaSeparatedList(
source_out(), expression_results,
[&](const VisitResult& result) { return RValueFlattenStructs(result); });
source_out() << "};\n";
return VisitResult(struct_type, result_var_name);
}
LocationReference ImplementationVisitor::GetLocationReference( LocationReference ImplementationVisitor::GetLocationReference(
LocationExpression* location) { LocationExpression* location) {
switch (location->kind) { switch (location->kind) {
...@@ -1276,6 +1339,47 @@ LocationReference ImplementationVisitor::GetLocationReference( ...@@ -1276,6 +1339,47 @@ LocationReference ImplementationVisitor::GetLocationReference(
} }
} }
LocationReference ImplementationVisitor::GetLocationReference(
FieldAccessExpression* expr) {
VisitResult result = Visit(expr->object);
if (result.type()->IsStructType()) {
if (result.declarable()) {
return LocationReference(
declarations()->LookupValue((*result.declarable())->name() + "." +
expr->field),
{}, {});
} else {
return LocationReference(
nullptr,
VisitResult(result.type(), result.RValue() + "." + expr->field), {});
}
}
return LocationReference(nullptr, result, {});
}
std::string ImplementationVisitor::RValueFlattenStructs(VisitResult result) {
if (result.declarable()) {
const Value* value = *result.declarable();
const Type* type = value->type();
if (const StructType* struct_type = StructType::DynamicCast(type)) {
std::stringstream s;
s << struct_type->name() << "{";
PrintCommaSeparatedList(
s, struct_type->fields(), [&](const NameAndType& field) {
std::string field_declaration = value->name() + "." + field.name;
Variable* field_variable =
Variable::cast(declarations()->LookupValue(field_declaration));
return RValueFlattenStructs(
VisitResult(field_variable->type(), field_variable));
});
s << "}";
return s.str();
}
}
return result.RValue();
}
VisitResult ImplementationVisitor::GenerateFetchFromLocation( VisitResult ImplementationVisitor::GenerateFetchFromLocation(
LocationExpression* location, LocationReference reference) { LocationExpression* location, LocationReference reference) {
switch (location->kind) { switch (location->kind) {
...@@ -1293,28 +1397,77 @@ VisitResult ImplementationVisitor::GenerateFetchFromLocation( ...@@ -1293,28 +1397,77 @@ VisitResult ImplementationVisitor::GenerateFetchFromLocation(
} }
} }
VisitResult ImplementationVisitor::GenerateFetchFromLocation(
FieldAccessExpression* expr, LocationReference reference) {
const Type* type = reference.base.type();
if (reference.value != nullptr) {
return GenerateFetchFromLocation(reference);
} else if (const StructType* struct_type = StructType::DynamicCast(type)) {
auto& fields = struct_type->fields();
auto i = std::find_if(
fields.begin(), fields.end(),
[&](const NameAndType& f) { return f.name == expr->field; });
if (i == fields.end()) {
std::stringstream s;
s << "\"" << expr->field << "\" is not a field of struct type \""
<< struct_type->name() << "\"";
ReportError(s.str());
}
return VisitResult(i->type, reference.base.RValue());
} else {
Arguments arguments;
arguments.parameters = {reference.base};
return GenerateCall(std::string(".") + expr->field, arguments);
}
}
void ImplementationVisitor::GenerateAssignToVariable(Variable* var, void ImplementationVisitor::GenerateAssignToVariable(Variable* var,
VisitResult value) { VisitResult value) {
if (var->type()->IsStructType()) {
if (value.type() != var->type()) {
std::stringstream s;
s << "incompatable assignment from type " << *value.type() << " to "
<< *var->type();
ReportError(s.str());
}
const StructType* struct_type = StructType::cast(var->type());
for (auto& field : struct_type->fields()) {
std::string field_declaration = var->name() + "." + field.name;
Variable* field_variable =
Variable::cast(declarations()->LookupValue(field_declaration));
if (value.declarable() && (*value.declarable())->IsVariable()) {
Variable* source_field = Variable::cast(declarations()->LookupValue(
Variable::cast((*value.declarable()))->name() + "." + field.name));
GenerateAssignToVariable(
field_variable, VisitResult{source_field->type(), source_field});
} else {
GenerateAssignToVariable(
field_variable, VisitResult{field_variable->type(),
value.RValue() + "." + field.name});
}
}
} else {
VisitResult casted_value = GenerateImplicitConvert(var->type(), value); VisitResult casted_value = GenerateImplicitConvert(var->type(), value);
GenerateIndent(); GenerateIndent();
VisitResult variable_result = {var->type(), var}; VisitResult var_value = {var->type(), var};
source_out() << variable_result.LValue() << " = " << casted_value.RValue() source_out() << var_value.LValue() << " = "
<< ";\n"; << RValueFlattenStructs(casted_value) << ";" << std::endl;
}
var->Define(); var->Define();
} }
void ImplementationVisitor::GenerateAssignToLocation( void ImplementationVisitor::GenerateAssignToLocation(
LocationExpression* location, const LocationReference& reference, LocationExpression* location, const LocationReference& reference,
VisitResult assignment_value) { VisitResult assignment_value) {
if (IdentifierExpression::cast(location)) { if (reference.value != nullptr) {
Value* value = reference.value; Value* value = reference.value;
if (value->IsConst()) { Variable* var = Variable::cast(value);
if (var->IsConst()) {
std::stringstream s; std::stringstream s;
s << "\"" << value->name() s << "\"" << var->name()
<< "\" is declared const (maybe implicitly) and cannot be assigned to"; << "\" is declared const (maybe implicitly) and cannot be assigned to";
ReportError(s.str()); ReportError(s.str());
} }
Variable* var = Variable::cast(value);
GenerateAssignToVariable(var, assignment_value); GenerateAssignToVariable(var, assignment_value);
} else if (auto access = FieldAccessExpression::cast(location)) { } else if (auto access = FieldAccessExpression::cast(location)) {
GenerateCall(std::string(".") + access->field + "=", GenerateCall(std::string(".") + access->field + "=",
...@@ -1326,6 +1479,36 @@ void ImplementationVisitor::GenerateAssignToLocation( ...@@ -1326,6 +1479,36 @@ void ImplementationVisitor::GenerateAssignToLocation(
} }
} }
void ImplementationVisitor::GenerateVariableDeclaration(const Variable* var) {
const Type* var_type = var->type();
if (var_type->IsStructType()) {
const StructType* struct_type = StructType::cast(var_type);
for (auto& field : struct_type->fields()) {
GenerateVariableDeclaration(Variable::cast(
declarations()->LookupValue(var->name() + "." + field.name)));
}
} else {
std::string value = var->value();
GenerateIndent();
if (var_type->IsConstexpr()) {
source_out() << var_type->GetGeneratedTypeName();
source_out() << " " << value << "_impl;" << std::endl;
} else if (var->IsConst()) {
source_out() << "TNode<" << var->type()->GetGeneratedTNodeTypeName();
source_out() << "> " << var->value() << "_impl;\n";
} else {
source_out() << "TVARIABLE(";
source_out() << var_type->GetGeneratedTNodeTypeName();
source_out() << ", " << value << "_impl);" << std::endl;
}
GenerateIndent();
source_out() << "auto " << value << " = &" << value << "_impl;"
<< std::endl;
GenerateIndent();
source_out() << "USE(" << value << ");" << std::endl;
}
}
Variable* ImplementationVisitor::GenerateVariableDeclaration( Variable* ImplementationVisitor::GenerateVariableDeclaration(
AstNode* node, const std::string& name, AstNode* node, const std::string& name,
const base::Optional<const Type*>& type, const base::Optional<const Type*>& type,
...@@ -1344,24 +1527,7 @@ Variable* ImplementationVisitor::GenerateVariableDeclaration( ...@@ -1344,24 +1527,7 @@ Variable* ImplementationVisitor::GenerateVariableDeclaration(
node, declarations()->GetCurrentSpecializationTypeNamesVector(), node, declarations()->GetCurrentSpecializationTypeNamesVector(),
variable); variable);
} }
GenerateVariableDeclaration(variable);
GenerateIndent();
if (variable->type()->IsConstexpr()) {
source_out() << variable->type()->GetGeneratedTypeName();
source_out() << " " << variable->value() << "_impl;\n";
} else if (variable->IsConst()) {
source_out() << "TNode<" << variable->type()->GetGeneratedTNodeTypeName();
source_out() << "> " << variable->value() << "_impl;\n";
} else {
source_out() << "TVARIABLE(";
source_out() << variable->type()->GetGeneratedTNodeTypeName();
source_out() << ", " << variable->value() << "_impl);\n";
}
GenerateIndent();
source_out() << "auto " << variable->value() << " = &" << variable->value()
<< "_impl;\n";
GenerateIndent();
source_out() << "USE(" << variable->value() << ");\n";
if (initialization) { if (initialization) {
GenerateAssignToVariable(variable, *initialization); GenerateAssignToVariable(variable, *initialization);
} }
...@@ -1431,7 +1597,7 @@ VisitResult ImplementationVisitor::GeneratePointerCall( ...@@ -1431,7 +1597,7 @@ VisitResult ImplementationVisitor::GeneratePointerCall(
const Type* to_type = type->parameter_types()[current]; const Type* to_type = type->parameter_types()[current];
VisitResult result = VisitResult result =
GenerateImplicitConvert(to_type, arguments.parameters[current]); GenerateImplicitConvert(to_type, arguments.parameters[current]);
variables.push_back(result.RValue()); variables.push_back(RValueFlattenStructs(result));
} }
std::string result_variable_name; std::string result_variable_name;
...@@ -1439,11 +1605,16 @@ VisitResult ImplementationVisitor::GeneratePointerCall( ...@@ -1439,11 +1605,16 @@ VisitResult ImplementationVisitor::GeneratePointerCall(
if (no_result) { if (no_result) {
GenerateIndent(); GenerateIndent();
} else { } else {
result_variable_name = GenerateNewTempVariable(type->return_type()); const Type* return_type = type->return_type();
result_variable_name = GenerateNewTempVariable(return_type);
if (return_type->IsStructType()) {
source_out() << "(";
} else {
source_out() << "UncheckedCast<"; source_out() << "UncheckedCast<";
source_out() << type->return_type()->GetGeneratedTNodeTypeName(); source_out() << type->return_type()->GetGeneratedTNodeTypeName();
source_out() << ">("; source_out() << ">(";
} }
}
Builtin* example_builtin = Builtin* example_builtin =
declarations()->FindSomeInternalBuiltinWithType(type); declarations()->FindSomeInternalBuiltinWithType(type);
...@@ -1460,7 +1631,7 @@ VisitResult ImplementationVisitor::GeneratePointerCall( ...@@ -1460,7 +1631,7 @@ VisitResult ImplementationVisitor::GeneratePointerCall(
} }
source_out() << "Builtins::CallableFor(isolate(), Builtins::k" source_out() << "Builtins::CallableFor(isolate(), Builtins::k"
<< example_builtin->name() << ").descriptor(), " << example_builtin->name() << ").descriptor(), "
<< callee_result.RValue() << ", "; << RValueFlattenStructs(callee_result) << ", ";
size_t total_parameters = 0; size_t total_parameters = 0;
for (size_t i = 0; i < arguments.parameters.size(); ++i) { for (size_t i = 0; i < arguments.parameters.size(); ++i) {
...@@ -1499,7 +1670,7 @@ VisitResult ImplementationVisitor::GenerateCall( ...@@ -1499,7 +1670,7 @@ VisitResult ImplementationVisitor::GenerateCall(
: callable->signature().types()[current]; : callable->signature().types()[current];
VisitResult result = VisitResult result =
GenerateImplicitConvert(to_type, arguments.parameters[current]); GenerateImplicitConvert(to_type, arguments.parameters[current]);
variables.push_back(result.RValue()); variables.push_back(RValueFlattenStructs(result));
} }
std::string result_variable_name; std::string result_variable_name;
...@@ -1508,11 +1679,15 @@ VisitResult ImplementationVisitor::GenerateCall( ...@@ -1508,11 +1679,15 @@ VisitResult ImplementationVisitor::GenerateCall(
} else { } else {
result_variable_name = GenerateNewTempVariable(result_type); result_variable_name = GenerateNewTempVariable(result_type);
if (!result_type->IsConstexpr()) { if (!result_type->IsConstexpr()) {
if (result_type->IsStructType()) {
source_out() << "(";
} else {
source_out() << "UncheckedCast<"; source_out() << "UncheckedCast<";
source_out() << result_type->GetGeneratedTNodeTypeName(); source_out() << result_type->GetGeneratedTNodeTypeName();
source_out() << ">("; source_out() << ">(";
} }
} }
}
if (callable->IsBuiltin()) { if (callable->IsBuiltin()) {
if (is_tailcall) { if (is_tailcall) {
source_out() << "TailCallBuiltin(Builtins::k" << callable->name() << ", "; source_out() << "TailCallBuiltin(Builtins::k" << callable->name() << ", ";
...@@ -1663,7 +1838,7 @@ VisitResult ImplementationVisitor::Visit(CallExpression* expr, ...@@ -1663,7 +1838,7 @@ VisitResult ImplementationVisitor::Visit(CallExpression* expr,
} }
if (!result.type()->IsVoidOrNever()) { if (!result.type()->IsVoidOrNever()) {
GenerateIndent(); GenerateIndent();
source_out() << "USE(" << result.RValue() << ");" << std::endl; source_out() << "USE(" << RValueFlattenStructs(result) << ");" << std::endl;
} }
if (is_tailcall) { if (is_tailcall) {
result = {TypeOracle::GetNeverType(), ""}; result = {TypeOracle::GetNeverType(), ""};
...@@ -1695,7 +1870,7 @@ void ImplementationVisitor::GenerateBranch(const VisitResult& condition, ...@@ -1695,7 +1870,7 @@ void ImplementationVisitor::GenerateBranch(const VisitResult& condition,
Label* true_label, Label* true_label,
Label* false_label) { Label* false_label) {
GenerateIndent(); GenerateIndent();
source_out() << "Branch(" << condition.RValue() << ", " source_out() << "Branch(" << RValueFlattenStructs(condition) << ", "
<< true_label->generated() << ", " << false_label->generated() << true_label->generated() << ", " << false_label->generated()
<< ");" << std::endl; << ");" << std::endl;
} }
......
...@@ -37,35 +37,31 @@ class ImplementationVisitor : public FileVisitor { ...@@ -37,35 +37,31 @@ class ImplementationVisitor : public FileVisitor {
const Type* Visit(Statement* stmt); const Type* Visit(Statement* stmt);
void Visit(Declaration* decl); void Visit(Declaration* decl);
VisitResult Visit(StructExpression* decl);
LocationReference GetLocationReference(LocationExpression* location); LocationReference GetLocationReference(LocationExpression* location);
LocationReference GetLocationReference(IdentifierExpression* expr) { LocationReference GetLocationReference(IdentifierExpression* expr) {
return LocationReference(declarations()->LookupValue(expr->name), {}, {}); return LocationReference(declarations()->LookupValue(expr->name), {}, {});
} }
LocationReference GetLocationReference(FieldAccessExpression* expr) { LocationReference GetLocationReference(FieldAccessExpression* expr);
return LocationReference({}, Visit(expr->object), {});
}
LocationReference GetLocationReference(ElementAccessExpression* expr) { LocationReference GetLocationReference(ElementAccessExpression* expr) {
return LocationReference({}, Visit(expr->array), Visit(expr->index)); return LocationReference({}, Visit(expr->array), Visit(expr->index));
} }
std::string RValueFlattenStructs(VisitResult result);
VisitResult GenerateFetchFromLocation(LocationReference reference) {
const Value* value = reference.value;
return VisitResult(value->type(), value);
}
VisitResult GenerateFetchFromLocation(LocationExpression* location, VisitResult GenerateFetchFromLocation(LocationExpression* location,
LocationReference reference); LocationReference reference);
VisitResult GenerateFetchFromLocation(IdentifierExpression* expr, VisitResult GenerateFetchFromLocation(IdentifierExpression* expr,
LocationReference reference) { LocationReference reference) {
Value* value = reference.value; return GenerateFetchFromLocation(reference);
if (value->IsVariable() && !Variable::cast(value)->IsDefined()) {
std::stringstream s;
s << "\"" << value->name() << "\" is used before it is defined";
ReportError(s.str());
}
return VisitResult(value->type(), value);
} }
VisitResult GenerateFetchFromLocation(FieldAccessExpression* expr, VisitResult GenerateFetchFromLocation(FieldAccessExpression* expr,
LocationReference reference) { LocationReference reference);
Arguments arguments;
arguments.parameters = {reference.base};
return GenerateCall(std::string(".") + expr->field, arguments);
}
VisitResult GenerateFetchFromLocation(ElementAccessExpression* expr, VisitResult GenerateFetchFromLocation(ElementAccessExpression* expr,
LocationReference reference) { LocationReference reference) {
Arguments arguments; Arguments arguments;
...@@ -93,6 +89,7 @@ class ImplementationVisitor : public FileVisitor { ...@@ -93,6 +89,7 @@ class ImplementationVisitor : public FileVisitor {
void Visit(TypeDeclaration* decl) {} void Visit(TypeDeclaration* decl) {}
void Visit(TypeAliasDeclaration* decl) {} void Visit(TypeAliasDeclaration* decl) {}
void Visit(ExternConstDeclaration* decl) {} void Visit(ExternConstDeclaration* decl) {}
void Visit(StructDeclaration* decl);
void Visit(StandardDeclaration* decl); void Visit(StandardDeclaration* decl);
void Visit(GenericDeclaration* decl) {} void Visit(GenericDeclaration* decl) {}
void Visit(SpecializationDeclaration* decl); void Visit(SpecializationDeclaration* decl);
...@@ -176,6 +173,11 @@ class ImplementationVisitor : public FileVisitor { ...@@ -176,6 +173,11 @@ class ImplementationVisitor : public FileVisitor {
Callable* LookupCall(const std::string& name, const Arguments& arguments); Callable* LookupCall(const std::string& name, const Arguments& arguments);
bool GenerateChangedVarFromControlSplit(const Variable* v, bool first = true);
void GetFlattenedStructsVars(const Variable* base,
std::set<const Variable*>& vars);
void GenerateChangedVarsFromControlSplit(AstNode* node); void GenerateChangedVarsFromControlSplit(AstNode* node);
const Type* GetCommonType(const Type* left, const Type* right); const Type* GetCommonType(const Type* left, const Type* right);
...@@ -188,6 +190,8 @@ class ImplementationVisitor : public FileVisitor { ...@@ -188,6 +190,8 @@ class ImplementationVisitor : public FileVisitor {
const LocationReference& reference, const LocationReference& reference,
VisitResult assignment_value); VisitResult assignment_value);
void GenerateVariableDeclaration(const Variable* var);
Variable* GenerateVariableDeclaration( Variable* GenerateVariableDeclaration(
AstNode* node, const std::string& name, AstNode* node, const std::string& name,
const base::Optional<const Type*>& type, const base::Optional<const Type*>& type,
......
...@@ -29,6 +29,14 @@ class TypeOracle : public ContextualClass<TypeOracle> { ...@@ -29,6 +29,14 @@ class TypeOracle : public ContextualClass<TypeOracle> {
return result; return result;
} }
static const StructType* GetStructType(
Module* module, const std::string& name,
const std::vector<NameAndType>& fields) {
StructType* result = new StructType(module, name, fields);
Get().struct_types_.push_back(std::unique_ptr<StructType>(result));
return result;
}
static const FunctionPointerType* GetFunctionPointerType( static const FunctionPointerType* GetFunctionPointerType(
TypeVector argument_types, const Type* return_type) { TypeVector argument_types, const Type* return_type) {
const Type* code_type = Get().GetBuiltinType(CODE_TYPE_STRING); const Type* code_type = Get().GetBuiltinType(CODE_TYPE_STRING);
...@@ -101,6 +109,7 @@ class TypeOracle : public ContextualClass<TypeOracle> { ...@@ -101,6 +109,7 @@ class TypeOracle : public ContextualClass<TypeOracle> {
Deduplicator<FunctionPointerType> function_pointer_types_; Deduplicator<FunctionPointerType> function_pointer_types_;
Deduplicator<UnionType> union_types_; Deduplicator<UnionType> union_types_;
std::vector<std::unique_ptr<Type>> nominal_types_; std::vector<std::unique_ptr<Type>> nominal_types_;
std::vector<std::unique_ptr<Type>> struct_types_;
}; };
} // namespace torque } // namespace torque
......
...@@ -154,6 +154,14 @@ const Type* UnionType::NonConstexprVersion() const { ...@@ -154,6 +154,14 @@ const Type* UnionType::NonConstexprVersion() const {
return this; return this;
} }
std::string StructType::ToExplicitString() const {
std::stringstream result;
result << "{";
PrintCommaSeparatedList(result, fields_);
result << "}";
return result.str();
}
void PrintSignature(std::ostream& os, const Signature& sig, bool with_names) { void PrintSignature(std::ostream& os, const Signature& sig, bool with_names) {
os << "("; os << "(";
for (size_t i = 0; i < sig.parameter_types.types.size(); ++i) { for (size_t i = 0; i < sig.parameter_types.types.size(); ++i) {
...@@ -181,6 +189,13 @@ void PrintSignature(std::ostream& os, const Signature& sig, bool with_names) { ...@@ -181,6 +189,13 @@ void PrintSignature(std::ostream& os, const Signature& sig, bool with_names) {
} }
} }
std::ostream& operator<<(std::ostream& os, const NameAndType& name_and_type) {
os << name_and_type.name;
os << ": ";
os << *name_and_type.type;
return os;
}
std::ostream& operator<<(std::ostream& os, const Signature& sig) { std::ostream& operator<<(std::ostream& os, const Signature& sig) {
PrintSignature(os, sig, true); PrintSignature(os, sig, true);
return os; return os;
...@@ -256,7 +271,17 @@ std::string VisitResult::LValue() const { ...@@ -256,7 +271,17 @@ std::string VisitResult::LValue() const {
} }
std::string VisitResult::RValue() const { std::string VisitResult::RValue() const {
return declarable_ ? (*declarable_)->RValue() : value_; if (declarable()) {
auto value = *declarable();
if (value->IsVariable() && !Variable::cast(value)->IsDefined()) {
std::stringstream s;
s << "\"" << value->name() << "\" is used before it is defined";
ReportError(s.str());
}
return value->RValue();
} else {
return value_;
}
} }
} // namespace torque } // namespace torque
......
...@@ -37,13 +37,19 @@ class Value; ...@@ -37,13 +37,19 @@ class Value;
class TypeBase { class TypeBase {
public: public:
enum class Kind { kAbstractType, kFunctionPointerType, kUnionType }; enum class Kind {
kAbstractType,
kFunctionPointerType,
kUnionType,
kStructType
};
virtual ~TypeBase() {} virtual ~TypeBase() {}
bool IsAbstractType() const { return kind() == Kind::kAbstractType; } bool IsAbstractType() const { return kind() == Kind::kAbstractType; }
bool IsFunctionPointerType() const { bool IsFunctionPointerType() const {
return kind() == Kind::kFunctionPointerType; return kind() == Kind::kFunctionPointerType;
} }
bool IsUnionType() const { return kind() == Kind::kUnionType; } bool IsUnionType() const { return kind() == Kind::kUnionType; }
bool IsStructType() const { return kind() == Kind::kStructType; }
protected: protected:
explicit TypeBase(Kind kind) : kind_(kind) {} explicit TypeBase(Kind kind) : kind_(kind) {}
...@@ -111,6 +117,13 @@ class Type : public TypeBase { ...@@ -111,6 +117,13 @@ class Type : public TypeBase {
using TypeVector = std::vector<const Type*>; using TypeVector = std::vector<const Type*>;
struct NameAndType {
std::string name;
const Type* type;
};
std::ostream& operator<<(std::ostream& os, const NameAndType& name_and_type);
class AbstractType final : public Type { class AbstractType final : public Type {
public: public:
DECLARE_TYPE_BOILERPLATE(AbstractType); DECLARE_TYPE_BOILERPLATE(AbstractType);
...@@ -285,6 +298,37 @@ class UnionType final : public Type { ...@@ -285,6 +298,37 @@ class UnionType final : public Type {
std::set<const Type*, TypeLess> types_; std::set<const Type*, TypeLess> types_;
}; };
class StructType final : public Type {
public:
DECLARE_TYPE_BOILERPLATE(StructType);
std::string ToExplicitString() const override;
std::string MangledName() const override { return name_; }
std::string GetGeneratedTypeName() const override { return GetStructName(); }
std::string GetGeneratedTNodeTypeName() const override { UNREACHABLE(); }
const Type* NonConstexprVersion() const override { return this; }
bool IsConstexpr() const override { return false; }
const std::vector<NameAndType>& fields() const { return fields_; }
const std::string& name() const { return name_; }
Module* module() const { return module_; }
private:
friend class TypeOracle;
StructType(Module* module, const std::string& name,
const std::vector<NameAndType>& fields)
: Type(Kind::kStructType, nullptr),
module_(module),
name_(name),
fields_(fields) {}
const std::string& GetStructName() const { return name_; }
Module* module_;
std::string name_;
std::vector<NameAndType> fields_;
};
inline std::ostream& operator<<(std::ostream& os, const Type& t) { inline std::ostream& operator<<(std::ostream& os, const Type& t) {
os << t.ToString(); os << t.ToString();
return os; return os;
...@@ -325,11 +369,6 @@ class VisitResultVector : public std::vector<VisitResult> { ...@@ -325,11 +369,6 @@ class VisitResultVector : public std::vector<VisitResult> {
std::ostream& operator<<(std::ostream& os, const TypeVector& types); std::ostream& operator<<(std::ostream& os, const TypeVector& types);
struct NameAndType {
std::string name;
const Type* type;
};
typedef std::vector<NameAndType> NameAndTypeVector; typedef std::vector<NameAndType> NameAndTypeVector;
struct LabelDefinition { struct LabelDefinition {
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
module test { module test {
macro ElementsKindTestHelper1(kind: constexpr ElementsKind): bool { macro ElementsKindTestHelper1(kind: constexpr ElementsKind): bool {
if constexpr ((kind == UINT8_ELEMENTS) || (kind == UINT16_ELEMENTS)) { if constexpr((kind == UINT8_ELEMENTS) || (kind == UINT16_ELEMENTS)) {
return true; return true;
} }
else { else {
...@@ -82,7 +82,7 @@ module test { ...@@ -82,7 +82,7 @@ module test {
} }
} }
builtin GenericBuiltinTest<T: type>(c: Context, param: T): Object { builtin GenericBuiltinTest<T : type>(c: Context, param: T): Object {
return Null; return Null;
} }
...@@ -98,7 +98,8 @@ module test { ...@@ -98,7 +98,8 @@ module test {
} }
macro LabelTestHelper4(flag: constexpr bool): never labels Label4, Label5 { macro LabelTestHelper4(flag: constexpr bool): never labels Label4, Label5 {
if constexpr (flag) goto Label4; if
constexpr(flag) goto Label4;
else else
goto Label5; goto Label5;
} }
...@@ -125,7 +126,7 @@ module test { ...@@ -125,7 +126,7 @@ module test {
return False; return False;
} }
macro GenericMacroTest<T: type>(param: T): Object { macro GenericMacroTest<T : type>(param: T): Object {
return Undefined; return Undefined;
} }
...@@ -133,7 +134,7 @@ module test { ...@@ -133,7 +134,7 @@ module test {
return param2; return param2;
} }
macro GenericMacroTestWithLabels<T: type>(param: T): Object labels X { macro GenericMacroTestWithLabels<T : type>(param: T): Object labels X {
return Undefined; return Undefined;
} }
...@@ -158,29 +159,29 @@ module test { ...@@ -158,29 +159,29 @@ module test {
} }
} }
builtin TestHelperPlus1(context : Context, x : Smi) : Smi { builtin TestHelperPlus1(context: Context, x: Smi): Smi {
return x + 1; return x + 1;
} }
builtin TestHelperPlus2(context : Context, x : Smi) : Smi { builtin TestHelperPlus2(context: Context, x: Smi): Smi {
return x + 2; return x + 2;
} }
macro TestFunctionPointers(context : Context) : Boolean { macro TestFunctionPointers(context: Context): Boolean {
let fptr : builtin(Context, Smi) => Smi = TestHelperPlus1; let fptr: builtin(Context, Smi) => Smi = TestHelperPlus1;
check(fptr(context, 42) == 43); check(fptr(context, 42) == 43);
fptr = TestHelperPlus2; fptr = TestHelperPlus2;
check(fptr(context, 42) == 44); check(fptr(context, 42) == 44);
return True; return True;
} }
macro TestVariableRedeclaration(context : Context) : Boolean { macro TestVariableRedeclaration(context: Context): Boolean {
let var1 : int31 = from_constexpr<bool>(42 == 0) ? 0 : 1; let var1: int31 = from_constexpr<bool>(42 == 0) ? 0 : 1;
let var2 : int31 = from_constexpr<bool>(42 == 0) ? 1 : 0; let var2: int31 = from_constexpr<bool>(42 == 0) ? 1 : 0;
return True; return True;
} }
macro TestTernaryOperator(x : Smi) : Smi { macro TestTernaryOperator(x: Smi): Smi {
let b : bool = x < 0 ? true : false; let b: bool = x < 0 ? true : false;
return b ? x - 10 : x + 100; return b ? x - 10 : x + 100;
} }
...@@ -195,7 +196,7 @@ module test { ...@@ -195,7 +196,7 @@ module test {
} }
type SmiToSmi = builtin(Smi) => Smi; type SmiToSmi = builtin(Smi) => Smi;
macro TestTypeAlias(x : SmiToSmi) : Code { macro TestTypeAlias(x: SmiToSmi): Code {
return x; return x;
} }
...@@ -221,8 +222,9 @@ module test { ...@@ -221,8 +222,9 @@ module test {
macro TestMultilineAssert() { macro TestMultilineAssert() {
let someVeryLongVariableNameThatWillCauseLineBreaks: Smi = 5; let someVeryLongVariableNameThatWillCauseLineBreaks: Smi = 5;
check(someVeryLongVariableNameThatWillCauseLineBreaks > 0 check(
&& someVeryLongVariableNameThatWillCauseLineBreaks < 10); someVeryLongVariableNameThatWillCauseLineBreaks > 0 &&
someVeryLongVariableNameThatWillCauseLineBreaks < 10);
} }
macro TestNewlineInString() { macro TestNewlineInString() {
...@@ -243,4 +245,48 @@ module test { ...@@ -243,4 +245,48 @@ module test {
const kSmi: Smi = 3; const kSmi: Smi = 3;
check(kSmi == 3); check(kSmi == 3);
} }
struct TestStructA {
indexes: FixedArray;
i: Smi;
k: Number;
}
struct TestStructB {
x: TestStructA;
y: Smi;
}
macro TestStruct1(i: TestStructA): Smi {
return i.i;
}
macro TestStruct2(): TestStructA {
return TestStructA{unsafe_cast<FixedArray>(kEmptyFixedArray), 27, 31};
}
macro TestStruct3(): TestStructA {
let a: TestStructA =
TestStructA{unsafe_cast<FixedArray>(kEmptyFixedArray), 13, 5};
let b: TestStructA = a;
let c: TestStructA = TestStruct2();
a.i = TestStruct1(c);
a.k = a.i;
let d: TestStructB;
d.x = a;
d = TestStructB{a, 7};
let e: TestStructA = d.x;
let f: Smi = TestStructA{unsafe_cast<FixedArray>(kEmptyFixedArray), 27, 31}.i;
f = TestStruct2().i;
return a;
}
struct TestStructC {
x : TestStructA;
y : TestStructA;
}
macro TestStruct4(): TestStructC {
return TestStructC{TestStruct2(), TestStruct2()};
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment