Commit 07f19a08 authored by Tobias Tebbi's avatar Tobias Tebbi Committed by Commit Bot

[torque] implement function pointers to builtins

This CL adds the new type expression
builtin(Context, ArgType1, ...) => ReturnType
and allows to use Torque-defined builtins as values of this type, as well
as calling values of this type.
The new function pointer types are subtypes of Code.

Change-Id: Ib7ba3ce6ef7a8591a4c79230dd189fd25698d5b9
Reviewed-on: https://chromium-review.googlesource.com/1060056
Commit-Queue: Tobias Tebbi <tebbi@chromium.org>
Reviewed-by: 's avatarDaniel Clifford <danno@chromium.org>
Cr-Commit-Position: refs/heads/master@{#53217}
parent f651409f
......@@ -17,6 +17,8 @@ type RawPtr generates 'TNode<RawPtrT>' constexpr 'void*';
type Number extends Object generates 'TNode<Number>';
type Smi extends Number generates 'TNode<Smi>';
type HeapObject extends Object generates 'TNode<HeapObject>';
type AbstractCode extends HeapObject generates 'TNode<AbstractCode>';
type Code extends AbstractCode generates 'TNode<Code>';
type JSReceiver extends HeapObject generates 'TNode<JSReceiver>';
type Context extends HeapObject generates 'TNode<Context>';
type String extends HeapObject generates 'TNode<String>';
......
......@@ -117,16 +117,18 @@ DECIMAL_LITERAL
| MINUS? DECIMAL_INTEGER_LITERAL EXPONENT_PART?
;
type : CONSTEXPR? IDENTIFIER;
typeList : '(' type? (',' type)* ')';
optionalGenericSpecializationTypeList: ('<' IDENTIFIER (',' IDENTIFIER)* '>')?;
type : CONSTEXPR? IDENTIFIER
| BUILTIN '(' typeList ')' '=>' type
;
typeList : (type (',' type)*)?;
genericSpecializationTypeList: '<' typeList '>';
optionalGenericTypeList: ('<' IDENTIFIER ':' 'type' (',' IDENTIFIER ':' 'type')* '>')?;
typeListMaybeVarArgs: '(' type? (',' type)* (',' VARARGS)? ')'
| '(' VARARGS ')';
labelParameter: IDENTIFIER typeList?;
labelParameter: IDENTIFIER ( '(' typeList ')' )?;
optionalType: (':' type)?;
optionalLabelList: (LABELS labelParameter (',' labelParameter)*)?;
......@@ -223,7 +225,7 @@ forOfLoop: FOR '(' variableDeclaration 'of' expression forOfRange ')' statementB
argument: expression;
argumentList: '(' argument? (',' argument)* ')';
helperCall: (MIN | MAX | IDENTIFIER) optionalGenericSpecializationTypeList argumentList optionalOtherwise;
helperCall: (MIN | MAX | IDENTIFIER) genericSpecializationTypeList? argumentList optionalOtherwise;
labelReference: IDENTIFIER;
variableDeclaration: LET IDENTIFIER ':' type;
......@@ -269,11 +271,11 @@ generatesDeclaration: 'generates' STRING_LITERAL;
constexprDeclaration: 'constexpr' STRING_LITERAL;
typeDeclaration : 'type' IDENTIFIER extendsDeclaration? generatesDeclaration? constexprDeclaration?';';
externalBuiltin : EXTERN JAVASCRIPT? BUILTIN IDENTIFIER optionalGenericTypeList typeList optionalType ';';
externalBuiltin : EXTERN JAVASCRIPT? BUILTIN IDENTIFIER optionalGenericTypeList '(' typeList ')' optionalType ';';
externalMacro : EXTERN (IMPLICIT? 'operator' STRING_LITERAL)? MACRO IDENTIFIER optionalGenericTypeList typeListMaybeVarArgs optionalType optionalLabelList ';';
externalRuntime : EXTERN RUNTIME IDENTIFIER typeListMaybeVarArgs optionalType ';';
builtinDeclaration : JAVASCRIPT? BUILTIN IDENTIFIER optionalGenericTypeList parameterList optionalType helperBody;
genericSpecialization: IDENTIFIER optionalGenericSpecializationTypeList parameterList optionalType optionalLabelList helperBody;
genericSpecialization: IDENTIFIER genericSpecializationTypeList parameterList optionalType optionalLabelList helperBody;
macroDeclaration : MACRO IDENTIFIER optionalGenericTypeList parameterList optionalType optionalLabelList helperBody;
constDeclaration : 'const' IDENTIFIER ':' type '=' STRING_LITERAL ';';
......
......@@ -24,12 +24,10 @@ class TorqueBaseListener : public TorqueListener {
void enterTypeList(TorqueParser::TypeListContext* /*ctx*/) override {}
void exitTypeList(TorqueParser::TypeListContext* /*ctx*/) override {}
void enterOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* /*ctx*/)
override {}
void exitOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* /*ctx*/)
override {}
void enterGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* /*ctx*/) override {}
void exitGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* /*ctx*/) override {}
void enterOptionalGenericTypeList(
TorqueParser::OptionalGenericTypeListContext* /*ctx*/) override {}
......
......@@ -26,9 +26,8 @@ class TorqueBaseVisitor : public TorqueVisitor {
return visitChildren(ctx);
}
antlrcpp::Any visitOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* ctx)
override {
antlrcpp::Any visitGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* ctx) override {
return visitChildren(ctx);
}
......
......@@ -69,6 +69,7 @@ std::vector<std::string> TorqueLexer::_ruleNames = {u8"T__0",
u8"T__17",
u8"T__18",
u8"T__19",
u8"T__20",
u8"MACRO",
u8"BUILTIN",
u8"RUNTIME",
......@@ -143,8 +144,9 @@ std::vector<std::string> TorqueLexer::_modeNames = {u8"DEFAULT_MODE"};
std::vector<std::string> TorqueLexer::_literalNames = {"",
u8"'('",
u8"','",
u8"')'",
u8"'=>'",
u8"','",
u8"':'",
u8"'type'",
u8"'?'",
......@@ -220,6 +222,7 @@ std::vector<std::string> TorqueLexer::_literalNames = {"",
u8"'!'"};
std::vector<std::string> TorqueLexer::_symbolicNames = {
"",
"",
"",
"",
......@@ -326,7 +329,7 @@ TorqueLexer::Initializer::Initializer() {
_serializedATN = {
0x3, 0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964,
0x2, 0x54, 0x29c, 0x8, 0x1, 0x4, 0x2, 0x9, 0x2,
0x2, 0x55, 0x2a1, 0x8, 0x1, 0x4, 0x2, 0x9, 0x2,
0x4, 0x3, 0x9, 0x3, 0x4, 0x4, 0x9, 0x4, 0x4,
0x5, 0x9, 0x5, 0x4, 0x6, 0x9, 0x6, 0x4, 0x7,
0x9, 0x7, 0x4, 0x8, 0x9, 0x8, 0x4, 0x9, 0x9,
......@@ -364,617 +367,621 @@ TorqueLexer::Initializer::Initializer() {
0x9, 0x4f, 0x4, 0x50, 0x9, 0x50, 0x4, 0x51, 0x9,
0x51, 0x4, 0x52, 0x9, 0x52, 0x4, 0x53, 0x9, 0x53,
0x4, 0x54, 0x9, 0x54, 0x4, 0x55, 0x9, 0x55, 0x4,
0x56, 0x9, 0x56, 0x4, 0x57, 0x9, 0x57, 0x3, 0x2,
0x3, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3,
0x4, 0x3, 0x5, 0x3, 0x5, 0x3, 0x6, 0x3, 0x6,
0x3, 0x6, 0x3, 0x6, 0x3, 0x6, 0x3, 0x7, 0x3,
0x7, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x9,
0x3, 0x9, 0x3, 0x9, 0x3, 0xa, 0x3, 0xa, 0x3,
0xb, 0x3, 0xb, 0x3, 0xc, 0x3, 0xc, 0x3, 0xd,
0x3, 0xd, 0x3, 0xe, 0x3, 0xe, 0x3, 0xe, 0x3,
0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf,
0x3, 0x10, 0x3, 0x10, 0x3, 0x11, 0x3, 0x11, 0x3,
0x12, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x3, 0x12,
0x3, 0x12, 0x3, 0x12, 0x3, 0x12, 0x3, 0x13, 0x3,
0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13,
0x56, 0x9, 0x56, 0x4, 0x57, 0x9, 0x57, 0x4, 0x58,
0x9, 0x58, 0x3, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3,
0x3, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x5,
0x3, 0x5, 0x3, 0x6, 0x3, 0x6, 0x3, 0x7, 0x3,
0x7, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x3, 0x8,
0x3, 0x8, 0x3, 0x9, 0x3, 0x9, 0x3, 0x9, 0x3,
0xa, 0x3, 0xa, 0x3, 0xa, 0x3, 0xb, 0x3, 0xb,
0x3, 0xc, 0x3, 0xc, 0x3, 0xd, 0x3, 0xd, 0x3,
0xe, 0x3, 0xe, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf,
0x3, 0x10, 0x3, 0x10, 0x3, 0x10, 0x3, 0x10, 0x3,
0x10, 0x3, 0x11, 0x3, 0x11, 0x3, 0x12, 0x3, 0x12,
0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3,
0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14,
0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x14,
0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3,
0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14, 0x3, 0x14,
0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3,
0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15,
0x3, 0x15, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3,
0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x17, 0x3, 0x17,
0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3,
0x17, 0x3, 0x17, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18,
0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3,
0x18, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19,
0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x1a, 0x3,
0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a,
0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3,
0x1a, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b,
0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3,
0x16, 0x3, 0x16, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17,
0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x18, 0x3,
0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18,
0x3, 0x18, 0x3, 0x18, 0x3, 0x19, 0x3, 0x19, 0x3,
0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19,
0x3, 0x19, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3,
0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1b,
0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3,
0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c,
0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3,
0x1c, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1e,
0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x3,
0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b,
0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3,
0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c,
0x3, 0x1c, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3,
0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d,
0x3, 0x1d, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1e, 0x3,
0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f,
0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x20, 0x3,
0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x21, 0x3, 0x21,
0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3,
0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3,
0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x21,
0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x22, 0x3,
0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x22,
0x3, 0x22, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x3,
0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x23,
0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3,
0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24,
0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x25, 0x3,
0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25,
0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x23, 0x3,
0x23, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3, 0x24,
0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3,
0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x24, 0x3, 0x25,
0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3,
0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x3, 0x26,
0x3, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3, 0x26, 0x3,
0x26, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27,
0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3, 0x27, 0x3,
0x27, 0x3, 0x27, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28,
0x3, 0x28, 0x3, 0x29, 0x3, 0x29, 0x3, 0x29, 0x3,
0x29, 0x3, 0x29, 0x3, 0x29, 0x3, 0x2a, 0x3, 0x2a,
0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3,
0x3, 0x27, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x3,
0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28, 0x3, 0x28,
0x3, 0x28, 0x3, 0x28, 0x3, 0x29, 0x3, 0x29, 0x3,
0x29, 0x3, 0x29, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a,
0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2a, 0x3, 0x2b, 0x3,
0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2b,
0x3, 0x2b, 0x3, 0x2b, 0x3, 0x2c, 0x3, 0x2c, 0x3,
0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2c, 0x3,
0x2c, 0x3, 0x2c, 0x3, 0x2c, 0x3, 0x2d, 0x3, 0x2d,
0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2d, 0x3, 0x2e, 0x3,
0x2e, 0x3, 0x2e, 0x3, 0x2f, 0x3, 0x2f, 0x3, 0x2f,
0x3, 0x2f, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3,
0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x30, 0x3, 0x31,
0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2e, 0x3, 0x2f,
0x3, 0x2f, 0x3, 0x2f, 0x3, 0x30, 0x3, 0x30, 0x3,
0x30, 0x3, 0x30, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31,
0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3, 0x31, 0x3,
0x31, 0x3, 0x31, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32,
0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3,
0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32, 0x3, 0x32,
0x3, 0x32, 0x3, 0x32, 0x3, 0x33, 0x3, 0x33, 0x3,
0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33,
0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3, 0x33, 0x3,
0x33, 0x3, 0x33, 0x3, 0x34, 0x3, 0x34, 0x3, 0x35,
0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3,
0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35,
0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3,
0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35,
0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3, 0x35, 0x3,
0x35, 0x3, 0x35, 0x3, 0x35, 0x5, 0x35, 0x1e1, 0xa,
0x35, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x37,
0x3, 0x37, 0x3, 0x38, 0x3, 0x38, 0x3, 0x39, 0x3,
0x39, 0x3, 0x3a, 0x3, 0x3a, 0x3, 0x3b, 0x3, 0x3b,
0x3, 0x3c, 0x3, 0x3c, 0x3, 0x3d, 0x3, 0x3d, 0x3,
0x3e, 0x3, 0x3e, 0x3, 0x3f, 0x3, 0x3f, 0x3, 0x3f,
0x3, 0x3f, 0x3, 0x40, 0x3, 0x40, 0x3, 0x40, 0x3,
0x40, 0x3, 0x41, 0x3, 0x41, 0x3, 0x41, 0x3, 0x42,
0x3, 0x42, 0x3, 0x43, 0x3, 0x43, 0x3, 0x43, 0x3,
0x44, 0x3, 0x44, 0x3, 0x45, 0x3, 0x45, 0x3, 0x45,
0x3, 0x46, 0x3, 0x46, 0x3, 0x46, 0x3, 0x47, 0x3,
0x47, 0x3, 0x47, 0x3, 0x48, 0x3, 0x48, 0x3, 0x48,
0x3, 0x48, 0x3, 0x49, 0x3, 0x49, 0x3, 0x49, 0x3,
0x49, 0x3, 0x4a, 0x3, 0x4a, 0x5, 0x4a, 0x21b, 0xa,
0x4a, 0x3, 0x4b, 0x3, 0x4b, 0x3, 0x4b, 0x3, 0x4c,
0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4d, 0x3, 0x4d, 0x3,
0x4e, 0x3, 0x4e, 0x3, 0x4e, 0x7, 0x4e, 0x228, 0xa,
0x4e, 0xc, 0x4e, 0xe, 0x4e, 0x22b, 0xb, 0x4e, 0x3,
0x4e, 0x3, 0x4e, 0x3, 0x4e, 0x3, 0x4e, 0x7, 0x4e,
0x231, 0xa, 0x4e, 0xc, 0x4e, 0xe, 0x4e, 0x234, 0xb,
0x4e, 0x3, 0x4e, 0x5, 0x4e, 0x237, 0xa, 0x4e, 0x3,
0x4f, 0x3, 0x4f, 0x3, 0x4f, 0x3, 0x50, 0x3, 0x50,
0x7, 0x50, 0x23e, 0xa, 0x50, 0xc, 0x50, 0xe, 0x50,
0x241, 0xb, 0x50, 0x3, 0x51, 0x6, 0x51, 0x244, 0xa,
0x51, 0xd, 0x51, 0xe, 0x51, 0x245, 0x3, 0x51, 0x3,
0x51, 0x3, 0x52, 0x3, 0x52, 0x3, 0x52, 0x3, 0x52,
0x7, 0x52, 0x24e, 0xa, 0x52, 0xc, 0x52, 0xe, 0x52,
0x251, 0xb, 0x52, 0x3, 0x52, 0x3, 0x52, 0x3, 0x52,
0x5, 0x52, 0x256, 0xa, 0x52, 0x3, 0x52, 0x3, 0x52,
0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x7,
0x53, 0x25e, 0xa, 0x53, 0xc, 0x53, 0xe, 0x53, 0x261,
0xb, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3, 0x54, 0x3,
0x54, 0x3, 0x55, 0x3, 0x55, 0x3, 0x55, 0x7, 0x55,
0x26a, 0xa, 0x55, 0xc, 0x55, 0xe, 0x55, 0x26d, 0xb,
0x55, 0x5, 0x55, 0x26f, 0xa, 0x55, 0x3, 0x56, 0x3,
0x56, 0x5, 0x56, 0x273, 0xa, 0x56, 0x3, 0x56, 0x6,
0x56, 0x276, 0xa, 0x56, 0xd, 0x56, 0xe, 0x56, 0x277,
0x3, 0x57, 0x5, 0x57, 0x27b, 0xa, 0x57, 0x3, 0x57,
0x3, 0x57, 0x3, 0x57, 0x7, 0x57, 0x280, 0xa, 0x57,
0xc, 0x57, 0xe, 0x57, 0x283, 0xb, 0x57, 0x3, 0x57,
0x5, 0x57, 0x286, 0xa, 0x57, 0x3, 0x57, 0x5, 0x57,
0x289, 0xa, 0x57, 0x3, 0x57, 0x3, 0x57, 0x6, 0x57,
0x28d, 0xa, 0x57, 0xd, 0x57, 0xe, 0x57, 0x28e, 0x3,
0x57, 0x5, 0x57, 0x292, 0xa, 0x57, 0x3, 0x57, 0x5,
0x57, 0x295, 0xa, 0x57, 0x3, 0x57, 0x3, 0x57, 0x5,
0x57, 0x299, 0xa, 0x57, 0x5, 0x57, 0x29b, 0xa, 0x57,
0x3, 0x24f, 0x2, 0x58, 0x3, 0x3, 0x5, 0x4, 0x7,
0x5, 0x9, 0x6, 0xb, 0x7, 0xd, 0x8, 0xf, 0x9,
0x11, 0xa, 0x13, 0xb, 0x15, 0xc, 0x17, 0xd, 0x19,
0xe, 0x1b, 0xf, 0x1d, 0x10, 0x1f, 0x11, 0x21, 0x12,
0x23, 0x13, 0x25, 0x14, 0x27, 0x15, 0x29, 0x16, 0x2b,
0x17, 0x2d, 0x18, 0x2f, 0x19, 0x31, 0x1a, 0x33, 0x1b,
0x35, 0x1c, 0x37, 0x1d, 0x39, 0x1e, 0x3b, 0x1f, 0x3d,
0x20, 0x3f, 0x21, 0x41, 0x22, 0x43, 0x23, 0x45, 0x24,
0x47, 0x25, 0x49, 0x26, 0x4b, 0x27, 0x4d, 0x28, 0x4f,
0x29, 0x51, 0x2a, 0x53, 0x2b, 0x55, 0x2c, 0x57, 0x2d,
0x59, 0x2e, 0x5b, 0x2f, 0x5d, 0x30, 0x5f, 0x31, 0x61,
0x32, 0x63, 0x33, 0x65, 0x34, 0x67, 0x35, 0x69, 0x36,
0x6b, 0x37, 0x6d, 0x38, 0x6f, 0x39, 0x71, 0x3a, 0x73,
0x3b, 0x75, 0x3c, 0x77, 0x3d, 0x79, 0x3e, 0x7b, 0x3f,
0x7d, 0x40, 0x7f, 0x41, 0x81, 0x42, 0x83, 0x43, 0x85,
0x44, 0x87, 0x45, 0x89, 0x46, 0x8b, 0x47, 0x8d, 0x48,
0x8f, 0x49, 0x91, 0x4a, 0x93, 0x4b, 0x95, 0x4c, 0x97,
0x4d, 0x99, 0x4e, 0x9b, 0x4f, 0x9d, 0x2, 0x9f, 0x50,
0xa1, 0x51, 0xa3, 0x52, 0xa5, 0x53, 0xa7, 0x2, 0xa9,
0x2, 0xab, 0x2, 0xad, 0x54, 0x3, 0x2, 0xd, 0x6,
0x2, 0xc, 0xc, 0xf, 0xf, 0x24, 0x24, 0x5e, 0x5e,
0x6, 0x2, 0xc, 0xc, 0xf, 0xf, 0x29, 0x29, 0x5e,
0x5e, 0x5, 0x2, 0x24, 0x24, 0x29, 0x29, 0x5e, 0x5e,
0x4, 0x2, 0x43, 0x5c, 0x63, 0x7c, 0x6, 0x2, 0x32,
0x3b, 0x43, 0x5c, 0x61, 0x61, 0x63, 0x7c, 0x5, 0x2,
0xb, 0xc, 0xe, 0xf, 0x22, 0x22, 0x4, 0x2, 0xc,
0xc, 0xf, 0xf, 0x3, 0x2, 0x32, 0x3b, 0x3, 0x2,
0x33, 0x3b, 0x4, 0x2, 0x47, 0x47, 0x67, 0x67, 0x4,
0x2, 0x2d, 0x2d, 0x2f, 0x2f, 0x2, 0x2ba, 0x2, 0x3,
0x3, 0x2, 0x2, 0x2, 0x2, 0x5, 0x3, 0x2, 0x2,
0x2, 0x2, 0x7, 0x3, 0x2, 0x2, 0x2, 0x2, 0x9,
0x3, 0x2, 0x2, 0x2, 0x2, 0xb, 0x3, 0x2, 0x2,
0x2, 0x2, 0xd, 0x3, 0x2, 0x2, 0x2, 0x2, 0xf,
0x3, 0x2, 0x2, 0x2, 0x2, 0x11, 0x3, 0x2, 0x2,
0x2, 0x2, 0x13, 0x3, 0x2, 0x2, 0x2, 0x2, 0x15,
0x3, 0x2, 0x2, 0x2, 0x2, 0x17, 0x3, 0x2, 0x2,
0x2, 0x2, 0x19, 0x3, 0x2, 0x2, 0x2, 0x2, 0x1b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x1d, 0x3, 0x2, 0x2,
0x2, 0x2, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x21,
0x3, 0x2, 0x2, 0x2, 0x2, 0x23, 0x3, 0x2, 0x2,
0x2, 0x2, 0x25, 0x3, 0x2, 0x2, 0x2, 0x2, 0x27,
0x3, 0x2, 0x2, 0x2, 0x2, 0x29, 0x3, 0x2, 0x2,
0x2, 0x2, 0x2b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x2f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x31, 0x3, 0x2, 0x2, 0x2, 0x2, 0x33,
0x3, 0x2, 0x2, 0x2, 0x2, 0x35, 0x3, 0x2, 0x2,
0x2, 0x2, 0x37, 0x3, 0x2, 0x2, 0x2, 0x2, 0x39,
0x3, 0x2, 0x2, 0x2, 0x2, 0x3b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x3d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x3f,
0x3, 0x2, 0x2, 0x2, 0x2, 0x41, 0x3, 0x2, 0x2,
0x2, 0x2, 0x43, 0x3, 0x2, 0x2, 0x2, 0x2, 0x45,
0x3, 0x2, 0x2, 0x2, 0x2, 0x47, 0x3, 0x2, 0x2,
0x2, 0x2, 0x49, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x4d, 0x3, 0x2, 0x2,
0x2, 0x2, 0x4f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x51,
0x3, 0x2, 0x2, 0x2, 0x2, 0x53, 0x3, 0x2, 0x2,
0x2, 0x2, 0x55, 0x3, 0x2, 0x2, 0x2, 0x2, 0x57,
0x3, 0x2, 0x2, 0x2, 0x2, 0x59, 0x3, 0x2, 0x2,
0x2, 0x2, 0x5b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x5d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x5f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x61, 0x3, 0x2, 0x2, 0x2, 0x2, 0x63,
0x3, 0x2, 0x2, 0x2, 0x2, 0x65, 0x3, 0x2, 0x2,
0x2, 0x2, 0x67, 0x3, 0x2, 0x2, 0x2, 0x2, 0x69,
0x3, 0x2, 0x2, 0x2, 0x2, 0x6b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x6d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x6f,
0x3, 0x2, 0x2, 0x2, 0x2, 0x71, 0x3, 0x2, 0x2,
0x2, 0x2, 0x73, 0x3, 0x2, 0x2, 0x2, 0x2, 0x75,
0x3, 0x2, 0x2, 0x2, 0x2, 0x77, 0x3, 0x2, 0x2,
0x2, 0x2, 0x79, 0x3, 0x2, 0x2, 0x2, 0x2, 0x7b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x7d, 0x3, 0x2, 0x2,
0x2, 0x2, 0x7f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x81,
0x3, 0x2, 0x2, 0x2, 0x2, 0x83, 0x3, 0x2, 0x2,
0x2, 0x2, 0x85, 0x3, 0x2, 0x2, 0x2, 0x2, 0x87,
0x3, 0x2, 0x2, 0x2, 0x2, 0x89, 0x3, 0x2, 0x2,
0x2, 0x2, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x8d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x8f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x91, 0x3, 0x2, 0x2, 0x2, 0x2, 0x93,
0x3, 0x2, 0x2, 0x2, 0x2, 0x95, 0x3, 0x2, 0x2,
0x2, 0x2, 0x97, 0x3, 0x2, 0x2, 0x2, 0x2, 0x99,
0x3, 0x2, 0x2, 0x2, 0x2, 0x9b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x9f, 0x3, 0x2, 0x2, 0x2, 0x2, 0xa1,
0x3, 0x2, 0x2, 0x2, 0x2, 0xa3, 0x3, 0x2, 0x2,
0x2, 0x2, 0xa5, 0x3, 0x2, 0x2, 0x2, 0x2, 0xad,
0x3, 0x2, 0x2, 0x2, 0x3, 0xaf, 0x3, 0x2, 0x2,
0x2, 0x5, 0xb1, 0x3, 0x2, 0x2, 0x2, 0x7, 0xb3,
0x3, 0x2, 0x2, 0x2, 0x9, 0xb5, 0x3, 0x2, 0x2,
0x2, 0xb, 0xb7, 0x3, 0x2, 0x2, 0x2, 0xd, 0xbc,
0x3, 0x2, 0x2, 0x2, 0xf, 0xbe, 0x3, 0x2, 0x2,
0x2, 0x11, 0xc1, 0x3, 0x2, 0x2, 0x2, 0x13, 0xc4,
0x3, 0x2, 0x2, 0x2, 0x15, 0xc6, 0x3, 0x2, 0x2,
0x2, 0x17, 0xc8, 0x3, 0x2, 0x2, 0x2, 0x19, 0xca,
0x3, 0x2, 0x2, 0x2, 0x1b, 0xcc, 0x3, 0x2, 0x2,
0x2, 0x1d, 0xcf, 0x3, 0x2, 0x2, 0x2, 0x1f, 0xd4,
0x3, 0x2, 0x2, 0x2, 0x21, 0xd6, 0x3, 0x2, 0x2,
0x2, 0x23, 0xd8, 0x3, 0x2, 0x2, 0x2, 0x25, 0xe0,
0x3, 0x2, 0x2, 0x2, 0x27, 0xea, 0x3, 0x2, 0x2,
0x2, 0x29, 0xf3, 0x3, 0x2, 0x2, 0x2, 0x2b, 0xf9,
0x3, 0x2, 0x2, 0x2, 0x2d, 0xff, 0x3, 0x2, 0x2,
0x2, 0x2f, 0x107, 0x3, 0x2, 0x2, 0x2, 0x31, 0x10f,
0x3, 0x2, 0x2, 0x2, 0x33, 0x116, 0x3, 0x2, 0x2,
0x2, 0x35, 0x121, 0x3, 0x2, 0x2, 0x2, 0x37, 0x12a,
0x3, 0x2, 0x2, 0x2, 0x39, 0x133, 0x3, 0x2, 0x2,
0x2, 0x3b, 0x136, 0x3, 0x2, 0x2, 0x2, 0x3d, 0x13b,
0x3, 0x2, 0x2, 0x2, 0x3f, 0x143, 0x3, 0x2, 0x2,
0x2, 0x41, 0x147, 0x3, 0x2, 0x2, 0x2, 0x43, 0x14d,
0x3, 0x2, 0x2, 0x2, 0x45, 0x154, 0x3, 0x2, 0x2,
0x2, 0x47, 0x15e, 0x3, 0x2, 0x2, 0x2, 0x49, 0x167,
0x3, 0x2, 0x2, 0x2, 0x4b, 0x16d, 0x3, 0x2, 0x2,
0x2, 0x4d, 0x172, 0x3, 0x2, 0x2, 0x2, 0x4f, 0x17c,
0x3, 0x2, 0x2, 0x2, 0x51, 0x180, 0x3, 0x2, 0x2,
0x2, 0x53, 0x186, 0x3, 0x2, 0x2, 0x2, 0x55, 0x18c,
0x3, 0x2, 0x2, 0x2, 0x57, 0x193, 0x3, 0x2, 0x2,
0x33, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34, 0x3, 0x34,
0x3, 0x34, 0x3, 0x34, 0x3, 0x35, 0x3, 0x35, 0x3,
0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36,
0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3,
0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36,
0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3,
0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x3, 0x36,
0x3, 0x36, 0x3, 0x36, 0x3, 0x36, 0x5, 0x36, 0x1e6,
0xa, 0x36, 0x3, 0x37, 0x3, 0x37, 0x3, 0x37, 0x3,
0x38, 0x3, 0x38, 0x3, 0x39, 0x3, 0x39, 0x3, 0x3a,
0x3, 0x3a, 0x3, 0x3b, 0x3, 0x3b, 0x3, 0x3c, 0x3,
0x3c, 0x3, 0x3d, 0x3, 0x3d, 0x3, 0x3e, 0x3, 0x3e,
0x3, 0x3f, 0x3, 0x3f, 0x3, 0x40, 0x3, 0x40, 0x3,
0x40, 0x3, 0x40, 0x3, 0x41, 0x3, 0x41, 0x3, 0x41,
0x3, 0x41, 0x3, 0x42, 0x3, 0x42, 0x3, 0x42, 0x3,
0x43, 0x3, 0x43, 0x3, 0x44, 0x3, 0x44, 0x3, 0x44,
0x3, 0x45, 0x3, 0x45, 0x3, 0x46, 0x3, 0x46, 0x3,
0x46, 0x3, 0x47, 0x3, 0x47, 0x3, 0x47, 0x3, 0x48,
0x3, 0x48, 0x3, 0x48, 0x3, 0x49, 0x3, 0x49, 0x3,
0x49, 0x3, 0x49, 0x3, 0x4a, 0x3, 0x4a, 0x3, 0x4a,
0x3, 0x4a, 0x3, 0x4b, 0x3, 0x4b, 0x5, 0x4b, 0x220,
0xa, 0x4b, 0x3, 0x4c, 0x3, 0x4c, 0x3, 0x4c, 0x3,
0x4d, 0x3, 0x4d, 0x3, 0x4d, 0x3, 0x4e, 0x3, 0x4e,
0x3, 0x4f, 0x3, 0x4f, 0x3, 0x4f, 0x7, 0x4f, 0x22d,
0xa, 0x4f, 0xc, 0x4f, 0xe, 0x4f, 0x230, 0xb, 0x4f,
0x3, 0x4f, 0x3, 0x4f, 0x3, 0x4f, 0x3, 0x4f, 0x7,
0x4f, 0x236, 0xa, 0x4f, 0xc, 0x4f, 0xe, 0x4f, 0x239,
0xb, 0x4f, 0x3, 0x4f, 0x5, 0x4f, 0x23c, 0xa, 0x4f,
0x3, 0x50, 0x3, 0x50, 0x3, 0x50, 0x3, 0x51, 0x3,
0x51, 0x7, 0x51, 0x243, 0xa, 0x51, 0xc, 0x51, 0xe,
0x51, 0x246, 0xb, 0x51, 0x3, 0x52, 0x6, 0x52, 0x249,
0xa, 0x52, 0xd, 0x52, 0xe, 0x52, 0x24a, 0x3, 0x52,
0x3, 0x52, 0x3, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3,
0x53, 0x7, 0x53, 0x253, 0xa, 0x53, 0xc, 0x53, 0xe,
0x53, 0x256, 0xb, 0x53, 0x3, 0x53, 0x3, 0x53, 0x3,
0x53, 0x5, 0x53, 0x25b, 0xa, 0x53, 0x3, 0x53, 0x3,
0x53, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54, 0x3, 0x54,
0x7, 0x54, 0x263, 0xa, 0x54, 0xc, 0x54, 0xe, 0x54,
0x266, 0xb, 0x54, 0x3, 0x54, 0x3, 0x54, 0x3, 0x55,
0x3, 0x55, 0x3, 0x56, 0x3, 0x56, 0x3, 0x56, 0x7,
0x56, 0x26f, 0xa, 0x56, 0xc, 0x56, 0xe, 0x56, 0x272,
0xb, 0x56, 0x5, 0x56, 0x274, 0xa, 0x56, 0x3, 0x57,
0x3, 0x57, 0x5, 0x57, 0x278, 0xa, 0x57, 0x3, 0x57,
0x6, 0x57, 0x27b, 0xa, 0x57, 0xd, 0x57, 0xe, 0x57,
0x27c, 0x3, 0x58, 0x5, 0x58, 0x280, 0xa, 0x58, 0x3,
0x58, 0x3, 0x58, 0x3, 0x58, 0x7, 0x58, 0x285, 0xa,
0x58, 0xc, 0x58, 0xe, 0x58, 0x288, 0xb, 0x58, 0x3,
0x58, 0x5, 0x58, 0x28b, 0xa, 0x58, 0x3, 0x58, 0x5,
0x58, 0x28e, 0xa, 0x58, 0x3, 0x58, 0x3, 0x58, 0x6,
0x58, 0x292, 0xa, 0x58, 0xd, 0x58, 0xe, 0x58, 0x293,
0x3, 0x58, 0x5, 0x58, 0x297, 0xa, 0x58, 0x3, 0x58,
0x5, 0x58, 0x29a, 0xa, 0x58, 0x3, 0x58, 0x3, 0x58,
0x5, 0x58, 0x29e, 0xa, 0x58, 0x5, 0x58, 0x2a0, 0xa,
0x58, 0x3, 0x254, 0x2, 0x59, 0x3, 0x3, 0x5, 0x4,
0x7, 0x5, 0x9, 0x6, 0xb, 0x7, 0xd, 0x8, 0xf,
0x9, 0x11, 0xa, 0x13, 0xb, 0x15, 0xc, 0x17, 0xd,
0x19, 0xe, 0x1b, 0xf, 0x1d, 0x10, 0x1f, 0x11, 0x21,
0x12, 0x23, 0x13, 0x25, 0x14, 0x27, 0x15, 0x29, 0x16,
0x2b, 0x17, 0x2d, 0x18, 0x2f, 0x19, 0x31, 0x1a, 0x33,
0x1b, 0x35, 0x1c, 0x37, 0x1d, 0x39, 0x1e, 0x3b, 0x1f,
0x3d, 0x20, 0x3f, 0x21, 0x41, 0x22, 0x43, 0x23, 0x45,
0x24, 0x47, 0x25, 0x49, 0x26, 0x4b, 0x27, 0x4d, 0x28,
0x4f, 0x29, 0x51, 0x2a, 0x53, 0x2b, 0x55, 0x2c, 0x57,
0x2d, 0x59, 0x2e, 0x5b, 0x2f, 0x5d, 0x30, 0x5f, 0x31,
0x61, 0x32, 0x63, 0x33, 0x65, 0x34, 0x67, 0x35, 0x69,
0x36, 0x6b, 0x37, 0x6d, 0x38, 0x6f, 0x39, 0x71, 0x3a,
0x73, 0x3b, 0x75, 0x3c, 0x77, 0x3d, 0x79, 0x3e, 0x7b,
0x3f, 0x7d, 0x40, 0x7f, 0x41, 0x81, 0x42, 0x83, 0x43,
0x85, 0x44, 0x87, 0x45, 0x89, 0x46, 0x8b, 0x47, 0x8d,
0x48, 0x8f, 0x49, 0x91, 0x4a, 0x93, 0x4b, 0x95, 0x4c,
0x97, 0x4d, 0x99, 0x4e, 0x9b, 0x4f, 0x9d, 0x50, 0x9f,
0x2, 0xa1, 0x51, 0xa3, 0x52, 0xa5, 0x53, 0xa7, 0x54,
0xa9, 0x2, 0xab, 0x2, 0xad, 0x2, 0xaf, 0x55, 0x3,
0x2, 0xd, 0x6, 0x2, 0xc, 0xc, 0xf, 0xf, 0x24,
0x24, 0x5e, 0x5e, 0x6, 0x2, 0xc, 0xc, 0xf, 0xf,
0x29, 0x29, 0x5e, 0x5e, 0x5, 0x2, 0x24, 0x24, 0x29,
0x29, 0x5e, 0x5e, 0x4, 0x2, 0x43, 0x5c, 0x63, 0x7c,
0x6, 0x2, 0x32, 0x3b, 0x43, 0x5c, 0x61, 0x61, 0x63,
0x7c, 0x5, 0x2, 0xb, 0xc, 0xe, 0xf, 0x22, 0x22,
0x4, 0x2, 0xc, 0xc, 0xf, 0xf, 0x3, 0x2, 0x32,
0x3b, 0x3, 0x2, 0x33, 0x3b, 0x4, 0x2, 0x47, 0x47,
0x67, 0x67, 0x4, 0x2, 0x2d, 0x2d, 0x2f, 0x2f, 0x2,
0x2bf, 0x2, 0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x5,
0x3, 0x2, 0x2, 0x2, 0x2, 0x7, 0x3, 0x2, 0x2,
0x2, 0x2, 0x9, 0x3, 0x2, 0x2, 0x2, 0x2, 0xb,
0x3, 0x2, 0x2, 0x2, 0x2, 0xd, 0x3, 0x2, 0x2,
0x2, 0x2, 0xf, 0x3, 0x2, 0x2, 0x2, 0x2, 0x11,
0x3, 0x2, 0x2, 0x2, 0x2, 0x13, 0x3, 0x2, 0x2,
0x2, 0x2, 0x15, 0x3, 0x2, 0x2, 0x2, 0x2, 0x17,
0x3, 0x2, 0x2, 0x2, 0x2, 0x19, 0x3, 0x2, 0x2,
0x2, 0x2, 0x1b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x1d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x1f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x21, 0x3, 0x2, 0x2, 0x2, 0x2, 0x23,
0x3, 0x2, 0x2, 0x2, 0x2, 0x25, 0x3, 0x2, 0x2,
0x2, 0x2, 0x27, 0x3, 0x2, 0x2, 0x2, 0x2, 0x29,
0x3, 0x2, 0x2, 0x2, 0x2, 0x2b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x2d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x2f,
0x3, 0x2, 0x2, 0x2, 0x2, 0x31, 0x3, 0x2, 0x2,
0x2, 0x2, 0x33, 0x3, 0x2, 0x2, 0x2, 0x2, 0x35,
0x3, 0x2, 0x2, 0x2, 0x2, 0x37, 0x3, 0x2, 0x2,
0x2, 0x2, 0x39, 0x3, 0x2, 0x2, 0x2, 0x2, 0x3b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x3d, 0x3, 0x2, 0x2,
0x2, 0x2, 0x3f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x41,
0x3, 0x2, 0x2, 0x2, 0x2, 0x43, 0x3, 0x2, 0x2,
0x2, 0x2, 0x45, 0x3, 0x2, 0x2, 0x2, 0x2, 0x47,
0x3, 0x2, 0x2, 0x2, 0x2, 0x49, 0x3, 0x2, 0x2,
0x2, 0x2, 0x4b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x4f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x51, 0x3, 0x2, 0x2, 0x2, 0x2, 0x53,
0x3, 0x2, 0x2, 0x2, 0x2, 0x55, 0x3, 0x2, 0x2,
0x2, 0x2, 0x57, 0x3, 0x2, 0x2, 0x2, 0x2, 0x59,
0x3, 0x2, 0x2, 0x2, 0x2, 0x5b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x5d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x5f,
0x3, 0x2, 0x2, 0x2, 0x2, 0x61, 0x3, 0x2, 0x2,
0x2, 0x2, 0x63, 0x3, 0x2, 0x2, 0x2, 0x2, 0x65,
0x3, 0x2, 0x2, 0x2, 0x2, 0x67, 0x3, 0x2, 0x2,
0x2, 0x2, 0x69, 0x3, 0x2, 0x2, 0x2, 0x2, 0x6b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x6d, 0x3, 0x2, 0x2,
0x2, 0x2, 0x6f, 0x3, 0x2, 0x2, 0x2, 0x2, 0x71,
0x3, 0x2, 0x2, 0x2, 0x2, 0x73, 0x3, 0x2, 0x2,
0x2, 0x2, 0x75, 0x3, 0x2, 0x2, 0x2, 0x2, 0x77,
0x3, 0x2, 0x2, 0x2, 0x2, 0x79, 0x3, 0x2, 0x2,
0x2, 0x2, 0x7b, 0x3, 0x2, 0x2, 0x2, 0x2, 0x7d,
0x3, 0x2, 0x2, 0x2, 0x2, 0x7f, 0x3, 0x2, 0x2,
0x2, 0x2, 0x81, 0x3, 0x2, 0x2, 0x2, 0x2, 0x83,
0x3, 0x2, 0x2, 0x2, 0x2, 0x85, 0x3, 0x2, 0x2,
0x2, 0x2, 0x87, 0x3, 0x2, 0x2, 0x2, 0x2, 0x89,
0x3, 0x2, 0x2, 0x2, 0x2, 0x8b, 0x3, 0x2, 0x2,
0x2, 0x2, 0x8d, 0x3, 0x2, 0x2, 0x2, 0x2, 0x8f,
0x3, 0x2, 0x2, 0x2, 0x2, 0x91, 0x3, 0x2, 0x2,
0x2, 0x2, 0x93, 0x3, 0x2, 0x2, 0x2, 0x2, 0x95,
0x3, 0x2, 0x2, 0x2, 0x2, 0x97, 0x3, 0x2, 0x2,
0x2, 0x2, 0x99, 0x3, 0x2, 0x2, 0x2, 0x2, 0x9b,
0x3, 0x2, 0x2, 0x2, 0x2, 0x9d, 0x3, 0x2, 0x2,
0x2, 0x2, 0xa1, 0x3, 0x2, 0x2, 0x2, 0x2, 0xa3,
0x3, 0x2, 0x2, 0x2, 0x2, 0xa5, 0x3, 0x2, 0x2,
0x2, 0x2, 0xa7, 0x3, 0x2, 0x2, 0x2, 0x2, 0xaf,
0x3, 0x2, 0x2, 0x2, 0x3, 0xb1, 0x3, 0x2, 0x2,
0x2, 0x5, 0xb3, 0x3, 0x2, 0x2, 0x2, 0x7, 0xb5,
0x3, 0x2, 0x2, 0x2, 0x9, 0xb8, 0x3, 0x2, 0x2,
0x2, 0xb, 0xba, 0x3, 0x2, 0x2, 0x2, 0xd, 0xbc,
0x3, 0x2, 0x2, 0x2, 0xf, 0xc1, 0x3, 0x2, 0x2,
0x2, 0x11, 0xc3, 0x3, 0x2, 0x2, 0x2, 0x13, 0xc6,
0x3, 0x2, 0x2, 0x2, 0x15, 0xc9, 0x3, 0x2, 0x2,
0x2, 0x17, 0xcb, 0x3, 0x2, 0x2, 0x2, 0x19, 0xcd,
0x3, 0x2, 0x2, 0x2, 0x1b, 0xcf, 0x3, 0x2, 0x2,
0x2, 0x1d, 0xd1, 0x3, 0x2, 0x2, 0x2, 0x1f, 0xd4,
0x3, 0x2, 0x2, 0x2, 0x21, 0xd9, 0x3, 0x2, 0x2,
0x2, 0x23, 0xdb, 0x3, 0x2, 0x2, 0x2, 0x25, 0xdd,
0x3, 0x2, 0x2, 0x2, 0x27, 0xe5, 0x3, 0x2, 0x2,
0x2, 0x29, 0xef, 0x3, 0x2, 0x2, 0x2, 0x2b, 0xf8,
0x3, 0x2, 0x2, 0x2, 0x2d, 0xfe, 0x3, 0x2, 0x2,
0x2, 0x2f, 0x104, 0x3, 0x2, 0x2, 0x2, 0x31, 0x10c,
0x3, 0x2, 0x2, 0x2, 0x33, 0x114, 0x3, 0x2, 0x2,
0x2, 0x35, 0x11b, 0x3, 0x2, 0x2, 0x2, 0x37, 0x126,
0x3, 0x2, 0x2, 0x2, 0x39, 0x12f, 0x3, 0x2, 0x2,
0x2, 0x3b, 0x138, 0x3, 0x2, 0x2, 0x2, 0x3d, 0x13b,
0x3, 0x2, 0x2, 0x2, 0x3f, 0x140, 0x3, 0x2, 0x2,
0x2, 0x41, 0x148, 0x3, 0x2, 0x2, 0x2, 0x43, 0x14c,
0x3, 0x2, 0x2, 0x2, 0x45, 0x152, 0x3, 0x2, 0x2,
0x2, 0x47, 0x159, 0x3, 0x2, 0x2, 0x2, 0x49, 0x163,
0x3, 0x2, 0x2, 0x2, 0x4b, 0x16c, 0x3, 0x2, 0x2,
0x2, 0x4d, 0x172, 0x3, 0x2, 0x2, 0x2, 0x4f, 0x177,
0x3, 0x2, 0x2, 0x2, 0x51, 0x181, 0x3, 0x2, 0x2,
0x2, 0x53, 0x185, 0x3, 0x2, 0x2, 0x2, 0x55, 0x18b,
0x3, 0x2, 0x2, 0x2, 0x57, 0x191, 0x3, 0x2, 0x2,
0x2, 0x59, 0x198, 0x3, 0x2, 0x2, 0x2, 0x5b, 0x19d,
0x3, 0x2, 0x2, 0x2, 0x5d, 0x1a0, 0x3, 0x2, 0x2,
0x2, 0x5f, 0x1a4, 0x3, 0x2, 0x2, 0x2, 0x61, 0x1ab,
0x3, 0x2, 0x2, 0x2, 0x63, 0x1b2, 0x3, 0x2, 0x2,
0x2, 0x65, 0x1be, 0x3, 0x2, 0x2, 0x2, 0x67, 0x1c4,
0x3, 0x2, 0x2, 0x2, 0x69, 0x1e0, 0x3, 0x2, 0x2,
0x2, 0x6b, 0x1e2, 0x3, 0x2, 0x2, 0x2, 0x6d, 0x1e5,
0x3, 0x2, 0x2, 0x2, 0x6f, 0x1e7, 0x3, 0x2, 0x2,
0x2, 0x71, 0x1e9, 0x3, 0x2, 0x2, 0x2, 0x73, 0x1eb,
0x3, 0x2, 0x2, 0x2, 0x75, 0x1ed, 0x3, 0x2, 0x2,
0x2, 0x77, 0x1ef, 0x3, 0x2, 0x2, 0x2, 0x79, 0x1f1,
0x3, 0x2, 0x2, 0x2, 0x7b, 0x1f3, 0x3, 0x2, 0x2,
0x2, 0x7d, 0x1f5, 0x3, 0x2, 0x2, 0x2, 0x7f, 0x1f9,
0x3, 0x2, 0x2, 0x2, 0x81, 0x1fd, 0x3, 0x2, 0x2,
0x2, 0x83, 0x200, 0x3, 0x2, 0x2, 0x2, 0x85, 0x202,
0x3, 0x2, 0x2, 0x2, 0x87, 0x205, 0x3, 0x2, 0x2,
0x2, 0x89, 0x207, 0x3, 0x2, 0x2, 0x2, 0x8b, 0x20a,
0x3, 0x2, 0x2, 0x2, 0x8d, 0x20d, 0x3, 0x2, 0x2,
0x2, 0x8f, 0x210, 0x3, 0x2, 0x2, 0x2, 0x91, 0x214,
0x3, 0x2, 0x2, 0x2, 0x93, 0x21a, 0x3, 0x2, 0x2,
0x2, 0x95, 0x21c, 0x3, 0x2, 0x2, 0x2, 0x97, 0x21f,
0x3, 0x2, 0x2, 0x2, 0x99, 0x222, 0x3, 0x2, 0x2,
0x2, 0x9b, 0x236, 0x3, 0x2, 0x2, 0x2, 0x9d, 0x238,
0x3, 0x2, 0x2, 0x2, 0x9f, 0x23b, 0x3, 0x2, 0x2,
0x2, 0xa1, 0x243, 0x3, 0x2, 0x2, 0x2, 0xa3, 0x249,
0x3, 0x2, 0x2, 0x2, 0xa5, 0x259, 0x3, 0x2, 0x2,
0x2, 0xa7, 0x264, 0x3, 0x2, 0x2, 0x2, 0xa9, 0x26e,
0x3, 0x2, 0x2, 0x2, 0xab, 0x270, 0x3, 0x2, 0x2,
0x2, 0xad, 0x29a, 0x3, 0x2, 0x2, 0x2, 0xaf, 0xb0,
0x7, 0x2a, 0x2, 0x2, 0xb0, 0x4, 0x3, 0x2, 0x2,
0x2, 0xb1, 0xb2, 0x7, 0x2e, 0x2, 0x2, 0xb2, 0x6,
0x3, 0x2, 0x2, 0x2, 0xb3, 0xb4, 0x7, 0x2b, 0x2,
0x2, 0xb4, 0x8, 0x3, 0x2, 0x2, 0x2, 0xb5, 0xb6,
0x7, 0x3c, 0x2, 0x2, 0xb6, 0xa, 0x3, 0x2, 0x2,
0x2, 0xb7, 0xb8, 0x7, 0x76, 0x2, 0x2, 0xb8, 0xb9,
0x7, 0x7b, 0x2, 0x2, 0xb9, 0xba, 0x7, 0x72, 0x2,
0x2, 0xba, 0xbb, 0x7, 0x67, 0x2, 0x2, 0xbb, 0xc,
0x3, 0x2, 0x2, 0x2, 0xbc, 0xbd, 0x7, 0x41, 0x2,
0x2, 0xbd, 0xe, 0x3, 0x2, 0x2, 0x2, 0xbe, 0xbf,
0x7, 0x7e, 0x2, 0x2, 0xbf, 0xc0, 0x7, 0x7e, 0x2,
0x2, 0xc0, 0x10, 0x3, 0x2, 0x2, 0x2, 0xc1, 0xc2,
0x7, 0x28, 0x2, 0x2, 0xc2, 0xc3, 0x7, 0x28, 0x2,
0x2, 0xc3, 0x12, 0x3, 0x2, 0x2, 0x2, 0xc4, 0xc5,
0x7, 0x30, 0x2, 0x2, 0xc5, 0x14, 0x3, 0x2, 0x2,
0x2, 0xc6, 0xc7, 0x7, 0x5d, 0x2, 0x2, 0xc7, 0x16,
0x3, 0x2, 0x2, 0x2, 0xc8, 0xc9, 0x7, 0x5f, 0x2,
0x2, 0xc9, 0x18, 0x3, 0x2, 0x2, 0x2, 0xca, 0xcb,
0x7, 0x3d, 0x2, 0x2, 0xcb, 0x1a, 0x3, 0x2, 0x2,
0x2, 0xcc, 0xcd, 0x7, 0x71, 0x2, 0x2, 0xcd, 0xce,
0x7, 0x68, 0x2, 0x2, 0xce, 0x1c, 0x3, 0x2, 0x2,
0x2, 0xcf, 0xd0, 0x7, 0x67, 0x2, 0x2, 0xd0, 0xd1,
0x7, 0x6e, 0x2, 0x2, 0xd1, 0xd2, 0x7, 0x75, 0x2,
0x2, 0xd2, 0xd3, 0x7, 0x67, 0x2, 0x2, 0xd3, 0x1e,
0x3, 0x2, 0x2, 0x2, 0xd4, 0xd5, 0x7, 0x7d, 0x2,
0x2, 0xd5, 0x20, 0x3, 0x2, 0x2, 0x2, 0xd6, 0xd7,
0x7, 0x7f, 0x2, 0x2, 0xd7, 0x22, 0x3, 0x2, 0x2,
0x2, 0xd8, 0xd9, 0x7, 0x67, 0x2, 0x2, 0xd9, 0xda,
0x7, 0x7a, 0x2, 0x2, 0xda, 0xdb, 0x7, 0x76, 0x2,
0x2, 0xdb, 0xdc, 0x7, 0x67, 0x2, 0x2, 0xdc, 0xdd,
0x7, 0x70, 0x2, 0x2, 0xdd, 0xde, 0x7, 0x66, 0x2,
0x2, 0xde, 0xdf, 0x7, 0x75, 0x2, 0x2, 0xdf, 0x24,
0x3, 0x2, 0x2, 0x2, 0xe0, 0xe1, 0x7, 0x69, 0x2,
0x2, 0xe1, 0xe2, 0x7, 0x67, 0x2, 0x2, 0xe2, 0xe3,
0x7, 0x70, 0x2, 0x2, 0xe3, 0xe4, 0x7, 0x67, 0x2,
0x2, 0xe4, 0xe5, 0x7, 0x74, 0x2, 0x2, 0xe5, 0xe6,
0x7, 0x63, 0x2, 0x2, 0xe6, 0xe7, 0x7, 0x76, 0x2,
0x2, 0xe7, 0xe8, 0x7, 0x67, 0x2, 0x2, 0xe8, 0xe9,
0x7, 0x75, 0x2, 0x2, 0xe9, 0x26, 0x3, 0x2, 0x2,
0x2, 0xea, 0xeb, 0x7, 0x71, 0x2, 0x2, 0xeb, 0xec,
0x7, 0x72, 0x2, 0x2, 0xec, 0xed, 0x7, 0x67, 0x2,
0x2, 0xed, 0xee, 0x7, 0x74, 0x2, 0x2, 0xee, 0xef,
0x7, 0x63, 0x2, 0x2, 0xef, 0xf0, 0x7, 0x76, 0x2,
0x2, 0xf0, 0xf1, 0x7, 0x71, 0x2, 0x2, 0xf1, 0xf2,
0x7, 0x74, 0x2, 0x2, 0xf2, 0x28, 0x3, 0x2, 0x2,
0x2, 0xf3, 0xf4, 0x7, 0x65, 0x2, 0x2, 0xf4, 0xf5,
0x7, 0x71, 0x2, 0x2, 0xf5, 0xf6, 0x7, 0x70, 0x2,
0x2, 0xf6, 0xf7, 0x7, 0x75, 0x2, 0x2, 0xf7, 0xf8,
0x7, 0x76, 0x2, 0x2, 0xf8, 0x2a, 0x3, 0x2, 0x2,
0x2, 0xf9, 0xfa, 0x7, 0x6f, 0x2, 0x2, 0xfa, 0xfb,
0x7, 0x63, 0x2, 0x2, 0xfb, 0xfc, 0x7, 0x65, 0x2,
0x2, 0xfc, 0xfd, 0x7, 0x74, 0x2, 0x2, 0xfd, 0xfe,
0x7, 0x71, 0x2, 0x2, 0xfe, 0x2c, 0x3, 0x2, 0x2,
0x2, 0xff, 0x100, 0x7, 0x64, 0x2, 0x2, 0x100, 0x101,
0x7, 0x77, 0x2, 0x2, 0x101, 0x102, 0x7, 0x6b, 0x2,
0x2, 0x102, 0x103, 0x7, 0x6e, 0x2, 0x2, 0x103, 0x104,
0x7, 0x76, 0x2, 0x2, 0x104, 0x105, 0x7, 0x6b, 0x2,
0x2, 0x105, 0x106, 0x7, 0x70, 0x2, 0x2, 0x106, 0x2e,
0x3, 0x2, 0x2, 0x2, 0x107, 0x108, 0x7, 0x74, 0x2,
0x2, 0x108, 0x109, 0x7, 0x77, 0x2, 0x2, 0x109, 0x10a,
0x7, 0x70, 0x2, 0x2, 0x10a, 0x10b, 0x7, 0x76, 0x2,
0x2, 0x10b, 0x10c, 0x7, 0x6b, 0x2, 0x2, 0x10c, 0x10d,
0x7, 0x6f, 0x2, 0x2, 0x10d, 0x10e, 0x7, 0x67, 0x2,
0x2, 0x10e, 0x30, 0x3, 0x2, 0x2, 0x2, 0x10f, 0x110,
0x7, 0x6f, 0x2, 0x2, 0x110, 0x111, 0x7, 0x71, 0x2,
0x2, 0x111, 0x112, 0x7, 0x66, 0x2, 0x2, 0x112, 0x113,
0x7, 0x77, 0x2, 0x2, 0x113, 0x114, 0x7, 0x6e, 0x2,
0x2, 0x114, 0x115, 0x7, 0x67, 0x2, 0x2, 0x115, 0x32,
0x3, 0x2, 0x2, 0x2, 0x116, 0x117, 0x7, 0x6c, 0x2,
0x2, 0x117, 0x118, 0x7, 0x63, 0x2, 0x2, 0x118, 0x119,
0x7, 0x78, 0x2, 0x2, 0x119, 0x11a, 0x7, 0x63, 0x2,
0x2, 0x11a, 0x11b, 0x7, 0x75, 0x2, 0x2, 0x11b, 0x11c,
0x7, 0x65, 0x2, 0x2, 0x11c, 0x11d, 0x7, 0x74, 0x2,
0x2, 0x11d, 0x11e, 0x7, 0x6b, 0x2, 0x2, 0x11e, 0x11f,
0x7, 0x72, 0x2, 0x2, 0x11f, 0x120, 0x7, 0x76, 0x2,
0x2, 0x120, 0x34, 0x3, 0x2, 0x2, 0x2, 0x121, 0x122,
0x7, 0x6b, 0x2, 0x2, 0x122, 0x123, 0x7, 0x6f, 0x2,
0x2, 0x123, 0x124, 0x7, 0x72, 0x2, 0x2, 0x124, 0x125,
0x7, 0x6e, 0x2, 0x2, 0x125, 0x126, 0x7, 0x6b, 0x2,
0x2, 0x126, 0x127, 0x7, 0x65, 0x2, 0x2, 0x127, 0x128,
0x7, 0x6b, 0x2, 0x2, 0x128, 0x129, 0x7, 0x76, 0x2,
0x2, 0x129, 0x36, 0x3, 0x2, 0x2, 0x2, 0x12a, 0x12b,
0x7, 0x66, 0x2, 0x2, 0x12b, 0x12c, 0x7, 0x67, 0x2,
0x2, 0x12c, 0x12d, 0x7, 0x68, 0x2, 0x2, 0x12d, 0x12e,
0x7, 0x67, 0x2, 0x2, 0x12e, 0x12f, 0x7, 0x74, 0x2,
0x2, 0x12f, 0x130, 0x7, 0x74, 0x2, 0x2, 0x130, 0x131,
0x7, 0x67, 0x2, 0x2, 0x131, 0x132, 0x7, 0x66, 0x2,
0x2, 0x132, 0x38, 0x3, 0x2, 0x2, 0x2, 0x133, 0x134,
0x7, 0x6b, 0x2, 0x2, 0x134, 0x135, 0x7, 0x68, 0x2,
0x2, 0x135, 0x3a, 0x3, 0x2, 0x2, 0x2, 0x136, 0x137,
0x7, 0x65, 0x2, 0x2, 0x137, 0x138, 0x7, 0x63, 0x2,
0x2, 0x138, 0x139, 0x7, 0x75, 0x2, 0x2, 0x139, 0x13a,
0x7, 0x76, 0x2, 0x2, 0x13a, 0x3c, 0x3, 0x2, 0x2,
0x2, 0x13b, 0x13c, 0x7, 0x65, 0x2, 0x2, 0x13c, 0x13d,
0x7, 0x71, 0x2, 0x2, 0x13d, 0x13e, 0x7, 0x70, 0x2,
0x2, 0x13e, 0x13f, 0x7, 0x78, 0x2, 0x2, 0x13f, 0x140,
0x7, 0x67, 0x2, 0x2, 0x140, 0x141, 0x7, 0x74, 0x2,
0x2, 0x141, 0x142, 0x7, 0x76, 0x2, 0x2, 0x142, 0x3e,
0x3, 0x2, 0x2, 0x2, 0x143, 0x144, 0x7, 0x68, 0x2,
0x2, 0x144, 0x145, 0x7, 0x71, 0x2, 0x2, 0x145, 0x146,
0x7, 0x74, 0x2, 0x2, 0x146, 0x40, 0x3, 0x2, 0x2,
0x2, 0x147, 0x148, 0x7, 0x79, 0x2, 0x2, 0x148, 0x149,
0x7, 0x6a, 0x2, 0x2, 0x149, 0x14a, 0x7, 0x6b, 0x2,
0x2, 0x14a, 0x14b, 0x7, 0x6e, 0x2, 0x2, 0x14b, 0x14c,
0x7, 0x67, 0x2, 0x2, 0x14c, 0x42, 0x3, 0x2, 0x2,
0x2, 0x14d, 0x14e, 0x7, 0x74, 0x2, 0x2, 0x14e, 0x14f,
0x7, 0x67, 0x2, 0x2, 0x14f, 0x150, 0x7, 0x76, 0x2,
0x2, 0x150, 0x151, 0x7, 0x77, 0x2, 0x2, 0x151, 0x152,
0x7, 0x74, 0x2, 0x2, 0x152, 0x153, 0x7, 0x70, 0x2,
0x2, 0x153, 0x44, 0x3, 0x2, 0x2, 0x2, 0x154, 0x155,
0x7, 0x65, 0x2, 0x2, 0x155, 0x156, 0x7, 0x71, 0x2,
0x2, 0x156, 0x157, 0x7, 0x70, 0x2, 0x2, 0x157, 0x158,
0x7, 0x75, 0x2, 0x2, 0x158, 0x159, 0x7, 0x76, 0x2,
0x2, 0x159, 0x15a, 0x7, 0x67, 0x2, 0x2, 0x15a, 0x15b,
0x7, 0x7a, 0x2, 0x2, 0x15b, 0x15c, 0x7, 0x72, 0x2,
0x2, 0x15c, 0x15d, 0x7, 0x74, 0x2, 0x2, 0x15d, 0x46,
0x3, 0x2, 0x2, 0x2, 0x15e, 0x15f, 0x7, 0x65, 0x2,
0x2, 0x15f, 0x160, 0x7, 0x71, 0x2, 0x2, 0x160, 0x161,
0x7, 0x70, 0x2, 0x2, 0x161, 0x162, 0x7, 0x76, 0x2,
0x2, 0x162, 0x163, 0x7, 0x6b, 0x2, 0x2, 0x163, 0x164,
0x7, 0x70, 0x2, 0x2, 0x164, 0x165, 0x7, 0x77, 0x2,
0x2, 0x165, 0x166, 0x7, 0x67, 0x2, 0x2, 0x166, 0x48,
0x3, 0x2, 0x2, 0x2, 0x167, 0x168, 0x7, 0x64, 0x2,
0x2, 0x168, 0x169, 0x7, 0x74, 0x2, 0x2, 0x169, 0x16a,
0x7, 0x67, 0x2, 0x2, 0x16a, 0x16b, 0x7, 0x63, 0x2,
0x2, 0x16b, 0x16c, 0x7, 0x6d, 0x2, 0x2, 0x16c, 0x4a,
0x3, 0x2, 0x2, 0x2, 0x16d, 0x16e, 0x7, 0x69, 0x2,
0x2, 0x16e, 0x16f, 0x7, 0x71, 0x2, 0x2, 0x16f, 0x170,
0x7, 0x76, 0x2, 0x2, 0x170, 0x171, 0x7, 0x71, 0x2,
0x2, 0x171, 0x4c, 0x3, 0x2, 0x2, 0x2, 0x172, 0x173,
0x7, 0x71, 0x2, 0x2, 0x173, 0x174, 0x7, 0x76, 0x2,
0x2, 0x174, 0x175, 0x7, 0x6a, 0x2, 0x2, 0x175, 0x176,
0x7, 0x67, 0x2, 0x2, 0x176, 0x177, 0x7, 0x74, 0x2,
0x2, 0x177, 0x178, 0x7, 0x79, 0x2, 0x2, 0x178, 0x179,
0x7, 0x6b, 0x2, 0x2, 0x179, 0x17a, 0x7, 0x75, 0x2,
0x2, 0x17a, 0x17b, 0x7, 0x67, 0x2, 0x2, 0x17b, 0x4e,
0x3, 0x2, 0x2, 0x2, 0x17c, 0x17d, 0x7, 0x76, 0x2,
0x2, 0x17d, 0x17e, 0x7, 0x74, 0x2, 0x2, 0x17e, 0x17f,
0x7, 0x7b, 0x2, 0x2, 0x17f, 0x50, 0x3, 0x2, 0x2,
0x2, 0x180, 0x181, 0x7, 0x65, 0x2, 0x2, 0x181, 0x182,
0x7, 0x63, 0x2, 0x2, 0x182, 0x183, 0x7, 0x76, 0x2,
0x2, 0x183, 0x184, 0x7, 0x65, 0x2, 0x2, 0x184, 0x185,
0x7, 0x6a, 0x2, 0x2, 0x185, 0x52, 0x3, 0x2, 0x2,
0x2, 0x186, 0x187, 0x7, 0x6e, 0x2, 0x2, 0x187, 0x188,
0x7, 0x63, 0x2, 0x2, 0x188, 0x189, 0x7, 0x64, 0x2,
0x2, 0x189, 0x18a, 0x7, 0x67, 0x2, 0x2, 0x18a, 0x18b,
0x7, 0x6e, 0x2, 0x2, 0x18b, 0x54, 0x3, 0x2, 0x2,
0x2, 0x18c, 0x18d, 0x7, 0x6e, 0x2, 0x2, 0x18d, 0x18e,
0x7, 0x63, 0x2, 0x2, 0x18e, 0x18f, 0x7, 0x64, 0x2,
0x2, 0x18f, 0x190, 0x7, 0x67, 0x2, 0x2, 0x190, 0x191,
0x7, 0x6e, 0x2, 0x2, 0x191, 0x192, 0x7, 0x75, 0x2,
0x2, 0x192, 0x56, 0x3, 0x2, 0x2, 0x2, 0x193, 0x194,
0x7, 0x76, 0x2, 0x2, 0x194, 0x195, 0x7, 0x63, 0x2,
0x2, 0x195, 0x196, 0x7, 0x6b, 0x2, 0x2, 0x196, 0x197,
0x7, 0x6e, 0x2, 0x2, 0x197, 0x58, 0x3, 0x2, 0x2,
0x2, 0x198, 0x199, 0x7, 0x6b, 0x2, 0x2, 0x199, 0x19a,
0x7, 0x75, 0x2, 0x2, 0x19a, 0x19b, 0x7, 0x70, 0x2,
0x2, 0x19b, 0x19c, 0x7, 0x76, 0x2, 0x2, 0x19c, 0x5a,
0x3, 0x2, 0x2, 0x2, 0x19d, 0x19e, 0x7, 0x6b, 0x2,
0x2, 0x19e, 0x19f, 0x7, 0x75, 0x2, 0x2, 0x19f, 0x5c,
0x3, 0x2, 0x2, 0x2, 0x1a0, 0x1a1, 0x7, 0x6e, 0x2,
0x2, 0x1a1, 0x1a2, 0x7, 0x67, 0x2, 0x2, 0x1a2, 0x1a3,
0x7, 0x76, 0x2, 0x2, 0x1a3, 0x5e, 0x3, 0x2, 0x2,
0x2, 0x1a4, 0x1a5, 0x7, 0x67, 0x2, 0x2, 0x1a5, 0x1a6,
0x7, 0x7a, 0x2, 0x2, 0x1a6, 0x1a7, 0x7, 0x76, 0x2,
0x2, 0x1a7, 0x1a8, 0x7, 0x67, 0x2, 0x2, 0x1a8, 0x1a9,
0x7, 0x74, 0x2, 0x2, 0x1a9, 0x1aa, 0x7, 0x70, 0x2,
0x2, 0x1aa, 0x60, 0x3, 0x2, 0x2, 0x2, 0x1ab, 0x1ac,
0x7, 0x63, 0x2, 0x2, 0x1ac, 0x1ad, 0x7, 0x75, 0x2,
0x2, 0x1ad, 0x1ae, 0x7, 0x75, 0x2, 0x2, 0x1ae, 0x1af,
0x7, 0x67, 0x2, 0x2, 0x1af, 0x1b0, 0x7, 0x74, 0x2,
0x2, 0x1b0, 0x1b1, 0x7, 0x76, 0x2, 0x2, 0x1b1, 0x62,
0x3, 0x2, 0x2, 0x2, 0x1b2, 0x1b3, 0x7, 0x77, 0x2,
0x2, 0x1b3, 0x1b4, 0x7, 0x70, 0x2, 0x2, 0x1b4, 0x1b5,
0x7, 0x74, 0x2, 0x2, 0x1b5, 0x1b6, 0x7, 0x67, 0x2,
0x2, 0x1b6, 0x1b7, 0x7, 0x63, 0x2, 0x2, 0x1b7, 0x1b8,
0x7, 0x65, 0x2, 0x2, 0x1b8, 0x1b9, 0x7, 0x6a, 0x2,
0x2, 0x1b9, 0x1ba, 0x7, 0x63, 0x2, 0x2, 0x1ba, 0x1bb,
0x7, 0x64, 0x2, 0x2, 0x1bb, 0x1bc, 0x7, 0x6e, 0x2,
0x2, 0x1bc, 0x1bd, 0x7, 0x67, 0x2, 0x2, 0x1bd, 0x64,
0x3, 0x2, 0x2, 0x2, 0x1be, 0x1bf, 0x7, 0x66, 0x2,
0x2, 0x1bf, 0x1c0, 0x7, 0x67, 0x2, 0x2, 0x1c0, 0x1c1,
0x7, 0x64, 0x2, 0x2, 0x1c1, 0x1c2, 0x7, 0x77, 0x2,
0x2, 0x1c2, 0x1c3, 0x7, 0x69, 0x2, 0x2, 0x1c3, 0x66,
0x3, 0x2, 0x2, 0x2, 0x1c4, 0x1c5, 0x7, 0x3f, 0x2,
0x2, 0x1c5, 0x68, 0x3, 0x2, 0x2, 0x2, 0x1c6, 0x1c7,
0x7, 0x2c, 0x2, 0x2, 0x1c7, 0x1e1, 0x7, 0x3f, 0x2,
0x2, 0x1c8, 0x1c9, 0x7, 0x31, 0x2, 0x2, 0x1c9, 0x1e1,
0x7, 0x3f, 0x2, 0x2, 0x1ca, 0x1cb, 0x7, 0x27, 0x2,
0x2, 0x1cb, 0x1e1, 0x7, 0x3f, 0x2, 0x2, 0x1cc, 0x1cd,
0x7, 0x2d, 0x2, 0x2, 0x1cd, 0x1e1, 0x7, 0x3f, 0x2,
0x2, 0x1ce, 0x1cf, 0x7, 0x2f, 0x2, 0x2, 0x1cf, 0x1e1,
0x7, 0x3f, 0x2, 0x2, 0x1d0, 0x1d1, 0x7, 0x3e, 0x2,
0x2, 0x1d1, 0x1d2, 0x7, 0x3e, 0x2, 0x2, 0x1d2, 0x1e1,
0x7, 0x3f, 0x2, 0x2, 0x1d3, 0x1d4, 0x7, 0x40, 0x2,
0x2, 0x1d4, 0x1d5, 0x7, 0x40, 0x2, 0x2, 0x1d5, 0x1e1,
0x7, 0x3f, 0x2, 0x2, 0x1d6, 0x1d7, 0x7, 0x40, 0x2,
0x2, 0x1d7, 0x1d8, 0x7, 0x40, 0x2, 0x2, 0x1d8, 0x1d9,
0x7, 0x40, 0x2, 0x2, 0x1d9, 0x1e1, 0x7, 0x3f, 0x2,
0x2, 0x1da, 0x1db, 0x7, 0x28, 0x2, 0x2, 0x1db, 0x1e1,
0x7, 0x3f, 0x2, 0x2, 0x1dc, 0x1dd, 0x7, 0x60, 0x2,
0x2, 0x1dd, 0x1e1, 0x7, 0x3f, 0x2, 0x2, 0x1de, 0x1df,
0x7, 0x7e, 0x2, 0x2, 0x1df, 0x1e1, 0x7, 0x3f, 0x2,
0x2, 0x1e0, 0x1c6, 0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1c8,
0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1ca, 0x3, 0x2, 0x2,
0x2, 0x1e0, 0x1cc, 0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1ce,
0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1d0, 0x3, 0x2, 0x2,
0x2, 0x1e0, 0x1d3, 0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1d6,
0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1da, 0x3, 0x2, 0x2,
0x2, 0x1e0, 0x1dc, 0x3, 0x2, 0x2, 0x2, 0x1e0, 0x1de,
0x3, 0x2, 0x2, 0x2, 0x1e1, 0x6a, 0x3, 0x2, 0x2,
0x2, 0x1e2, 0x1e3, 0x7, 0x3f, 0x2, 0x2, 0x1e3, 0x1e4,
0x7, 0x3f, 0x2, 0x2, 0x1e4, 0x6c, 0x3, 0x2, 0x2,
0x2, 0x1e5, 0x1e6, 0x7, 0x2d, 0x2, 0x2, 0x1e6, 0x6e,
0x3, 0x2, 0x2, 0x2, 0x1e7, 0x1e8, 0x7, 0x2f, 0x2,
0x2, 0x1e8, 0x70, 0x3, 0x2, 0x2, 0x2, 0x1e9, 0x1ea,
0x7, 0x2c, 0x2, 0x2, 0x1ea, 0x72, 0x3, 0x2, 0x2,
0x2, 0x1eb, 0x1ec, 0x7, 0x31, 0x2, 0x2, 0x1ec, 0x74,
0x3, 0x2, 0x2, 0x2, 0x1ed, 0x1ee, 0x7, 0x27, 0x2,
0x2, 0x1ee, 0x76, 0x3, 0x2, 0x2, 0x2, 0x1ef, 0x1f0,
0x7, 0x7e, 0x2, 0x2, 0x1f0, 0x78, 0x3, 0x2, 0x2,
0x2, 0x1f1, 0x1f2, 0x7, 0x28, 0x2, 0x2, 0x1f2, 0x7a,
0x3, 0x2, 0x2, 0x2, 0x1f3, 0x1f4, 0x7, 0x80, 0x2,
0x2, 0x1f4, 0x7c, 0x3, 0x2, 0x2, 0x2, 0x1f5, 0x1f6,
0x7, 0x6f, 0x2, 0x2, 0x1f6, 0x1f7, 0x7, 0x63, 0x2,
0x2, 0x1f7, 0x1f8, 0x7, 0x7a, 0x2, 0x2, 0x1f8, 0x7e,
0x3, 0x2, 0x2, 0x2, 0x1f9, 0x1fa, 0x7, 0x6f, 0x2,
0x2, 0x1fa, 0x1fb, 0x7, 0x6b, 0x2, 0x2, 0x1fb, 0x1fc,
0x7, 0x70, 0x2, 0x2, 0x1fc, 0x80, 0x3, 0x2, 0x2,
0x2, 0x1fd, 0x1fe, 0x7, 0x23, 0x2, 0x2, 0x1fe, 0x1ff,
0x7, 0x3f, 0x2, 0x2, 0x1ff, 0x82, 0x3, 0x2, 0x2,
0x2, 0x200, 0x201, 0x7, 0x3e, 0x2, 0x2, 0x201, 0x84,
0x3, 0x2, 0x2, 0x2, 0x202, 0x203, 0x7, 0x3e, 0x2,
0x2, 0x203, 0x204, 0x7, 0x3f, 0x2, 0x2, 0x204, 0x86,
0x3, 0x2, 0x2, 0x2, 0x205, 0x206, 0x7, 0x40, 0x2,
0x2, 0x206, 0x88, 0x3, 0x2, 0x2, 0x2, 0x207, 0x208,
0x7, 0x40, 0x2, 0x2, 0x208, 0x209, 0x7, 0x3f, 0x2,
0x2, 0x209, 0x8a, 0x3, 0x2, 0x2, 0x2, 0x20a, 0x20b,
0x7, 0x3e, 0x2, 0x2, 0x20b, 0x20c, 0x7, 0x3e, 0x2,
0x2, 0x20c, 0x8c, 0x3, 0x2, 0x2, 0x2, 0x20d, 0x20e,
0x7, 0x40, 0x2, 0x2, 0x20e, 0x20f, 0x7, 0x40, 0x2,
0x2, 0x20f, 0x8e, 0x3, 0x2, 0x2, 0x2, 0x210, 0x211,
0x7, 0x40, 0x2, 0x2, 0x211, 0x212, 0x7, 0x40, 0x2,
0x2, 0x212, 0x213, 0x7, 0x40, 0x2, 0x2, 0x213, 0x90,
0x3, 0x2, 0x2, 0x2, 0x214, 0x215, 0x7, 0x30, 0x2,
0x2, 0x215, 0x216, 0x7, 0x30, 0x2, 0x2, 0x216, 0x217,
0x7, 0x30, 0x2, 0x2, 0x217, 0x92, 0x3, 0x2, 0x2,
0x2, 0x218, 0x21b, 0x5, 0x6b, 0x36, 0x2, 0x219, 0x21b,
0x5, 0x81, 0x41, 0x2, 0x21a, 0x218, 0x3, 0x2, 0x2,
0x2, 0x21a, 0x219, 0x3, 0x2, 0x2, 0x2, 0x21b, 0x94,
0x3, 0x2, 0x2, 0x2, 0x21c, 0x21d, 0x7, 0x2d, 0x2,
0x2, 0x21d, 0x21e, 0x7, 0x2d, 0x2, 0x2, 0x21e, 0x96,
0x3, 0x2, 0x2, 0x2, 0x21f, 0x220, 0x7, 0x2f, 0x2,
0x2, 0x220, 0x221, 0x7, 0x2f, 0x2, 0x2, 0x221, 0x98,
0x3, 0x2, 0x2, 0x2, 0x222, 0x223, 0x7, 0x23, 0x2,
0x2, 0x223, 0x9a, 0x3, 0x2, 0x2, 0x2, 0x224, 0x229,
0x7, 0x24, 0x2, 0x2, 0x225, 0x228, 0x5, 0x9d, 0x4f,
0x2, 0x226, 0x228, 0xa, 0x2, 0x2, 0x2, 0x227, 0x225,
0x3, 0x2, 0x2, 0x2, 0x227, 0x226, 0x3, 0x2, 0x2,
0x2, 0x228, 0x22b, 0x3, 0x2, 0x2, 0x2, 0x229, 0x227,
0x3, 0x2, 0x2, 0x2, 0x229, 0x22a, 0x3, 0x2, 0x2,
0x2, 0x22a, 0x22c, 0x3, 0x2, 0x2, 0x2, 0x22b, 0x229,
0x3, 0x2, 0x2, 0x2, 0x22c, 0x237, 0x7, 0x24, 0x2,
0x2, 0x22d, 0x232, 0x7, 0x29, 0x2, 0x2, 0x22e, 0x231,
0x5, 0x9d, 0x4f, 0x2, 0x22f, 0x231, 0xa, 0x3, 0x2,
0x2, 0x230, 0x22e, 0x3, 0x2, 0x2, 0x2, 0x230, 0x22f,
0x3, 0x2, 0x2, 0x2, 0x231, 0x234, 0x3, 0x2, 0x2,
0x2, 0x232, 0x230, 0x3, 0x2, 0x2, 0x2, 0x232, 0x233,
0x3, 0x2, 0x2, 0x2, 0x233, 0x235, 0x3, 0x2, 0x2,
0x2, 0x234, 0x232, 0x3, 0x2, 0x2, 0x2, 0x235, 0x237,
0x7, 0x29, 0x2, 0x2, 0x236, 0x224, 0x3, 0x2, 0x2,
0x2, 0x236, 0x22d, 0x3, 0x2, 0x2, 0x2, 0x237, 0x9c,
0x3, 0x2, 0x2, 0x2, 0x238, 0x239, 0x7, 0x5e, 0x2,
0x2, 0x239, 0x23a, 0x9, 0x4, 0x2, 0x2, 0x23a, 0x9e,
0x3, 0x2, 0x2, 0x2, 0x23b, 0x23f, 0x9, 0x5, 0x2,
0x2, 0x23c, 0x23e, 0x9, 0x6, 0x2, 0x2, 0x23d, 0x23c,
0x3, 0x2, 0x2, 0x2, 0x23e, 0x241, 0x3, 0x2, 0x2,
0x2, 0x23f, 0x23d, 0x3, 0x2, 0x2, 0x2, 0x23f, 0x240,
0x3, 0x2, 0x2, 0x2, 0x240, 0xa0, 0x3, 0x2, 0x2,
0x2, 0x241, 0x23f, 0x3, 0x2, 0x2, 0x2, 0x242, 0x244,
0x9, 0x7, 0x2, 0x2, 0x243, 0x242, 0x3, 0x2, 0x2,
0x2, 0x244, 0x245, 0x3, 0x2, 0x2, 0x2, 0x245, 0x243,
0x3, 0x2, 0x2, 0x2, 0x245, 0x246, 0x3, 0x2, 0x2,
0x2, 0x246, 0x247, 0x3, 0x2, 0x2, 0x2, 0x247, 0x248,
0x8, 0x51, 0x2, 0x2, 0x248, 0xa2, 0x3, 0x2, 0x2,
0x2, 0x249, 0x24a, 0x7, 0x31, 0x2, 0x2, 0x24a, 0x24b,
0x7, 0x2c, 0x2, 0x2, 0x24b, 0x24f, 0x3, 0x2, 0x2,
0x2, 0x24c, 0x24e, 0xb, 0x2, 0x2, 0x2, 0x24d, 0x24c,
0x3, 0x2, 0x2, 0x2, 0x24e, 0x251, 0x3, 0x2, 0x2,
0x2, 0x24f, 0x250, 0x3, 0x2, 0x2, 0x2, 0x24f, 0x24d,
0x3, 0x2, 0x2, 0x2, 0x250, 0x255, 0x3, 0x2, 0x2,
0x2, 0x251, 0x24f, 0x3, 0x2, 0x2, 0x2, 0x252, 0x253,
0x7, 0x2c, 0x2, 0x2, 0x253, 0x256, 0x7, 0x31, 0x2,
0x2, 0x254, 0x256, 0x7, 0x2, 0x2, 0x3, 0x255, 0x252,
0x3, 0x2, 0x2, 0x2, 0x255, 0x254, 0x3, 0x2, 0x2,
0x2, 0x256, 0x257, 0x3, 0x2, 0x2, 0x2, 0x257, 0x258,
0x8, 0x52, 0x2, 0x2, 0x258, 0xa4, 0x3, 0x2, 0x2,
0x2, 0x259, 0x25a, 0x7, 0x31, 0x2, 0x2, 0x25a, 0x25b,
0x7, 0x31, 0x2, 0x2, 0x25b, 0x25f, 0x3, 0x2, 0x2,
0x2, 0x25c, 0x25e, 0xa, 0x8, 0x2, 0x2, 0x25d, 0x25c,
0x3, 0x2, 0x2, 0x2, 0x25e, 0x261, 0x3, 0x2, 0x2,
0x2, 0x25f, 0x25d, 0x3, 0x2, 0x2, 0x2, 0x25f, 0x260,
0x3, 0x2, 0x2, 0x2, 0x260, 0x262, 0x3, 0x2, 0x2,
0x2, 0x261, 0x25f, 0x3, 0x2, 0x2, 0x2, 0x262, 0x263,
0x8, 0x53, 0x2, 0x2, 0x263, 0xa6, 0x3, 0x2, 0x2,
0x2, 0x264, 0x265, 0x9, 0x9, 0x2, 0x2, 0x265, 0xa8,
0x3, 0x2, 0x2, 0x2, 0x266, 0x26f, 0x7, 0x32, 0x2,
0x2, 0x267, 0x26b, 0x9, 0xa, 0x2, 0x2, 0x268, 0x26a,
0x5, 0xa7, 0x54, 0x2, 0x269, 0x268, 0x3, 0x2, 0x2,
0x2, 0x26a, 0x26d, 0x3, 0x2, 0x2, 0x2, 0x26b, 0x269,
0x3, 0x2, 0x2, 0x2, 0x26b, 0x26c, 0x3, 0x2, 0x2,
0x2, 0x26c, 0x26f, 0x3, 0x2, 0x2, 0x2, 0x26d, 0x26b,
0x3, 0x2, 0x2, 0x2, 0x26e, 0x266, 0x3, 0x2, 0x2,
0x2, 0x26e, 0x267, 0x3, 0x2, 0x2, 0x2, 0x26f, 0xaa,
0x3, 0x2, 0x2, 0x2, 0x270, 0x272, 0x9, 0xb, 0x2,
0x2, 0x271, 0x273, 0x9, 0xc, 0x2, 0x2, 0x272, 0x271,
0x3, 0x2, 0x2, 0x2, 0x272, 0x273, 0x3, 0x2, 0x2,
0x2, 0x273, 0x275, 0x3, 0x2, 0x2, 0x2, 0x274, 0x276,
0x5, 0xa7, 0x54, 0x2, 0x275, 0x274, 0x3, 0x2, 0x2,
0x2, 0x276, 0x277, 0x3, 0x2, 0x2, 0x2, 0x277, 0x275,
0x3, 0x2, 0x2, 0x2, 0x277, 0x278, 0x3, 0x2, 0x2,
0x2, 0x278, 0xac, 0x3, 0x2, 0x2, 0x2, 0x279, 0x27b,
0x5, 0x6f, 0x38, 0x2, 0x27a, 0x279, 0x3, 0x2, 0x2,
0x2, 0x27a, 0x27b, 0x3, 0x2, 0x2, 0x2, 0x27b, 0x27c,
0x3, 0x2, 0x2, 0x2, 0x27c, 0x27d, 0x5, 0xa9, 0x55,
0x2, 0x27d, 0x281, 0x7, 0x30, 0x2, 0x2, 0x27e, 0x280,
0x5, 0xa7, 0x54, 0x2, 0x27f, 0x27e, 0x3, 0x2, 0x2,
0x2, 0x280, 0x283, 0x3, 0x2, 0x2, 0x2, 0x281, 0x27f,
0x3, 0x2, 0x2, 0x2, 0x281, 0x282, 0x3, 0x2, 0x2,
0x2, 0x282, 0x285, 0x3, 0x2, 0x2, 0x2, 0x283, 0x281,
0x3, 0x2, 0x2, 0x2, 0x284, 0x286, 0x5, 0xab, 0x56,
0x2, 0x285, 0x284, 0x3, 0x2, 0x2, 0x2, 0x285, 0x286,
0x3, 0x2, 0x2, 0x2, 0x286, 0x29b, 0x3, 0x2, 0x2,
0x2, 0x287, 0x289, 0x5, 0x6f, 0x38, 0x2, 0x288, 0x287,
0x3, 0x2, 0x2, 0x2, 0x288, 0x289, 0x3, 0x2, 0x2,
0x2, 0x289, 0x28a, 0x3, 0x2, 0x2, 0x2, 0x28a, 0x28c,
0x7, 0x30, 0x2, 0x2, 0x28b, 0x28d, 0x5, 0xa7, 0x54,
0x2, 0x28c, 0x28b, 0x3, 0x2, 0x2, 0x2, 0x28d, 0x28e,
0x3, 0x2, 0x2, 0x2, 0x28e, 0x28c, 0x3, 0x2, 0x2,
0x2, 0x28e, 0x28f, 0x3, 0x2, 0x2, 0x2, 0x28f, 0x291,
0x3, 0x2, 0x2, 0x2, 0x290, 0x292, 0x5, 0xab, 0x56,
0x2, 0x291, 0x290, 0x3, 0x2, 0x2, 0x2, 0x291, 0x292,
0x3, 0x2, 0x2, 0x2, 0x292, 0x29b, 0x3, 0x2, 0x2,
0x2, 0x293, 0x295, 0x5, 0x6f, 0x38, 0x2, 0x294, 0x293,
0x3, 0x2, 0x2, 0x2, 0x294, 0x295, 0x3, 0x2, 0x2,
0x2, 0x295, 0x296, 0x3, 0x2, 0x2, 0x2, 0x296, 0x298,
0x5, 0xa9, 0x55, 0x2, 0x297, 0x299, 0x5, 0xab, 0x56,
0x2, 0x298, 0x297, 0x3, 0x2, 0x2, 0x2, 0x298, 0x299,
0x3, 0x2, 0x2, 0x2, 0x299, 0x29b, 0x3, 0x2, 0x2,
0x2, 0x29a, 0x27a, 0x3, 0x2, 0x2, 0x2, 0x29a, 0x288,
0x3, 0x2, 0x2, 0x2, 0x29a, 0x294, 0x3, 0x2, 0x2,
0x2, 0x29b, 0xae, 0x3, 0x2, 0x2, 0x2, 0x1c, 0x2,
0x1e0, 0x21a, 0x227, 0x229, 0x230, 0x232, 0x236, 0x23f, 0x245,
0x24f, 0x255, 0x25f, 0x26b, 0x26e, 0x272, 0x277, 0x27a, 0x281,
0x285, 0x288, 0x28e, 0x291, 0x294, 0x298, 0x29a, 0x3, 0x2,
0x3, 0x2,
0x3, 0x2, 0x2, 0x2, 0x5d, 0x1a2, 0x3, 0x2, 0x2,
0x2, 0x5f, 0x1a5, 0x3, 0x2, 0x2, 0x2, 0x61, 0x1a9,
0x3, 0x2, 0x2, 0x2, 0x63, 0x1b0, 0x3, 0x2, 0x2,
0x2, 0x65, 0x1b7, 0x3, 0x2, 0x2, 0x2, 0x67, 0x1c3,
0x3, 0x2, 0x2, 0x2, 0x69, 0x1c9, 0x3, 0x2, 0x2,
0x2, 0x6b, 0x1e5, 0x3, 0x2, 0x2, 0x2, 0x6d, 0x1e7,
0x3, 0x2, 0x2, 0x2, 0x6f, 0x1ea, 0x3, 0x2, 0x2,
0x2, 0x71, 0x1ec, 0x3, 0x2, 0x2, 0x2, 0x73, 0x1ee,
0x3, 0x2, 0x2, 0x2, 0x75, 0x1f0, 0x3, 0x2, 0x2,
0x2, 0x77, 0x1f2, 0x3, 0x2, 0x2, 0x2, 0x79, 0x1f4,
0x3, 0x2, 0x2, 0x2, 0x7b, 0x1f6, 0x3, 0x2, 0x2,
0x2, 0x7d, 0x1f8, 0x3, 0x2, 0x2, 0x2, 0x7f, 0x1fa,
0x3, 0x2, 0x2, 0x2, 0x81, 0x1fe, 0x3, 0x2, 0x2,
0x2, 0x83, 0x202, 0x3, 0x2, 0x2, 0x2, 0x85, 0x205,
0x3, 0x2, 0x2, 0x2, 0x87, 0x207, 0x3, 0x2, 0x2,
0x2, 0x89, 0x20a, 0x3, 0x2, 0x2, 0x2, 0x8b, 0x20c,
0x3, 0x2, 0x2, 0x2, 0x8d, 0x20f, 0x3, 0x2, 0x2,
0x2, 0x8f, 0x212, 0x3, 0x2, 0x2, 0x2, 0x91, 0x215,
0x3, 0x2, 0x2, 0x2, 0x93, 0x219, 0x3, 0x2, 0x2,
0x2, 0x95, 0x21f, 0x3, 0x2, 0x2, 0x2, 0x97, 0x221,
0x3, 0x2, 0x2, 0x2, 0x99, 0x224, 0x3, 0x2, 0x2,
0x2, 0x9b, 0x227, 0x3, 0x2, 0x2, 0x2, 0x9d, 0x23b,
0x3, 0x2, 0x2, 0x2, 0x9f, 0x23d, 0x3, 0x2, 0x2,
0x2, 0xa1, 0x240, 0x3, 0x2, 0x2, 0x2, 0xa3, 0x248,
0x3, 0x2, 0x2, 0x2, 0xa5, 0x24e, 0x3, 0x2, 0x2,
0x2, 0xa7, 0x25e, 0x3, 0x2, 0x2, 0x2, 0xa9, 0x269,
0x3, 0x2, 0x2, 0x2, 0xab, 0x273, 0x3, 0x2, 0x2,
0x2, 0xad, 0x275, 0x3, 0x2, 0x2, 0x2, 0xaf, 0x29f,
0x3, 0x2, 0x2, 0x2, 0xb1, 0xb2, 0x7, 0x2a, 0x2,
0x2, 0xb2, 0x4, 0x3, 0x2, 0x2, 0x2, 0xb3, 0xb4,
0x7, 0x2b, 0x2, 0x2, 0xb4, 0x6, 0x3, 0x2, 0x2,
0x2, 0xb5, 0xb6, 0x7, 0x3f, 0x2, 0x2, 0xb6, 0xb7,
0x7, 0x40, 0x2, 0x2, 0xb7, 0x8, 0x3, 0x2, 0x2,
0x2, 0xb8, 0xb9, 0x7, 0x2e, 0x2, 0x2, 0xb9, 0xa,
0x3, 0x2, 0x2, 0x2, 0xba, 0xbb, 0x7, 0x3c, 0x2,
0x2, 0xbb, 0xc, 0x3, 0x2, 0x2, 0x2, 0xbc, 0xbd,
0x7, 0x76, 0x2, 0x2, 0xbd, 0xbe, 0x7, 0x7b, 0x2,
0x2, 0xbe, 0xbf, 0x7, 0x72, 0x2, 0x2, 0xbf, 0xc0,
0x7, 0x67, 0x2, 0x2, 0xc0, 0xe, 0x3, 0x2, 0x2,
0x2, 0xc1, 0xc2, 0x7, 0x41, 0x2, 0x2, 0xc2, 0x10,
0x3, 0x2, 0x2, 0x2, 0xc3, 0xc4, 0x7, 0x7e, 0x2,
0x2, 0xc4, 0xc5, 0x7, 0x7e, 0x2, 0x2, 0xc5, 0x12,
0x3, 0x2, 0x2, 0x2, 0xc6, 0xc7, 0x7, 0x28, 0x2,
0x2, 0xc7, 0xc8, 0x7, 0x28, 0x2, 0x2, 0xc8, 0x14,
0x3, 0x2, 0x2, 0x2, 0xc9, 0xca, 0x7, 0x30, 0x2,
0x2, 0xca, 0x16, 0x3, 0x2, 0x2, 0x2, 0xcb, 0xcc,
0x7, 0x5d, 0x2, 0x2, 0xcc, 0x18, 0x3, 0x2, 0x2,
0x2, 0xcd, 0xce, 0x7, 0x5f, 0x2, 0x2, 0xce, 0x1a,
0x3, 0x2, 0x2, 0x2, 0xcf, 0xd0, 0x7, 0x3d, 0x2,
0x2, 0xd0, 0x1c, 0x3, 0x2, 0x2, 0x2, 0xd1, 0xd2,
0x7, 0x71, 0x2, 0x2, 0xd2, 0xd3, 0x7, 0x68, 0x2,
0x2, 0xd3, 0x1e, 0x3, 0x2, 0x2, 0x2, 0xd4, 0xd5,
0x7, 0x67, 0x2, 0x2, 0xd5, 0xd6, 0x7, 0x6e, 0x2,
0x2, 0xd6, 0xd7, 0x7, 0x75, 0x2, 0x2, 0xd7, 0xd8,
0x7, 0x67, 0x2, 0x2, 0xd8, 0x20, 0x3, 0x2, 0x2,
0x2, 0xd9, 0xda, 0x7, 0x7d, 0x2, 0x2, 0xda, 0x22,
0x3, 0x2, 0x2, 0x2, 0xdb, 0xdc, 0x7, 0x7f, 0x2,
0x2, 0xdc, 0x24, 0x3, 0x2, 0x2, 0x2, 0xdd, 0xde,
0x7, 0x67, 0x2, 0x2, 0xde, 0xdf, 0x7, 0x7a, 0x2,
0x2, 0xdf, 0xe0, 0x7, 0x76, 0x2, 0x2, 0xe0, 0xe1,
0x7, 0x67, 0x2, 0x2, 0xe1, 0xe2, 0x7, 0x70, 0x2,
0x2, 0xe2, 0xe3, 0x7, 0x66, 0x2, 0x2, 0xe3, 0xe4,
0x7, 0x75, 0x2, 0x2, 0xe4, 0x26, 0x3, 0x2, 0x2,
0x2, 0xe5, 0xe6, 0x7, 0x69, 0x2, 0x2, 0xe6, 0xe7,
0x7, 0x67, 0x2, 0x2, 0xe7, 0xe8, 0x7, 0x70, 0x2,
0x2, 0xe8, 0xe9, 0x7, 0x67, 0x2, 0x2, 0xe9, 0xea,
0x7, 0x74, 0x2, 0x2, 0xea, 0xeb, 0x7, 0x63, 0x2,
0x2, 0xeb, 0xec, 0x7, 0x76, 0x2, 0x2, 0xec, 0xed,
0x7, 0x67, 0x2, 0x2, 0xed, 0xee, 0x7, 0x75, 0x2,
0x2, 0xee, 0x28, 0x3, 0x2, 0x2, 0x2, 0xef, 0xf0,
0x7, 0x71, 0x2, 0x2, 0xf0, 0xf1, 0x7, 0x72, 0x2,
0x2, 0xf1, 0xf2, 0x7, 0x67, 0x2, 0x2, 0xf2, 0xf3,
0x7, 0x74, 0x2, 0x2, 0xf3, 0xf4, 0x7, 0x63, 0x2,
0x2, 0xf4, 0xf5, 0x7, 0x76, 0x2, 0x2, 0xf5, 0xf6,
0x7, 0x71, 0x2, 0x2, 0xf6, 0xf7, 0x7, 0x74, 0x2,
0x2, 0xf7, 0x2a, 0x3, 0x2, 0x2, 0x2, 0xf8, 0xf9,
0x7, 0x65, 0x2, 0x2, 0xf9, 0xfa, 0x7, 0x71, 0x2,
0x2, 0xfa, 0xfb, 0x7, 0x70, 0x2, 0x2, 0xfb, 0xfc,
0x7, 0x75, 0x2, 0x2, 0xfc, 0xfd, 0x7, 0x76, 0x2,
0x2, 0xfd, 0x2c, 0x3, 0x2, 0x2, 0x2, 0xfe, 0xff,
0x7, 0x6f, 0x2, 0x2, 0xff, 0x100, 0x7, 0x63, 0x2,
0x2, 0x100, 0x101, 0x7, 0x65, 0x2, 0x2, 0x101, 0x102,
0x7, 0x74, 0x2, 0x2, 0x102, 0x103, 0x7, 0x71, 0x2,
0x2, 0x103, 0x2e, 0x3, 0x2, 0x2, 0x2, 0x104, 0x105,
0x7, 0x64, 0x2, 0x2, 0x105, 0x106, 0x7, 0x77, 0x2,
0x2, 0x106, 0x107, 0x7, 0x6b, 0x2, 0x2, 0x107, 0x108,
0x7, 0x6e, 0x2, 0x2, 0x108, 0x109, 0x7, 0x76, 0x2,
0x2, 0x109, 0x10a, 0x7, 0x6b, 0x2, 0x2, 0x10a, 0x10b,
0x7, 0x70, 0x2, 0x2, 0x10b, 0x30, 0x3, 0x2, 0x2,
0x2, 0x10c, 0x10d, 0x7, 0x74, 0x2, 0x2, 0x10d, 0x10e,
0x7, 0x77, 0x2, 0x2, 0x10e, 0x10f, 0x7, 0x70, 0x2,
0x2, 0x10f, 0x110, 0x7, 0x76, 0x2, 0x2, 0x110, 0x111,
0x7, 0x6b, 0x2, 0x2, 0x111, 0x112, 0x7, 0x6f, 0x2,
0x2, 0x112, 0x113, 0x7, 0x67, 0x2, 0x2, 0x113, 0x32,
0x3, 0x2, 0x2, 0x2, 0x114, 0x115, 0x7, 0x6f, 0x2,
0x2, 0x115, 0x116, 0x7, 0x71, 0x2, 0x2, 0x116, 0x117,
0x7, 0x66, 0x2, 0x2, 0x117, 0x118, 0x7, 0x77, 0x2,
0x2, 0x118, 0x119, 0x7, 0x6e, 0x2, 0x2, 0x119, 0x11a,
0x7, 0x67, 0x2, 0x2, 0x11a, 0x34, 0x3, 0x2, 0x2,
0x2, 0x11b, 0x11c, 0x7, 0x6c, 0x2, 0x2, 0x11c, 0x11d,
0x7, 0x63, 0x2, 0x2, 0x11d, 0x11e, 0x7, 0x78, 0x2,
0x2, 0x11e, 0x11f, 0x7, 0x63, 0x2, 0x2, 0x11f, 0x120,
0x7, 0x75, 0x2, 0x2, 0x120, 0x121, 0x7, 0x65, 0x2,
0x2, 0x121, 0x122, 0x7, 0x74, 0x2, 0x2, 0x122, 0x123,
0x7, 0x6b, 0x2, 0x2, 0x123, 0x124, 0x7, 0x72, 0x2,
0x2, 0x124, 0x125, 0x7, 0x76, 0x2, 0x2, 0x125, 0x36,
0x3, 0x2, 0x2, 0x2, 0x126, 0x127, 0x7, 0x6b, 0x2,
0x2, 0x127, 0x128, 0x7, 0x6f, 0x2, 0x2, 0x128, 0x129,
0x7, 0x72, 0x2, 0x2, 0x129, 0x12a, 0x7, 0x6e, 0x2,
0x2, 0x12a, 0x12b, 0x7, 0x6b, 0x2, 0x2, 0x12b, 0x12c,
0x7, 0x65, 0x2, 0x2, 0x12c, 0x12d, 0x7, 0x6b, 0x2,
0x2, 0x12d, 0x12e, 0x7, 0x76, 0x2, 0x2, 0x12e, 0x38,
0x3, 0x2, 0x2, 0x2, 0x12f, 0x130, 0x7, 0x66, 0x2,
0x2, 0x130, 0x131, 0x7, 0x67, 0x2, 0x2, 0x131, 0x132,
0x7, 0x68, 0x2, 0x2, 0x132, 0x133, 0x7, 0x67, 0x2,
0x2, 0x133, 0x134, 0x7, 0x74, 0x2, 0x2, 0x134, 0x135,
0x7, 0x74, 0x2, 0x2, 0x135, 0x136, 0x7, 0x67, 0x2,
0x2, 0x136, 0x137, 0x7, 0x66, 0x2, 0x2, 0x137, 0x3a,
0x3, 0x2, 0x2, 0x2, 0x138, 0x139, 0x7, 0x6b, 0x2,
0x2, 0x139, 0x13a, 0x7, 0x68, 0x2, 0x2, 0x13a, 0x3c,
0x3, 0x2, 0x2, 0x2, 0x13b, 0x13c, 0x7, 0x65, 0x2,
0x2, 0x13c, 0x13d, 0x7, 0x63, 0x2, 0x2, 0x13d, 0x13e,
0x7, 0x75, 0x2, 0x2, 0x13e, 0x13f, 0x7, 0x76, 0x2,
0x2, 0x13f, 0x3e, 0x3, 0x2, 0x2, 0x2, 0x140, 0x141,
0x7, 0x65, 0x2, 0x2, 0x141, 0x142, 0x7, 0x71, 0x2,
0x2, 0x142, 0x143, 0x7, 0x70, 0x2, 0x2, 0x143, 0x144,
0x7, 0x78, 0x2, 0x2, 0x144, 0x145, 0x7, 0x67, 0x2,
0x2, 0x145, 0x146, 0x7, 0x74, 0x2, 0x2, 0x146, 0x147,
0x7, 0x76, 0x2, 0x2, 0x147, 0x40, 0x3, 0x2, 0x2,
0x2, 0x148, 0x149, 0x7, 0x68, 0x2, 0x2, 0x149, 0x14a,
0x7, 0x71, 0x2, 0x2, 0x14a, 0x14b, 0x7, 0x74, 0x2,
0x2, 0x14b, 0x42, 0x3, 0x2, 0x2, 0x2, 0x14c, 0x14d,
0x7, 0x79, 0x2, 0x2, 0x14d, 0x14e, 0x7, 0x6a, 0x2,
0x2, 0x14e, 0x14f, 0x7, 0x6b, 0x2, 0x2, 0x14f, 0x150,
0x7, 0x6e, 0x2, 0x2, 0x150, 0x151, 0x7, 0x67, 0x2,
0x2, 0x151, 0x44, 0x3, 0x2, 0x2, 0x2, 0x152, 0x153,
0x7, 0x74, 0x2, 0x2, 0x153, 0x154, 0x7, 0x67, 0x2,
0x2, 0x154, 0x155, 0x7, 0x76, 0x2, 0x2, 0x155, 0x156,
0x7, 0x77, 0x2, 0x2, 0x156, 0x157, 0x7, 0x74, 0x2,
0x2, 0x157, 0x158, 0x7, 0x70, 0x2, 0x2, 0x158, 0x46,
0x3, 0x2, 0x2, 0x2, 0x159, 0x15a, 0x7, 0x65, 0x2,
0x2, 0x15a, 0x15b, 0x7, 0x71, 0x2, 0x2, 0x15b, 0x15c,
0x7, 0x70, 0x2, 0x2, 0x15c, 0x15d, 0x7, 0x75, 0x2,
0x2, 0x15d, 0x15e, 0x7, 0x76, 0x2, 0x2, 0x15e, 0x15f,
0x7, 0x67, 0x2, 0x2, 0x15f, 0x160, 0x7, 0x7a, 0x2,
0x2, 0x160, 0x161, 0x7, 0x72, 0x2, 0x2, 0x161, 0x162,
0x7, 0x74, 0x2, 0x2, 0x162, 0x48, 0x3, 0x2, 0x2,
0x2, 0x163, 0x164, 0x7, 0x65, 0x2, 0x2, 0x164, 0x165,
0x7, 0x71, 0x2, 0x2, 0x165, 0x166, 0x7, 0x70, 0x2,
0x2, 0x166, 0x167, 0x7, 0x76, 0x2, 0x2, 0x167, 0x168,
0x7, 0x6b, 0x2, 0x2, 0x168, 0x169, 0x7, 0x70, 0x2,
0x2, 0x169, 0x16a, 0x7, 0x77, 0x2, 0x2, 0x16a, 0x16b,
0x7, 0x67, 0x2, 0x2, 0x16b, 0x4a, 0x3, 0x2, 0x2,
0x2, 0x16c, 0x16d, 0x7, 0x64, 0x2, 0x2, 0x16d, 0x16e,
0x7, 0x74, 0x2, 0x2, 0x16e, 0x16f, 0x7, 0x67, 0x2,
0x2, 0x16f, 0x170, 0x7, 0x63, 0x2, 0x2, 0x170, 0x171,
0x7, 0x6d, 0x2, 0x2, 0x171, 0x4c, 0x3, 0x2, 0x2,
0x2, 0x172, 0x173, 0x7, 0x69, 0x2, 0x2, 0x173, 0x174,
0x7, 0x71, 0x2, 0x2, 0x174, 0x175, 0x7, 0x76, 0x2,
0x2, 0x175, 0x176, 0x7, 0x71, 0x2, 0x2, 0x176, 0x4e,
0x3, 0x2, 0x2, 0x2, 0x177, 0x178, 0x7, 0x71, 0x2,
0x2, 0x178, 0x179, 0x7, 0x76, 0x2, 0x2, 0x179, 0x17a,
0x7, 0x6a, 0x2, 0x2, 0x17a, 0x17b, 0x7, 0x67, 0x2,
0x2, 0x17b, 0x17c, 0x7, 0x74, 0x2, 0x2, 0x17c, 0x17d,
0x7, 0x79, 0x2, 0x2, 0x17d, 0x17e, 0x7, 0x6b, 0x2,
0x2, 0x17e, 0x17f, 0x7, 0x75, 0x2, 0x2, 0x17f, 0x180,
0x7, 0x67, 0x2, 0x2, 0x180, 0x50, 0x3, 0x2, 0x2,
0x2, 0x181, 0x182, 0x7, 0x76, 0x2, 0x2, 0x182, 0x183,
0x7, 0x74, 0x2, 0x2, 0x183, 0x184, 0x7, 0x7b, 0x2,
0x2, 0x184, 0x52, 0x3, 0x2, 0x2, 0x2, 0x185, 0x186,
0x7, 0x65, 0x2, 0x2, 0x186, 0x187, 0x7, 0x63, 0x2,
0x2, 0x187, 0x188, 0x7, 0x76, 0x2, 0x2, 0x188, 0x189,
0x7, 0x65, 0x2, 0x2, 0x189, 0x18a, 0x7, 0x6a, 0x2,
0x2, 0x18a, 0x54, 0x3, 0x2, 0x2, 0x2, 0x18b, 0x18c,
0x7, 0x6e, 0x2, 0x2, 0x18c, 0x18d, 0x7, 0x63, 0x2,
0x2, 0x18d, 0x18e, 0x7, 0x64, 0x2, 0x2, 0x18e, 0x18f,
0x7, 0x67, 0x2, 0x2, 0x18f, 0x190, 0x7, 0x6e, 0x2,
0x2, 0x190, 0x56, 0x3, 0x2, 0x2, 0x2, 0x191, 0x192,
0x7, 0x6e, 0x2, 0x2, 0x192, 0x193, 0x7, 0x63, 0x2,
0x2, 0x193, 0x194, 0x7, 0x64, 0x2, 0x2, 0x194, 0x195,
0x7, 0x67, 0x2, 0x2, 0x195, 0x196, 0x7, 0x6e, 0x2,
0x2, 0x196, 0x197, 0x7, 0x75, 0x2, 0x2, 0x197, 0x58,
0x3, 0x2, 0x2, 0x2, 0x198, 0x199, 0x7, 0x76, 0x2,
0x2, 0x199, 0x19a, 0x7, 0x63, 0x2, 0x2, 0x19a, 0x19b,
0x7, 0x6b, 0x2, 0x2, 0x19b, 0x19c, 0x7, 0x6e, 0x2,
0x2, 0x19c, 0x5a, 0x3, 0x2, 0x2, 0x2, 0x19d, 0x19e,
0x7, 0x6b, 0x2, 0x2, 0x19e, 0x19f, 0x7, 0x75, 0x2,
0x2, 0x19f, 0x1a0, 0x7, 0x70, 0x2, 0x2, 0x1a0, 0x1a1,
0x7, 0x76, 0x2, 0x2, 0x1a1, 0x5c, 0x3, 0x2, 0x2,
0x2, 0x1a2, 0x1a3, 0x7, 0x6b, 0x2, 0x2, 0x1a3, 0x1a4,
0x7, 0x75, 0x2, 0x2, 0x1a4, 0x5e, 0x3, 0x2, 0x2,
0x2, 0x1a5, 0x1a6, 0x7, 0x6e, 0x2, 0x2, 0x1a6, 0x1a7,
0x7, 0x67, 0x2, 0x2, 0x1a7, 0x1a8, 0x7, 0x76, 0x2,
0x2, 0x1a8, 0x60, 0x3, 0x2, 0x2, 0x2, 0x1a9, 0x1aa,
0x7, 0x67, 0x2, 0x2, 0x1aa, 0x1ab, 0x7, 0x7a, 0x2,
0x2, 0x1ab, 0x1ac, 0x7, 0x76, 0x2, 0x2, 0x1ac, 0x1ad,
0x7, 0x67, 0x2, 0x2, 0x1ad, 0x1ae, 0x7, 0x74, 0x2,
0x2, 0x1ae, 0x1af, 0x7, 0x70, 0x2, 0x2, 0x1af, 0x62,
0x3, 0x2, 0x2, 0x2, 0x1b0, 0x1b1, 0x7, 0x63, 0x2,
0x2, 0x1b1, 0x1b2, 0x7, 0x75, 0x2, 0x2, 0x1b2, 0x1b3,
0x7, 0x75, 0x2, 0x2, 0x1b3, 0x1b4, 0x7, 0x67, 0x2,
0x2, 0x1b4, 0x1b5, 0x7, 0x74, 0x2, 0x2, 0x1b5, 0x1b6,
0x7, 0x76, 0x2, 0x2, 0x1b6, 0x64, 0x3, 0x2, 0x2,
0x2, 0x1b7, 0x1b8, 0x7, 0x77, 0x2, 0x2, 0x1b8, 0x1b9,
0x7, 0x70, 0x2, 0x2, 0x1b9, 0x1ba, 0x7, 0x74, 0x2,
0x2, 0x1ba, 0x1bb, 0x7, 0x67, 0x2, 0x2, 0x1bb, 0x1bc,
0x7, 0x63, 0x2, 0x2, 0x1bc, 0x1bd, 0x7, 0x65, 0x2,
0x2, 0x1bd, 0x1be, 0x7, 0x6a, 0x2, 0x2, 0x1be, 0x1bf,
0x7, 0x63, 0x2, 0x2, 0x1bf, 0x1c0, 0x7, 0x64, 0x2,
0x2, 0x1c0, 0x1c1, 0x7, 0x6e, 0x2, 0x2, 0x1c1, 0x1c2,
0x7, 0x67, 0x2, 0x2, 0x1c2, 0x66, 0x3, 0x2, 0x2,
0x2, 0x1c3, 0x1c4, 0x7, 0x66, 0x2, 0x2, 0x1c4, 0x1c5,
0x7, 0x67, 0x2, 0x2, 0x1c5, 0x1c6, 0x7, 0x64, 0x2,
0x2, 0x1c6, 0x1c7, 0x7, 0x77, 0x2, 0x2, 0x1c7, 0x1c8,
0x7, 0x69, 0x2, 0x2, 0x1c8, 0x68, 0x3, 0x2, 0x2,
0x2, 0x1c9, 0x1ca, 0x7, 0x3f, 0x2, 0x2, 0x1ca, 0x6a,
0x3, 0x2, 0x2, 0x2, 0x1cb, 0x1cc, 0x7, 0x2c, 0x2,
0x2, 0x1cc, 0x1e6, 0x7, 0x3f, 0x2, 0x2, 0x1cd, 0x1ce,
0x7, 0x31, 0x2, 0x2, 0x1ce, 0x1e6, 0x7, 0x3f, 0x2,
0x2, 0x1cf, 0x1d0, 0x7, 0x27, 0x2, 0x2, 0x1d0, 0x1e6,
0x7, 0x3f, 0x2, 0x2, 0x1d1, 0x1d2, 0x7, 0x2d, 0x2,
0x2, 0x1d2, 0x1e6, 0x7, 0x3f, 0x2, 0x2, 0x1d3, 0x1d4,
0x7, 0x2f, 0x2, 0x2, 0x1d4, 0x1e6, 0x7, 0x3f, 0x2,
0x2, 0x1d5, 0x1d6, 0x7, 0x3e, 0x2, 0x2, 0x1d6, 0x1d7,
0x7, 0x3e, 0x2, 0x2, 0x1d7, 0x1e6, 0x7, 0x3f, 0x2,
0x2, 0x1d8, 0x1d9, 0x7, 0x40, 0x2, 0x2, 0x1d9, 0x1da,
0x7, 0x40, 0x2, 0x2, 0x1da, 0x1e6, 0x7, 0x3f, 0x2,
0x2, 0x1db, 0x1dc, 0x7, 0x40, 0x2, 0x2, 0x1dc, 0x1dd,
0x7, 0x40, 0x2, 0x2, 0x1dd, 0x1de, 0x7, 0x40, 0x2,
0x2, 0x1de, 0x1e6, 0x7, 0x3f, 0x2, 0x2, 0x1df, 0x1e0,
0x7, 0x28, 0x2, 0x2, 0x1e0, 0x1e6, 0x7, 0x3f, 0x2,
0x2, 0x1e1, 0x1e2, 0x7, 0x60, 0x2, 0x2, 0x1e2, 0x1e6,
0x7, 0x3f, 0x2, 0x2, 0x1e3, 0x1e4, 0x7, 0x7e, 0x2,
0x2, 0x1e4, 0x1e6, 0x7, 0x3f, 0x2, 0x2, 0x1e5, 0x1cb,
0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1cd, 0x3, 0x2, 0x2,
0x2, 0x1e5, 0x1cf, 0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1d1,
0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1d3, 0x3, 0x2, 0x2,
0x2, 0x1e5, 0x1d5, 0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1d8,
0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1db, 0x3, 0x2, 0x2,
0x2, 0x1e5, 0x1df, 0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1e1,
0x3, 0x2, 0x2, 0x2, 0x1e5, 0x1e3, 0x3, 0x2, 0x2,
0x2, 0x1e6, 0x6c, 0x3, 0x2, 0x2, 0x2, 0x1e7, 0x1e8,
0x7, 0x3f, 0x2, 0x2, 0x1e8, 0x1e9, 0x7, 0x3f, 0x2,
0x2, 0x1e9, 0x6e, 0x3, 0x2, 0x2, 0x2, 0x1ea, 0x1eb,
0x7, 0x2d, 0x2, 0x2, 0x1eb, 0x70, 0x3, 0x2, 0x2,
0x2, 0x1ec, 0x1ed, 0x7, 0x2f, 0x2, 0x2, 0x1ed, 0x72,
0x3, 0x2, 0x2, 0x2, 0x1ee, 0x1ef, 0x7, 0x2c, 0x2,
0x2, 0x1ef, 0x74, 0x3, 0x2, 0x2, 0x2, 0x1f0, 0x1f1,
0x7, 0x31, 0x2, 0x2, 0x1f1, 0x76, 0x3, 0x2, 0x2,
0x2, 0x1f2, 0x1f3, 0x7, 0x27, 0x2, 0x2, 0x1f3, 0x78,
0x3, 0x2, 0x2, 0x2, 0x1f4, 0x1f5, 0x7, 0x7e, 0x2,
0x2, 0x1f5, 0x7a, 0x3, 0x2, 0x2, 0x2, 0x1f6, 0x1f7,
0x7, 0x28, 0x2, 0x2, 0x1f7, 0x7c, 0x3, 0x2, 0x2,
0x2, 0x1f8, 0x1f9, 0x7, 0x80, 0x2, 0x2, 0x1f9, 0x7e,
0x3, 0x2, 0x2, 0x2, 0x1fa, 0x1fb, 0x7, 0x6f, 0x2,
0x2, 0x1fb, 0x1fc, 0x7, 0x63, 0x2, 0x2, 0x1fc, 0x1fd,
0x7, 0x7a, 0x2, 0x2, 0x1fd, 0x80, 0x3, 0x2, 0x2,
0x2, 0x1fe, 0x1ff, 0x7, 0x6f, 0x2, 0x2, 0x1ff, 0x200,
0x7, 0x6b, 0x2, 0x2, 0x200, 0x201, 0x7, 0x70, 0x2,
0x2, 0x201, 0x82, 0x3, 0x2, 0x2, 0x2, 0x202, 0x203,
0x7, 0x23, 0x2, 0x2, 0x203, 0x204, 0x7, 0x3f, 0x2,
0x2, 0x204, 0x84, 0x3, 0x2, 0x2, 0x2, 0x205, 0x206,
0x7, 0x3e, 0x2, 0x2, 0x206, 0x86, 0x3, 0x2, 0x2,
0x2, 0x207, 0x208, 0x7, 0x3e, 0x2, 0x2, 0x208, 0x209,
0x7, 0x3f, 0x2, 0x2, 0x209, 0x88, 0x3, 0x2, 0x2,
0x2, 0x20a, 0x20b, 0x7, 0x40, 0x2, 0x2, 0x20b, 0x8a,
0x3, 0x2, 0x2, 0x2, 0x20c, 0x20d, 0x7, 0x40, 0x2,
0x2, 0x20d, 0x20e, 0x7, 0x3f, 0x2, 0x2, 0x20e, 0x8c,
0x3, 0x2, 0x2, 0x2, 0x20f, 0x210, 0x7, 0x3e, 0x2,
0x2, 0x210, 0x211, 0x7, 0x3e, 0x2, 0x2, 0x211, 0x8e,
0x3, 0x2, 0x2, 0x2, 0x212, 0x213, 0x7, 0x40, 0x2,
0x2, 0x213, 0x214, 0x7, 0x40, 0x2, 0x2, 0x214, 0x90,
0x3, 0x2, 0x2, 0x2, 0x215, 0x216, 0x7, 0x40, 0x2,
0x2, 0x216, 0x217, 0x7, 0x40, 0x2, 0x2, 0x217, 0x218,
0x7, 0x40, 0x2, 0x2, 0x218, 0x92, 0x3, 0x2, 0x2,
0x2, 0x219, 0x21a, 0x7, 0x30, 0x2, 0x2, 0x21a, 0x21b,
0x7, 0x30, 0x2, 0x2, 0x21b, 0x21c, 0x7, 0x30, 0x2,
0x2, 0x21c, 0x94, 0x3, 0x2, 0x2, 0x2, 0x21d, 0x220,
0x5, 0x6d, 0x37, 0x2, 0x21e, 0x220, 0x5, 0x83, 0x42,
0x2, 0x21f, 0x21d, 0x3, 0x2, 0x2, 0x2, 0x21f, 0x21e,
0x3, 0x2, 0x2, 0x2, 0x220, 0x96, 0x3, 0x2, 0x2,
0x2, 0x221, 0x222, 0x7, 0x2d, 0x2, 0x2, 0x222, 0x223,
0x7, 0x2d, 0x2, 0x2, 0x223, 0x98, 0x3, 0x2, 0x2,
0x2, 0x224, 0x225, 0x7, 0x2f, 0x2, 0x2, 0x225, 0x226,
0x7, 0x2f, 0x2, 0x2, 0x226, 0x9a, 0x3, 0x2, 0x2,
0x2, 0x227, 0x228, 0x7, 0x23, 0x2, 0x2, 0x228, 0x9c,
0x3, 0x2, 0x2, 0x2, 0x229, 0x22e, 0x7, 0x24, 0x2,
0x2, 0x22a, 0x22d, 0x5, 0x9f, 0x50, 0x2, 0x22b, 0x22d,
0xa, 0x2, 0x2, 0x2, 0x22c, 0x22a, 0x3, 0x2, 0x2,
0x2, 0x22c, 0x22b, 0x3, 0x2, 0x2, 0x2, 0x22d, 0x230,
0x3, 0x2, 0x2, 0x2, 0x22e, 0x22c, 0x3, 0x2, 0x2,
0x2, 0x22e, 0x22f, 0x3, 0x2, 0x2, 0x2, 0x22f, 0x231,
0x3, 0x2, 0x2, 0x2, 0x230, 0x22e, 0x3, 0x2, 0x2,
0x2, 0x231, 0x23c, 0x7, 0x24, 0x2, 0x2, 0x232, 0x237,
0x7, 0x29, 0x2, 0x2, 0x233, 0x236, 0x5, 0x9f, 0x50,
0x2, 0x234, 0x236, 0xa, 0x3, 0x2, 0x2, 0x235, 0x233,
0x3, 0x2, 0x2, 0x2, 0x235, 0x234, 0x3, 0x2, 0x2,
0x2, 0x236, 0x239, 0x3, 0x2, 0x2, 0x2, 0x237, 0x235,
0x3, 0x2, 0x2, 0x2, 0x237, 0x238, 0x3, 0x2, 0x2,
0x2, 0x238, 0x23a, 0x3, 0x2, 0x2, 0x2, 0x239, 0x237,
0x3, 0x2, 0x2, 0x2, 0x23a, 0x23c, 0x7, 0x29, 0x2,
0x2, 0x23b, 0x229, 0x3, 0x2, 0x2, 0x2, 0x23b, 0x232,
0x3, 0x2, 0x2, 0x2, 0x23c, 0x9e, 0x3, 0x2, 0x2,
0x2, 0x23d, 0x23e, 0x7, 0x5e, 0x2, 0x2, 0x23e, 0x23f,
0x9, 0x4, 0x2, 0x2, 0x23f, 0xa0, 0x3, 0x2, 0x2,
0x2, 0x240, 0x244, 0x9, 0x5, 0x2, 0x2, 0x241, 0x243,
0x9, 0x6, 0x2, 0x2, 0x242, 0x241, 0x3, 0x2, 0x2,
0x2, 0x243, 0x246, 0x3, 0x2, 0x2, 0x2, 0x244, 0x242,
0x3, 0x2, 0x2, 0x2, 0x244, 0x245, 0x3, 0x2, 0x2,
0x2, 0x245, 0xa2, 0x3, 0x2, 0x2, 0x2, 0x246, 0x244,
0x3, 0x2, 0x2, 0x2, 0x247, 0x249, 0x9, 0x7, 0x2,
0x2, 0x248, 0x247, 0x3, 0x2, 0x2, 0x2, 0x249, 0x24a,
0x3, 0x2, 0x2, 0x2, 0x24a, 0x248, 0x3, 0x2, 0x2,
0x2, 0x24a, 0x24b, 0x3, 0x2, 0x2, 0x2, 0x24b, 0x24c,
0x3, 0x2, 0x2, 0x2, 0x24c, 0x24d, 0x8, 0x52, 0x2,
0x2, 0x24d, 0xa4, 0x3, 0x2, 0x2, 0x2, 0x24e, 0x24f,
0x7, 0x31, 0x2, 0x2, 0x24f, 0x250, 0x7, 0x2c, 0x2,
0x2, 0x250, 0x254, 0x3, 0x2, 0x2, 0x2, 0x251, 0x253,
0xb, 0x2, 0x2, 0x2, 0x252, 0x251, 0x3, 0x2, 0x2,
0x2, 0x253, 0x256, 0x3, 0x2, 0x2, 0x2, 0x254, 0x255,
0x3, 0x2, 0x2, 0x2, 0x254, 0x252, 0x3, 0x2, 0x2,
0x2, 0x255, 0x25a, 0x3, 0x2, 0x2, 0x2, 0x256, 0x254,
0x3, 0x2, 0x2, 0x2, 0x257, 0x258, 0x7, 0x2c, 0x2,
0x2, 0x258, 0x25b, 0x7, 0x31, 0x2, 0x2, 0x259, 0x25b,
0x7, 0x2, 0x2, 0x3, 0x25a, 0x257, 0x3, 0x2, 0x2,
0x2, 0x25a, 0x259, 0x3, 0x2, 0x2, 0x2, 0x25b, 0x25c,
0x3, 0x2, 0x2, 0x2, 0x25c, 0x25d, 0x8, 0x53, 0x2,
0x2, 0x25d, 0xa6, 0x3, 0x2, 0x2, 0x2, 0x25e, 0x25f,
0x7, 0x31, 0x2, 0x2, 0x25f, 0x260, 0x7, 0x31, 0x2,
0x2, 0x260, 0x264, 0x3, 0x2, 0x2, 0x2, 0x261, 0x263,
0xa, 0x8, 0x2, 0x2, 0x262, 0x261, 0x3, 0x2, 0x2,
0x2, 0x263, 0x266, 0x3, 0x2, 0x2, 0x2, 0x264, 0x262,
0x3, 0x2, 0x2, 0x2, 0x264, 0x265, 0x3, 0x2, 0x2,
0x2, 0x265, 0x267, 0x3, 0x2, 0x2, 0x2, 0x266, 0x264,
0x3, 0x2, 0x2, 0x2, 0x267, 0x268, 0x8, 0x54, 0x2,
0x2, 0x268, 0xa8, 0x3, 0x2, 0x2, 0x2, 0x269, 0x26a,
0x9, 0x9, 0x2, 0x2, 0x26a, 0xaa, 0x3, 0x2, 0x2,
0x2, 0x26b, 0x274, 0x7, 0x32, 0x2, 0x2, 0x26c, 0x270,
0x9, 0xa, 0x2, 0x2, 0x26d, 0x26f, 0x5, 0xa9, 0x55,
0x2, 0x26e, 0x26d, 0x3, 0x2, 0x2, 0x2, 0x26f, 0x272,
0x3, 0x2, 0x2, 0x2, 0x270, 0x26e, 0x3, 0x2, 0x2,
0x2, 0x270, 0x271, 0x3, 0x2, 0x2, 0x2, 0x271, 0x274,
0x3, 0x2, 0x2, 0x2, 0x272, 0x270, 0x3, 0x2, 0x2,
0x2, 0x273, 0x26b, 0x3, 0x2, 0x2, 0x2, 0x273, 0x26c,
0x3, 0x2, 0x2, 0x2, 0x274, 0xac, 0x3, 0x2, 0x2,
0x2, 0x275, 0x277, 0x9, 0xb, 0x2, 0x2, 0x276, 0x278,
0x9, 0xc, 0x2, 0x2, 0x277, 0x276, 0x3, 0x2, 0x2,
0x2, 0x277, 0x278, 0x3, 0x2, 0x2, 0x2, 0x278, 0x27a,
0x3, 0x2, 0x2, 0x2, 0x279, 0x27b, 0x5, 0xa9, 0x55,
0x2, 0x27a, 0x279, 0x3, 0x2, 0x2, 0x2, 0x27b, 0x27c,
0x3, 0x2, 0x2, 0x2, 0x27c, 0x27a, 0x3, 0x2, 0x2,
0x2, 0x27c, 0x27d, 0x3, 0x2, 0x2, 0x2, 0x27d, 0xae,
0x3, 0x2, 0x2, 0x2, 0x27e, 0x280, 0x5, 0x71, 0x39,
0x2, 0x27f, 0x27e, 0x3, 0x2, 0x2, 0x2, 0x27f, 0x280,
0x3, 0x2, 0x2, 0x2, 0x280, 0x281, 0x3, 0x2, 0x2,
0x2, 0x281, 0x282, 0x5, 0xab, 0x56, 0x2, 0x282, 0x286,
0x7, 0x30, 0x2, 0x2, 0x283, 0x285, 0x5, 0xa9, 0x55,
0x2, 0x284, 0x283, 0x3, 0x2, 0x2, 0x2, 0x285, 0x288,
0x3, 0x2, 0x2, 0x2, 0x286, 0x284, 0x3, 0x2, 0x2,
0x2, 0x286, 0x287, 0x3, 0x2, 0x2, 0x2, 0x287, 0x28a,
0x3, 0x2, 0x2, 0x2, 0x288, 0x286, 0x3, 0x2, 0x2,
0x2, 0x289, 0x28b, 0x5, 0xad, 0x57, 0x2, 0x28a, 0x289,
0x3, 0x2, 0x2, 0x2, 0x28a, 0x28b, 0x3, 0x2, 0x2,
0x2, 0x28b, 0x2a0, 0x3, 0x2, 0x2, 0x2, 0x28c, 0x28e,
0x5, 0x71, 0x39, 0x2, 0x28d, 0x28c, 0x3, 0x2, 0x2,
0x2, 0x28d, 0x28e, 0x3, 0x2, 0x2, 0x2, 0x28e, 0x28f,
0x3, 0x2, 0x2, 0x2, 0x28f, 0x291, 0x7, 0x30, 0x2,
0x2, 0x290, 0x292, 0x5, 0xa9, 0x55, 0x2, 0x291, 0x290,
0x3, 0x2, 0x2, 0x2, 0x292, 0x293, 0x3, 0x2, 0x2,
0x2, 0x293, 0x291, 0x3, 0x2, 0x2, 0x2, 0x293, 0x294,
0x3, 0x2, 0x2, 0x2, 0x294, 0x296, 0x3, 0x2, 0x2,
0x2, 0x295, 0x297, 0x5, 0xad, 0x57, 0x2, 0x296, 0x295,
0x3, 0x2, 0x2, 0x2, 0x296, 0x297, 0x3, 0x2, 0x2,
0x2, 0x297, 0x2a0, 0x3, 0x2, 0x2, 0x2, 0x298, 0x29a,
0x5, 0x71, 0x39, 0x2, 0x299, 0x298, 0x3, 0x2, 0x2,
0x2, 0x299, 0x29a, 0x3, 0x2, 0x2, 0x2, 0x29a, 0x29b,
0x3, 0x2, 0x2, 0x2, 0x29b, 0x29d, 0x5, 0xab, 0x56,
0x2, 0x29c, 0x29e, 0x5, 0xad, 0x57, 0x2, 0x29d, 0x29c,
0x3, 0x2, 0x2, 0x2, 0x29d, 0x29e, 0x3, 0x2, 0x2,
0x2, 0x29e, 0x2a0, 0x3, 0x2, 0x2, 0x2, 0x29f, 0x27f,
0x3, 0x2, 0x2, 0x2, 0x29f, 0x28d, 0x3, 0x2, 0x2,
0x2, 0x29f, 0x299, 0x3, 0x2, 0x2, 0x2, 0x2a0, 0xb0,
0x3, 0x2, 0x2, 0x2, 0x1c, 0x2, 0x1e5, 0x21f, 0x22c,
0x22e, 0x235, 0x237, 0x23b, 0x244, 0x24a, 0x254, 0x25a, 0x264,
0x270, 0x273, 0x277, 0x27c, 0x27f, 0x286, 0x28a, 0x28d, 0x293,
0x296, 0x299, 0x29d, 0x29f, 0x3, 0x2, 0x3, 0x2,
};
atn::ATNDeserializer deserializer;
......
......@@ -33,68 +33,69 @@ class TorqueLexer : public antlr4::Lexer {
T__17 = 18,
T__18 = 19,
T__19 = 20,
MACRO = 21,
BUILTIN = 22,
RUNTIME = 23,
MODULE = 24,
JAVASCRIPT = 25,
IMPLICIT = 26,
DEFERRED = 27,
IF = 28,
CAST_KEYWORD = 29,
CONVERT_KEYWORD = 30,
FOR = 31,
WHILE = 32,
RETURN = 33,
CONSTEXPR = 34,
CONTINUE = 35,
BREAK = 36,
GOTO = 37,
OTHERWISE = 38,
TRY = 39,
CATCH = 40,
LABEL = 41,
LABELS = 42,
TAIL = 43,
ISNT = 44,
IS = 45,
LET = 46,
EXTERN = 47,
ASSERT = 48,
UNREACHABLE_TOKEN = 49,
DEBUG_TOKEN = 50,
ASSIGNMENT = 51,
ASSIGNMENT_OPERATOR = 52,
EQUAL = 53,
PLUS = 54,
MINUS = 55,
MULTIPLY = 56,
DIVIDE = 57,
MODULO = 58,
BIT_OR = 59,
BIT_AND = 60,
BIT_NOT = 61,
MAX = 62,
MIN = 63,
NOT_EQUAL = 64,
LESS_THAN = 65,
LESS_THAN_EQUAL = 66,
GREATER_THAN = 67,
GREATER_THAN_EQUAL = 68,
SHIFT_LEFT = 69,
SHIFT_RIGHT = 70,
SHIFT_RIGHT_ARITHMETIC = 71,
VARARGS = 72,
EQUALITY_OPERATOR = 73,
INCREMENT = 74,
DECREMENT = 75,
NOT = 76,
STRING_LITERAL = 77,
IDENTIFIER = 78,
WS = 79,
BLOCK_COMMENT = 80,
LINE_COMMENT = 81,
DECIMAL_LITERAL = 82
T__20 = 21,
MACRO = 22,
BUILTIN = 23,
RUNTIME = 24,
MODULE = 25,
JAVASCRIPT = 26,
IMPLICIT = 27,
DEFERRED = 28,
IF = 29,
CAST_KEYWORD = 30,
CONVERT_KEYWORD = 31,
FOR = 32,
WHILE = 33,
RETURN = 34,
CONSTEXPR = 35,
CONTINUE = 36,
BREAK = 37,
GOTO = 38,
OTHERWISE = 39,
TRY = 40,
CATCH = 41,
LABEL = 42,
LABELS = 43,
TAIL = 44,
ISNT = 45,
IS = 46,
LET = 47,
EXTERN = 48,
ASSERT = 49,
UNREACHABLE_TOKEN = 50,
DEBUG_TOKEN = 51,
ASSIGNMENT = 52,
ASSIGNMENT_OPERATOR = 53,
EQUAL = 54,
PLUS = 55,
MINUS = 56,
MULTIPLY = 57,
DIVIDE = 58,
MODULO = 59,
BIT_OR = 60,
BIT_AND = 61,
BIT_NOT = 62,
MAX = 63,
MIN = 64,
NOT_EQUAL = 65,
LESS_THAN = 66,
LESS_THAN_EQUAL = 67,
GREATER_THAN = 68,
GREATER_THAN_EQUAL = 69,
SHIFT_LEFT = 70,
SHIFT_RIGHT = 71,
SHIFT_RIGHT_ARITHMETIC = 72,
VARARGS = 73,
EQUALITY_OPERATOR = 74,
INCREMENT = 75,
DECREMENT = 76,
NOT = 77,
STRING_LITERAL = 78,
IDENTIFIER = 79,
WS = 80,
BLOCK_COMMENT = 81,
LINE_COMMENT = 82,
DECIMAL_LITERAL = 83
};
explicit TorqueLexer(antlr4::CharStream* input);
......
......@@ -23,10 +23,10 @@ class TorqueListener : public antlr4::tree::ParseTreeListener {
virtual void enterTypeList(TorqueParser::TypeListContext* ctx) = 0;
virtual void exitTypeList(TorqueParser::TypeListContext* ctx) = 0;
virtual void enterOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* ctx) = 0;
virtual void exitOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* ctx) = 0;
virtual void enterGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* ctx) = 0;
virtual void exitGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* ctx) = 0;
virtual void enterOptionalGenericTypeList(
TorqueParser::OptionalGenericTypeListContext* ctx) = 0;
......
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -33,74 +33,75 @@ class TorqueParser : public antlr4::Parser {
T__17 = 18,
T__18 = 19,
T__19 = 20,
MACRO = 21,
BUILTIN = 22,
RUNTIME = 23,
MODULE = 24,
JAVASCRIPT = 25,
IMPLICIT = 26,
DEFERRED = 27,
IF = 28,
CAST_KEYWORD = 29,
CONVERT_KEYWORD = 30,
FOR = 31,
WHILE = 32,
RETURN = 33,
CONSTEXPR = 34,
CONTINUE = 35,
BREAK = 36,
GOTO = 37,
OTHERWISE = 38,
TRY = 39,
CATCH = 40,
LABEL = 41,
LABELS = 42,
TAIL = 43,
ISNT = 44,
IS = 45,
LET = 46,
EXTERN = 47,
ASSERT = 48,
UNREACHABLE_TOKEN = 49,
DEBUG_TOKEN = 50,
ASSIGNMENT = 51,
ASSIGNMENT_OPERATOR = 52,
EQUAL = 53,
PLUS = 54,
MINUS = 55,
MULTIPLY = 56,
DIVIDE = 57,
MODULO = 58,
BIT_OR = 59,
BIT_AND = 60,
BIT_NOT = 61,
MAX = 62,
MIN = 63,
NOT_EQUAL = 64,
LESS_THAN = 65,
LESS_THAN_EQUAL = 66,
GREATER_THAN = 67,
GREATER_THAN_EQUAL = 68,
SHIFT_LEFT = 69,
SHIFT_RIGHT = 70,
SHIFT_RIGHT_ARITHMETIC = 71,
VARARGS = 72,
EQUALITY_OPERATOR = 73,
INCREMENT = 74,
DECREMENT = 75,
NOT = 76,
STRING_LITERAL = 77,
IDENTIFIER = 78,
WS = 79,
BLOCK_COMMENT = 80,
LINE_COMMENT = 81,
DECIMAL_LITERAL = 82
T__20 = 21,
MACRO = 22,
BUILTIN = 23,
RUNTIME = 24,
MODULE = 25,
JAVASCRIPT = 26,
IMPLICIT = 27,
DEFERRED = 28,
IF = 29,
CAST_KEYWORD = 30,
CONVERT_KEYWORD = 31,
FOR = 32,
WHILE = 33,
RETURN = 34,
CONSTEXPR = 35,
CONTINUE = 36,
BREAK = 37,
GOTO = 38,
OTHERWISE = 39,
TRY = 40,
CATCH = 41,
LABEL = 42,
LABELS = 43,
TAIL = 44,
ISNT = 45,
IS = 46,
LET = 47,
EXTERN = 48,
ASSERT = 49,
UNREACHABLE_TOKEN = 50,
DEBUG_TOKEN = 51,
ASSIGNMENT = 52,
ASSIGNMENT_OPERATOR = 53,
EQUAL = 54,
PLUS = 55,
MINUS = 56,
MULTIPLY = 57,
DIVIDE = 58,
MODULO = 59,
BIT_OR = 60,
BIT_AND = 61,
BIT_NOT = 62,
MAX = 63,
MIN = 64,
NOT_EQUAL = 65,
LESS_THAN = 66,
LESS_THAN_EQUAL = 67,
GREATER_THAN = 68,
GREATER_THAN_EQUAL = 69,
SHIFT_LEFT = 70,
SHIFT_RIGHT = 71,
SHIFT_RIGHT_ARITHMETIC = 72,
VARARGS = 73,
EQUALITY_OPERATOR = 74,
INCREMENT = 75,
DECREMENT = 76,
NOT = 77,
STRING_LITERAL = 78,
IDENTIFIER = 79,
WS = 80,
BLOCK_COMMENT = 81,
LINE_COMMENT = 82,
DECIMAL_LITERAL = 83
};
enum {
RuleType = 0,
RuleTypeList = 1,
RuleOptionalGenericSpecializationTypeList = 2,
RuleGenericSpecializationTypeList = 2,
RuleOptionalGenericTypeList = 3,
RuleTypeListMaybeVarArgs = 4,
RuleLabelParameter = 5,
......@@ -182,7 +183,7 @@ class TorqueParser : public antlr4::Parser {
class TypeContext;
class TypeListContext;
class OptionalGenericSpecializationTypeListContext;
class GenericSpecializationTypeListContext;
class OptionalGenericTypeListContext;
class TypeListMaybeVarArgsContext;
class LabelParameterContext;
......@@ -256,6 +257,9 @@ class TorqueParser : public antlr4::Parser {
size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER();
antlr4::tree::TerminalNode* CONSTEXPR();
antlr4::tree::TerminalNode* BUILTIN();
TypeListContext* typeList();
TypeContext* type();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
......@@ -280,14 +284,13 @@ class TorqueParser : public antlr4::Parser {
TypeListContext* typeList();
class OptionalGenericSpecializationTypeListContext
class GenericSpecializationTypeListContext
: public antlr4::ParserRuleContext {
public:
OptionalGenericSpecializationTypeListContext(
antlr4::ParserRuleContext* parent, size_t invokingState);
GenericSpecializationTypeListContext(antlr4::ParserRuleContext* parent,
size_t invokingState);
size_t getRuleIndex() const override;
std::vector<antlr4::tree::TerminalNode*> IDENTIFIER();
antlr4::tree::TerminalNode* IDENTIFIER(size_t i);
TypeListContext* typeList();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
......@@ -295,8 +298,7 @@ class TorqueParser : public antlr4::Parser {
antlrcpp::Any accept(antlr4::tree::ParseTreeVisitor* visitor) override;
};
OptionalGenericSpecializationTypeListContext*
optionalGenericSpecializationTypeList();
GenericSpecializationTypeListContext* genericSpecializationTypeList();
class OptionalGenericTypeListContext : public antlr4::ParserRuleContext {
public:
......@@ -857,13 +859,12 @@ class TorqueParser : public antlr4::Parser {
public:
HelperCallContext(antlr4::ParserRuleContext* parent, size_t invokingState);
size_t getRuleIndex() const override;
OptionalGenericSpecializationTypeListContext*
optionalGenericSpecializationTypeList();
ArgumentListContext* argumentList();
OptionalOtherwiseContext* optionalOtherwise();
antlr4::tree::TerminalNode* MIN();
antlr4::tree::TerminalNode* MAX();
antlr4::tree::TerminalNode* IDENTIFIER();
GenericSpecializationTypeListContext* genericSpecializationTypeList();
void enterRule(antlr4::tree::ParseTreeListener* listener) override;
void exitRule(antlr4::tree::ParseTreeListener* listener) override;
......@@ -1347,8 +1348,7 @@ class TorqueParser : public antlr4::Parser {
size_t invokingState);
size_t getRuleIndex() const override;
antlr4::tree::TerminalNode* IDENTIFIER();
OptionalGenericSpecializationTypeListContext*
optionalGenericSpecializationTypeList();
GenericSpecializationTypeListContext* genericSpecializationTypeList();
ParameterListContext* parameterList();
OptionalTypeContext* optionalType();
OptionalLabelListContext* optionalLabelList();
......
......@@ -25,8 +25,8 @@ class TorqueVisitor : public antlr4::tree::AbstractParseTreeVisitor {
virtual antlrcpp::Any visitTypeList(
TorqueParser::TypeListContext* context) = 0;
virtual antlrcpp::Any visitOptionalGenericSpecializationTypeList(
TorqueParser::OptionalGenericSpecializationTypeListContext* context) = 0;
virtual antlrcpp::Any visitGenericSpecializationTypeList(
TorqueParser::GenericSpecializationTypeListContext* context) = 0;
virtual antlrcpp::Any visitOptionalGenericTypeList(
TorqueParser::OptionalGenericTypeListContext* context) = 0;
......
......@@ -13,28 +13,6 @@ namespace torque {
namespace {
std::string GetType(TorqueParser::TypeContext* context) {
if (!context) return "void";
std::string result(context->CONSTEXPR() == nullptr ? ""
: CONSTEXPR_TYPE_PREFIX);
result += context->IDENTIFIER()->getSymbol()->getText();
return result;
}
std::string GetOptionalType(TorqueParser::OptionalTypeContext* context) {
if (!context) return "";
return GetType(context->type());
}
std::vector<std::string> GetTypeVector(
TorqueParser::TypeListContext* type_list) {
std::vector<std::string> result;
for (auto s : type_list->type()) {
result.push_back(GetType(s));
}
return result;
}
std::vector<std::string> GetIdentifierVector(
std::vector<antlr4::tree::TerminalNode*> source) {
std::vector<std::string> result;
......@@ -44,22 +22,6 @@ std::vector<std::string> GetIdentifierVector(
return result;
}
LabelAndTypesVector GetOptionalLabelAndTypeList(
TorqueParser::OptionalLabelListContext* context) {
LabelAndTypesVector labels;
if (context) {
for (auto label : context->labelParameter()) {
LabelAndTypes new_label;
new_label.name = label->IDENTIFIER()->getSymbol()->getText();
if (label->typeList() != nullptr) {
new_label.types = GetTypeVector(label->typeList());
}
labels.emplace_back(new_label);
}
}
return labels;
}
std::string StringLiteralUnquote(const std::string& s) {
assert('"' == s.front() || '\'' == s.front());
assert('"' == s.back() || '\'' == s.back());
......@@ -93,6 +55,54 @@ std::string StringLiteralUnquote(const std::string& s) {
} // namespace
LabelAndTypesVector AstGenerator::GetOptionalLabelAndTypeList(
TorqueParser::OptionalLabelListContext* context) {
LabelAndTypesVector labels;
if (context) {
for (auto* label : context->labelParameter()) {
LabelAndTypes new_label;
new_label.name = label->IDENTIFIER()->getSymbol()->getText();
if (label->typeList() != nullptr) {
for (auto* type : label->typeList()->type()) {
new_label.types.emplace_back(GetType(type));
}
}
labels.emplace_back(new_label);
}
}
return labels;
}
TypeExpression* AstGenerator::GetType(TorqueParser::TypeContext* context) {
if (context->BUILTIN()) {
ParameterList parameters = context->typeList()->accept(this);
TypeExpression* return_type = GetType(context->type());
return RegisterNode(
new FunctionTypeExpression(Pos(context), parameters, return_type));
} else {
bool is_constexpr = context->CONSTEXPR() != nullptr;
std::string name = context->IDENTIFIER()->getSymbol()->getText();
return RegisterNode(
new BasicTypeExpression(Pos(context), is_constexpr, std::move(name)));
}
}
TypeExpression* AstGenerator::GetOptionalType(
TorqueParser::OptionalTypeContext* context) {
if (!context->type())
return RegisterNode(new BasicTypeExpression(Pos(context), false, "void"));
return GetType(context->type());
}
std::vector<TypeExpression*> AstGenerator::GetTypeVector(
TorqueParser::TypeListContext* type_list) {
std::vector<TypeExpression*> result;
for (auto t : type_list->type()) {
result.push_back(GetType(t));
}
return result;
}
ParameterList AstGenerator::GetOptionalParameterList(
TorqueParser::ParameterListContext* context) {
if (context != nullptr) {
......@@ -256,8 +266,8 @@ antlrcpp::Any AstGenerator::visitExternalRuntime(
antlrcpp::Any AstGenerator::visitGenericSpecialization(
TorqueParser::GenericSpecializationContext* context) {
auto name = context->IDENTIFIER()->getSymbol()->getText();
auto specialization_parameters = GetIdentifierVector(
context->optionalGenericSpecializationTypeList()->IDENTIFIER());
auto specialization_parameters =
GetTypeVector(context->genericSpecializationTypeList()->typeList());
Statement* body = context->helperBody()->accept(this).as<Statement*>();
return implicit_cast<Declaration*>(RegisterNode(new SpecializationDeclaration{
Pos(context), name, specialization_parameters,
......@@ -330,14 +340,18 @@ antlrcpp::Any AstGenerator::visitHelperCall(
for (auto label : context->optionalOtherwise()->IDENTIFIER()) {
labels.push_back(label->getSymbol()->getText());
}
CallExpression* result = RegisterNode(new CallExpression{
Pos(context),
callee->getSymbol()->getText(),
is_operator,
GetIdentifierVector(
context->optionalGenericSpecializationTypeList()->IDENTIFIER()),
{},
labels});
std::vector<TypeExpression*> templateArguments;
if (context->genericSpecializationTypeList()) {
templateArguments =
GetTypeVector(context->genericSpecializationTypeList()->typeList());
}
CallExpression* result =
RegisterNode(new CallExpression{Pos(context),
callee->getSymbol()->getText(),
is_operator,
templateArguments,
{},
labels});
for (auto* arg : context->argumentList()->argument()) {
result->arguments.push_back(arg->accept(this).as<Expression*>());
}
......
......@@ -154,6 +154,13 @@ class AstGenerator : public TorqueBaseVisitor {
return node;
}
LabelAndTypesVector GetOptionalLabelAndTypeList(
TorqueParser::OptionalLabelListContext* context);
TypeExpression* GetType(TorqueParser::TypeContext* context);
TypeExpression* GetOptionalType(TorqueParser::OptionalTypeContext* context);
std::vector<TypeExpression*> GetTypeVector(
TorqueParser::TypeListContext* type_list);
ParameterList GetOptionalParameterList(
TorqueParser::ParameterListContext* context);
......
......@@ -39,6 +39,10 @@ struct SourcePosition {
V(CastExpression) \
V(ConvertExpression)
#define AST_TYPE_EXPRESSION_NODE_KIND_LIST(V) \
V(BasicTypeExpression) \
V(FunctionTypeExpression)
#define AST_STATEMENT_NODE_KIND_LIST(V) \
V(BlockStatement) \
V(ExpressionStatement) \
......@@ -72,12 +76,13 @@ struct SourcePosition {
V(ExternalBuiltinDeclaration) \
V(ExternalRuntimeDeclaration)
#define AST_NODE_KIND_LIST(V) \
AST_EXPRESSION_NODE_KIND_LIST(V) \
AST_STATEMENT_NODE_KIND_LIST(V) \
AST_DECLARATION_NODE_KIND_LIST(V) \
AST_CALLABLE_NODE_KIND_LIST(V) \
V(CatchBlock) \
#define AST_NODE_KIND_LIST(V) \
AST_EXPRESSION_NODE_KIND_LIST(V) \
AST_TYPE_EXPRESSION_NODE_KIND_LIST(V) \
AST_STATEMENT_NODE_KIND_LIST(V) \
AST_DECLARATION_NODE_KIND_LIST(V) \
AST_CALLABLE_NODE_KIND_LIST(V) \
V(CatchBlock) \
V(LabelBlock)
struct AstNode {
......@@ -101,19 +106,28 @@ struct AstNodeClassCheck {
};
// Boilerplate for most derived classes.
#define DEFINE_AST_NODE_LEAF_BOILERPLATE(T) \
static const Kind kKind = Kind::k##T; \
static T* cast(AstNode* node) { \
if (node->kind != kKind) return nullptr; \
return static_cast<T*>(node); \
#define DEFINE_AST_NODE_LEAF_BOILERPLATE(T) \
static const Kind kKind = Kind::k##T; \
static T* cast(AstNode* node) { \
if (node->kind != kKind) return nullptr; \
return static_cast<T*>(node); \
} \
static T* DynamicCast(AstNode* node) { \
if (!node) return nullptr; \
if (!AstNodeClassCheck::IsInstanceOf<T>(node)) return nullptr; \
return static_cast<T*>(node); \
}
// Boilerplate for classes with subclasses.
#define DEFINE_AST_NODE_INNER_BOILERPLATE(T) \
template <class F> \
static T* cast(F* node) { \
DCHECK(AstNodeClassCheck::IsInstanceOf<T>(node)); \
return static_cast<T*>(node); \
#define DEFINE_AST_NODE_INNER_BOILERPLATE(T) \
static T* cast(AstNode* node) { \
DCHECK(AstNodeClassCheck::IsInstanceOf<T>(node)); \
return static_cast<T*>(node); \
} \
static T* DynamicCast(AstNode* node) { \
if (!node) return nullptr; \
if (!AstNodeClassCheck::IsInstanceOf<T>(node)) return nullptr; \
return static_cast<T*>(node); \
}
struct Expression : AstNode {
......@@ -126,6 +140,11 @@ struct LocationExpression : Expression {
DEFINE_AST_NODE_INNER_BOILERPLATE(LocationExpression)
};
struct TypeExpression : AstNode {
TypeExpression(Kind k, SourcePosition p) : AstNode(k, p) {}
DEFINE_AST_NODE_INNER_BOILERPLATE(TypeExpression)
};
struct Declaration : AstNode {
Declaration(Kind k, SourcePosition p) : AstNode(k, p) {}
DEFINE_AST_NODE_INNER_BOILERPLATE(Declaration)
......@@ -214,20 +233,27 @@ class Ast {
std::vector<std::unique_ptr<AstNode>> nodes_;
};
struct IdentifierExpression : LocationExpression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(IdentifierExpression)
IdentifierExpression(SourcePosition p, std::string n)
: LocationExpression(kKind, p), name(std::move(n)) {}
std::string name;
};
struct CallExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(CallExpression)
CallExpression(SourcePosition p, std::string c, bool o,
std::vector<std::string> ga, std::vector<Expression*> a,
std::vector<TypeExpression*> ga, std::vector<Expression*> a,
std::vector<std::string> l)
: Expression(kKind, p),
callee(std::move(c)),
callee(p, std::move(c)),
is_operator(o),
generic_arguments(ga),
arguments(std::move(a)),
labels(l) {}
std::string callee;
IdentifierExpression callee;
bool is_operator;
std::vector<std::string> generic_arguments;
std::vector<TypeExpression*> generic_arguments;
std::vector<Expression*> arguments;
std::vector<std::string> labels;
};
......@@ -258,13 +284,6 @@ struct ConditionalExpression : Expression {
Expression* if_false;
};
struct IdentifierExpression : LocationExpression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(IdentifierExpression)
IdentifierExpression(SourcePosition p, std::string n)
: LocationExpression(kKind, p), name(std::move(n)) {}
std::string name;
};
struct StringLiteralExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(StringLiteralExpression)
StringLiteralExpression(SourcePosition p, std::string l)
......@@ -281,18 +300,19 @@ struct NumberLiteralExpression : Expression {
struct CastExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(CastExpression)
CastExpression(SourcePosition p, std::string t, std::string o, Expression* v)
: Expression(kKind, p), type(std::move(t)), otherwise(o), value(v) {}
std::string type;
CastExpression(SourcePosition p, TypeExpression* t, std::string o,
Expression* v)
: Expression(kKind, p), type(t), otherwise(o), value(v) {}
TypeExpression* type;
std::string otherwise;
Expression* value;
};
struct ConvertExpression : Expression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ConvertExpression)
ConvertExpression(SourcePosition p, std::string t, Expression* v)
: Expression(kKind, p), type(std::move(t)), value(v) {}
std::string type;
ConvertExpression(SourcePosition p, TypeExpression* t, Expression* v)
: Expression(kKind, p), type(t), value(v) {}
TypeExpression* type;
Expression* value;
};
......@@ -334,6 +354,29 @@ struct IncrementDecrementExpression : Expression {
bool postfix;
};
struct ParameterList {
std::vector<std::string> names;
std::vector<TypeExpression*> types;
bool has_varargs;
std::string arguments_variable;
};
struct BasicTypeExpression : TypeExpression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(BasicTypeExpression)
BasicTypeExpression(SourcePosition p, bool c, std::string n)
: TypeExpression(kKind, p), is_constexpr(c), name(n) {}
bool is_constexpr;
std::string name;
};
struct FunctionTypeExpression : TypeExpression {
DEFINE_AST_NODE_LEAF_BOILERPLATE(FunctionTypeExpression)
FunctionTypeExpression(SourcePosition p, ParameterList pl, TypeExpression* r)
: TypeExpression(kKind, p), parameters(pl), return_type(r) {}
ParameterList parameters;
TypeExpression* return_type;
};
struct ExpressionStatement : Statement {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ExpressionStatement)
ExpressionStatement(SourcePosition p, Expression* e)
......@@ -396,14 +439,11 @@ struct TailCallStatement : Statement {
struct VarDeclarationStatement : Statement {
DEFINE_AST_NODE_LEAF_BOILERPLATE(VarDeclarationStatement)
VarDeclarationStatement(SourcePosition p, std::string n, std::string t,
VarDeclarationStatement(SourcePosition p, std::string n, TypeExpression* t,
base::Optional<Expression*> i)
: Statement(kKind, p),
name(std::move(n)),
type(std::move(t)),
initializer(std::move(i)) {}
: Statement(kKind, p), name(std::move(n)), type(t), initializer(i) {}
std::string name;
std::string type;
TypeExpression* type;
base::Optional<Expression*> initializer;
};
......@@ -467,13 +507,6 @@ struct CatchBlock : AstNode {
Statement* body;
};
struct ParameterList {
std::vector<std::string> names;
std::vector<std::string> types;
bool has_varargs;
std::string arguments_variable;
};
struct LabelBlock : AstNode {
DEFINE_AST_NODE_LEAF_BOILERPLATE(LabelBlock)
LabelBlock(SourcePosition p, const std::string& l,
......@@ -520,20 +553,21 @@ struct TypeDeclaration : Declaration {
struct LabelAndTypes {
std::string name;
std::vector<std::string> types;
std::vector<TypeExpression*> types;
};
typedef std::vector<LabelAndTypes> LabelAndTypesVector;
struct CallableNodeSignature {
ParameterList parameters;
std::string return_type;
TypeExpression* return_type;
LabelAndTypesVector labels;
};
struct CallableNode : AstNode {
CallableNode(AstNode::Kind kind, SourcePosition p, std::string n,
ParameterList pl, std::string r, const LabelAndTypesVector& l)
ParameterList pl, TypeExpression* r,
const LabelAndTypesVector& l)
: AstNode(kind, p),
name(std::move(n)),
signature(new CallableNodeSignature{pl, r, l}) {}
......@@ -546,7 +580,7 @@ struct MacroDeclaration : CallableNode {
DEFINE_AST_NODE_INNER_BOILERPLATE(MacroDeclaration)
MacroDeclaration(AstNode::Kind kind, SourcePosition p, std::string n, bool i,
base::Optional<std::string> o, ParameterList pl,
std::string r, const LabelAndTypesVector& l)
TypeExpression* r, const LabelAndTypesVector& l)
: CallableNode(kind, p, n, pl, r, l), implicit(i), op(std::move(o)) {}
bool implicit;
base::Optional<std::string> op;
......@@ -556,20 +590,20 @@ struct ExternalMacroDeclaration : MacroDeclaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ExternalMacroDeclaration)
ExternalMacroDeclaration(SourcePosition p, std::string n, bool i,
base::Optional<std::string> o, ParameterList pl,
std::string r, const LabelAndTypesVector& l)
TypeExpression* r, const LabelAndTypesVector& l)
: MacroDeclaration(kKind, p, n, i, o, pl, r, l) {}
};
struct TorqueMacroDeclaration : MacroDeclaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(TorqueMacroDeclaration)
TorqueMacroDeclaration(SourcePosition p, std::string n, ParameterList pl,
std::string r, const LabelAndTypesVector& l)
TypeExpression* r, const LabelAndTypesVector& l)
: MacroDeclaration(kKind, p, n, false, {}, pl, r, l) {}
};
struct BuiltinDeclaration : CallableNode {
BuiltinDeclaration(AstNode::Kind kind, SourcePosition p, bool j,
std::string n, ParameterList pl, std::string r)
std::string n, ParameterList pl, TypeExpression* r)
: CallableNode(kind, p, n, pl, r, {}), javascript_linkage(j) {}
bool javascript_linkage;
};
......@@ -577,21 +611,21 @@ struct BuiltinDeclaration : CallableNode {
struct ExternalBuiltinDeclaration : BuiltinDeclaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ExternalBuiltinDeclaration)
ExternalBuiltinDeclaration(SourcePosition p, bool j, std::string n,
ParameterList pl, std::string r)
ParameterList pl, TypeExpression* r)
: BuiltinDeclaration(kKind, p, j, n, pl, r) {}
};
struct TorqueBuiltinDeclaration : BuiltinDeclaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(TorqueBuiltinDeclaration)
TorqueBuiltinDeclaration(SourcePosition p, bool j, std::string n,
ParameterList pl, std::string r)
ParameterList pl, TypeExpression* r)
: BuiltinDeclaration(kKind, p, j, n, pl, r) {}
};
struct ExternalRuntimeDeclaration : CallableNode {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ExternalRuntimeDeclaration)
ExternalRuntimeDeclaration(SourcePosition p, std::string n, ParameterList pl,
std::string r)
TypeExpression* r)
: CallableNode(kKind, p, n, pl, r, {}) {}
};
......@@ -619,30 +653,30 @@ struct GenericDeclaration : Declaration {
struct SpecializationDeclaration : Declaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(SpecializationDeclaration)
SpecializationDeclaration(SourcePosition p, std::string n,
std::vector<std::string> gp, ParameterList pl,
std::string r, LabelAndTypesVector l, Statement* b)
std::vector<TypeExpression*> gp, ParameterList pl,
TypeExpression* r, LabelAndTypesVector l,
Statement* b)
: Declaration(kKind, p),
name(std::move(n)),
generic_parameters(gp),
signature(new CallableNodeSignature{pl, r, l}),
body(std::move(b)) {}
DEFINE_AST_NODE_INNER_BOILERPLATE(SpecializationDeclaration)
body(b) {}
std::string name;
std::vector<std::string> generic_parameters;
std::vector<TypeExpression*> generic_parameters;
std::unique_ptr<CallableNodeSignature> signature;
Statement* body;
};
struct ConstDeclaration : Declaration {
DEFINE_AST_NODE_LEAF_BOILERPLATE(ConstDeclaration)
ConstDeclaration(SourcePosition p, std::string n, std::string t,
ConstDeclaration(SourcePosition p, std::string n, TypeExpression* t,
std::string l)
: Declaration(kKind, p),
name(std::move(n)),
type(std::move(t)),
type(t),
literal(std::move(l)) {}
std::string name;
std::string type;
TypeExpression* type;
std::string literal;
};
......
......@@ -20,13 +20,50 @@ bool Type::IsSubtypeOf(const Type* supertype) const {
return false;
}
std::string Type::GetGeneratedTNodeTypeName() const {
bool Type::IsAbstractName(const std::string& name) const {
if (!IsAbstractType()) return false;
return AbstractType::cast(this)->name() == name;
}
std::string AbstractType::GetGeneratedTNodeTypeName() const {
std::string result = GetGeneratedTypeName();
DCHECK_EQ(result.substr(0, 6), "TNode<");
result = result.substr(6, result.length() - 7);
return result;
}
std::string FunctionPointerType::ToString() const {
std::stringstream result;
result << "builtin (";
bool first = true;
for (const Type* t : parameter_types_) {
if (!first) {
result << ", ";
first = false;
}
result << t;
}
result << ") => " << return_type_;
return result.str();
}
std::string FunctionPointerType::MangledName() const {
std::stringstream result;
result << "FT";
bool first = true;
for (const Type* t : parameter_types_) {
if (!first) {
result << ", ";
first = false;
}
std::string arg_type_string = t->MangledName();
result << arg_type_string.size() << arg_type_string;
}
std::string return_type_string = return_type_->MangledName();
result << return_type_string.size() << return_type_string;
return result.str();
}
} // namespace torque
} // namespace internal
} // namespace v8
......@@ -8,6 +8,7 @@
#include <cassert>
#include <string>
#include "src/base/functional.h"
#include "src/base/logging.h"
#include "src/torque/ast.h"
#include "src/torque/types.h"
......@@ -24,7 +25,8 @@ class Declarable {
public:
virtual ~Declarable() {}
enum Kind {
kType,
kAbstractType,
kFunctionPointerType,
kVariable,
kParameter,
kMacro,
......@@ -36,9 +38,10 @@ class Declarable {
kLabel,
kConstant
};
explicit Declarable(Kind kind) : kind_(kind) {}
Kind kind() const { return kind_; }
bool IsType() const { return kind() == kType; }
bool IsAbstractType() const { return kind() == kAbstractType; }
bool IsFunctionPointerType() const { return kind() == kFunctionPointerType; }
bool IsType() const { return IsAbstractType() || IsFunctionPointerType(); }
bool IsMacro() const { return kind() == kMacro; }
bool IsBuiltin() const { return kind() == kBuiltin; }
bool IsRuntimeFunction() const { return kind() == kRuntimeFunction; }
......@@ -52,53 +55,130 @@ class Declarable {
bool IsValue() const { return IsVariable() || IsConstant() || IsParameter(); }
virtual const char* type_name() const { return "<<unknown>>"; }
protected:
explicit Declarable(Kind kind) : kind_(kind) {}
private:
Kind kind_;
};
#define DECLARE_DECLARABLE_BOILERPLATE(x, y) \
static x* cast(Declarable* declarable) { \
DCHECK(declarable->Is##x()); \
return static_cast<x*>(declarable); \
} \
static const x* cast(const Declarable* declarable) { \
DCHECK(declarable->Is##x()); \
return static_cast<const x*>(declarable); \
} \
const char* type_name() const override { return #y; }
#define DECLARE_DECLARABLE_BOILERPLATE(x, y) \
static x* cast(Declarable* declarable) { \
DCHECK(declarable->Is##x()); \
return static_cast<x*>(declarable); \
} \
static const x* cast(const Declarable* declarable) { \
DCHECK(declarable->Is##x()); \
return static_cast<const x*>(declarable); \
} \
const char* type_name() const override { return #y; } \
static x* DynamicCast(Declarable* declarable) { \
if (!declarable) return nullptr; \
if (!declarable->Is##x()) return nullptr; \
return static_cast<x*>(declarable); \
} \
static const x* DynamicCast(const Declarable* declarable) { \
if (!declarable) return nullptr; \
if (!declarable->Is##x()) return nullptr; \
return static_cast<const x*>(declarable); \
}
class Type : public Declarable {
public:
DECLARE_DECLARABLE_BOILERPLATE(Type, type);
Type(const Type* parent, const std::string& name,
const std::string& generated_type)
: Declarable(Declarable::kType),
parent_(parent),
bool IsSubtypeOf(const Type* supertype) const;
virtual std::string ToString() const = 0;
virtual std::string MangledName() const = 0;
bool IsVoid() const { return IsAbstractName(VOID_TYPE_STRING); }
bool IsNever() const { return IsAbstractName(NEVER_TYPE_STRING); }
bool IsBool() const { return IsAbstractName(BOOL_TYPE_STRING); }
bool IsConstexprBool() const {
return IsAbstractName(CONSTEXPR_BOOL_TYPE_STRING);
}
bool IsVoidOrNever() const { return IsVoid() || IsNever(); }
virtual const std::string& GetGeneratedTypeName() const = 0;
virtual std::string GetGeneratedTNodeTypeName() const = 0;
virtual bool IsConstexpr() const = 0;
protected:
Type(Declarable::Kind kind, const Type* parent)
: Declarable(kind), parent_(parent) {}
const Type* parent() const { return parent_; }
private:
bool IsAbstractName(const std::string& name) const;
const Type* const parent_;
};
class AbstractType : public Type {
public:
DECLARE_DECLARABLE_BOILERPLATE(AbstractType, abstract_type);
AbstractType(const Type* parent, const std::string& name,
const std::string& generated_type)
: Type(Declarable::kAbstractType, parent),
name_(name),
generated_type_(generated_type) {}
const Type* parent() const { return parent_; }
const std::string& name() const { return name_; }
const std::string& GetGeneratedTypeName() const { return generated_type_; }
std::string GetGeneratedTNodeTypeName() const;
bool IsSubtypeOf(const Type* supertype) const;
bool IsVoid() const { return name() == VOID_TYPE_STRING; }
bool IsNever() const { return name() == NEVER_TYPE_STRING; }
bool IsBool() const { return name() == BOOL_TYPE_STRING; }
bool IsConstexprBool() const { return name() == CONSTEXPR_BOOL_TYPE_STRING; }
bool IsVoidOrNever() const { return IsVoid() || IsNever(); }
bool IsConstexpr() const {
std::string ToString() const override { return name(); }
std::string MangledName() const override { return "AT" + name(); }
const std::string& GetGeneratedTypeName() const override {
return generated_type_;
}
std::string GetGeneratedTNodeTypeName() const override;
bool IsConstexpr() const override {
return name().substr(0, strlen(CONSTEXPR_TYPE_PREFIX)) ==
CONSTEXPR_TYPE_PREFIX;
}
private:
const Type* const parent_;
const std::string name_;
const std::string generated_type_;
};
// For now, function pointers are restricted to Code objects of Torque-defined
// builtins.
class FunctionPointerType : public Type {
public:
DECLARE_DECLARABLE_BOILERPLATE(FunctionPointerType, function_pointer_type);
FunctionPointerType(const Type* parent, TypeVector parameter_types,
const Type* return_type)
: Type(Declarable::kFunctionPointerType, parent),
parameter_types_(parameter_types),
return_type_(return_type) {}
std::string ToString() const override;
std::string MangledName() const override;
const std::string& GetGeneratedTypeName() const override {
return parent()->GetGeneratedTypeName();
}
std::string GetGeneratedTNodeTypeName() const override {
return parent()->GetGeneratedTNodeTypeName();
}
bool IsConstexpr() const override { return parent()->IsConstexpr(); }
const TypeVector& parameter_types() const { return parameter_types_; }
const Type* return_type() const { return return_type_; }
friend size_t hash_value(const FunctionPointerType& p) {
size_t result = base::hash_value(p.return_type_);
for (const Type* parameter : p.parameter_types_) {
result = base::hash_combine(result, parameter);
}
return result;
}
bool operator==(const FunctionPointerType& other) const {
return parameter_types_ == other.parameter_types_ &&
return_type_ == other.return_type_;
}
private:
const TypeVector parameter_types_;
const Type* const return_type_;
};
inline std::ostream& operator<<(std::ostream& os, const Type* t) {
os << t->name().c_str();
os << t->ToString();
return os;
}
......@@ -275,20 +355,24 @@ class MacroList : public Declarable {
class Builtin : public Callable {
public:
enum Kind { kStub = 0, kFixedArgsJavaScript, kVarArgsJavaScript };
enum Kind { kStub, kFixedArgsJavaScript, kVarArgsJavaScript };
DECLARE_DECLARABLE_BOILERPLATE(Builtin, builtin);
Kind kind() const { return kind_; }
bool IsStub() const { return kind_ == kStub; }
bool IsVarArgsJavaScript() const { return kind_ == kVarArgsJavaScript; }
bool IsFixedArgsJavaScript() const { return kind_ == kFixedArgsJavaScript; }
bool IsExternal() const { return external_; }
private:
friend class Declarations;
Builtin(const std::string& name, Builtin::Kind kind,
Builtin(const std::string& name, Builtin::Kind kind, bool external,
const Signature& signature)
: Callable(Declarable::kBuiltin, name, signature), kind_(kind) {}
: Callable(Declarable::kBuiltin, name, signature),
kind_(kind),
external_(external) {}
Kind kind_;
bool external_;
};
class RuntimeFunction : public Callable {
......
......@@ -58,7 +58,7 @@ void DeclarationVisitor::Visit(CallableNode* decl, const Signature& signature,
}
Builtin* DeclarationVisitor::BuiltinDeclarationCommon(
BuiltinDeclaration* decl, const Signature& signature) {
BuiltinDeclaration* decl, bool external, const Signature& signature) {
const bool javascript = decl->javascript_linkage;
const bool varargs = decl->signature->parameters.has_varargs;
Builtin::Kind kind = !javascript ? Builtin::kStub
......@@ -66,7 +66,8 @@ Builtin* DeclarationVisitor::BuiltinDeclarationCommon(
: Builtin::kFixedArgsJavaScript;
if (signature.types().size() == 0 ||
!(signature.types()[0]->name() == CONTEXT_TYPE_STRING)) {
!(signature.types()[0] ==
declarations()->LookupGlobalType(decl->pos, CONTEXT_TYPE_STRING))) {
std::stringstream stream;
stream << "first parameter to builtin " << decl->name
<< " is not a context but should be at "
......@@ -84,10 +85,11 @@ Builtin* DeclarationVisitor::BuiltinDeclarationCommon(
if (javascript) {
if (signature.types().size() < 2 ||
!(signature.types()[1]->name() == OBJECT_TYPE_STRING)) {
!(signature.types()[1] ==
declarations()->LookupGlobalType(decl->pos, OBJECT_TYPE_STRING))) {
std::stringstream stream;
stream << "second parameter to javascript builtin " << decl->name
<< " is not a receiver type but should be at "
<< " is " << signature.types()[1] << " but should be Object at "
<< PositionAsString(decl->pos);
ReportError(stream.str());
}
......@@ -96,7 +98,7 @@ Builtin* DeclarationVisitor::BuiltinDeclarationCommon(
std::string generated_name = GetGeneratedCallableName(
decl->name, declarations()->GetCurrentSpecializationTypeNamesVector());
return declarations()->DeclareBuiltin(decl->pos, generated_name, kind,
signature);
external, signature);
}
void DeclarationVisitor::Visit(ExternalRuntimeDeclaration* decl,
......@@ -107,7 +109,8 @@ void DeclarationVisitor::Visit(ExternalRuntimeDeclaration* decl,
}
if (signature.parameter_types.types.size() == 0 ||
!(signature.parameter_types.types[0]->name() == CONTEXT_TYPE_STRING)) {
!(signature.parameter_types.types[0] ==
declarations()->LookupGlobalType(CONTEXT_TYPE_STRING))) {
std::stringstream stream;
stream << "first parameter to runtime " << decl->name
<< " is not a context but should be at "
......@@ -161,7 +164,7 @@ void DeclarationVisitor::Visit(ExternalMacroDeclaration* decl,
void DeclarationVisitor::Visit(TorqueBuiltinDeclaration* decl,
const Signature& signature, Statement* body) {
Builtin* builtin = BuiltinDeclarationCommon(decl, signature);
Builtin* builtin = BuiltinDeclarationCommon(decl, false, signature);
CurrentCallableActivator activator(global_context_, builtin, decl);
DeclareSignature(decl->pos, builtin->signature());
if (builtin->signature().parameter_types.var_args) {
......@@ -280,8 +283,7 @@ void DeclarationVisitor::Visit(TryCatchStatement* stmt) {
for (auto p : block->parameters.names) {
shared_label->AddVariable(declarations()->DeclareVariable(
stmt->pos, p,
declarations()->LookupType(stmt->pos,
block->parameters.types[i])));
declarations()->GetType(stmt->pos, block->parameters.types[i])));
++i;
}
}
......@@ -307,10 +309,11 @@ void DeclarationVisitor::Visit(TryCatchStatement* stmt) {
void DeclarationVisitor::Visit(CallExpression* expr) {
if (expr->generic_arguments.size() != 0) {
Generic* generic = declarations()->LookupGeneric(expr->pos, expr->callee);
Generic* generic =
declarations()->LookupGeneric(expr->pos, expr->callee.name);
TypeVector specialization_types;
for (auto t : expr->generic_arguments) {
specialization_types.push_back(declarations()->LookupType(expr->pos, t));
specialization_types.push_back(declarations()->GetType(expr->pos, t));
}
CallableNode* callable = generic->declaration()->callable;
QueueGenericSpecialization({generic, specialization_types}, callable,
......
......@@ -74,22 +74,23 @@ class DeclarationVisitor : public FileVisitor {
std::string generates =
decl->generates ? *decl->generates : std::string("");
declarations()->DeclareType(decl->pos, decl->name, generates, extends_ptr);
declarations()->DeclareAbstractType(decl->pos, decl->name, generates,
extends_ptr);
if (decl->constexpr_generates) {
std::string constexpr_name =
std::string(CONSTEXPR_TYPE_PREFIX) + decl->name;
declarations()->DeclareType(decl->pos, constexpr_name,
*decl->constexpr_generates, &(decl->name));
declarations()->DeclareAbstractType(
decl->pos, constexpr_name, *decl->constexpr_generates, &(decl->name));
}
}
Builtin* BuiltinDeclarationCommon(BuiltinDeclaration* decl,
Builtin* BuiltinDeclarationCommon(BuiltinDeclaration* decl, bool external,
const Signature& signature);
void Visit(ExternalBuiltinDeclaration* decl, const Signature& signature,
Statement* body) {
BuiltinDeclarationCommon(decl, signature);
BuiltinDeclarationCommon(decl, true, signature);
}
void Visit(ExternalRuntimeDeclaration* decl, const Signature& sig,
......@@ -117,7 +118,7 @@ class DeclarationVisitor : public FileVisitor {
void Visit(VarDeclarationStatement* stmt) {
std::string variable_name = stmt->name;
const Type* type = declarations()->LookupType(stmt->pos, stmt->type);
const Type* type = declarations()->GetType(stmt->pos, stmt->type);
if (type->IsConstexpr()) {
std::stringstream stream;
stream << "cannot declare variable with constexpr type at "
......@@ -140,8 +141,8 @@ class DeclarationVisitor : public FileVisitor {
void Visit(ConstDeclaration* decl) {
declarations()->DeclareConstant(
decl->pos, decl->name,
declarations()->LookupType(decl->pos, decl->type), decl->literal);
decl->pos, decl->name, declarations()->GetType(decl->pos, decl->type),
decl->literal);
}
void Visit(LogicalOrExpression* expr) {
......
......@@ -59,6 +59,62 @@ const Type* Declarations::LookupType(SourcePosition pos,
return nullptr;
}
const Type* Declarations::LookupGlobalType(const std::string& name) {
return Type::cast(LookupGlobalScope(name));
}
const Type* Declarations::LookupGlobalType(SourcePosition pos,
const std::string& name) {
Declarable* raw = LookupGlobalScope(pos, name);
if (!raw->IsType()) {
std::stringstream s;
s << "declaration \"" << name << "\" is not a Type at "
<< PositionAsString(pos);
ReportError(s.str());
}
return Type::cast(raw);
}
const Type* Declarations::GetFunctionPointerType(SourcePosition pos,
TypeVector argument_types,
const Type* return_type) {
const Type* code_type = LookupGlobalType(pos, CODE_TYPE_STRING);
return function_pointer_types_.Add(
FunctionPointerType(code_type, argument_types, return_type));
}
const Type* Declarations::GetType(SourcePosition pos,
TypeExpression* type_expression) {
if (auto* basic = BasicTypeExpression::DynamicCast(type_expression)) {
std::string name =
(basic->is_constexpr ? CONSTEXPR_TYPE_PREFIX : "") + basic->name;
return LookupType(pos, name);
} else {
auto* function_type_exp = FunctionTypeExpression::cast(type_expression);
TypeVector argument_types;
for (TypeExpression* type_exp : function_type_exp->parameters.types) {
argument_types.push_back(GetType(pos, type_exp));
}
return GetFunctionPointerType(pos, argument_types,
GetType(pos, function_type_exp->return_type));
}
}
Builtin* Declarations::FindSomeInternalBuiltinWithType(
const FunctionPointerType* type) {
for (auto& declarable : declarables_) {
if (Builtin* builtin = Builtin::DynamicCast(declarable.get())) {
if (!builtin->IsExternal() && builtin->kind() == Builtin::kStub &&
builtin->signature().return_type == type->return_type() &&
builtin->signature().parameter_types.types ==
type->parameter_types()) {
return builtin;
}
}
}
return nullptr;
}
Value* Declarations::LookupValue(SourcePosition pos, const std::string& name) {
Declarable* d = Lookup(pos, name);
if (!d->IsValue()) {
......@@ -131,10 +187,9 @@ Generic* Declarations::LookupGeneric(const SourcePosition& pos,
return nullptr;
}
const Type* Declarations::DeclareType(SourcePosition pos,
const std::string& name,
const std::string& generated,
const std::string* parent) {
const AbstractType* Declarations::DeclareAbstractType(
SourcePosition pos, const std::string& name, const std::string& generated,
const std::string* parent) {
CheckAlreadyDeclared(pos, name, "type");
const Type* parent_type = nullptr;
if (parent != nullptr) {
......@@ -154,7 +209,7 @@ const Type* Declarations::DeclareType(SourcePosition pos,
}
parent_type = Type::cast(maybe_parent_type);
}
Type* result = new Type(parent_type, name, generated);
AbstractType* result = new AbstractType(parent_type, name, generated);
Declare(name, std::unique_ptr<Declarable>(result));
return result;
}
......@@ -205,10 +260,10 @@ Macro* Declarations::DeclareMacro(SourcePosition pos, const std::string& name,
Builtin* Declarations::DeclareBuiltin(SourcePosition pos,
const std::string& name,
Builtin::Kind kind,
Builtin::Kind kind, bool external,
const Signature& signature) {
CheckAlreadyDeclared(pos, name, "builtin");
Builtin* result = new Builtin(name, kind, signature);
Builtin* result = new Builtin(name, kind, external, signature);
Declare(name, std::unique_ptr<Declarable>(result));
return result;
}
......
......@@ -9,6 +9,7 @@
#include "src/torque/declarable.h"
#include "src/torque/scope.h"
#include "src/torque/utils.h"
namespace v8 {
namespace internal {
......@@ -33,7 +34,31 @@ class Declarations {
return d;
}
Declarable* LookupGlobalScope(const std::string& name) {
return chain_.LookupGlobalScope(name);
}
Declarable* LookupGlobalScope(SourcePosition pos, const std::string& name) {
Declarable* d = chain_.LookupGlobalScope(name);
if (d == nullptr) {
std::stringstream s;
s << "cannot find \"" << name << "\" in global scope at "
<< PositionAsString(pos);
ReportError(s.str());
}
return d;
}
const Type* LookupType(SourcePosition pos, const std::string& name);
const Type* LookupGlobalType(const std::string& name);
const Type* LookupGlobalType(SourcePosition pos, const std::string& name);
const Type* GetType(SourcePosition pos, TypeExpression* type_expression);
const Type* GetFunctionPointerType(SourcePosition pos,
TypeVector argument_types,
const Type* return_type);
Builtin* FindSomeInternalBuiltinWithType(const FunctionPointerType* type);
Value* LookupValue(SourcePosition pos, const std::string& name);
......@@ -46,9 +71,10 @@ class Declarations {
Generic* LookupGeneric(const SourcePosition& pos, const std::string& name);
const Type* DeclareType(SourcePosition pos, const std::string& name,
const std::string& generated,
const std::string* parent = nullptr);
const AbstractType* DeclareAbstractType(SourcePosition pos,
const std::string& name,
const std::string& generated,
const std::string* parent = nullptr);
void DeclareTypeAlias(SourcePosition pos, const std::string& name,
const Type* aliased_type);
......@@ -59,7 +85,8 @@ class Declarations {
const Signature& signature);
Builtin* DeclareBuiltin(SourcePosition pos, const std::string& name,
const Builtin::Kind kind, const Signature& signature);
Builtin::Kind kind, bool external,
const Signature& signature);
RuntimeFunction* DeclareRuntimeFunction(SourcePosition pos,
const std::string& name,
......@@ -104,10 +131,15 @@ class Declarations {
Scope* GetNodeScope(const AstNode* node);
Scope* GetGenericScope(Generic* generic, const TypeVector& types);
template <class T>
T* RegisterDeclarable(std::unique_ptr<T> d) {
T* ptr = d.get();
declarables_.push_back(std::move(d));
return ptr;
}
void Declare(const std::string& name, std::unique_ptr<Declarable> d) {
Declarable* ptr = d.get();
declarables_.emplace_back(std::move(d));
chain_.Declare(name, ptr);
chain_.Declare(name, RegisterDeclarable(std::move(d)));
}
int GetNextUniqueDeclarationNumber() { return unique_declaration_number_++; }
......@@ -121,6 +153,7 @@ class Declarations {
const SpecializationKey* current_generic_specialization_;
Statement* next_body_;
std::vector<std::unique_ptr<Declarable>> declarables_;
Deduplicator<FunctionPointerType> function_pointer_types_;
std::map<std::pair<const AstNode*, TypeVector>, Scope*> scopes_;
std::map<Generic*, ScopeChain::Snapshot> generic_declaration_scopes_;
};
......
......@@ -18,12 +18,11 @@ Signature FileVisitor::MakeSignature(CallableNode* decl,
LabelDeclaration def = {label.name, GetTypeVector(decl->pos, label.types)};
definition_vector.push_back(def);
}
Signature result{
signature->parameters.names,
{GetTypeVector(decl->pos, signature->parameters.types),
signature->parameters.has_varargs},
declarations()->LookupType(decl->pos, signature->return_type),
definition_vector};
Signature result{signature->parameters.names,
{GetTypeVector(decl->pos, signature->parameters.types),
signature->parameters.has_varargs},
declarations()->GetType(decl->pos, signature->return_type),
definition_vector};
return result;
}
......@@ -31,8 +30,8 @@ std::string FileVisitor::GetGeneratedCallableName(
const std::string& name, const TypeVector& specialized_types) {
std::string result = name;
for (auto type : specialized_types) {
result += std::to_string(type->name().size());
result += type->name();
std::string type_string = type->MangledName();
result += std::to_string(type_string.size()) + type_string;
}
return result;
}
......@@ -69,7 +68,8 @@ Callable* FileVisitor::LookupCall(SourcePosition pos, const std::string& name,
}
} else {
std::stringstream stream;
stream << "can't call " << name << " because it's not callable"
stream << "can't call " << declarable->type_name() << " " << name
<< " because it's not callable"
<< ": call parameters were (" << parameter_types << ") at "
<< PositionAsString(pos);
ReportError(stream.str());
......
......@@ -27,10 +27,10 @@ class FileVisitor {
module_(global_context.GetDefaultModule()) {}
TypeVector GetTypeVector(SourcePosition pos,
const std::vector<std::string>& v) {
const std::vector<TypeExpression*>& v) {
TypeVector result;
for (const std::string& s : v) {
result.push_back(declarations()->LookupType(pos, s));
for (TypeExpression* t : v) {
result.push_back(declarations()->GetType(pos, t));
}
return result;
}
......
......@@ -495,19 +495,37 @@ VisitResult ImplementationVisitor::Visit(StringLiteralExpression* expr) {
return VisitResult{GetTypeOracle().GetStringType(), temp};
}
VisitResult ImplementationVisitor::GetBuiltinCode(SourcePosition pos,
Builtin* builtin) {
if (builtin->IsExternal() || builtin->kind() != Builtin::kStub) {
std::stringstream s;
s << "creating function pointers is only allowed for internal builtins "
"with stub linkage at "
<< PositionAsString(pos);
ReportError(s.str());
}
const Type* type = declarations()->GetFunctionPointerType(
pos, builtin->signature().parameter_types.types,
builtin->signature().return_type);
std::string code =
"HeapConstant(Builtins::CallableFor(isolate(), Builtins::k" +
builtin->name() + ").code())";
return VisitResult(type, code);
}
VisitResult ImplementationVisitor::Visit(CastExpression* expr) {
Arguments args;
args.parameters = {Visit(expr->value)};
args.labels = LabelsFromIdentifiers(expr->pos, {expr->otherwise});
return GenerateOperation(expr->pos, "cast<>", args,
declarations()->LookupType(expr->pos, expr->type));
declarations()->GetType(expr->pos, expr->type));
}
VisitResult ImplementationVisitor::Visit(ConvertExpression* expr) {
Arguments args;
args.parameters = {Visit(expr->value)};
return GenerateOperation(expr->pos, "convert<>", args,
declarations()->LookupType(expr->pos, expr->type));
declarations()->GetType(expr->pos, expr->type));
}
const Type* ImplementationVisitor::Visit(GotoStatement* stmt) {
......@@ -1281,6 +1299,65 @@ void ImplementationVisitor::GenerateParameterList(SourcePosition pos,
}
}
VisitResult ImplementationVisitor::GeneratePointerCall(
SourcePosition pos, Expression* callee, const Arguments& arguments,
bool is_tailcall) {
TypeVector parameter_types(arguments.parameters.GetTypeVector());
VisitResult callee_result = Visit(callee);
if (!callee_result.type()->IsFunctionPointerType()) {
std::stringstream stream;
stream << "Expected a function pointer type but found "
<< callee_result.type() << " at " << PositionAsString(pos);
ReportError(stream.str());
}
const FunctionPointerType* type =
FunctionPointerType::cast(callee_result.type());
std::vector<std::string> variables;
for (size_t current = 0; current < arguments.parameters.size(); ++current) {
const Type* to_type = type->parameter_types()[current];
VisitResult result =
GenerateImplicitConvert(pos, to_type, arguments.parameters[current]);
variables.push_back(result.variable());
}
std::string result_variable_name;
bool no_result = type->return_type()->IsVoidOrNever() || is_tailcall;
if (no_result) {
GenerateIndent();
} else {
result_variable_name = GenerateNewTempVariable(type->return_type());
source_out() << "UncheckedCast<";
source_out() << type->return_type()->GetGeneratedTNodeTypeName();
source_out() << ">(";
}
Builtin* example_builtin =
declarations()->FindSomeInternalBuiltinWithType(type);
if (is_tailcall) {
source_out() << "TailCallStub(";
} else {
source_out() << "CallStub(";
}
source_out() << "Builtins::CallableFor(isolate(), Builtins::k"
<< example_builtin->name() << ").descriptor(), "
<< callee_result.variable() << ", ";
size_t total_parameters = 0;
for (size_t i = 0; i < arguments.parameters.size(); ++i) {
if (total_parameters++ != 0) {
source_out() << ", ";
}
source_out() << variables[i];
}
if (!no_result) {
source_out() << ")";
}
source_out() << ");" << std::endl;
return VisitResult(type->return_type(), result_variable_name);
}
VisitResult ImplementationVisitor::GenerateCall(
SourcePosition pos, const std::string& callable_name,
const Arguments& arguments, bool is_tailcall) {
......@@ -1415,9 +1492,11 @@ void ImplementationVisitor::Visit(SpecializationDeclaration* decl) {
VisitResult ImplementationVisitor::Visit(CallExpression* expr,
bool is_tailcall) {
Arguments arguments;
std::string name = expr->callee;
if (expr->generic_arguments.size() != 0) {
Generic* generic = declarations()->LookupGeneric(expr->pos, expr->callee);
std::string name = expr->callee.name;
bool has_template_arguments = expr->generic_arguments.size() != 0;
if (has_template_arguments) {
Generic* generic =
declarations()->LookupGeneric(expr->pos, expr->callee.name);
TypeVector specialization_types =
GetTypeVector(expr->pos, expr->generic_arguments);
name = GetGeneratedCallableName(name, specialization_types);
......@@ -1437,7 +1516,14 @@ VisitResult ImplementationVisitor::Visit(CallExpression* expr,
}
return GenerateOperation(expr->pos, name, arguments);
}
VisitResult result = GenerateCall(expr->pos, name, arguments, is_tailcall);
VisitResult result;
if (!has_template_arguments &&
declarations()->Lookup(expr->pos, expr->callee.name)->IsValue()) {
result =
GeneratePointerCall(expr->pos, &expr->callee, arguments, is_tailcall);
} else {
result = GenerateCall(expr->pos, name, arguments, is_tailcall);
}
if (!result.type()->IsVoidOrNever()) {
GenerateIndent();
source_out() << "USE(" << result.variable() << ");" << std::endl;
......
......@@ -76,7 +76,13 @@ class ImplementationVisitor : public FileVisitor {
return GenerateOperation(expr->pos, "[]", arguments);
}
VisitResult GetBuiltinCode(SourcePosition pos, Builtin* builtin);
VisitResult Visit(IdentifierExpression* expr) {
if (Builtin* builtin =
Builtin::DynamicCast(declarations()->Lookup(expr->name))) {
return GetBuiltinCode(expr->pos, builtin);
}
return GenerateFetchFromLocation(expr, GetLocationReference(expr));
}
VisitResult Visit(FieldAccessExpression* expr) {
......@@ -201,6 +207,8 @@ class ImplementationVisitor : public FileVisitor {
VisitResult GenerateCall(SourcePosition pos, const std::string& callable_name,
const Arguments& parameters, bool tail_call);
VisitResult GeneratePointerCall(SourcePosition pos, Expression* callee,
const Arguments& parameters, bool tail_call);
bool GenerateLabeledStatementBlocks(
const std::vector<Statement*>& blocks,
......
......@@ -112,6 +112,11 @@ class ScopeChain {
return e->Lookup(name);
}
Declarable* LookupGlobalScope(const std::string& name) {
auto& e = current_scopes_.front();
return e->Lookup(name);
}
void Print() {
for (auto s : current_scopes_) {
s->Print();
......
......@@ -77,9 +77,7 @@ class TypeOracle {
private:
const Type* GetBuiltinType(const std::string& name) {
Declarable* declarable = declarations_->Lookup(name);
DCHECK(declarable != nullptr);
return Type::cast(declarable);
return declarations_->LookupGlobalType(name);
}
Declarations* declarations_;
......
......@@ -23,6 +23,7 @@ static const char* const ARGUMENTS_TYPE_STRING = "Arguments";
static const char* const CONTEXT_TYPE_STRING = "Context";
static const char* const OBJECT_TYPE_STRING = "Object";
static const char* const STRING_TYPE_STRING = "String";
static const char* const CODE_TYPE_STRING = "Code";
static const char* const INTPTR_TYPE_STRING = "intptr";
static const char* const CONST_INT31_TYPE_STRING = "constexpr int31";
static const char* const CONST_INT32_TYPE_STRING = "constexpr int32";
......
......@@ -6,8 +6,11 @@
#define V8_TORQUE_UTILS_H_
#include <string>
#include <unordered_set>
#include <vector>
#include "src/base/functional.h"
namespace v8 {
namespace internal {
namespace torque {
......@@ -22,6 +25,15 @@ std::string DashifyString(const std::string& underscore_string);
void ReplaceFileContentsIfDifferent(const std::string& file_path,
const std::string& contents);
template <class T>
class Deduplicator {
public:
const T* Add(T x) { return &*(storage_.insert(std::move(x)).first); }
private:
std::unordered_set<T, base::hash<T>> storage_;
};
} // namespace torque
} // namespace internal
} // namespace v8
......
......@@ -124,6 +124,20 @@ TEST(TestMacroSpecialization) {
FunctionTester ft(asm_tester.GenerateCode(), 0);
}
TEST(TestFunctionPointers) {
Isolate* isolate(CcTest::InitIsolateOnce());
const int kNumParams = 0;
CodeAssemblerTester asm_tester(isolate, kNumParams);
TestBuiltinsFromDSLAssembler m(asm_tester.state());
{
TNode<Context> context =
m.UncheckedCast<Context>(m.Parameter(kNumParams + 2));
m.Return(m.TestFunctionPointers(context));
}
FunctionTester ft(asm_tester.GenerateCode(), 0);
ft.CheckCall(ft.true_value());
}
} // namespace compiler
} // namespace internal
} // namespace v8
......@@ -158,4 +158,19 @@ module test {
unreachable;
}
}
builtin TestHelperPlus1(context : Context, x : Smi) : Smi {
return x + 1;
}
builtin TestHelperPlus2(context : Context, x : Smi) : Smi {
return x + 2;
}
macro TestFunctionPointers(context : Context) : Boolean {
let fptr : builtin(Context, Smi) => Smi = TestHelperPlus1;
assert(fptr(context, 42) == 43);
fptr = TestHelperPlus2;
assert(fptr(context, 42) == 44);
return True;
}
}
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