From 9aa23caaa9d40f95b03dad99bcfbd25174345848 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Sun, 11 Aug 2024 15:38:53 +0000 Subject: [PATCH] basically finish AST build --- grammar/MXParser.g4 | 2 +- include/ast/expr_astnode.h | 32 +- include/ast/statement_astnode.h | 1 + include/semantic/semantic.h | 4 +- src/main.cpp | 2 +- src/semantic/antlr-generated/MXParser.cpp | 415 ++++++------ src/semantic/antlr-generated/MXParser.interp | 2 +- src/semantic/semantic.cpp | 8 +- src/semantic/visitor.cpp | 633 +++++++++++++++++-- 9 files changed, 824 insertions(+), 275 deletions(-) diff --git a/grammar/MXParser.g4 b/grammar/MXParser.g4 index 768249e..09f73c3 100644 --- a/grammar/MXParser.g4 +++ b/grammar/MXParser.g4 @@ -27,7 +27,7 @@ statement define_statement : type (LBRACKET RBRACKET)* ID (ASSIGN expr)? (COMMA ID (ASSIGN expr)?)* SEMICOLON; expr : basic_expr #basic_expression - | NEW type (LBRACKET expr? RBRACKET)*constant? #new_array_expression + | NEW type (LBRACKET expr? RBRACKET)+constant? #new_array_expression | NEW type LPAREN RPAREN #new_construct_expression | NEW type #new_expression | expr DOT (ID|(ID LPAREN (expr (COMMA expr)*)? RPAREN)) #access_expression diff --git a/include/ast/expr_astnode.h b/include/ast/expr_astnode.h index 71922b6..ecdfe53 100644 --- a/include/ast/expr_astnode.h +++ b/include/ast/expr_astnode.h @@ -6,6 +6,7 @@ #include "astnode.h" class Expr_ASTNode : public ASTNodeBase { + friend Visitor; ExprTypeInfo expr_type_info; public: @@ -16,6 +17,7 @@ class BasicExpr_ASTNode : public Expr_ASTNode {}; // This is a virtual class class NewArrayExpr_ASTNode : public Expr_ASTNode { friend Visitor; bool has_initial_value; + std::vector> dim_size; std::shared_ptr initial_value; }; class NewConstructExpr_ASTNode : public Expr_ASTNode { @@ -28,12 +30,7 @@ class AccessExpr_ASTNode : public Expr_ASTNode { friend Visitor; std::shared_ptr base; IdentifierType member; -}; -class MemberVariableAccessExpr_ASTNode : public AccessExpr_ASTNode { - friend Visitor; -}; -class MemberFunctionAccessExpr_ASTNode : public AccessExpr_ASTNode { - friend Visitor; + bool is_function; std::vector> arguments; }; class IndexExpr_ASTNode : public Expr_ASTNode { @@ -43,10 +40,12 @@ class IndexExpr_ASTNode : public Expr_ASTNode { }; class SuffixExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr base; }; class PrefixExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr base; }; class OppositeExpr_ASTNode : public Expr_ASTNode { @@ -55,61 +54,69 @@ class OppositeExpr_ASTNode : public Expr_ASTNode { }; class LNotExpr_ASTNode : public Expr_ASTNode { friend Visitor; - std::shared_ptr left; - std::shared_ptr right; + std::shared_ptr base; }; class BNotExpr_ASTNode : public Expr_ASTNode { friend Visitor; - std::shared_ptr left; - std::shared_ptr right; + std::shared_ptr base; }; class MDMExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class PMExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class RLExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class GGLLExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class NEExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class BAndExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class BXorExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class BOrExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class LAndExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; class LOrExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr left; std::shared_ptr right; }; @@ -121,6 +128,7 @@ class TernaryExpr_ASTNode : public Expr_ASTNode { }; class AssignExpr_ASTNode : public Expr_ASTNode { friend Visitor; + std::string op; std::shared_ptr dest; std::shared_ptr src; }; @@ -143,8 +151,8 @@ class FunctionCallExpr_ASTNode : public BasicExpr_ASTNode { }; class FormattedStringExpr_ASTNode : public BasicExpr_ASTNode { friend Visitor; - using SegmentType = std::variant>; - std::vector segments; + std::vector literals; + std::vector> exprs; }; struct NullType {}; using AtomicConstantType = std::variant; diff --git a/include/ast/statement_astnode.h b/include/ast/statement_astnode.h index 0b7e48c..13e66e6 100644 --- a/include/ast/statement_astnode.h +++ b/include/ast/statement_astnode.h @@ -41,6 +41,7 @@ class ForStatement_ASTNode : public Statement_ASTNode { }; class JmpStatement_ASTNode : public Statement_ASTNode { friend Visitor; + uint8_t jmp_type; // 0: return, 1: break, 2: continue std::shared_ptr return_value; }; class SuiteStatement_ASTNode : public Statement_ASTNode { diff --git a/include/semantic/semantic.h b/include/semantic/semantic.h index 0bd3290..914658a 100644 --- a/include/semantic/semantic.h +++ b/include/semantic/semantic.h @@ -4,6 +4,6 @@ #include "ast/ast.h" #include "visitor.h" -std::shared_ptr BuildAST(Visitor *visitor, antlr4::tree::ParseTree *tree); -void SemanticCheck(std::istream &fin, std::shared_ptr &ast); +std::shared_ptr BuildAST(Visitor *visitor, antlr4::tree::ParseTree *tree); +void SemanticCheck(std::istream &fin, std::shared_ptr &ast); #endif \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 75343db..9fe7e0d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -21,7 +21,7 @@ int main(int argc, char **argv) { auto input_file = program.get("input"); auto output_file = program.get("output"); std::ifstream fin(input_file); - std::shared_ptr ast; + std::shared_ptr ast; try { SemanticCheck(fin, ast); } catch (const SemanticError &err) { diff --git a/src/semantic/antlr-generated/MXParser.cpp b/src/semantic/antlr-generated/MXParser.cpp index 7e5c8a6..c264e8c 100644 --- a/src/semantic/antlr-generated/MXParser.cpp +++ b/src/semantic/antlr-generated/MXParser.cpp @@ -78,7 +78,7 @@ void mxparserParserInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,1,61,365,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, + 4,1,61,364,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6,2, 7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,1,0,1,0,1,0,4,0,30, 8,0,11,0,12,0,31,1,0,1,0,1,1,1,1,1,1,5,1,39,8,1,10,1,12,1,42,9,1,1,1, 1,1,1,1,1,1,1,1,5,1,49,8,1,10,1,12,1,52,9,1,1,1,1,1,1,1,1,1,1,1,1,1,5, @@ -92,22 +92,22 @@ void mxparserParserInitialize() { 1,6,3,6,166,8,6,3,6,168,8,6,1,6,1,6,3,6,172,8,6,1,7,1,7,1,7,5,7,177,8, 7,10,7,12,7,180,9,7,1,7,1,7,1,7,3,7,185,8,7,1,7,1,7,1,7,1,7,3,7,191,8, 7,5,7,193,8,7,10,7,12,7,196,9,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,3,8,206, - 8,8,1,8,5,8,209,8,8,10,8,12,8,212,9,8,1,8,3,8,215,8,8,1,8,1,8,1,8,1,8, - 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,3,8,232,8,8,1,8,1,8,1,8,1, + 8,8,1,8,4,8,209,8,8,11,8,12,8,210,1,8,3,8,214,8,8,1,8,1,8,1,8,1,8,1,8, + 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,3,8,231,8,8,1,8,1,8,1,8,1,8,1, 8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8, 1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1, - 8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,281,8,8,10,8,12,8,284,9,8,3,8,286, - 8,8,1,8,3,8,289,8,8,1,8,1,8,1,8,1,8,1,8,4,8,296,8,8,11,8,12,8,297,1,8, - 1,8,5,8,302,8,8,10,8,12,8,305,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9, - 1,9,1,9,5,9,318,8,9,10,9,12,9,321,9,9,3,9,323,8,9,1,9,1,9,1,9,3,9,328, - 8,9,1,10,1,10,1,10,1,10,1,10,5,10,335,8,10,10,10,12,10,338,9,10,1,10, - 1,10,3,10,342,8,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,5,11, - 353,8,11,10,11,12,11,356,9,11,3,11,358,8,11,1,11,3,11,361,8,11,1,12,1, - 12,1,12,1,336,1,16,13,0,2,4,6,8,10,12,14,16,18,20,22,24,0,7,1,0,39,40, - 1,0,20,22,1,0,18,19,1,0,32,33,1,0,23,26,1,0,27,28,2,0,1,4,56,56,430,0, - 29,1,0,0,0,2,35,1,0,0,0,4,76,1,0,0,0,6,90,1,0,0,0,8,108,1,0,0,0,10,113, - 1,0,0,0,12,171,1,0,0,0,14,173,1,0,0,0,16,231,1,0,0,0,18,327,1,0,0,0,20, - 341,1,0,0,0,22,360,1,0,0,0,24,362,1,0,0,0,26,30,3,4,2,0,27,30,3,14,7, + 8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,5,8,280,8,8,10,8,12,8,283,9,8,3,8,285,8, + 8,1,8,3,8,288,8,8,1,8,1,8,1,8,1,8,1,8,4,8,295,8,8,11,8,12,8,296,1,8,1, + 8,5,8,301,8,8,10,8,12,8,304,9,8,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1,9,1, + 9,1,9,5,9,317,8,9,10,9,12,9,320,9,9,3,9,322,8,9,1,9,1,9,1,9,3,9,327,8, + 9,1,10,1,10,1,10,1,10,1,10,5,10,334,8,10,10,10,12,10,337,9,10,1,10,1, + 10,3,10,341,8,10,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,1,11,5,11,352, + 8,11,10,11,12,11,355,9,11,3,11,357,8,11,1,11,3,11,360,8,11,1,12,1,12, + 1,12,1,335,1,16,13,0,2,4,6,8,10,12,14,16,18,20,22,24,0,7,1,0,39,40,1, + 0,20,22,1,0,18,19,1,0,32,33,1,0,23,26,1,0,27,28,2,0,1,4,56,56,429,0,29, + 1,0,0,0,2,35,1,0,0,0,4,76,1,0,0,0,6,90,1,0,0,0,8,108,1,0,0,0,10,113,1, + 0,0,0,12,171,1,0,0,0,14,173,1,0,0,0,16,230,1,0,0,0,18,326,1,0,0,0,20, + 340,1,0,0,0,22,359,1,0,0,0,24,361,1,0,0,0,26,30,3,4,2,0,27,30,3,14,7, 0,28,30,3,2,1,0,29,26,1,0,0,0,29,27,1,0,0,0,29,28,1,0,0,0,30,31,1,0,0, 0,31,29,1,0,0,0,31,32,1,0,0,0,32,33,1,0,0,0,33,34,5,0,0,1,34,1,1,0,0, 0,35,40,3,24,12,0,36,37,5,46,0,0,37,39,5,47,0,0,38,36,1,0,0,0,39,42,1, @@ -153,59 +153,58 @@ void mxparserParserInitialize() { 186,187,5,51,0,0,187,190,5,56,0,0,188,189,5,38,0,0,189,191,3,16,8,0,190, 188,1,0,0,0,190,191,1,0,0,0,191,193,1,0,0,0,192,186,1,0,0,0,193,196,1, 0,0,0,194,192,1,0,0,0,194,195,1,0,0,0,195,197,1,0,0,0,196,194,1,0,0,0, - 197,198,5,50,0,0,198,15,1,0,0,0,199,200,6,8,-1,0,200,232,3,18,9,0,201, - 202,5,5,0,0,202,210,3,24,12,0,203,205,5,46,0,0,204,206,3,16,8,0,205,204, + 197,198,5,50,0,0,198,15,1,0,0,0,199,200,6,8,-1,0,200,231,3,18,9,0,201, + 202,5,5,0,0,202,208,3,24,12,0,203,205,5,46,0,0,204,206,3,16,8,0,205,204, 1,0,0,0,205,206,1,0,0,0,206,207,1,0,0,0,207,209,5,47,0,0,208,203,1,0, - 0,0,209,212,1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,214,1,0,0,0,212, - 210,1,0,0,0,213,215,3,22,11,0,214,213,1,0,0,0,214,215,1,0,0,0,215,232, - 1,0,0,0,216,217,5,5,0,0,217,218,3,24,12,0,218,219,5,44,0,0,219,220,5, - 45,0,0,220,232,1,0,0,0,221,222,5,5,0,0,222,232,3,24,12,0,223,224,7,0, - 0,0,224,232,3,16,8,16,225,226,5,19,0,0,226,232,3,16,8,15,227,228,5,31, - 0,0,228,232,3,16,8,14,229,230,5,37,0,0,230,232,3,16,8,13,231,199,1,0, - 0,0,231,201,1,0,0,0,231,216,1,0,0,0,231,221,1,0,0,0,231,223,1,0,0,0,231, - 225,1,0,0,0,231,227,1,0,0,0,231,229,1,0,0,0,232,303,1,0,0,0,233,234,10, - 12,0,0,234,235,7,1,0,0,235,302,3,16,8,13,236,237,10,11,0,0,237,238,7, - 2,0,0,238,302,3,16,8,12,239,240,10,10,0,0,240,241,7,3,0,0,241,302,3,16, - 8,11,242,243,10,9,0,0,243,244,7,4,0,0,244,302,3,16,8,10,245,246,10,8, - 0,0,246,247,7,5,0,0,247,302,3,16,8,9,248,249,10,7,0,0,249,250,5,34,0, - 0,250,302,3,16,8,8,251,252,10,6,0,0,252,253,5,36,0,0,253,302,3,16,8,7, - 254,255,10,5,0,0,255,256,5,35,0,0,256,302,3,16,8,6,257,258,10,4,0,0,258, - 259,5,29,0,0,259,302,3,16,8,5,260,261,10,3,0,0,261,262,5,30,0,0,262,302, - 3,16,8,4,263,264,10,2,0,0,264,265,5,42,0,0,265,266,3,16,8,0,266,267,5, - 43,0,0,267,268,3,16,8,2,268,302,1,0,0,0,269,270,10,1,0,0,270,271,5,38, - 0,0,271,302,3,16,8,1,272,273,10,19,0,0,273,288,5,41,0,0,274,289,5,56, - 0,0,275,276,5,56,0,0,276,285,5,44,0,0,277,282,3,16,8,0,278,279,5,51,0, - 0,279,281,3,16,8,0,280,278,1,0,0,0,281,284,1,0,0,0,282,280,1,0,0,0,282, - 283,1,0,0,0,283,286,1,0,0,0,284,282,1,0,0,0,285,277,1,0,0,0,285,286,1, - 0,0,0,286,287,1,0,0,0,287,289,5,45,0,0,288,274,1,0,0,0,288,275,1,0,0, - 0,289,302,1,0,0,0,290,295,10,18,0,0,291,292,5,46,0,0,292,293,3,16,8,0, - 293,294,5,47,0,0,294,296,1,0,0,0,295,291,1,0,0,0,296,297,1,0,0,0,297, - 295,1,0,0,0,297,298,1,0,0,0,298,302,1,0,0,0,299,300,10,17,0,0,300,302, - 7,0,0,0,301,233,1,0,0,0,301,236,1,0,0,0,301,239,1,0,0,0,301,242,1,0,0, - 0,301,245,1,0,0,0,301,248,1,0,0,0,301,251,1,0,0,0,301,254,1,0,0,0,301, - 257,1,0,0,0,301,260,1,0,0,0,301,263,1,0,0,0,301,269,1,0,0,0,301,272,1, - 0,0,0,301,290,1,0,0,0,301,299,1,0,0,0,302,305,1,0,0,0,303,301,1,0,0,0, - 303,304,1,0,0,0,304,17,1,0,0,0,305,303,1,0,0,0,306,328,5,10,0,0,307,308, - 5,44,0,0,308,309,3,16,8,0,309,310,5,45,0,0,310,328,1,0,0,0,311,328,5, - 56,0,0,312,313,5,56,0,0,313,322,5,44,0,0,314,319,3,16,8,0,315,316,5,51, - 0,0,316,318,3,16,8,0,317,315,1,0,0,0,318,321,1,0,0,0,319,317,1,0,0,0, - 319,320,1,0,0,0,320,323,1,0,0,0,321,319,1,0,0,0,322,314,1,0,0,0,322,323, - 1,0,0,0,323,324,1,0,0,0,324,328,5,45,0,0,325,328,3,20,10,0,326,328,3, - 22,11,0,327,306,1,0,0,0,327,307,1,0,0,0,327,311,1,0,0,0,327,312,1,0,0, - 0,327,325,1,0,0,0,327,326,1,0,0,0,328,19,1,0,0,0,329,342,5,52,0,0,330, - 331,5,53,0,0,331,336,3,16,8,0,332,333,5,55,0,0,333,335,3,16,8,0,334,332, - 1,0,0,0,335,338,1,0,0,0,336,337,1,0,0,0,336,334,1,0,0,0,337,339,1,0,0, - 0,338,336,1,0,0,0,339,340,5,54,0,0,340,342,1,0,0,0,341,329,1,0,0,0,341, - 330,1,0,0,0,342,21,1,0,0,0,343,361,5,8,0,0,344,361,5,9,0,0,345,361,5, - 57,0,0,346,361,5,58,0,0,347,361,5,7,0,0,348,357,5,48,0,0,349,354,3,22, - 11,0,350,351,5,51,0,0,351,353,3,22,11,0,352,350,1,0,0,0,353,356,1,0,0, - 0,354,352,1,0,0,0,354,355,1,0,0,0,355,358,1,0,0,0,356,354,1,0,0,0,357, - 349,1,0,0,0,357,358,1,0,0,0,358,359,1,0,0,0,359,361,5,49,0,0,360,343, - 1,0,0,0,360,344,1,0,0,0,360,345,1,0,0,0,360,346,1,0,0,0,360,347,1,0,0, - 0,360,348,1,0,0,0,361,23,1,0,0,0,362,363,7,6,0,0,363,25,1,0,0,0,41,29, - 31,40,50,61,68,71,82,84,95,103,117,134,149,152,157,165,167,171,178,184, - 190,194,205,210,214,231,282,285,288,297,301,303,319,322,327,336,341,354, - 357,360 + 0,0,209,210,1,0,0,0,210,208,1,0,0,0,210,211,1,0,0,0,211,213,1,0,0,0,212, + 214,3,22,11,0,213,212,1,0,0,0,213,214,1,0,0,0,214,231,1,0,0,0,215,216, + 5,5,0,0,216,217,3,24,12,0,217,218,5,44,0,0,218,219,5,45,0,0,219,231,1, + 0,0,0,220,221,5,5,0,0,221,231,3,24,12,0,222,223,7,0,0,0,223,231,3,16, + 8,16,224,225,5,19,0,0,225,231,3,16,8,15,226,227,5,31,0,0,227,231,3,16, + 8,14,228,229,5,37,0,0,229,231,3,16,8,13,230,199,1,0,0,0,230,201,1,0,0, + 0,230,215,1,0,0,0,230,220,1,0,0,0,230,222,1,0,0,0,230,224,1,0,0,0,230, + 226,1,0,0,0,230,228,1,0,0,0,231,302,1,0,0,0,232,233,10,12,0,0,233,234, + 7,1,0,0,234,301,3,16,8,13,235,236,10,11,0,0,236,237,7,2,0,0,237,301,3, + 16,8,12,238,239,10,10,0,0,239,240,7,3,0,0,240,301,3,16,8,11,241,242,10, + 9,0,0,242,243,7,4,0,0,243,301,3,16,8,10,244,245,10,8,0,0,245,246,7,5, + 0,0,246,301,3,16,8,9,247,248,10,7,0,0,248,249,5,34,0,0,249,301,3,16,8, + 8,250,251,10,6,0,0,251,252,5,36,0,0,252,301,3,16,8,7,253,254,10,5,0,0, + 254,255,5,35,0,0,255,301,3,16,8,6,256,257,10,4,0,0,257,258,5,29,0,0,258, + 301,3,16,8,5,259,260,10,3,0,0,260,261,5,30,0,0,261,301,3,16,8,4,262,263, + 10,2,0,0,263,264,5,42,0,0,264,265,3,16,8,0,265,266,5,43,0,0,266,267,3, + 16,8,2,267,301,1,0,0,0,268,269,10,1,0,0,269,270,5,38,0,0,270,301,3,16, + 8,1,271,272,10,19,0,0,272,287,5,41,0,0,273,288,5,56,0,0,274,275,5,56, + 0,0,275,284,5,44,0,0,276,281,3,16,8,0,277,278,5,51,0,0,278,280,3,16,8, + 0,279,277,1,0,0,0,280,283,1,0,0,0,281,279,1,0,0,0,281,282,1,0,0,0,282, + 285,1,0,0,0,283,281,1,0,0,0,284,276,1,0,0,0,284,285,1,0,0,0,285,286,1, + 0,0,0,286,288,5,45,0,0,287,273,1,0,0,0,287,274,1,0,0,0,288,301,1,0,0, + 0,289,294,10,18,0,0,290,291,5,46,0,0,291,292,3,16,8,0,292,293,5,47,0, + 0,293,295,1,0,0,0,294,290,1,0,0,0,295,296,1,0,0,0,296,294,1,0,0,0,296, + 297,1,0,0,0,297,301,1,0,0,0,298,299,10,17,0,0,299,301,7,0,0,0,300,232, + 1,0,0,0,300,235,1,0,0,0,300,238,1,0,0,0,300,241,1,0,0,0,300,244,1,0,0, + 0,300,247,1,0,0,0,300,250,1,0,0,0,300,253,1,0,0,0,300,256,1,0,0,0,300, + 259,1,0,0,0,300,262,1,0,0,0,300,268,1,0,0,0,300,271,1,0,0,0,300,289,1, + 0,0,0,300,298,1,0,0,0,301,304,1,0,0,0,302,300,1,0,0,0,302,303,1,0,0,0, + 303,17,1,0,0,0,304,302,1,0,0,0,305,327,5,10,0,0,306,307,5,44,0,0,307, + 308,3,16,8,0,308,309,5,45,0,0,309,327,1,0,0,0,310,327,5,56,0,0,311,312, + 5,56,0,0,312,321,5,44,0,0,313,318,3,16,8,0,314,315,5,51,0,0,315,317,3, + 16,8,0,316,314,1,0,0,0,317,320,1,0,0,0,318,316,1,0,0,0,318,319,1,0,0, + 0,319,322,1,0,0,0,320,318,1,0,0,0,321,313,1,0,0,0,321,322,1,0,0,0,322, + 323,1,0,0,0,323,327,5,45,0,0,324,327,3,20,10,0,325,327,3,22,11,0,326, + 305,1,0,0,0,326,306,1,0,0,0,326,310,1,0,0,0,326,311,1,0,0,0,326,324,1, + 0,0,0,326,325,1,0,0,0,327,19,1,0,0,0,328,341,5,52,0,0,329,330,5,53,0, + 0,330,335,3,16,8,0,331,332,5,55,0,0,332,334,3,16,8,0,333,331,1,0,0,0, + 334,337,1,0,0,0,335,336,1,0,0,0,335,333,1,0,0,0,336,338,1,0,0,0,337,335, + 1,0,0,0,338,339,5,54,0,0,339,341,1,0,0,0,340,328,1,0,0,0,340,329,1,0, + 0,0,341,21,1,0,0,0,342,360,5,8,0,0,343,360,5,9,0,0,344,360,5,57,0,0,345, + 360,5,58,0,0,346,360,5,7,0,0,347,356,5,48,0,0,348,353,3,22,11,0,349,350, + 5,51,0,0,350,352,3,22,11,0,351,349,1,0,0,0,352,355,1,0,0,0,353,351,1, + 0,0,0,353,354,1,0,0,0,354,357,1,0,0,0,355,353,1,0,0,0,356,348,1,0,0,0, + 356,357,1,0,0,0,357,358,1,0,0,0,358,360,5,49,0,0,359,342,1,0,0,0,359, + 343,1,0,0,0,359,344,1,0,0,0,359,345,1,0,0,0,359,346,1,0,0,0,359,347,1, + 0,0,0,360,23,1,0,0,0,361,362,7,6,0,0,362,25,1,0,0,0,41,29,31,40,50,61, + 68,71,82,84,95,103,117,134,149,152,157,165,167,171,178,184,190,194,205, + 210,213,230,281,284,287,296,300,302,318,321,326,335,340,353,356,359 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -2160,7 +2159,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(231); + setState(230); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 26, _ctx)) { case 1: { @@ -2181,35 +2180,41 @@ MXParser::ExprContext* MXParser::expr(int precedence) { match(MXParser::NEW); setState(202); type(); - setState(210); + setState(208); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 24, _ctx); - while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { - if (alt == 1) { - setState(203); - match(MXParser::LBRACKET); - setState(205); - _errHandler->sync(this); + alt = 1; + do { + switch (alt) { + case 1: { + setState(203); + match(MXParser::LBRACKET); + setState(205); + _errHandler->sync(this); - _la = _input->LA(1); - if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 518214813164767136) != 0)) { - setState(204); - expr(0); - } - setState(207); - match(MXParser::RBRACKET); + _la = _input->LA(1); + if ((((_la & ~ 0x3fULL) == 0) && + ((1ULL << _la) & 518214813164767136) != 0)) { + setState(204); + expr(0); + } + setState(207); + match(MXParser::RBRACKET); + break; + } + + default: + throw NoViableAltException(this); } - setState(212); + setState(210); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 24, _ctx); - } - setState(214); + } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); + setState(213); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 25, _ctx)) { case 1: { - setState(213); + setState(212); constant(); break; } @@ -2224,13 +2229,13 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(216); + setState(215); match(MXParser::NEW); - setState(217); + setState(216); type(); - setState(218); + setState(217); match(MXParser::LPAREN); - setState(219); + setState(218); match(MXParser::RPAREN); break; } @@ -2239,9 +2244,9 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(221); + setState(220); match(MXParser::NEW); - setState(222); + setState(221); type(); break; } @@ -2250,7 +2255,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(223); + setState(222); _la = _input->LA(1); if (!(_la == MXParser::SELF_PLUS @@ -2261,7 +2266,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(224); + setState(223); expr(16); break; } @@ -2270,9 +2275,9 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(225); + setState(224); match(MXParser::MINUS); - setState(226); + setState(225); expr(15); break; } @@ -2281,9 +2286,9 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(227); + setState(226); match(MXParser::LNOT); - setState(228); + setState(227); expr(14); break; } @@ -2292,9 +2297,9 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(229); + setState(228); match(MXParser::BNOT); - setState(230); + setState(229); expr(13); break; } @@ -2303,7 +2308,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(303); + setState(302); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 32, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { @@ -2311,17 +2316,17 @@ MXParser::ExprContext* MXParser::expr(int precedence) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(301); + setState(300); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(233); + setState(232); if (!(precpred(_ctx, 12))) throw FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(234); + setState(233); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 7340032) != 0))) { @@ -2331,7 +2336,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(235); + setState(234); expr(13); break; } @@ -2340,10 +2345,10 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(236); + setState(235); if (!(precpred(_ctx, 11))) throw FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(237); + setState(236); _la = _input->LA(1); if (!(_la == MXParser::PLUS @@ -2354,7 +2359,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(238); + setState(237); expr(12); break; } @@ -2363,10 +2368,10 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(239); + setState(238); if (!(precpred(_ctx, 10))) throw FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(240); + setState(239); _la = _input->LA(1); if (!(_la == MXParser::ARS @@ -2377,7 +2382,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(241); + setState(240); expr(11); break; } @@ -2386,10 +2391,10 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(242); + setState(241); if (!(precpred(_ctx, 9))) throw FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(243); + setState(242); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 125829120) != 0))) { @@ -2399,7 +2404,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(244); + setState(243); expr(10); break; } @@ -2408,10 +2413,10 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(245); + setState(244); if (!(precpred(_ctx, 8))) throw FailedPredicateException(this, "precpred(_ctx, 8)"); - setState(246); + setState(245); _la = _input->LA(1); if (!(_la == MXParser::NE @@ -2422,7 +2427,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(247); + setState(246); expr(9); break; } @@ -2431,12 +2436,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(248); + setState(247); if (!(precpred(_ctx, 7))) throw FailedPredicateException(this, "precpred(_ctx, 7)"); - setState(249); + setState(248); match(MXParser::BAND); - setState(250); + setState(249); expr(8); break; } @@ -2445,12 +2450,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(251); + setState(250); if (!(precpred(_ctx, 6))) throw FailedPredicateException(this, "precpred(_ctx, 6)"); - setState(252); + setState(251); match(MXParser::BXOR); - setState(253); + setState(252); expr(7); break; } @@ -2459,12 +2464,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(254); + setState(253); if (!(precpred(_ctx, 5))) throw FailedPredicateException(this, "precpred(_ctx, 5)"); - setState(255); + setState(254); match(MXParser::BOR); - setState(256); + setState(255); expr(6); break; } @@ -2473,12 +2478,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(257); + setState(256); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(258); + setState(257); match(MXParser::LAND); - setState(259); + setState(258); expr(5); break; } @@ -2487,12 +2492,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(260); + setState(259); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(261); + setState(260); match(MXParser::LOR); - setState(262); + setState(261); expr(4); break; } @@ -2501,16 +2506,16 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(263); + setState(262); if (!(precpred(_ctx, 2))) throw FailedPredicateException(this, "precpred(_ctx, 2)"); - setState(264); + setState(263); match(MXParser::QUESTION_MARK); - setState(265); + setState(264); expr(0); - setState(266); + setState(265); match(MXParser::COLON); - setState(267); + setState(266); expr(2); break; } @@ -2519,12 +2524,12 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(269); + setState(268); if (!(precpred(_ctx, 1))) throw FailedPredicateException(this, "precpred(_ctx, 1)"); - setState(270); + setState(269); match(MXParser::ASSIGN); - setState(271); + setState(270); expr(1); break; } @@ -2533,47 +2538,47 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(272); + setState(271); if (!(precpred(_ctx, 19))) throw FailedPredicateException(this, "precpred(_ctx, 19)"); - setState(273); + setState(272); match(MXParser::DOT); - setState(288); + setState(287); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 29, _ctx)) { case 1: { - setState(274); + setState(273); match(MXParser::ID); break; } case 2: { - setState(275); + setState(274); match(MXParser::ID); - setState(276); + setState(275); match(MXParser::LPAREN); - setState(285); + setState(284); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 518214813164767136) != 0)) { - setState(277); + setState(276); expr(0); - setState(282); + setState(281); _errHandler->sync(this); _la = _input->LA(1); while (_la == MXParser::COMMA) { - setState(278); + setState(277); match(MXParser::COMMA); - setState(279); + setState(278); expr(0); - setState(284); + setState(283); _errHandler->sync(this); _la = _input->LA(1); } } - setState(287); + setState(286); match(MXParser::RPAREN); break; } @@ -2588,20 +2593,20 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(290); + setState(289); if (!(precpred(_ctx, 18))) throw FailedPredicateException(this, "precpred(_ctx, 18)"); - setState(295); + setState(294); _errHandler->sync(this); alt = 1; do { switch (alt) { case 1: { - setState(291); + setState(290); match(MXParser::LBRACKET); - setState(292); + setState(291); expr(0); - setState(293); + setState(292); match(MXParser::RBRACKET); break; } @@ -2609,7 +2614,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { default: throw NoViableAltException(this); } - setState(297); + setState(296); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 30, _ctx); } while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER); @@ -2620,10 +2625,10 @@ MXParser::ExprContext* MXParser::expr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleExpr); - setState(299); + setState(298); if (!(precpred(_ctx, 17))) throw FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(300); + setState(299); _la = _input->LA(1); if (!(_la == MXParser::SELF_PLUS @@ -2641,7 +2646,7 @@ MXParser::ExprContext* MXParser::expr(int precedence) { break; } } - setState(305); + setState(304); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 32, _ctx); } @@ -2804,13 +2809,13 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { exitRule(); }); try { - setState(327); + setState(326); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 35, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(306); + setState(305); match(MXParser::THIS); break; } @@ -2818,11 +2823,11 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(307); + setState(306); match(MXParser::LPAREN); - setState(308); + setState(307); expr(0); - setState(309); + setState(308); match(MXParser::RPAREN); break; } @@ -2830,7 +2835,7 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { case 3: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 3); - setState(311); + setState(310); match(MXParser::ID); break; } @@ -2838,32 +2843,32 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { case 4: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 4); - setState(312); + setState(311); match(MXParser::ID); - setState(313); + setState(312); match(MXParser::LPAREN); - setState(322); + setState(321); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 518214813164767136) != 0)) { - setState(314); + setState(313); expr(0); - setState(319); + setState(318); _errHandler->sync(this); _la = _input->LA(1); while (_la == MXParser::COMMA) { - setState(315); + setState(314); match(MXParser::COMMA); - setState(316); + setState(315); expr(0); - setState(321); + setState(320); _errHandler->sync(this); _la = _input->LA(1); } } - setState(324); + setState(323); match(MXParser::RPAREN); break; } @@ -2871,7 +2876,7 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { case 5: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 5); - setState(325); + setState(324); formatted_string(); break; } @@ -2879,7 +2884,7 @@ MXParser::Basic_exprContext* MXParser::basic_expr() { case 6: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 6); - setState(326); + setState(325); constant(); break; } @@ -2958,37 +2963,37 @@ MXParser::Formatted_stringContext* MXParser::formatted_string() { }); try { size_t alt; - setState(341); + setState(340); _errHandler->sync(this); switch (_input->LA(1)) { case MXParser::FORMAT_STRING_WHOLE: { enterOuterAlt(_localctx, 1); - setState(329); + setState(328); match(MXParser::FORMAT_STRING_WHOLE); break; } case MXParser::FORMAT_STRING_HEAD: { enterOuterAlt(_localctx, 2); - setState(330); + setState(329); match(MXParser::FORMAT_STRING_HEAD); - setState(331); + setState(330); expr(0); - setState(336); + setState(335); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); while (alt != 1 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1 + 1) { - setState(332); + setState(331); match(MXParser::FORMAT_STRING_BODY); - setState(333); + setState(332); expr(0); } - setState(338); + setState(337); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 36, _ctx); } - setState(339); + setState(338); match(MXParser::FORMAT_STRING_TAIL); break; } @@ -3083,70 +3088,70 @@ MXParser::ConstantContext* MXParser::constant() { exitRule(); }); try { - setState(360); + setState(359); _errHandler->sync(this); switch (_input->LA(1)) { case MXParser::TRUE: { enterOuterAlt(_localctx, 1); - setState(343); + setState(342); match(MXParser::TRUE); break; } case MXParser::FALSE: { enterOuterAlt(_localctx, 2); - setState(344); + setState(343); match(MXParser::FALSE); break; } case MXParser::INT_LITERAL: { enterOuterAlt(_localctx, 3); - setState(345); + setState(344); match(MXParser::INT_LITERAL); break; } case MXParser::STRING_LITERAL: { enterOuterAlt(_localctx, 4); - setState(346); + setState(345); match(MXParser::STRING_LITERAL); break; } case MXParser::NULL_: { enterOuterAlt(_localctx, 5); - setState(347); + setState(346); match(MXParser::NULL_); break; } case MXParser::LBRACE: { enterOuterAlt(_localctx, 6); - setState(348); + setState(347); match(MXParser::LBRACE); - setState(357); + setState(356); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 432627039204279168) != 0)) { - setState(349); + setState(348); constant(); - setState(354); + setState(353); _errHandler->sync(this); _la = _input->LA(1); while (_la == MXParser::COMMA) { - setState(350); + setState(349); match(MXParser::COMMA); - setState(351); + setState(350); constant(); - setState(356); + setState(355); _errHandler->sync(this); _la = _input->LA(1); } } - setState(359); + setState(358); match(MXParser::RBRACE); break; } @@ -3218,7 +3223,7 @@ MXParser::TypeContext* MXParser::type() { }); try { enterOuterAlt(_localctx, 1); - setState(362); + setState(361); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 72057594037927966) != 0))) { diff --git a/src/semantic/antlr-generated/MXParser.interp b/src/semantic/antlr-generated/MXParser.interp index fab1ff1..2de017a 100644 --- a/src/semantic/antlr-generated/MXParser.interp +++ b/src/semantic/antlr-generated/MXParser.interp @@ -143,4 +143,4 @@ type atn: -[4, 1, 61, 365, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 4, 0, 30, 8, 0, 11, 0, 12, 0, 31, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 5, 1, 39, 8, 1, 10, 1, 12, 1, 42, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 49, 8, 1, 10, 1, 12, 1, 52, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 60, 8, 1, 10, 1, 12, 1, 63, 9, 1, 1, 1, 1, 1, 5, 1, 67, 8, 1, 10, 1, 12, 1, 70, 9, 1, 3, 1, 72, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 83, 8, 2, 10, 2, 12, 2, 86, 9, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 5, 3, 94, 8, 3, 10, 3, 12, 3, 97, 9, 3, 1, 3, 1, 3, 1, 3, 5, 3, 102, 8, 3, 10, 3, 12, 3, 105, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 5, 5, 116, 8, 5, 10, 5, 12, 5, 119, 9, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 135, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 150, 8, 6, 1, 6, 3, 6, 153, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 158, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 166, 8, 6, 3, 6, 168, 8, 6, 1, 6, 1, 6, 3, 6, 172, 8, 6, 1, 7, 1, 7, 1, 7, 5, 7, 177, 8, 7, 10, 7, 12, 7, 180, 9, 7, 1, 7, 1, 7, 1, 7, 3, 7, 185, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 191, 8, 7, 5, 7, 193, 8, 7, 10, 7, 12, 7, 196, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 206, 8, 8, 1, 8, 5, 8, 209, 8, 8, 10, 8, 12, 8, 212, 9, 8, 1, 8, 3, 8, 215, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 232, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 281, 8, 8, 10, 8, 12, 8, 284, 9, 8, 3, 8, 286, 8, 8, 1, 8, 3, 8, 289, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 4, 8, 296, 8, 8, 11, 8, 12, 8, 297, 1, 8, 1, 8, 5, 8, 302, 8, 8, 10, 8, 12, 8, 305, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 318, 8, 9, 10, 9, 12, 9, 321, 9, 9, 3, 9, 323, 8, 9, 1, 9, 1, 9, 1, 9, 3, 9, 328, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 335, 8, 10, 10, 10, 12, 10, 338, 9, 10, 1, 10, 1, 10, 3, 10, 342, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 353, 8, 11, 10, 11, 12, 11, 356, 9, 11, 3, 11, 358, 8, 11, 1, 11, 3, 11, 361, 8, 11, 1, 12, 1, 12, 1, 12, 1, 336, 1, 16, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 7, 1, 0, 39, 40, 1, 0, 20, 22, 1, 0, 18, 19, 1, 0, 32, 33, 1, 0, 23, 26, 1, 0, 27, 28, 2, 0, 1, 4, 56, 56, 430, 0, 29, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 76, 1, 0, 0, 0, 6, 90, 1, 0, 0, 0, 8, 108, 1, 0, 0, 0, 10, 113, 1, 0, 0, 0, 12, 171, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 231, 1, 0, 0, 0, 18, 327, 1, 0, 0, 0, 20, 341, 1, 0, 0, 0, 22, 360, 1, 0, 0, 0, 24, 362, 1, 0, 0, 0, 26, 30, 3, 4, 2, 0, 27, 30, 3, 14, 7, 0, 28, 30, 3, 2, 1, 0, 29, 26, 1, 0, 0, 0, 29, 27, 1, 0, 0, 0, 29, 28, 1, 0, 0, 0, 30, 31, 1, 0, 0, 0, 31, 29, 1, 0, 0, 0, 31, 32, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 34, 5, 0, 0, 1, 34, 1, 1, 0, 0, 0, 35, 40, 3, 24, 12, 0, 36, 37, 5, 46, 0, 0, 37, 39, 5, 47, 0, 0, 38, 36, 1, 0, 0, 0, 39, 42, 1, 0, 0, 0, 40, 38, 1, 0, 0, 0, 40, 41, 1, 0, 0, 0, 41, 43, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 43, 44, 5, 56, 0, 0, 44, 71, 5, 44, 0, 0, 45, 50, 3, 24, 12, 0, 46, 47, 5, 46, 0, 0, 47, 49, 5, 47, 0, 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 53, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 5, 56, 0, 0, 54, 68, 1, 0, 0, 0, 55, 56, 5, 51, 0, 0, 56, 61, 3, 24, 12, 0, 57, 58, 5, 46, 0, 0, 58, 60, 5, 47, 0, 0, 59, 57, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 64, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 65, 5, 56, 0, 0, 65, 67, 1, 0, 0, 0, 66, 55, 1, 0, 0, 0, 67, 70, 1, 0, 0, 0, 68, 66, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 72, 1, 0, 0, 0, 70, 68, 1, 0, 0, 0, 71, 45, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 5, 45, 0, 0, 74, 75, 3, 10, 5, 0, 75, 3, 1, 0, 0, 0, 76, 77, 5, 6, 0, 0, 77, 78, 5, 56, 0, 0, 78, 84, 5, 48, 0, 0, 79, 83, 3, 6, 3, 0, 80, 83, 3, 8, 4, 0, 81, 83, 3, 2, 1, 0, 82, 79, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 86, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 85, 1, 0, 0, 0, 85, 87, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 87, 88, 5, 49, 0, 0, 88, 89, 5, 50, 0, 0, 89, 5, 1, 0, 0, 0, 90, 95, 3, 24, 12, 0, 91, 92, 5, 46, 0, 0, 92, 94, 5, 47, 0, 0, 93, 91, 1, 0, 0, 0, 94, 97, 1, 0, 0, 0, 95, 93, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 1, 0, 0, 0, 97, 95, 1, 0, 0, 0, 98, 103, 5, 56, 0, 0, 99, 100, 5, 51, 0, 0, 100, 102, 5, 56, 0, 0, 101, 99, 1, 0, 0, 0, 102, 105, 1, 0, 0, 0, 103, 101, 1, 0, 0, 0, 103, 104, 1, 0, 0, 0, 104, 106, 1, 0, 0, 0, 105, 103, 1, 0, 0, 0, 106, 107, 5, 50, 0, 0, 107, 7, 1, 0, 0, 0, 108, 109, 5, 56, 0, 0, 109, 110, 5, 44, 0, 0, 110, 111, 5, 45, 0, 0, 111, 112, 3, 10, 5, 0, 112, 9, 1, 0, 0, 0, 113, 117, 5, 48, 0, 0, 114, 116, 3, 12, 6, 0, 115, 114, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 120, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 121, 5, 49, 0, 0, 121, 11, 1, 0, 0, 0, 122, 172, 5, 50, 0, 0, 123, 172, 3, 14, 7, 0, 124, 125, 3, 16, 8, 0, 125, 126, 5, 50, 0, 0, 126, 172, 1, 0, 0, 0, 127, 128, 5, 11, 0, 0, 128, 129, 5, 44, 0, 0, 129, 130, 3, 16, 8, 0, 130, 131, 5, 45, 0, 0, 131, 134, 3, 12, 6, 0, 132, 133, 5, 12, 0, 0, 133, 135, 3, 12, 6, 0, 134, 132, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 172, 1, 0, 0, 0, 136, 137, 5, 14, 0, 0, 137, 138, 5, 44, 0, 0, 138, 139, 3, 16, 8, 0, 139, 140, 5, 45, 0, 0, 140, 141, 3, 12, 6, 0, 141, 172, 1, 0, 0, 0, 142, 143, 5, 13, 0, 0, 143, 149, 5, 44, 0, 0, 144, 150, 3, 14, 7, 0, 145, 146, 3, 16, 8, 0, 146, 147, 5, 50, 0, 0, 147, 150, 1, 0, 0, 0, 148, 150, 5, 50, 0, 0, 149, 144, 1, 0, 0, 0, 149, 145, 1, 0, 0, 0, 149, 148, 1, 0, 0, 0, 150, 152, 1, 0, 0, 0, 151, 153, 3, 16, 8, 0, 152, 151, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 157, 5, 50, 0, 0, 155, 158, 3, 14, 7, 0, 156, 158, 3, 16, 8, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 160, 5, 45, 0, 0, 160, 172, 3, 12, 6, 0, 161, 168, 5, 15, 0, 0, 162, 168, 5, 16, 0, 0, 163, 165, 5, 17, 0, 0, 164, 166, 3, 16, 8, 0, 165, 164, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 168, 1, 0, 0, 0, 167, 161, 1, 0, 0, 0, 167, 162, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 172, 5, 50, 0, 0, 170, 172, 3, 10, 5, 0, 171, 122, 1, 0, 0, 0, 171, 123, 1, 0, 0, 0, 171, 124, 1, 0, 0, 0, 171, 127, 1, 0, 0, 0, 171, 136, 1, 0, 0, 0, 171, 142, 1, 0, 0, 0, 171, 167, 1, 0, 0, 0, 171, 170, 1, 0, 0, 0, 172, 13, 1, 0, 0, 0, 173, 178, 3, 24, 12, 0, 174, 175, 5, 46, 0, 0, 175, 177, 5, 47, 0, 0, 176, 174, 1, 0, 0, 0, 177, 180, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 181, 184, 5, 56, 0, 0, 182, 183, 5, 38, 0, 0, 183, 185, 3, 16, 8, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 194, 1, 0, 0, 0, 186, 187, 5, 51, 0, 0, 187, 190, 5, 56, 0, 0, 188, 189, 5, 38, 0, 0, 189, 191, 3, 16, 8, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 50, 0, 0, 198, 15, 1, 0, 0, 0, 199, 200, 6, 8, -1, 0, 200, 232, 3, 18, 9, 0, 201, 202, 5, 5, 0, 0, 202, 210, 3, 24, 12, 0, 203, 205, 5, 46, 0, 0, 204, 206, 3, 16, 8, 0, 205, 204, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 5, 47, 0, 0, 208, 203, 1, 0, 0, 0, 209, 212, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 214, 1, 0, 0, 0, 212, 210, 1, 0, 0, 0, 213, 215, 3, 22, 11, 0, 214, 213, 1, 0, 0, 0, 214, 215, 1, 0, 0, 0, 215, 232, 1, 0, 0, 0, 216, 217, 5, 5, 0, 0, 217, 218, 3, 24, 12, 0, 218, 219, 5, 44, 0, 0, 219, 220, 5, 45, 0, 0, 220, 232, 1, 0, 0, 0, 221, 222, 5, 5, 0, 0, 222, 232, 3, 24, 12, 0, 223, 224, 7, 0, 0, 0, 224, 232, 3, 16, 8, 16, 225, 226, 5, 19, 0, 0, 226, 232, 3, 16, 8, 15, 227, 228, 5, 31, 0, 0, 228, 232, 3, 16, 8, 14, 229, 230, 5, 37, 0, 0, 230, 232, 3, 16, 8, 13, 231, 199, 1, 0, 0, 0, 231, 201, 1, 0, 0, 0, 231, 216, 1, 0, 0, 0, 231, 221, 1, 0, 0, 0, 231, 223, 1, 0, 0, 0, 231, 225, 1, 0, 0, 0, 231, 227, 1, 0, 0, 0, 231, 229, 1, 0, 0, 0, 232, 303, 1, 0, 0, 0, 233, 234, 10, 12, 0, 0, 234, 235, 7, 1, 0, 0, 235, 302, 3, 16, 8, 13, 236, 237, 10, 11, 0, 0, 237, 238, 7, 2, 0, 0, 238, 302, 3, 16, 8, 12, 239, 240, 10, 10, 0, 0, 240, 241, 7, 3, 0, 0, 241, 302, 3, 16, 8, 11, 242, 243, 10, 9, 0, 0, 243, 244, 7, 4, 0, 0, 244, 302, 3, 16, 8, 10, 245, 246, 10, 8, 0, 0, 246, 247, 7, 5, 0, 0, 247, 302, 3, 16, 8, 9, 248, 249, 10, 7, 0, 0, 249, 250, 5, 34, 0, 0, 250, 302, 3, 16, 8, 8, 251, 252, 10, 6, 0, 0, 252, 253, 5, 36, 0, 0, 253, 302, 3, 16, 8, 7, 254, 255, 10, 5, 0, 0, 255, 256, 5, 35, 0, 0, 256, 302, 3, 16, 8, 6, 257, 258, 10, 4, 0, 0, 258, 259, 5, 29, 0, 0, 259, 302, 3, 16, 8, 5, 260, 261, 10, 3, 0, 0, 261, 262, 5, 30, 0, 0, 262, 302, 3, 16, 8, 4, 263, 264, 10, 2, 0, 0, 264, 265, 5, 42, 0, 0, 265, 266, 3, 16, 8, 0, 266, 267, 5, 43, 0, 0, 267, 268, 3, 16, 8, 2, 268, 302, 1, 0, 0, 0, 269, 270, 10, 1, 0, 0, 270, 271, 5, 38, 0, 0, 271, 302, 3, 16, 8, 1, 272, 273, 10, 19, 0, 0, 273, 288, 5, 41, 0, 0, 274, 289, 5, 56, 0, 0, 275, 276, 5, 56, 0, 0, 276, 285, 5, 44, 0, 0, 277, 282, 3, 16, 8, 0, 278, 279, 5, 51, 0, 0, 279, 281, 3, 16, 8, 0, 280, 278, 1, 0, 0, 0, 281, 284, 1, 0, 0, 0, 282, 280, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 286, 1, 0, 0, 0, 284, 282, 1, 0, 0, 0, 285, 277, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 289, 5, 45, 0, 0, 288, 274, 1, 0, 0, 0, 288, 275, 1, 0, 0, 0, 289, 302, 1, 0, 0, 0, 290, 295, 10, 18, 0, 0, 291, 292, 5, 46, 0, 0, 292, 293, 3, 16, 8, 0, 293, 294, 5, 47, 0, 0, 294, 296, 1, 0, 0, 0, 295, 291, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 295, 1, 0, 0, 0, 297, 298, 1, 0, 0, 0, 298, 302, 1, 0, 0, 0, 299, 300, 10, 17, 0, 0, 300, 302, 7, 0, 0, 0, 301, 233, 1, 0, 0, 0, 301, 236, 1, 0, 0, 0, 301, 239, 1, 0, 0, 0, 301, 242, 1, 0, 0, 0, 301, 245, 1, 0, 0, 0, 301, 248, 1, 0, 0, 0, 301, 251, 1, 0, 0, 0, 301, 254, 1, 0, 0, 0, 301, 257, 1, 0, 0, 0, 301, 260, 1, 0, 0, 0, 301, 263, 1, 0, 0, 0, 301, 269, 1, 0, 0, 0, 301, 272, 1, 0, 0, 0, 301, 290, 1, 0, 0, 0, 301, 299, 1, 0, 0, 0, 302, 305, 1, 0, 0, 0, 303, 301, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 17, 1, 0, 0, 0, 305, 303, 1, 0, 0, 0, 306, 328, 5, 10, 0, 0, 307, 308, 5, 44, 0, 0, 308, 309, 3, 16, 8, 0, 309, 310, 5, 45, 0, 0, 310, 328, 1, 0, 0, 0, 311, 328, 5, 56, 0, 0, 312, 313, 5, 56, 0, 0, 313, 322, 5, 44, 0, 0, 314, 319, 3, 16, 8, 0, 315, 316, 5, 51, 0, 0, 316, 318, 3, 16, 8, 0, 317, 315, 1, 0, 0, 0, 318, 321, 1, 0, 0, 0, 319, 317, 1, 0, 0, 0, 319, 320, 1, 0, 0, 0, 320, 323, 1, 0, 0, 0, 321, 319, 1, 0, 0, 0, 322, 314, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 324, 1, 0, 0, 0, 324, 328, 5, 45, 0, 0, 325, 328, 3, 20, 10, 0, 326, 328, 3, 22, 11, 0, 327, 306, 1, 0, 0, 0, 327, 307, 1, 0, 0, 0, 327, 311, 1, 0, 0, 0, 327, 312, 1, 0, 0, 0, 327, 325, 1, 0, 0, 0, 327, 326, 1, 0, 0, 0, 328, 19, 1, 0, 0, 0, 329, 342, 5, 52, 0, 0, 330, 331, 5, 53, 0, 0, 331, 336, 3, 16, 8, 0, 332, 333, 5, 55, 0, 0, 333, 335, 3, 16, 8, 0, 334, 332, 1, 0, 0, 0, 335, 338, 1, 0, 0, 0, 336, 337, 1, 0, 0, 0, 336, 334, 1, 0, 0, 0, 337, 339, 1, 0, 0, 0, 338, 336, 1, 0, 0, 0, 339, 340, 5, 54, 0, 0, 340, 342, 1, 0, 0, 0, 341, 329, 1, 0, 0, 0, 341, 330, 1, 0, 0, 0, 342, 21, 1, 0, 0, 0, 343, 361, 5, 8, 0, 0, 344, 361, 5, 9, 0, 0, 345, 361, 5, 57, 0, 0, 346, 361, 5, 58, 0, 0, 347, 361, 5, 7, 0, 0, 348, 357, 5, 48, 0, 0, 349, 354, 3, 22, 11, 0, 350, 351, 5, 51, 0, 0, 351, 353, 3, 22, 11, 0, 352, 350, 1, 0, 0, 0, 353, 356, 1, 0, 0, 0, 354, 352, 1, 0, 0, 0, 354, 355, 1, 0, 0, 0, 355, 358, 1, 0, 0, 0, 356, 354, 1, 0, 0, 0, 357, 349, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 359, 1, 0, 0, 0, 359, 361, 5, 49, 0, 0, 360, 343, 1, 0, 0, 0, 360, 344, 1, 0, 0, 0, 360, 345, 1, 0, 0, 0, 360, 346, 1, 0, 0, 0, 360, 347, 1, 0, 0, 0, 360, 348, 1, 0, 0, 0, 361, 23, 1, 0, 0, 0, 362, 363, 7, 6, 0, 0, 363, 25, 1, 0, 0, 0, 41, 29, 31, 40, 50, 61, 68, 71, 82, 84, 95, 103, 117, 134, 149, 152, 157, 165, 167, 171, 178, 184, 190, 194, 205, 210, 214, 231, 282, 285, 288, 297, 301, 303, 319, 322, 327, 336, 341, 354, 357, 360] \ No newline at end of file +[4, 1, 61, 364, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 1, 0, 1, 0, 1, 0, 4, 0, 30, 8, 0, 11, 0, 12, 0, 31, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 5, 1, 39, 8, 1, 10, 1, 12, 1, 42, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 49, 8, 1, 10, 1, 12, 1, 52, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 60, 8, 1, 10, 1, 12, 1, 63, 9, 1, 1, 1, 1, 1, 5, 1, 67, 8, 1, 10, 1, 12, 1, 70, 9, 1, 3, 1, 72, 8, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 83, 8, 2, 10, 2, 12, 2, 86, 9, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 5, 3, 94, 8, 3, 10, 3, 12, 3, 97, 9, 3, 1, 3, 1, 3, 1, 3, 5, 3, 102, 8, 3, 10, 3, 12, 3, 105, 9, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 5, 5, 116, 8, 5, 10, 5, 12, 5, 119, 9, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 135, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 150, 8, 6, 1, 6, 3, 6, 153, 8, 6, 1, 6, 1, 6, 1, 6, 3, 6, 158, 8, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 166, 8, 6, 3, 6, 168, 8, 6, 1, 6, 1, 6, 3, 6, 172, 8, 6, 1, 7, 1, 7, 1, 7, 5, 7, 177, 8, 7, 10, 7, 12, 7, 180, 9, 7, 1, 7, 1, 7, 1, 7, 3, 7, 185, 8, 7, 1, 7, 1, 7, 1, 7, 1, 7, 3, 7, 191, 8, 7, 5, 7, 193, 8, 7, 10, 7, 12, 7, 196, 9, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 206, 8, 8, 1, 8, 4, 8, 209, 8, 8, 11, 8, 12, 8, 210, 1, 8, 3, 8, 214, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 231, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 5, 8, 280, 8, 8, 10, 8, 12, 8, 283, 9, 8, 3, 8, 285, 8, 8, 1, 8, 3, 8, 288, 8, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 4, 8, 295, 8, 8, 11, 8, 12, 8, 296, 1, 8, 1, 8, 5, 8, 301, 8, 8, 10, 8, 12, 8, 304, 9, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 5, 9, 317, 8, 9, 10, 9, 12, 9, 320, 9, 9, 3, 9, 322, 8, 9, 1, 9, 1, 9, 1, 9, 3, 9, 327, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 5, 10, 334, 8, 10, 10, 10, 12, 10, 337, 9, 10, 1, 10, 1, 10, 3, 10, 341, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 5, 11, 352, 8, 11, 10, 11, 12, 11, 355, 9, 11, 3, 11, 357, 8, 11, 1, 11, 3, 11, 360, 8, 11, 1, 12, 1, 12, 1, 12, 1, 335, 1, 16, 13, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 0, 7, 1, 0, 39, 40, 1, 0, 20, 22, 1, 0, 18, 19, 1, 0, 32, 33, 1, 0, 23, 26, 1, 0, 27, 28, 2, 0, 1, 4, 56, 56, 429, 0, 29, 1, 0, 0, 0, 2, 35, 1, 0, 0, 0, 4, 76, 1, 0, 0, 0, 6, 90, 1, 0, 0, 0, 8, 108, 1, 0, 0, 0, 10, 113, 1, 0, 0, 0, 12, 171, 1, 0, 0, 0, 14, 173, 1, 0, 0, 0, 16, 230, 1, 0, 0, 0, 18, 326, 1, 0, 0, 0, 20, 340, 1, 0, 0, 0, 22, 359, 1, 0, 0, 0, 24, 361, 1, 0, 0, 0, 26, 30, 3, 4, 2, 0, 27, 30, 3, 14, 7, 0, 28, 30, 3, 2, 1, 0, 29, 26, 1, 0, 0, 0, 29, 27, 1, 0, 0, 0, 29, 28, 1, 0, 0, 0, 30, 31, 1, 0, 0, 0, 31, 29, 1, 0, 0, 0, 31, 32, 1, 0, 0, 0, 32, 33, 1, 0, 0, 0, 33, 34, 5, 0, 0, 1, 34, 1, 1, 0, 0, 0, 35, 40, 3, 24, 12, 0, 36, 37, 5, 46, 0, 0, 37, 39, 5, 47, 0, 0, 38, 36, 1, 0, 0, 0, 39, 42, 1, 0, 0, 0, 40, 38, 1, 0, 0, 0, 40, 41, 1, 0, 0, 0, 41, 43, 1, 0, 0, 0, 42, 40, 1, 0, 0, 0, 43, 44, 5, 56, 0, 0, 44, 71, 5, 44, 0, 0, 45, 50, 3, 24, 12, 0, 46, 47, 5, 46, 0, 0, 47, 49, 5, 47, 0, 0, 48, 46, 1, 0, 0, 0, 49, 52, 1, 0, 0, 0, 50, 48, 1, 0, 0, 0, 50, 51, 1, 0, 0, 0, 51, 53, 1, 0, 0, 0, 52, 50, 1, 0, 0, 0, 53, 54, 5, 56, 0, 0, 54, 68, 1, 0, 0, 0, 55, 56, 5, 51, 0, 0, 56, 61, 3, 24, 12, 0, 57, 58, 5, 46, 0, 0, 58, 60, 5, 47, 0, 0, 59, 57, 1, 0, 0, 0, 60, 63, 1, 0, 0, 0, 61, 59, 1, 0, 0, 0, 61, 62, 1, 0, 0, 0, 62, 64, 1, 0, 0, 0, 63, 61, 1, 0, 0, 0, 64, 65, 5, 56, 0, 0, 65, 67, 1, 0, 0, 0, 66, 55, 1, 0, 0, 0, 67, 70, 1, 0, 0, 0, 68, 66, 1, 0, 0, 0, 68, 69, 1, 0, 0, 0, 69, 72, 1, 0, 0, 0, 70, 68, 1, 0, 0, 0, 71, 45, 1, 0, 0, 0, 71, 72, 1, 0, 0, 0, 72, 73, 1, 0, 0, 0, 73, 74, 5, 45, 0, 0, 74, 75, 3, 10, 5, 0, 75, 3, 1, 0, 0, 0, 76, 77, 5, 6, 0, 0, 77, 78, 5, 56, 0, 0, 78, 84, 5, 48, 0, 0, 79, 83, 3, 6, 3, 0, 80, 83, 3, 8, 4, 0, 81, 83, 3, 2, 1, 0, 82, 79, 1, 0, 0, 0, 82, 80, 1, 0, 0, 0, 82, 81, 1, 0, 0, 0, 83, 86, 1, 0, 0, 0, 84, 82, 1, 0, 0, 0, 84, 85, 1, 0, 0, 0, 85, 87, 1, 0, 0, 0, 86, 84, 1, 0, 0, 0, 87, 88, 5, 49, 0, 0, 88, 89, 5, 50, 0, 0, 89, 5, 1, 0, 0, 0, 90, 95, 3, 24, 12, 0, 91, 92, 5, 46, 0, 0, 92, 94, 5, 47, 0, 0, 93, 91, 1, 0, 0, 0, 94, 97, 1, 0, 0, 0, 95, 93, 1, 0, 0, 0, 95, 96, 1, 0, 0, 0, 96, 98, 1, 0, 0, 0, 97, 95, 1, 0, 0, 0, 98, 103, 5, 56, 0, 0, 99, 100, 5, 51, 0, 0, 100, 102, 5, 56, 0, 0, 101, 99, 1, 0, 0, 0, 102, 105, 1, 0, 0, 0, 103, 101, 1, 0, 0, 0, 103, 104, 1, 0, 0, 0, 104, 106, 1, 0, 0, 0, 105, 103, 1, 0, 0, 0, 106, 107, 5, 50, 0, 0, 107, 7, 1, 0, 0, 0, 108, 109, 5, 56, 0, 0, 109, 110, 5, 44, 0, 0, 110, 111, 5, 45, 0, 0, 111, 112, 3, 10, 5, 0, 112, 9, 1, 0, 0, 0, 113, 117, 5, 48, 0, 0, 114, 116, 3, 12, 6, 0, 115, 114, 1, 0, 0, 0, 116, 119, 1, 0, 0, 0, 117, 115, 1, 0, 0, 0, 117, 118, 1, 0, 0, 0, 118, 120, 1, 0, 0, 0, 119, 117, 1, 0, 0, 0, 120, 121, 5, 49, 0, 0, 121, 11, 1, 0, 0, 0, 122, 172, 5, 50, 0, 0, 123, 172, 3, 14, 7, 0, 124, 125, 3, 16, 8, 0, 125, 126, 5, 50, 0, 0, 126, 172, 1, 0, 0, 0, 127, 128, 5, 11, 0, 0, 128, 129, 5, 44, 0, 0, 129, 130, 3, 16, 8, 0, 130, 131, 5, 45, 0, 0, 131, 134, 3, 12, 6, 0, 132, 133, 5, 12, 0, 0, 133, 135, 3, 12, 6, 0, 134, 132, 1, 0, 0, 0, 134, 135, 1, 0, 0, 0, 135, 172, 1, 0, 0, 0, 136, 137, 5, 14, 0, 0, 137, 138, 5, 44, 0, 0, 138, 139, 3, 16, 8, 0, 139, 140, 5, 45, 0, 0, 140, 141, 3, 12, 6, 0, 141, 172, 1, 0, 0, 0, 142, 143, 5, 13, 0, 0, 143, 149, 5, 44, 0, 0, 144, 150, 3, 14, 7, 0, 145, 146, 3, 16, 8, 0, 146, 147, 5, 50, 0, 0, 147, 150, 1, 0, 0, 0, 148, 150, 5, 50, 0, 0, 149, 144, 1, 0, 0, 0, 149, 145, 1, 0, 0, 0, 149, 148, 1, 0, 0, 0, 150, 152, 1, 0, 0, 0, 151, 153, 3, 16, 8, 0, 152, 151, 1, 0, 0, 0, 152, 153, 1, 0, 0, 0, 153, 154, 1, 0, 0, 0, 154, 157, 5, 50, 0, 0, 155, 158, 3, 14, 7, 0, 156, 158, 3, 16, 8, 0, 157, 155, 1, 0, 0, 0, 157, 156, 1, 0, 0, 0, 157, 158, 1, 0, 0, 0, 158, 159, 1, 0, 0, 0, 159, 160, 5, 45, 0, 0, 160, 172, 3, 12, 6, 0, 161, 168, 5, 15, 0, 0, 162, 168, 5, 16, 0, 0, 163, 165, 5, 17, 0, 0, 164, 166, 3, 16, 8, 0, 165, 164, 1, 0, 0, 0, 165, 166, 1, 0, 0, 0, 166, 168, 1, 0, 0, 0, 167, 161, 1, 0, 0, 0, 167, 162, 1, 0, 0, 0, 167, 163, 1, 0, 0, 0, 168, 169, 1, 0, 0, 0, 169, 172, 5, 50, 0, 0, 170, 172, 3, 10, 5, 0, 171, 122, 1, 0, 0, 0, 171, 123, 1, 0, 0, 0, 171, 124, 1, 0, 0, 0, 171, 127, 1, 0, 0, 0, 171, 136, 1, 0, 0, 0, 171, 142, 1, 0, 0, 0, 171, 167, 1, 0, 0, 0, 171, 170, 1, 0, 0, 0, 172, 13, 1, 0, 0, 0, 173, 178, 3, 24, 12, 0, 174, 175, 5, 46, 0, 0, 175, 177, 5, 47, 0, 0, 176, 174, 1, 0, 0, 0, 177, 180, 1, 0, 0, 0, 178, 176, 1, 0, 0, 0, 178, 179, 1, 0, 0, 0, 179, 181, 1, 0, 0, 0, 180, 178, 1, 0, 0, 0, 181, 184, 5, 56, 0, 0, 182, 183, 5, 38, 0, 0, 183, 185, 3, 16, 8, 0, 184, 182, 1, 0, 0, 0, 184, 185, 1, 0, 0, 0, 185, 194, 1, 0, 0, 0, 186, 187, 5, 51, 0, 0, 187, 190, 5, 56, 0, 0, 188, 189, 5, 38, 0, 0, 189, 191, 3, 16, 8, 0, 190, 188, 1, 0, 0, 0, 190, 191, 1, 0, 0, 0, 191, 193, 1, 0, 0, 0, 192, 186, 1, 0, 0, 0, 193, 196, 1, 0, 0, 0, 194, 192, 1, 0, 0, 0, 194, 195, 1, 0, 0, 0, 195, 197, 1, 0, 0, 0, 196, 194, 1, 0, 0, 0, 197, 198, 5, 50, 0, 0, 198, 15, 1, 0, 0, 0, 199, 200, 6, 8, -1, 0, 200, 231, 3, 18, 9, 0, 201, 202, 5, 5, 0, 0, 202, 208, 3, 24, 12, 0, 203, 205, 5, 46, 0, 0, 204, 206, 3, 16, 8, 0, 205, 204, 1, 0, 0, 0, 205, 206, 1, 0, 0, 0, 206, 207, 1, 0, 0, 0, 207, 209, 5, 47, 0, 0, 208, 203, 1, 0, 0, 0, 209, 210, 1, 0, 0, 0, 210, 208, 1, 0, 0, 0, 210, 211, 1, 0, 0, 0, 211, 213, 1, 0, 0, 0, 212, 214, 3, 22, 11, 0, 213, 212, 1, 0, 0, 0, 213, 214, 1, 0, 0, 0, 214, 231, 1, 0, 0, 0, 215, 216, 5, 5, 0, 0, 216, 217, 3, 24, 12, 0, 217, 218, 5, 44, 0, 0, 218, 219, 5, 45, 0, 0, 219, 231, 1, 0, 0, 0, 220, 221, 5, 5, 0, 0, 221, 231, 3, 24, 12, 0, 222, 223, 7, 0, 0, 0, 223, 231, 3, 16, 8, 16, 224, 225, 5, 19, 0, 0, 225, 231, 3, 16, 8, 15, 226, 227, 5, 31, 0, 0, 227, 231, 3, 16, 8, 14, 228, 229, 5, 37, 0, 0, 229, 231, 3, 16, 8, 13, 230, 199, 1, 0, 0, 0, 230, 201, 1, 0, 0, 0, 230, 215, 1, 0, 0, 0, 230, 220, 1, 0, 0, 0, 230, 222, 1, 0, 0, 0, 230, 224, 1, 0, 0, 0, 230, 226, 1, 0, 0, 0, 230, 228, 1, 0, 0, 0, 231, 302, 1, 0, 0, 0, 232, 233, 10, 12, 0, 0, 233, 234, 7, 1, 0, 0, 234, 301, 3, 16, 8, 13, 235, 236, 10, 11, 0, 0, 236, 237, 7, 2, 0, 0, 237, 301, 3, 16, 8, 12, 238, 239, 10, 10, 0, 0, 239, 240, 7, 3, 0, 0, 240, 301, 3, 16, 8, 11, 241, 242, 10, 9, 0, 0, 242, 243, 7, 4, 0, 0, 243, 301, 3, 16, 8, 10, 244, 245, 10, 8, 0, 0, 245, 246, 7, 5, 0, 0, 246, 301, 3, 16, 8, 9, 247, 248, 10, 7, 0, 0, 248, 249, 5, 34, 0, 0, 249, 301, 3, 16, 8, 8, 250, 251, 10, 6, 0, 0, 251, 252, 5, 36, 0, 0, 252, 301, 3, 16, 8, 7, 253, 254, 10, 5, 0, 0, 254, 255, 5, 35, 0, 0, 255, 301, 3, 16, 8, 6, 256, 257, 10, 4, 0, 0, 257, 258, 5, 29, 0, 0, 258, 301, 3, 16, 8, 5, 259, 260, 10, 3, 0, 0, 260, 261, 5, 30, 0, 0, 261, 301, 3, 16, 8, 4, 262, 263, 10, 2, 0, 0, 263, 264, 5, 42, 0, 0, 264, 265, 3, 16, 8, 0, 265, 266, 5, 43, 0, 0, 266, 267, 3, 16, 8, 2, 267, 301, 1, 0, 0, 0, 268, 269, 10, 1, 0, 0, 269, 270, 5, 38, 0, 0, 270, 301, 3, 16, 8, 1, 271, 272, 10, 19, 0, 0, 272, 287, 5, 41, 0, 0, 273, 288, 5, 56, 0, 0, 274, 275, 5, 56, 0, 0, 275, 284, 5, 44, 0, 0, 276, 281, 3, 16, 8, 0, 277, 278, 5, 51, 0, 0, 278, 280, 3, 16, 8, 0, 279, 277, 1, 0, 0, 0, 280, 283, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 285, 1, 0, 0, 0, 283, 281, 1, 0, 0, 0, 284, 276, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 288, 5, 45, 0, 0, 287, 273, 1, 0, 0, 0, 287, 274, 1, 0, 0, 0, 288, 301, 1, 0, 0, 0, 289, 294, 10, 18, 0, 0, 290, 291, 5, 46, 0, 0, 291, 292, 3, 16, 8, 0, 292, 293, 5, 47, 0, 0, 293, 295, 1, 0, 0, 0, 294, 290, 1, 0, 0, 0, 295, 296, 1, 0, 0, 0, 296, 294, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 301, 1, 0, 0, 0, 298, 299, 10, 17, 0, 0, 299, 301, 7, 0, 0, 0, 300, 232, 1, 0, 0, 0, 300, 235, 1, 0, 0, 0, 300, 238, 1, 0, 0, 0, 300, 241, 1, 0, 0, 0, 300, 244, 1, 0, 0, 0, 300, 247, 1, 0, 0, 0, 300, 250, 1, 0, 0, 0, 300, 253, 1, 0, 0, 0, 300, 256, 1, 0, 0, 0, 300, 259, 1, 0, 0, 0, 300, 262, 1, 0, 0, 0, 300, 268, 1, 0, 0, 0, 300, 271, 1, 0, 0, 0, 300, 289, 1, 0, 0, 0, 300, 298, 1, 0, 0, 0, 301, 304, 1, 0, 0, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 17, 1, 0, 0, 0, 304, 302, 1, 0, 0, 0, 305, 327, 5, 10, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 3, 16, 8, 0, 308, 309, 5, 45, 0, 0, 309, 327, 1, 0, 0, 0, 310, 327, 5, 56, 0, 0, 311, 312, 5, 56, 0, 0, 312, 321, 5, 44, 0, 0, 313, 318, 3, 16, 8, 0, 314, 315, 5, 51, 0, 0, 315, 317, 3, 16, 8, 0, 316, 314, 1, 0, 0, 0, 317, 320, 1, 0, 0, 0, 318, 316, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 322, 1, 0, 0, 0, 320, 318, 1, 0, 0, 0, 321, 313, 1, 0, 0, 0, 321, 322, 1, 0, 0, 0, 322, 323, 1, 0, 0, 0, 323, 327, 5, 45, 0, 0, 324, 327, 3, 20, 10, 0, 325, 327, 3, 22, 11, 0, 326, 305, 1, 0, 0, 0, 326, 306, 1, 0, 0, 0, 326, 310, 1, 0, 0, 0, 326, 311, 1, 0, 0, 0, 326, 324, 1, 0, 0, 0, 326, 325, 1, 0, 0, 0, 327, 19, 1, 0, 0, 0, 328, 341, 5, 52, 0, 0, 329, 330, 5, 53, 0, 0, 330, 335, 3, 16, 8, 0, 331, 332, 5, 55, 0, 0, 332, 334, 3, 16, 8, 0, 333, 331, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 54, 0, 0, 339, 341, 1, 0, 0, 0, 340, 328, 1, 0, 0, 0, 340, 329, 1, 0, 0, 0, 341, 21, 1, 0, 0, 0, 342, 360, 5, 8, 0, 0, 343, 360, 5, 9, 0, 0, 344, 360, 5, 57, 0, 0, 345, 360, 5, 58, 0, 0, 346, 360, 5, 7, 0, 0, 347, 356, 5, 48, 0, 0, 348, 353, 3, 22, 11, 0, 349, 350, 5, 51, 0, 0, 350, 352, 3, 22, 11, 0, 351, 349, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 357, 1, 0, 0, 0, 355, 353, 1, 0, 0, 0, 356, 348, 1, 0, 0, 0, 356, 357, 1, 0, 0, 0, 357, 358, 1, 0, 0, 0, 358, 360, 5, 49, 0, 0, 359, 342, 1, 0, 0, 0, 359, 343, 1, 0, 0, 0, 359, 344, 1, 0, 0, 0, 359, 345, 1, 0, 0, 0, 359, 346, 1, 0, 0, 0, 359, 347, 1, 0, 0, 0, 360, 23, 1, 0, 0, 0, 361, 362, 7, 6, 0, 0, 362, 25, 1, 0, 0, 0, 41, 29, 31, 40, 50, 61, 68, 71, 82, 84, 95, 103, 117, 134, 149, 152, 157, 165, 167, 171, 178, 184, 190, 194, 205, 210, 213, 230, 281, 284, 287, 296, 300, 302, 318, 321, 326, 335, 340, 353, 356, 359] \ No newline at end of file diff --git a/src/semantic/semantic.cpp b/src/semantic/semantic.cpp index 884f373..564aa7c 100644 --- a/src/semantic/semantic.cpp +++ b/src/semantic/semantic.cpp @@ -19,12 +19,12 @@ class MXErrorListener : public antlr4::BaseErrorListener { } bool IsOk() { return no_problem; } }; -std::shared_ptr BuildAST(Visitor *visitor, antlr4::tree::ParseTree *tree) { +std::shared_ptr BuildAST(Visitor *visitor, antlr4::tree::ParseTree *tree) { return std::any_cast>(visitor->visit(tree)); } -std::shared_ptr CheckAndDecorate(std::shared_ptr src) { ; } +std::shared_ptr CheckAndDecorate(std::shared_ptr src) { return nullptr; } -void SemanticCheck(std::istream &fin, std::shared_ptr &ast_out) { +void SemanticCheck(std::istream &fin, std::shared_ptr &ast_out) { antlr4::ANTLRInputStream input(fin); MXLexer lexer(&input); antlr4::CommonTokenStream tokens(&lexer); @@ -36,6 +36,6 @@ void SemanticCheck(std::istream &fin, std::shared_ptr &ast_out) { antlr4::tree::ParseTree *tree = parser.mxprog(); if (!error_listener.IsOk()) throw SemanticError("Fatal error: syntax error", 1); Visitor visitor; - std::shared_ptr ast = BuildAST(&visitor, tree); + std::shared_ptr ast = BuildAST(&visitor, tree); ast_out = CheckAndDecorate(ast); } \ No newline at end of file diff --git a/src/semantic/visitor.cpp b/src/semantic/visitor.cpp index 40c24f4..47fb996 100644 --- a/src/semantic/visitor.cpp +++ b/src/semantic/visitor.cpp @@ -4,6 +4,7 @@ #include "MXParser.h" #include "MXParserVisitor.h" #include "ast/ast.h" +#include "tools.h" std::any Visitor::visitMxprog(MXParser::MxprogContext *context) { auto program = std::make_shared(); @@ -19,7 +20,8 @@ std::any Visitor::visitMxprog(MXParser::MxprogContext *context) { auto classNode = std::any_cast>(visit(classDefContext)); program->classes.push_back(classNode); } else if (auto defineStmtContext = dynamic_cast(def)) { - auto defineNode = std::any_cast>(visit(defineStmtContext)); + auto defineNode = std::dynamic_pointer_cast( + std::any_cast>(visit(defineStmtContext))); program->global_variables.push_back(defineNode); } else if (auto funcDefContext = dynamic_cast(def)) { auto funcNode = std::any_cast>(visit(funcDefContext)); @@ -115,7 +117,8 @@ std::any Visitor::visitFunction_def(MXParser::Function_defContext *context) { func->params.push_back(std::make_pair(cur_para_name, cur_para_type)); cur++; } - func->func_body = std::any_cast>(visit(context->suite())); + func->func_body = std::dynamic_pointer_cast( + std::any_cast>(visit(context->suite()))); nodetype_stk.pop_back(); return func; } @@ -140,6 +143,12 @@ std::any Visitor::visitClass_def(MXParser::Class_defContext *context) { auto func_node = std::any_cast>(visit(func)); class_def->member_functions.push_back(func_node); } + std::vector vars = context->class_var_def(); + for (auto var : vars) { + auto var_node = std::dynamic_pointer_cast( + std::any_cast>(visit(var))); + class_def->member_variables.push_back(var_node); + } nodetype_stk.pop_back(); return class_def; @@ -184,7 +193,7 @@ std::any Visitor::visitClass_var_def(MXParser::Class_var_defContext *context) { } nodetype_stk.pop_back(); - return member_var_def; + return std::static_pointer_cast(member_var_def); } std::any Visitor::visitClass_constructor(MXParser::Class_constructorContext *context) { auto construct_func = std::make_shared(); @@ -196,122 +205,648 @@ std::any Visitor::visitClass_constructor(MXParser::Class_constructorContext *con construct_func->end_char_pos = context->getStop()->getCharPositionInLine(); nodetype_stk.push_back(ASTNodeType::Constructor); - construct_func->func_body = std::any_cast>(visit(context->suite())); + construct_func->func_body = std::dynamic_pointer_cast( + std::any_cast>(visit(context->suite()))); nodetype_stk.pop_back(); return construct_func; } -std::any Visitor::visitSuite(MXParser::SuiteContext *context) { throw std::runtime_error("Not implemented"); } +std::any Visitor::visitSuite(MXParser::SuiteContext *context) { + auto suite_node = std::make_shared(); + suite_node->type = ASTNodeType::SuiteStatement; + suite_node->start_line = context->getStart()->getLine(); + suite_node->start_char_pos = context->getStart()->getCharPositionInLine(); + suite_node->end_line = context->getStop()->getLine(); + suite_node->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::SuiteStatement); + + std::vector stmts = context->statement(); + for (auto stmt : stmts) { + auto stmt_node = std::any_cast>(visit(stmt)); + suite_node->statements.push_back(stmt_node); + } + + nodetype_stk.pop_back(); + return std::static_pointer_cast(suite_node); +} std::any Visitor::visitEmpty_statement(MXParser::Empty_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto stmt = std::make_shared(); + stmt->type = ASTNodeType::EmptyStatement; + stmt->start_line = context->getStart()->getLine(); + stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + stmt->end_line = context->getStop()->getLine(); + stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + return std::static_pointer_cast(stmt); } std::any Visitor::visitDefinition_statement(MXParser::Definition_statementContext *context) { - throw std::runtime_error("Not implemented"); + return visit(context->define_statement()); } std::any Visitor::visitExpr_statement(MXParser::Expr_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto expr_stmt = std::make_shared(); + expr_stmt->type = ASTNodeType::ExprStatement; + expr_stmt->start_line = context->getStart()->getLine(); + expr_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + expr_stmt->end_line = context->getStop()->getLine(); + expr_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::ExprStatement); + expr_stmt->expr = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(expr_stmt); } std::any Visitor::visitIf_statement(MXParser::If_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto if_stmt = std::make_shared(); + if_stmt->type = ASTNodeType::IfStatement; + if_stmt->start_line = context->getStart()->getLine(); + if_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + if_stmt->end_line = context->getStop()->getLine(); + if_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::IfStatement); + if_stmt->condition = std::any_cast>(visit(context->expr())); + std::vector sub_stmts = context->statement(); + if_stmt->if_clause = std::any_cast>(visit(sub_stmts[0])); + if (sub_stmts.size() > 1) { + if_stmt->has_else_clause = true; + if_stmt->else_clause = std::any_cast>(visit(sub_stmts[1])); + } else { + if_stmt->has_else_clause = false; + if_stmt->else_clause = nullptr; + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(if_stmt); } std::any Visitor::visitWhile_statement(MXParser::While_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto while_stmt = std::make_shared(); + while_stmt->type = ASTNodeType::WhileStatement; + while_stmt->start_line = context->getStart()->getLine(); + while_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + while_stmt->end_line = context->getStop()->getLine(); + while_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::WhileStatement); + while_stmt->condition = std::any_cast>(visit(context->expr())); + while_stmt->loop_body = std::any_cast>(visit(context->statement())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(while_stmt); } std::any Visitor::visitFor_statement(MXParser::For_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto for_stmt = std::make_shared(); + for_stmt->type = ASTNodeType::ForStatement; + for_stmt->start_line = context->getStart()->getLine(); + for_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + for_stmt->end_line = context->getStop()->getLine(); + for_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::ForStatement); + size_t cur = 2; + if (dynamic_cast(context->children[cur]) != nullptr && + dynamic_cast(context->children[cur])->getSymbol()->getType() == + MXParser::SEMICOLON) { + for_stmt->initial = nullptr; + cur += 1; + } else if (dynamic_cast(context->children[cur]) != nullptr) { + for_stmt->initial = std::dynamic_pointer_cast( + std::any_cast>(visit(context->children[cur]))); + cur += 1; + } else if (dynamic_cast(context->children[cur]) != nullptr) { + auto expr = std::any_cast>(visit(context->children[cur])); + auto expr_stmt = std::make_shared(); + expr_stmt->type = ASTNodeType::ExprStatement; + expr_stmt->start_line = expr->start_line; + expr_stmt->start_char_pos = expr->start_char_pos; + expr_stmt->end_line = expr->end_line; + expr_stmt->end_char_pos = expr->end_char_pos; + expr_stmt->expr = expr; + for_stmt->initial = std::static_pointer_cast(expr_stmt); + cur += 2; + } else { + throw std::runtime_error("unknown subnode occurred in visitFor_statement"); + } + if (dynamic_cast(context->children[cur]) != nullptr && + dynamic_cast(context->children[cur])->getSymbol()->getType() == + MXParser::SEMICOLON) { + for_stmt->condition = nullptr; + cur += 1; + } else { + for_stmt->condition = std::any_cast>(visit(context->children[cur])); + cur += 2; + } + if (dynamic_cast(context->children[cur]) != nullptr) { + for_stmt->update = std::dynamic_pointer_cast( + std::any_cast>(visit(context->children[cur]))); + cur += 1; + } else if (dynamic_cast(context->children[cur]) != nullptr) { + auto expr = std::any_cast>(visit(context->children[cur])); + auto expr_stmt = std::make_shared(); + expr_stmt->type = ASTNodeType::ExprStatement; + expr_stmt->start_line = expr->start_line; + expr_stmt->start_char_pos = expr->start_char_pos; + expr_stmt->end_line = expr->end_line; + expr_stmt->end_char_pos = expr->end_char_pos; + expr_stmt->expr = expr; + for_stmt->update = std::static_pointer_cast(expr_stmt); + cur += 2; + } else { + throw std::runtime_error("unknown subnode occurred in visitFor_statement"); + } + for_stmt->loop_body = std::any_cast>(visit(context->children[cur])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(for_stmt); } std::any Visitor::visitJmp_statement(MXParser::Jmp_statementContext *context) { - throw std::runtime_error("Not implemented"); -} -std::any Visitor::visitSuite_statement(MXParser::Suite_statementContext *context) { - throw std::runtime_error("Not implemented"); + auto jmp_stmt = std::make_shared(); + jmp_stmt->type = ASTNodeType::JmpStatement; + jmp_stmt->start_line = context->getStart()->getLine(); + jmp_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + jmp_stmt->end_line = context->getStop()->getLine(); + jmp_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::JmpStatement); + if (context->RETURN() != nullptr) { + jmp_stmt->jmp_type = 0; + if (context->expr() != nullptr) { + jmp_stmt->return_value = std::any_cast>(visit(context->expr())); + } else { + jmp_stmt->return_value = nullptr; + } + } else if (context->BREAK() != nullptr) { + jmp_stmt->jmp_type = 1; + jmp_stmt->return_value = nullptr; + } else if (context->CONTINUE() != nullptr) { + jmp_stmt->jmp_type = 2; + jmp_stmt->return_value = nullptr; + } else { + throw std::runtime_error("unknown jmp statement type"); + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(jmp_stmt); } +std::any Visitor::visitSuite_statement(MXParser::Suite_statementContext *context) { return visit(context->suite()); } std::any Visitor::visitDefine_statement(MXParser::Define_statementContext *context) { - throw std::runtime_error("Not implemented"); + // define_statement : type (LBRACKET RBRACKET)* ID (ASSIGN expr)? (COMMA ID (ASSIGN expr)?)* SEMICOLON; + auto def_stmt = std::make_shared(); + def_stmt->type = ASTNodeType::DefinitionStatement; + def_stmt->start_line = context->getStart()->getLine(); + def_stmt->start_char_pos = context->getStart()->getCharPositionInLine(); + def_stmt->end_line = context->getStop()->getLine(); + def_stmt->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::DefinitionStatement); + std::string define_type_base; + if (auto type_context = dynamic_cast(context->children[0])) { + define_type_base = type_context->getText(); + } else + throw std::runtime_error("unknown subnode occurred in visitDefine_statement"); + size_t define_dimensions = 0; + for (size_t i = 1; i < context->children.size(); i++) { + if (dynamic_cast(context->children[i]) != nullptr && + dynamic_cast(context->children[i])->getSymbol()->getType() == MXParser::ID) { + break; + } + define_dimensions++; + } + define_dimensions >>= 1; + if (define_dimensions == 0) { + def_stmt->var_type = define_type_base; + std::cerr << std::string(nodetype_stk.size() * 2, ' ') << "recorded member variable type is [none-array]" + << define_type_base << std::endl; + } else { + def_stmt->var_type = ArrayType{true, define_type_base, static_cast(define_dimensions)}; + std::cerr << std::string(nodetype_stk.size() * 2, ' ') << "recorded member variable type is [array]" + << define_type_base << " with dimensions=" << define_dimensions << std::endl; + } + for (size_t i = 1 + 2 * define_dimensions; i < context->children.size();) { + if (dynamic_cast(context->children[i]) != nullptr && + dynamic_cast(context->children[i])->getSymbol()->getType() == + MXParser::SEMICOLON) { + break; + } + if (i != 1 + 2 * define_dimensions) i++; + if (dynamic_cast(context->children[i]) != nullptr && + dynamic_cast(context->children[i])->getSymbol()->getType() == MXParser::ID) { + def_stmt->vars.push_back(std::make_pair(context->children[i]->getText(), nullptr)); + } else + throw std::runtime_error("unknown subnode occurred in visitDefine_statement"); + i++; + if (dynamic_cast(context->children[i]) != nullptr && + dynamic_cast(context->children[i])->getSymbol()->getType() == MXParser::ASSIGN) { + i++; + def_stmt->vars.back().second = std::any_cast>(visit(context->children[i])); + i++; + } + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(def_stmt); } std::any Visitor::visitGgll_expression(MXParser::Ggll_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto ggll_expr = std::make_shared(); + ggll_expr->type = ASTNodeType::GGLLExpr; + ggll_expr->start_line = context->getStart()->getLine(); + ggll_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + ggll_expr->end_line = context->getStop()->getLine(); + ggll_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::GGLLExpr); + ggll_expr->op = context->children[1]->getText(); + ggll_expr->left = std::any_cast>(visit(context->children[0])); + ggll_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(ggll_expr); } std::any Visitor::visitBxor_expression(MXParser::Bxor_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto bxor_expr = std::make_shared(); + bxor_expr->type = ASTNodeType::BXorExpr; + bxor_expr->start_line = context->getStart()->getLine(); + bxor_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + bxor_expr->end_line = context->getStop()->getLine(); + bxor_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::BXorExpr); + bxor_expr->op = context->children[1]->getText(); + bxor_expr->left = std::any_cast>(visit(context->children[0])); + bxor_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(bxor_expr); } std::any Visitor::visitSuffix_expression(MXParser::Suffix_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto suffix_expr = std::make_shared(); + suffix_expr->type = ASTNodeType::SuffixExpr; + suffix_expr->start_line = context->getStart()->getLine(); + suffix_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + suffix_expr->end_line = context->getStop()->getLine(); + suffix_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::SuffixExpr); + suffix_expr->op = context->children[1]->getText(); + suffix_expr->base = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(suffix_expr); } std::any Visitor::visitLand_expression(MXParser::Land_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto land_expr = std::make_shared(); + land_expr->type = ASTNodeType::LAndExpr; + land_expr->start_line = context->getStart()->getLine(); + land_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + land_expr->end_line = context->getStop()->getLine(); + land_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::LAndExpr); + land_expr->op = context->children[1]->getText(); + land_expr->left = std::any_cast>(visit(context->children[0])); + land_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(land_expr); } std::any Visitor::visitPm_expression(MXParser::Pm_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto pm_expr = std::make_shared(); + pm_expr->type = ASTNodeType::PMExpr; + pm_expr->start_line = context->getStart()->getLine(); + pm_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + pm_expr->end_line = context->getStop()->getLine(); + pm_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::PMExpr); + pm_expr->op = context->children[1]->getText(); + pm_expr->left = std::any_cast>(visit(context->children[0])); + pm_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(pm_expr); } std::any Visitor::visitIndex_expression(MXParser::Index_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto idx_expr = std::make_shared(); + idx_expr->type = ASTNodeType::IndexExpr; + idx_expr->start_line = context->getStart()->getLine(); + idx_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + idx_expr->end_line = context->getStop()->getLine(); + idx_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::IndexExpr); + auto sub_exprs = context->expr(); + idx_expr->base = std::any_cast>(visit(sub_exprs[0])); + for (size_t i = 1; i < sub_exprs.size(); i++) { + idx_expr->indices.push_back(std::any_cast>(visit(sub_exprs[i]))); + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(idx_expr); } std::any Visitor::visitOpposite_expression(MXParser::Opposite_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto oppsite_expr = std::make_shared(); + oppsite_expr->type = ASTNodeType::OppositeExpr; + oppsite_expr->start_line = context->getStart()->getLine(); + oppsite_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + oppsite_expr->end_line = context->getStop()->getLine(); + oppsite_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::OppositeExpr); + oppsite_expr->base = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(oppsite_expr); } std::any Visitor::visitNew_array_expression(MXParser::New_array_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto new_array = std::make_shared(); + new_array->type = ASTNodeType::NewArrayExpr; + new_array->start_line = context->getStart()->getLine(); + new_array->start_char_pos = context->getStart()->getCharPositionInLine(); + new_array->end_line = context->getStop()->getLine(); + new_array->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::NewArrayExpr); + + size_t total_dimensions = context->LBRACKET().size(); + std::string base_type = context->type()->getText(); + new_array->expr_type_info = ArrayType{true, base_type, total_dimensions}; + size_t total_dim_count = 0; + new_array->dim_size.resize(total_dimensions); + for (size_t i = 3; i < context->children.size() && total_dim_count < total_dimensions; i++) { + if (dynamic_cast(context->children[i]) != nullptr && + dynamic_cast(context->children[i])->getSymbol()->getType() == + MXParser::RBRACKET) { + } else if (dynamic_cast(context->children[i]) != nullptr) { + new_array->dim_size[total_dim_count] = std::any_cast>(visit(context->children[i])); + } + total_dim_count++; + } + if (context->constant() != nullptr) { + new_array->has_initial_value = true; + new_array->initial_value = std::dynamic_pointer_cast( + std::any_cast>(visit(context->constant()))); + } + + nodetype_stk.pop_back(); + return std::static_pointer_cast(new_array); } std::any Visitor::visitBasic_expression(MXParser::Basic_expressionContext *context) { - throw std::runtime_error("Not implemented"); + return visit(context->basic_expr()); } std::any Visitor::visitAccess_expression(MXParser::Access_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto access_expr = std::make_shared(); + access_expr->start_line = context->getStart()->getLine(); + access_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + access_expr->end_line = context->getStop()->getLine(); + access_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + if (context->LPAREN() == nullptr) { + access_expr->type = ASTNodeType::MemberVariableAccessExpr; + access_expr->is_function = false; + } else { + access_expr->type = ASTNodeType::MemberFunctionAccessExpr; + access_expr->is_function = true; + } + nodetype_stk.push_back(access_expr->type); + auto sub_exprs = context->expr(); + access_expr->base = std::any_cast>(visit(sub_exprs[0])); + access_expr->member = context->ID()->getText(); + for (size_t i = 1; i < sub_exprs.size(); i++) { + access_expr->arguments.push_back(std::any_cast>(visit(sub_exprs[i]))); + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(access_expr); } std::any Visitor::visitBand_expression(MXParser::Band_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto band_expr = std::make_shared(); + band_expr->type = ASTNodeType::BAndExpr; + band_expr->start_line = context->getStart()->getLine(); + band_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + band_expr->end_line = context->getStop()->getLine(); + band_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::BAndExpr); + band_expr->op = context->children[1]->getText(); + band_expr->left = std::any_cast>(visit(context->children[0])); + band_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(band_expr); } std::any Visitor::visitNew_construct_expression(MXParser::New_construct_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto new_construct_expr = std::make_shared(); + new_construct_expr->type = ASTNodeType::NewConstructExpr; + new_construct_expr->start_line = context->getStart()->getLine(); + new_construct_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + new_construct_expr->end_line = context->getStop()->getLine(); + new_construct_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::NewConstructExpr); + new_construct_expr->expr_type_info = context->type()->getText(); + nodetype_stk.pop_back(); + return std::static_pointer_cast(new_construct_expr); } std::any Visitor::visitTernary_expression(MXParser::Ternary_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto ternary_expr = std::make_shared(); + ternary_expr->type = ASTNodeType::TernaryExpr; + ternary_expr->start_line = context->getStart()->getLine(); + ternary_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + ternary_expr->end_line = context->getStop()->getLine(); + ternary_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::TernaryExpr); + auto expr_subnodes = context->expr(); + ternary_expr->condition = std::any_cast>(visit(expr_subnodes[0])); + ternary_expr->src1 = std::any_cast>(visit(expr_subnodes[1])); + ternary_expr->src2 = std::any_cast>(visit(expr_subnodes[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(ternary_expr); } std::any Visitor::visitBnot_expression(MXParser::Bnot_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto bnot_expr = std::make_shared(); + bnot_expr->type = ASTNodeType::BNotExpr; + bnot_expr->start_line = context->getStart()->getLine(); + bnot_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + bnot_expr->end_line = context->getStop()->getLine(); + bnot_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::BNotExpr); + bnot_expr->base = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(bnot_expr); } std::any Visitor::visitLnot_expression(MXParser::Lnot_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto lnot_expr = std::make_shared(); + lnot_expr->type = ASTNodeType::LNotExpr; + lnot_expr->start_line = context->getStart()->getLine(); + lnot_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + lnot_expr->end_line = context->getStop()->getLine(); + lnot_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::LNotExpr); + lnot_expr->base = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(lnot_expr); } std::any Visitor::visitPrefix_expression(MXParser::Prefix_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto prefix_expr = std::make_shared(); + prefix_expr->type = ASTNodeType::PrefixExpr; + prefix_expr->start_line = context->getStart()->getLine(); + prefix_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + prefix_expr->end_line = context->getStop()->getLine(); + prefix_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::PrefixExpr); + prefix_expr->op = context->children[0]->getText(); + prefix_expr->base = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(prefix_expr); } std::any Visitor::visitRl_expression(MXParser::Rl_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto rl_expr = std::make_shared(); + rl_expr->type = ASTNodeType::RLExpr; + rl_expr->start_line = context->getStart()->getLine(); + rl_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + rl_expr->end_line = context->getStop()->getLine(); + rl_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::RLExpr); + rl_expr->op = context->children[1]->getText(); + rl_expr->left = std::any_cast>(visit(context->children[0])); + rl_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(rl_expr); } std::any Visitor::visitAssign_expression(MXParser::Assign_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto assign_expr = std::make_shared(); + assign_expr->type = ASTNodeType::AssignExpr; + assign_expr->start_line = context->getStart()->getLine(); + assign_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + assign_expr->end_line = context->getStop()->getLine(); + assign_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::AssignExpr); + assign_expr->dest = std::any_cast>(visit(context->expr(0))); + assign_expr->src = std::any_cast>(visit(context->expr(1))); + nodetype_stk.pop_back(); + return std::static_pointer_cast(assign_expr); } std::any Visitor::visitMdm_expression(MXParser::Mdm_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto mdm_expr = std::make_shared(); + mdm_expr->type = ASTNodeType::MDMExpr; + mdm_expr->start_line = context->getStart()->getLine(); + mdm_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + mdm_expr->end_line = context->getStop()->getLine(); + mdm_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::MDMExpr); + mdm_expr->op = context->children[1]->getText(); + mdm_expr->left = std::any_cast>(visit(context->children[0])); + mdm_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(mdm_expr); } std::any Visitor::visitNew_expression(MXParser::New_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto new_expr = std::make_shared(); + new_expr->type = ASTNodeType::NewExpr; + new_expr->start_line = context->getStart()->getLine(); + new_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + new_expr->end_line = context->getStop()->getLine(); + new_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::NewExpr); + new_expr->expr_type_info = context->type()->getText(); + nodetype_stk.pop_back(); + return std::static_pointer_cast(new_expr); } std::any Visitor::visitNe_expression(MXParser::Ne_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto ne_expr = std::make_shared(); + ne_expr->type = ASTNodeType::NEExpr; + ne_expr->start_line = context->getStart()->getLine(); + ne_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + ne_expr->end_line = context->getStop()->getLine(); + ne_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::NEExpr); + ne_expr->op = context->children[1]->getText(); + ne_expr->left = std::any_cast>(visit(context->children[0])); + ne_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(ne_expr); } std::any Visitor::visitBor_expression(MXParser::Bor_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto bor_expr = std::make_shared(); + bor_expr->type = ASTNodeType::BOrExpr; + bor_expr->start_line = context->getStart()->getLine(); + bor_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + bor_expr->end_line = context->getStop()->getLine(); + bor_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::BOrExpr); + bor_expr->op = context->children[1]->getText(); + bor_expr->left = std::any_cast>(visit(context->children[0])); + bor_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(bor_expr); } std::any Visitor::visitLor_expression(MXParser::Lor_expressionContext *context) { - throw std::runtime_error("Not implemented"); + auto lor_expr = std::make_shared(); + lor_expr->type = ASTNodeType::LOrExpr; + lor_expr->start_line = context->getStart()->getLine(); + lor_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + lor_expr->end_line = context->getStop()->getLine(); + lor_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::LOrExpr); + lor_expr->op = context->children[1]->getText(); + lor_expr->left = std::any_cast>(visit(context->children[0])); + lor_expr->right = std::any_cast>(visit(context->children[2])); + nodetype_stk.pop_back(); + return std::static_pointer_cast(lor_expr); +} +std::any Visitor::visitThis_expr(MXParser::This_exprContext *context) { + auto this_expr = std::make_shared(); + this_expr->type = ASTNodeType::ThisExpr; + this_expr->start_line = context->getStart()->getLine(); + this_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + this_expr->end_line = context->getStop()->getLine(); + this_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::ThisExpr); + nodetype_stk.pop_back(); + return std::static_pointer_cast(this_expr); +} +std::any Visitor::visitParen_expr(MXParser::Paren_exprContext *context) { + auto paren_expr = std::make_shared(); + paren_expr->type = ASTNodeType::ParenExpr; + paren_expr->start_line = context->getStart()->getLine(); + paren_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + paren_expr->end_line = context->getStop()->getLine(); + paren_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::ParenExpr); + paren_expr->expr = std::any_cast>(visit(context->expr())); + nodetype_stk.pop_back(); + return std::static_pointer_cast(paren_expr); +} +std::any Visitor::visitId_expr(MXParser::Id_exprContext *context) { + auto id_expr = std::make_shared(); + id_expr->type = ASTNodeType::IDExpr; + id_expr->start_line = context->getStart()->getLine(); + id_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + id_expr->end_line = context->getStop()->getLine(); + id_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::IDExpr); + id_expr->id = IdentifierType{context->ID()->getText()}; + nodetype_stk.pop_back(); + return std::static_pointer_cast(id_expr); } -std::any Visitor::visitThis_expr(MXParser::This_exprContext *context) { throw std::runtime_error("Not implemented"); } -std::any Visitor::visitParen_expr(MXParser::Paren_exprContext *context) { throw std::runtime_error("Not implemented"); } -std::any Visitor::visitId_expr(MXParser::Id_exprContext *context) { throw std::runtime_error("Not implemented"); } std::any Visitor::visitFunction_call_expr(MXParser::Function_call_exprContext *context) { - throw std::runtime_error("Not implemented"); + auto func_call_expr = std::make_shared(); + func_call_expr->type = ASTNodeType::FunctionCallExpr; + func_call_expr->start_line = context->getStart()->getLine(); + func_call_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + func_call_expr->end_line = context->getStop()->getLine(); + func_call_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::FunctionCallExpr); + func_call_expr->func_name = IdentifierType{context->ID()->getText()}; + auto expr_subnodes = context->expr(); + for (auto expr_subnode : expr_subnodes) { + func_call_expr->arguments.push_back(std::any_cast>(visit(expr_subnode))); + } + nodetype_stk.pop_back(); + return std::static_pointer_cast(func_call_expr); } std::any Visitor::visitFormatted_string_expr(MXParser::Formatted_string_exprContext *context) { - throw std::runtime_error("Not implemented"); -} -std::any Visitor::visitConstant_expr(MXParser::Constant_exprContext *context) { - throw std::runtime_error("Not implemented"); + return visit(context->formatted_string()); } +std::any Visitor::visitConstant_expr(MXParser::Constant_exprContext *context) { return visit(context->constant()); } std::any Visitor::visitFormatted_string(MXParser::Formatted_stringContext *context) { + auto fmt_expr = std::make_shared(); + fmt_expr->type = ASTNodeType::FormattedStringExpr; + fmt_expr->start_line = context->getStart()->getLine(); + fmt_expr->start_char_pos = context->getStart()->getCharPositionInLine(); + fmt_expr->end_line = context->getStop()->getLine(); + fmt_expr->end_char_pos = context->getStop()->getCharPositionInLine(); + nodetype_stk.push_back(ASTNodeType::FormattedStringExpr); + + if (context->FORMAT_STRING_WHOLE() != nullptr) { + fmt_expr->literals.push_back(context->FORMAT_STRING_WHOLE()->getText()); + } else { + auto expr_subnodes = context->expr(); + auto body_subnodes = context->FORMAT_STRING_BODY(); + fmt_expr->literals.push_back(context->FORMAT_STRING_HEAD()->getText()); + for (size_t i = 0; i < expr_subnodes.size(); i++) { + fmt_expr->literals.push_back(body_subnodes[i]->getText()); + } + fmt_expr->literals.push_back(context->FORMAT_STRING_TAIL()->getText()); + for (auto expr_subnode : expr_subnodes) { + fmt_expr->exprs.push_back(std::any_cast>(visit(expr_subnode))); + } + } + + nodetype_stk.pop_back(); + return std::static_pointer_cast(fmt_expr); +} +std::any Visitor::visitConstant(MXParser::ConstantContext *context) { + // TODO throw std::runtime_error("Not implemented"); } -std::any Visitor::visitConstant(MXParser::ConstantContext *context) { throw std::runtime_error("Not implemented"); } -std::any Visitor::visitType(MXParser::TypeContext *context) { throw std::runtime_error("Not implemented"); } +std::any Visitor::visitType(MXParser::TypeContext *context) { + throw std::runtime_error("Visitor::visitType should not be called"); +}