From b64d16088b29615d222d33450cf0315467400e59 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Patrick=20Sch=C3=B6nberger?= Date: Thu, 29 Jul 2021 09:58:14 +0200 Subject: [PATCH] toc now uses internal representation instead of ast --- Toc.g4 | 12 +- gen/Toc.interp | 5 +- gen/TocBaseListener.h | 9 +- gen/TocListener.h | 9 +- gen/TocParser.cpp | 883 ++++++++++++++++++++++-------------------- gen/TocParser.h | 69 ++-- src/main.cpp | 12 +- src/repr.h | 22 +- src/repr_get.h | 91 ++++- src/toc.h | 646 ++++++++++++++++++------------ todo.txt | 34 +- xmake.lua | 4 + 12 files changed, 1018 insertions(+), 778 deletions(-) diff --git a/Toc.g4 b/Toc.g4 index 95c9a0d..7b9ff97 100644 --- a/Toc.g4 +++ b/Toc.g4 @@ -15,9 +15,7 @@ type: typeName; funcDecl: 'func' func; func: funcName '(' parameter ')' (':' type) body; -parameter: (firstParameter (additionalParameter)*)?; -firstParameter: var; -additionalParameter: ',' var; +parameter: (var (',' var)*)?; body: '{' stmt* '}'; @@ -61,10 +59,18 @@ nonOpExpr: funcCall | parenExpr; nonSubscriptExpr: funcCall + | literal | identifier | memberAccess | parenExpr; +nonAccessExpr: funcCall + | literal + | identifier + | subscript + | parenExpr + | operatorExpr; + funcCall: funcName '(' (expr (',' expr)*)? ')'; operatorExpr: binaryOperator; diff --git a/gen/Toc.interp b/gen/Toc.interp index f384fe1..a115e25 100644 --- a/gen/Toc.interp +++ b/gen/Toc.interp @@ -55,8 +55,6 @@ type funcDecl func parameter -firstParameter -additionalParameter body structDecl structMember @@ -72,6 +70,7 @@ returnStmt expr nonOpExpr nonSubscriptExpr +nonAccessExpr funcCall operatorExpr binaryOperator @@ -87,4 +86,4 @@ structName atn: -[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 23, 257, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 3, 2, 6, 2, 78, 10, 2, 13, 2, 14, 2, 79, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 5, 3, 87, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 98, 10, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 7, 9, 116, 10, 9, 12, 9, 14, 9, 119, 11, 9, 5, 9, 121, 10, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 7, 12, 130, 10, 12, 12, 12, 14, 12, 133, 11, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 141, 10, 13, 12, 13, 14, 13, 144, 11, 13, 3, 13, 3, 13, 3, 14, 3, 14, 5, 14, 150, 10, 14, 3, 15, 3, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 5, 17, 162, 10, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 190, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 198, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 5, 26, 204, 10, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 27, 7, 27, 211, 10, 27, 12, 27, 14, 27, 214, 11, 27, 5, 27, 216, 10, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 29, 7, 29, 227, 10, 29, 12, 29, 14, 29, 230, 11, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 38, 3, 38, 3, 38, 2, 2, 39, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 2, 2, 2, 250, 2, 77, 3, 2, 2, 2, 4, 86, 3, 2, 2, 2, 6, 88, 3, 2, 2, 2, 8, 91, 3, 2, 2, 2, 10, 99, 3, 2, 2, 2, 12, 101, 3, 2, 2, 2, 14, 104, 3, 2, 2, 2, 16, 120, 3, 2, 2, 2, 18, 122, 3, 2, 2, 2, 20, 124, 3, 2, 2, 2, 22, 127, 3, 2, 2, 2, 24, 136, 3, 2, 2, 2, 26, 149, 3, 2, 2, 2, 28, 151, 3, 2, 2, 2, 30, 153, 3, 2, 2, 2, 32, 161, 3, 2, 2, 2, 34, 163, 3, 2, 2, 2, 36, 165, 3, 2, 2, 2, 38, 169, 3, 2, 2, 2, 40, 171, 3, 2, 2, 2, 42, 175, 3, 2, 2, 2, 44, 179, 3, 2, 2, 2, 46, 189, 3, 2, 2, 2, 48, 197, 3, 2, 2, 2, 50, 203, 3, 2, 2, 2, 52, 205, 3, 2, 2, 2, 54, 219, 3, 2, 2, 2, 56, 221, 3, 2, 2, 2, 58, 231, 3, 2, 2, 2, 60, 233, 3, 2, 2, 2, 62, 235, 3, 2, 2, 2, 64, 240, 3, 2, 2, 2, 66, 244, 3, 2, 2, 2, 68, 248, 3, 2, 2, 2, 70, 250, 3, 2, 2, 2, 72, 252, 3, 2, 2, 2, 74, 254, 3, 2, 2, 2, 76, 78, 5, 4, 3, 2, 77, 76, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 77, 3, 2, 2, 2, 79, 80, 3, 2, 2, 2, 80, 81, 3, 2, 2, 2, 81, 82, 7, 2, 2, 3, 82, 3, 3, 2, 2, 2, 83, 87, 5, 6, 4, 2, 84, 87, 5, 12, 7, 2, 85, 87, 5, 24, 13, 2, 86, 83, 3, 2, 2, 2, 86, 84, 3, 2, 2, 2, 86, 85, 3, 2, 2, 2, 87, 5, 3, 2, 2, 2, 88, 89, 7, 3, 2, 2, 89, 90, 5, 8, 5, 2, 90, 7, 3, 2, 2, 2, 91, 92, 5, 70, 36, 2, 92, 93, 7, 4, 2, 2, 93, 94, 5, 10, 6, 2, 94, 97, 3, 2, 2, 2, 95, 96, 7, 5, 2, 2, 96, 98, 5, 46, 24, 2, 97, 95, 3, 2, 2, 2, 97, 98, 3, 2, 2, 2, 98, 9, 3, 2, 2, 2, 99, 100, 5, 72, 37, 2, 100, 11, 3, 2, 2, 2, 101, 102, 7, 6, 2, 2, 102, 103, 5, 14, 8, 2, 103, 13, 3, 2, 2, 2, 104, 105, 5, 68, 35, 2, 105, 106, 7, 7, 2, 2, 106, 107, 5, 16, 9, 2, 107, 108, 7, 8, 2, 2, 108, 109, 7, 4, 2, 2, 109, 110, 5, 10, 6, 2, 110, 111, 3, 2, 2, 2, 111, 112, 5, 22, 12, 2, 112, 15, 3, 2, 2, 2, 113, 117, 5, 18, 10, 2, 114, 116, 5, 20, 11, 2, 115, 114, 3, 2, 2, 2, 116, 119, 3, 2, 2, 2, 117, 115, 3, 2, 2, 2, 117, 118, 3, 2, 2, 2, 118, 121, 3, 2, 2, 2, 119, 117, 3, 2, 2, 2, 120, 113, 3, 2, 2, 2, 120, 121, 3, 2, 2, 2, 121, 17, 3, 2, 2, 2, 122, 123, 5, 8, 5, 2, 123, 19, 3, 2, 2, 2, 124, 125, 7, 9, 2, 2, 125, 126, 5, 8, 5, 2, 126, 21, 3, 2, 2, 2, 127, 131, 7, 10, 2, 2, 128, 130, 5, 32, 17, 2, 129, 128, 3, 2, 2, 2, 130, 133, 3, 2, 2, 2, 131, 129, 3, 2, 2, 2, 131, 132, 3, 2, 2, 2, 132, 134, 3, 2, 2, 2, 133, 131, 3, 2, 2, 2, 134, 135, 7, 11, 2, 2, 135, 23, 3, 2, 2, 2, 136, 137, 7, 12, 2, 2, 137, 138, 5, 74, 38, 2, 138, 142, 7, 10, 2, 2, 139, 141, 5, 26, 14, 2, 140, 139, 3, 2, 2, 2, 141, 144, 3, 2, 2, 2, 142, 140, 3, 2, 2, 2, 142, 143, 3, 2, 2, 2, 143, 145, 3, 2, 2, 2, 144, 142, 3, 2, 2, 2, 145, 146, 7, 11, 2, 2, 146, 25, 3, 2, 2, 2, 147, 150, 5, 28, 15, 2, 148, 150, 5, 30, 16, 2, 149, 147, 3, 2, 2, 2, 149, 148, 3, 2, 2, 2, 150, 27, 3, 2, 2, 2, 151, 152, 5, 8, 5, 2, 152, 29, 3, 2, 2, 2, 153, 154, 5, 14, 8, 2, 154, 31, 3, 2, 2, 2, 155, 162, 5, 6, 4, 2, 156, 162, 5, 34, 18, 2, 157, 162, 5, 38, 20, 2, 158, 162, 5, 42, 22, 2, 159, 162, 5, 44, 23, 2, 160, 162, 5, 46, 24, 2, 161, 155, 3, 2, 2, 2, 161, 156, 3, 2, 2, 2, 161, 157, 3, 2, 2, 2, 161, 158, 3, 2, 2, 2, 161, 159, 3, 2, 2, 2, 161, 160, 3, 2, 2, 2, 162, 33, 3, 2, 2, 2, 163, 164, 5, 36, 19, 2, 164, 35, 3, 2, 2, 2, 165, 166, 7, 13, 2, 2, 166, 167, 5, 46, 24, 2, 167, 168, 5, 22, 12, 2, 168, 37, 3, 2, 2, 2, 169, 170, 5, 40, 21, 2, 170, 39, 3, 2, 2, 2, 171, 172, 7, 14, 2, 2, 172, 173, 5, 46, 24, 2, 173, 174, 5, 22, 12, 2, 174, 41, 3, 2, 2, 2, 175, 176, 5, 58, 30, 2, 176, 177, 7, 5, 2, 2, 177, 178, 5, 46, 24, 2, 178, 43, 3, 2, 2, 2, 179, 180, 7, 15, 2, 2, 180, 181, 5, 46, 24, 2, 181, 45, 3, 2, 2, 2, 182, 190, 5, 52, 27, 2, 183, 190, 5, 60, 31, 2, 184, 190, 5, 58, 30, 2, 185, 190, 5, 62, 32, 2, 186, 190, 5, 64, 33, 2, 187, 190, 5, 66, 34, 2, 188, 190, 5, 54, 28, 2, 189, 182, 3, 2, 2, 2, 189, 183, 3, 2, 2, 2, 189, 184, 3, 2, 2, 2, 189, 185, 3, 2, 2, 2, 189, 186, 3, 2, 2, 2, 189, 187, 3, 2, 2, 2, 189, 188, 3, 2, 2, 2, 190, 47, 3, 2, 2, 2, 191, 198, 5, 52, 27, 2, 192, 198, 5, 60, 31, 2, 193, 198, 5, 58, 30, 2, 194, 198, 5, 62, 32, 2, 195, 198, 5, 64, 33, 2, 196, 198, 5, 66, 34, 2, 197, 191, 3, 2, 2, 2, 197, 192, 3, 2, 2, 2, 197, 193, 3, 2, 2, 2, 197, 194, 3, 2, 2, 2, 197, 195, 3, 2, 2, 2, 197, 196, 3, 2, 2, 2, 198, 49, 3, 2, 2, 2, 199, 204, 5, 52, 27, 2, 200, 204, 5, 58, 30, 2, 201, 204, 5, 64, 33, 2, 202, 204, 5, 66, 34, 2, 203, 199, 3, 2, 2, 2, 203, 200, 3, 2, 2, 2, 203, 201, 3, 2, 2, 2, 203, 202, 3, 2, 2, 2, 204, 51, 3, 2, 2, 2, 205, 206, 5, 68, 35, 2, 206, 215, 7, 7, 2, 2, 207, 212, 5, 46, 24, 2, 208, 209, 7, 9, 2, 2, 209, 211, 5, 46, 24, 2, 210, 208, 3, 2, 2, 2, 211, 214, 3, 2, 2, 2, 212, 210, 3, 2, 2, 2, 212, 213, 3, 2, 2, 2, 213, 216, 3, 2, 2, 2, 214, 212, 3, 2, 2, 2, 215, 207, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 217, 3, 2, 2, 2, 217, 218, 7, 8, 2, 2, 218, 53, 3, 2, 2, 2, 219, 220, 5, 56, 29, 2, 220, 55, 3, 2, 2, 2, 221, 222, 5, 48, 25, 2, 222, 223, 7, 19, 2, 2, 223, 228, 5, 48, 25, 2, 224, 225, 7, 19, 2, 2, 225, 227, 5, 48, 25, 2, 226, 224, 3, 2, 2, 2, 227, 230, 3, 2, 2, 2, 228, 226, 3, 2, 2, 2, 228, 229, 3, 2, 2, 2, 229, 57, 3, 2, 2, 2, 230, 228, 3, 2, 2, 2, 231, 232, 5, 70, 36, 2, 232, 59, 3, 2, 2, 2, 233, 234, 7, 20, 2, 2, 234, 61, 3, 2, 2, 2, 235, 236, 5, 50, 26, 2, 236, 237, 7, 16, 2, 2, 237, 238, 5, 46, 24, 2, 238, 239, 7, 17, 2, 2, 239, 63, 3, 2, 2, 2, 240, 241, 5, 58, 30, 2, 241, 242, 7, 18, 2, 2, 242, 243, 5, 58, 30, 2, 243, 65, 3, 2, 2, 2, 244, 245, 7, 7, 2, 2, 245, 246, 5, 46, 24, 2, 246, 247, 7, 8, 2, 2, 247, 67, 3, 2, 2, 2, 248, 249, 7, 21, 2, 2, 249, 69, 3, 2, 2, 2, 250, 251, 7, 21, 2, 2, 251, 71, 3, 2, 2, 2, 252, 253, 7, 21, 2, 2, 253, 73, 3, 2, 2, 2, 254, 255, 7, 21, 2, 2, 255, 75, 3, 2, 2, 2, 17, 79, 86, 97, 117, 120, 131, 142, 149, 161, 189, 197, 203, 212, 215, 228] \ No newline at end of file +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 23, 260, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 3, 2, 6, 2, 76, 10, 2, 13, 2, 14, 2, 77, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 5, 3, 85, 10, 3, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 5, 5, 96, 10, 5, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 7, 9, 115, 10, 9, 12, 9, 14, 9, 118, 11, 9, 5, 9, 120, 10, 9, 3, 10, 3, 10, 7, 10, 124, 10, 10, 12, 10, 14, 10, 127, 11, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 7, 11, 135, 10, 11, 12, 11, 14, 11, 138, 11, 11, 3, 11, 3, 11, 3, 12, 3, 12, 5, 12, 144, 10, 12, 3, 13, 3, 13, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 5, 15, 156, 10, 15, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 5, 22, 184, 10, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 5, 23, 192, 10, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 5, 24, 199, 10, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 5, 25, 207, 10, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 7, 26, 214, 10, 26, 12, 26, 14, 26, 217, 11, 26, 5, 26, 219, 10, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 7, 28, 230, 10, 28, 12, 28, 14, 28, 233, 11, 28, 3, 29, 3, 29, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 35, 3, 35, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 2, 2, 38, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 2, 2, 2, 260, 2, 75, 3, 2, 2, 2, 4, 84, 3, 2, 2, 2, 6, 86, 3, 2, 2, 2, 8, 89, 3, 2, 2, 2, 10, 97, 3, 2, 2, 2, 12, 99, 3, 2, 2, 2, 14, 102, 3, 2, 2, 2, 16, 119, 3, 2, 2, 2, 18, 121, 3, 2, 2, 2, 20, 130, 3, 2, 2, 2, 22, 143, 3, 2, 2, 2, 24, 145, 3, 2, 2, 2, 26, 147, 3, 2, 2, 2, 28, 155, 3, 2, 2, 2, 30, 157, 3, 2, 2, 2, 32, 159, 3, 2, 2, 2, 34, 163, 3, 2, 2, 2, 36, 165, 3, 2, 2, 2, 38, 169, 3, 2, 2, 2, 40, 173, 3, 2, 2, 2, 42, 183, 3, 2, 2, 2, 44, 191, 3, 2, 2, 2, 46, 198, 3, 2, 2, 2, 48, 206, 3, 2, 2, 2, 50, 208, 3, 2, 2, 2, 52, 222, 3, 2, 2, 2, 54, 224, 3, 2, 2, 2, 56, 234, 3, 2, 2, 2, 58, 236, 3, 2, 2, 2, 60, 238, 3, 2, 2, 2, 62, 243, 3, 2, 2, 2, 64, 247, 3, 2, 2, 2, 66, 251, 3, 2, 2, 2, 68, 253, 3, 2, 2, 2, 70, 255, 3, 2, 2, 2, 72, 257, 3, 2, 2, 2, 74, 76, 5, 4, 3, 2, 75, 74, 3, 2, 2, 2, 76, 77, 3, 2, 2, 2, 77, 75, 3, 2, 2, 2, 77, 78, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 80, 7, 2, 2, 3, 80, 3, 3, 2, 2, 2, 81, 85, 5, 6, 4, 2, 82, 85, 5, 12, 7, 2, 83, 85, 5, 20, 11, 2, 84, 81, 3, 2, 2, 2, 84, 82, 3, 2, 2, 2, 84, 83, 3, 2, 2, 2, 85, 5, 3, 2, 2, 2, 86, 87, 7, 3, 2, 2, 87, 88, 5, 8, 5, 2, 88, 7, 3, 2, 2, 2, 89, 90, 5, 68, 35, 2, 90, 91, 7, 4, 2, 2, 91, 92, 5, 10, 6, 2, 92, 95, 3, 2, 2, 2, 93, 94, 7, 5, 2, 2, 94, 96, 5, 42, 22, 2, 95, 93, 3, 2, 2, 2, 95, 96, 3, 2, 2, 2, 96, 9, 3, 2, 2, 2, 97, 98, 5, 70, 36, 2, 98, 11, 3, 2, 2, 2, 99, 100, 7, 6, 2, 2, 100, 101, 5, 14, 8, 2, 101, 13, 3, 2, 2, 2, 102, 103, 5, 66, 34, 2, 103, 104, 7, 7, 2, 2, 104, 105, 5, 16, 9, 2, 105, 106, 7, 8, 2, 2, 106, 107, 7, 4, 2, 2, 107, 108, 5, 10, 6, 2, 108, 109, 3, 2, 2, 2, 109, 110, 5, 18, 10, 2, 110, 15, 3, 2, 2, 2, 111, 116, 5, 8, 5, 2, 112, 113, 7, 9, 2, 2, 113, 115, 5, 8, 5, 2, 114, 112, 3, 2, 2, 2, 115, 118, 3, 2, 2, 2, 116, 114, 3, 2, 2, 2, 116, 117, 3, 2, 2, 2, 117, 120, 3, 2, 2, 2, 118, 116, 3, 2, 2, 2, 119, 111, 3, 2, 2, 2, 119, 120, 3, 2, 2, 2, 120, 17, 3, 2, 2, 2, 121, 125, 7, 10, 2, 2, 122, 124, 5, 28, 15, 2, 123, 122, 3, 2, 2, 2, 124, 127, 3, 2, 2, 2, 125, 123, 3, 2, 2, 2, 125, 126, 3, 2, 2, 2, 126, 128, 3, 2, 2, 2, 127, 125, 3, 2, 2, 2, 128, 129, 7, 11, 2, 2, 129, 19, 3, 2, 2, 2, 130, 131, 7, 12, 2, 2, 131, 132, 5, 72, 37, 2, 132, 136, 7, 10, 2, 2, 133, 135, 5, 22, 12, 2, 134, 133, 3, 2, 2, 2, 135, 138, 3, 2, 2, 2, 136, 134, 3, 2, 2, 2, 136, 137, 3, 2, 2, 2, 137, 139, 3, 2, 2, 2, 138, 136, 3, 2, 2, 2, 139, 140, 7, 11, 2, 2, 140, 21, 3, 2, 2, 2, 141, 144, 5, 24, 13, 2, 142, 144, 5, 26, 14, 2, 143, 141, 3, 2, 2, 2, 143, 142, 3, 2, 2, 2, 144, 23, 3, 2, 2, 2, 145, 146, 5, 8, 5, 2, 146, 25, 3, 2, 2, 2, 147, 148, 5, 14, 8, 2, 148, 27, 3, 2, 2, 2, 149, 156, 5, 6, 4, 2, 150, 156, 5, 30, 16, 2, 151, 156, 5, 34, 18, 2, 152, 156, 5, 38, 20, 2, 153, 156, 5, 40, 21, 2, 154, 156, 5, 42, 22, 2, 155, 149, 3, 2, 2, 2, 155, 150, 3, 2, 2, 2, 155, 151, 3, 2, 2, 2, 155, 152, 3, 2, 2, 2, 155, 153, 3, 2, 2, 2, 155, 154, 3, 2, 2, 2, 156, 29, 3, 2, 2, 2, 157, 158, 5, 32, 17, 2, 158, 31, 3, 2, 2, 2, 159, 160, 7, 13, 2, 2, 160, 161, 5, 42, 22, 2, 161, 162, 5, 18, 10, 2, 162, 33, 3, 2, 2, 2, 163, 164, 5, 36, 19, 2, 164, 35, 3, 2, 2, 2, 165, 166, 7, 14, 2, 2, 166, 167, 5, 42, 22, 2, 167, 168, 5, 18, 10, 2, 168, 37, 3, 2, 2, 2, 169, 170, 5, 56, 29, 2, 170, 171, 7, 5, 2, 2, 171, 172, 5, 42, 22, 2, 172, 39, 3, 2, 2, 2, 173, 174, 7, 15, 2, 2, 174, 175, 5, 42, 22, 2, 175, 41, 3, 2, 2, 2, 176, 184, 5, 50, 26, 2, 177, 184, 5, 58, 30, 2, 178, 184, 5, 56, 29, 2, 179, 184, 5, 60, 31, 2, 180, 184, 5, 62, 32, 2, 181, 184, 5, 64, 33, 2, 182, 184, 5, 52, 27, 2, 183, 176, 3, 2, 2, 2, 183, 177, 3, 2, 2, 2, 183, 178, 3, 2, 2, 2, 183, 179, 3, 2, 2, 2, 183, 180, 3, 2, 2, 2, 183, 181, 3, 2, 2, 2, 183, 182, 3, 2, 2, 2, 184, 43, 3, 2, 2, 2, 185, 192, 5, 50, 26, 2, 186, 192, 5, 58, 30, 2, 187, 192, 5, 56, 29, 2, 188, 192, 5, 60, 31, 2, 189, 192, 5, 62, 32, 2, 190, 192, 5, 64, 33, 2, 191, 185, 3, 2, 2, 2, 191, 186, 3, 2, 2, 2, 191, 187, 3, 2, 2, 2, 191, 188, 3, 2, 2, 2, 191, 189, 3, 2, 2, 2, 191, 190, 3, 2, 2, 2, 192, 45, 3, 2, 2, 2, 193, 199, 5, 50, 26, 2, 194, 199, 5, 58, 30, 2, 195, 199, 5, 56, 29, 2, 196, 199, 5, 62, 32, 2, 197, 199, 5, 64, 33, 2, 198, 193, 3, 2, 2, 2, 198, 194, 3, 2, 2, 2, 198, 195, 3, 2, 2, 2, 198, 196, 3, 2, 2, 2, 198, 197, 3, 2, 2, 2, 199, 47, 3, 2, 2, 2, 200, 207, 5, 50, 26, 2, 201, 207, 5, 58, 30, 2, 202, 207, 5, 56, 29, 2, 203, 207, 5, 60, 31, 2, 204, 207, 5, 64, 33, 2, 205, 207, 5, 52, 27, 2, 206, 200, 3, 2, 2, 2, 206, 201, 3, 2, 2, 2, 206, 202, 3, 2, 2, 2, 206, 203, 3, 2, 2, 2, 206, 204, 3, 2, 2, 2, 206, 205, 3, 2, 2, 2, 207, 49, 3, 2, 2, 2, 208, 209, 5, 66, 34, 2, 209, 218, 7, 7, 2, 2, 210, 215, 5, 42, 22, 2, 211, 212, 7, 9, 2, 2, 212, 214, 5, 42, 22, 2, 213, 211, 3, 2, 2, 2, 214, 217, 3, 2, 2, 2, 215, 213, 3, 2, 2, 2, 215, 216, 3, 2, 2, 2, 216, 219, 3, 2, 2, 2, 217, 215, 3, 2, 2, 2, 218, 210, 3, 2, 2, 2, 218, 219, 3, 2, 2, 2, 219, 220, 3, 2, 2, 2, 220, 221, 7, 8, 2, 2, 221, 51, 3, 2, 2, 2, 222, 223, 5, 54, 28, 2, 223, 53, 3, 2, 2, 2, 224, 225, 5, 44, 23, 2, 225, 226, 7, 19, 2, 2, 226, 231, 5, 44, 23, 2, 227, 228, 7, 19, 2, 2, 228, 230, 5, 44, 23, 2, 229, 227, 3, 2, 2, 2, 230, 233, 3, 2, 2, 2, 231, 229, 3, 2, 2, 2, 231, 232, 3, 2, 2, 2, 232, 55, 3, 2, 2, 2, 233, 231, 3, 2, 2, 2, 234, 235, 5, 68, 35, 2, 235, 57, 3, 2, 2, 2, 236, 237, 7, 20, 2, 2, 237, 59, 3, 2, 2, 2, 238, 239, 5, 46, 24, 2, 239, 240, 7, 16, 2, 2, 240, 241, 5, 42, 22, 2, 241, 242, 7, 17, 2, 2, 242, 61, 3, 2, 2, 2, 243, 244, 5, 56, 29, 2, 244, 245, 7, 18, 2, 2, 245, 246, 5, 56, 29, 2, 246, 63, 3, 2, 2, 2, 247, 248, 7, 7, 2, 2, 248, 249, 5, 42, 22, 2, 249, 250, 7, 8, 2, 2, 250, 65, 3, 2, 2, 2, 251, 252, 7, 21, 2, 2, 252, 67, 3, 2, 2, 2, 253, 254, 7, 21, 2, 2, 254, 69, 3, 2, 2, 2, 255, 256, 7, 21, 2, 2, 256, 71, 3, 2, 2, 2, 257, 258, 7, 21, 2, 2, 258, 73, 3, 2, 2, 2, 18, 77, 84, 95, 116, 119, 125, 136, 143, 155, 183, 191, 198, 206, 215, 218, 231] \ No newline at end of file diff --git a/gen/TocBaseListener.h b/gen/TocBaseListener.h index f2439fb..bd19f54 100644 --- a/gen/TocBaseListener.h +++ b/gen/TocBaseListener.h @@ -40,12 +40,6 @@ public: virtual void enterParameter(TocParser::ParameterContext * /*ctx*/) override { } virtual void exitParameter(TocParser::ParameterContext * /*ctx*/) override { } - virtual void enterFirstParameter(TocParser::FirstParameterContext * /*ctx*/) override { } - virtual void exitFirstParameter(TocParser::FirstParameterContext * /*ctx*/) override { } - - virtual void enterAdditionalParameter(TocParser::AdditionalParameterContext * /*ctx*/) override { } - virtual void exitAdditionalParameter(TocParser::AdditionalParameterContext * /*ctx*/) override { } - virtual void enterBody(TocParser::BodyContext * /*ctx*/) override { } virtual void exitBody(TocParser::BodyContext * /*ctx*/) override { } @@ -91,6 +85,9 @@ public: virtual void enterNonSubscriptExpr(TocParser::NonSubscriptExprContext * /*ctx*/) override { } virtual void exitNonSubscriptExpr(TocParser::NonSubscriptExprContext * /*ctx*/) override { } + virtual void enterNonAccessExpr(TocParser::NonAccessExprContext * /*ctx*/) override { } + virtual void exitNonAccessExpr(TocParser::NonAccessExprContext * /*ctx*/) override { } + virtual void enterFuncCall(TocParser::FuncCallContext * /*ctx*/) override { } virtual void exitFuncCall(TocParser::FuncCallContext * /*ctx*/) override { } diff --git a/gen/TocListener.h b/gen/TocListener.h index 58cb4cd..0c635a0 100644 --- a/gen/TocListener.h +++ b/gen/TocListener.h @@ -38,12 +38,6 @@ public: virtual void enterParameter(TocParser::ParameterContext *ctx) = 0; virtual void exitParameter(TocParser::ParameterContext *ctx) = 0; - virtual void enterFirstParameter(TocParser::FirstParameterContext *ctx) = 0; - virtual void exitFirstParameter(TocParser::FirstParameterContext *ctx) = 0; - - virtual void enterAdditionalParameter(TocParser::AdditionalParameterContext *ctx) = 0; - virtual void exitAdditionalParameter(TocParser::AdditionalParameterContext *ctx) = 0; - virtual void enterBody(TocParser::BodyContext *ctx) = 0; virtual void exitBody(TocParser::BodyContext *ctx) = 0; @@ -89,6 +83,9 @@ public: virtual void enterNonSubscriptExpr(TocParser::NonSubscriptExprContext *ctx) = 0; virtual void exitNonSubscriptExpr(TocParser::NonSubscriptExprContext *ctx) = 0; + virtual void enterNonAccessExpr(TocParser::NonAccessExprContext *ctx) = 0; + virtual void exitNonAccessExpr(TocParser::NonAccessExprContext *ctx) = 0; + virtual void enterFuncCall(TocParser::FuncCallContext *ctx) = 0; virtual void exitFuncCall(TocParser::FuncCallContext *ctx) = 0; diff --git a/gen/TocParser.cpp b/gen/TocParser.cpp index 8c58634..eb6928d 100644 --- a/gen/TocParser.cpp +++ b/gen/TocParser.cpp @@ -80,20 +80,20 @@ TocParser::ProgContext* TocParser::prog() { }); try { enterOuterAlt(_localctx, 1); - setState(75); + setState(73); _errHandler->sync(this); _la = _input->LA(1); do { - setState(74); + setState(72); decl(); - setState(77); + setState(75); _errHandler->sync(this); _la = _input->LA(1); } while ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & ((1ULL << TocParser::T__0) | (1ULL << TocParser::T__3) | (1ULL << TocParser::T__9))) != 0)); - setState(79); + setState(77); match(TocParser::EOF); } @@ -153,26 +153,26 @@ TocParser::DeclContext* TocParser::decl() { exitRule(); }); try { - setState(84); + setState(82); _errHandler->sync(this); switch (_input->LA(1)) { case TocParser::T__0: { enterOuterAlt(_localctx, 1); - setState(81); + setState(79); varDecl(); break; } case TocParser::T__3: { enterOuterAlt(_localctx, 2); - setState(82); + setState(80); funcDecl(); break; } case TocParser::T__9: { enterOuterAlt(_localctx, 3); - setState(83); + setState(81); structDecl(); break; } @@ -231,9 +231,9 @@ TocParser::VarDeclContext* TocParser::varDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(86); + setState(84); match(TocParser::T__0); - setState(87); + setState(85); var(); } @@ -295,21 +295,21 @@ TocParser::VarContext* TocParser::var() { }); try { enterOuterAlt(_localctx, 1); - setState(89); + setState(87); varName(); - setState(90); + setState(88); match(TocParser::T__1); - setState(91); + setState(89); type(); - setState(95); + setState(93); _errHandler->sync(this); _la = _input->LA(1); if (_la == TocParser::T__2) { - setState(93); + setState(91); match(TocParser::T__2); - setState(94); + setState(92); expr(); } @@ -363,7 +363,7 @@ TocParser::TypeContext* TocParser::type() { }); try { enterOuterAlt(_localctx, 1); - setState(97); + setState(95); typeName(); } @@ -416,9 +416,9 @@ TocParser::FuncDeclContext* TocParser::funcDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(99); + setState(97); match(TocParser::T__3); - setState(100); + setState(98); func(); } @@ -483,20 +483,20 @@ TocParser::FuncContext* TocParser::func() { }); try { enterOuterAlt(_localctx, 1); - setState(102); + setState(100); funcName(); - setState(103); + setState(101); match(TocParser::T__4); - setState(104); + setState(102); parameter(); - setState(105); + setState(103); match(TocParser::T__5); - setState(106); + setState(104); match(TocParser::T__1); - setState(107); + setState(105); type(); - setState(109); + setState(107); body(); } @@ -515,16 +515,12 @@ TocParser::ParameterContext::ParameterContext(ParserRuleContext *parent, size_t : ParserRuleContext(parent, invokingState) { } -TocParser::FirstParameterContext* TocParser::ParameterContext::firstParameter() { - return getRuleContext(0); -} - -std::vector TocParser::ParameterContext::additionalParameter() { - return getRuleContexts(); +std::vector TocParser::ParameterContext::var() { + return getRuleContexts(); } -TocParser::AdditionalParameterContext* TocParser::ParameterContext::additionalParameter(size_t i) { - return getRuleContext(i); +TocParser::VarContext* TocParser::ParameterContext::var(size_t i) { + return getRuleContext(i); } @@ -558,20 +554,22 @@ TocParser::ParameterContext* TocParser::parameter() { }); try { enterOuterAlt(_localctx, 1); - setState(118); + setState(117); _errHandler->sync(this); _la = _input->LA(1); if (_la == TocParser::NAME) { - setState(111); - firstParameter(); - setState(115); + setState(109); + var(); + setState(114); _errHandler->sync(this); _la = _input->LA(1); while (_la == TocParser::T__6) { - setState(112); - additionalParameter(); - setState(117); + setState(110); + match(TocParser::T__6); + setState(111); + var(); + setState(116); _errHandler->sync(this); _la = _input->LA(1); } @@ -587,114 +585,6 @@ TocParser::ParameterContext* TocParser::parameter() { return _localctx; } -//----------------- FirstParameterContext ------------------------------------------------------------------ - -TocParser::FirstParameterContext::FirstParameterContext(ParserRuleContext *parent, size_t invokingState) - : ParserRuleContext(parent, invokingState) { -} - -TocParser::VarContext* TocParser::FirstParameterContext::var() { - return getRuleContext(0); -} - - -size_t TocParser::FirstParameterContext::getRuleIndex() const { - return TocParser::RuleFirstParameter; -} - -void TocParser::FirstParameterContext::enterRule(tree::ParseTreeListener *listener) { - auto parserListener = dynamic_cast(listener); - if (parserListener != nullptr) - parserListener->enterFirstParameter(this); -} - -void TocParser::FirstParameterContext::exitRule(tree::ParseTreeListener *listener) { - auto parserListener = dynamic_cast(listener); - if (parserListener != nullptr) - parserListener->exitFirstParameter(this); -} - -TocParser::FirstParameterContext* TocParser::firstParameter() { - FirstParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 16, TocParser::RuleFirstParameter); - -#if __cplusplus > 201703L - auto onExit = finally([=, this] { -#else - auto onExit = finally([=] { -#endif - exitRule(); - }); - try { - enterOuterAlt(_localctx, 1); - setState(120); - var(); - - } - catch (RecognitionException &e) { - _errHandler->reportError(this, e); - _localctx->exception = std::current_exception(); - _errHandler->recover(this, _localctx->exception); - } - - return _localctx; -} - -//----------------- AdditionalParameterContext ------------------------------------------------------------------ - -TocParser::AdditionalParameterContext::AdditionalParameterContext(ParserRuleContext *parent, size_t invokingState) - : ParserRuleContext(parent, invokingState) { -} - -TocParser::VarContext* TocParser::AdditionalParameterContext::var() { - return getRuleContext(0); -} - - -size_t TocParser::AdditionalParameterContext::getRuleIndex() const { - return TocParser::RuleAdditionalParameter; -} - -void TocParser::AdditionalParameterContext::enterRule(tree::ParseTreeListener *listener) { - auto parserListener = dynamic_cast(listener); - if (parserListener != nullptr) - parserListener->enterAdditionalParameter(this); -} - -void TocParser::AdditionalParameterContext::exitRule(tree::ParseTreeListener *listener) { - auto parserListener = dynamic_cast(listener); - if (parserListener != nullptr) - parserListener->exitAdditionalParameter(this); -} - -TocParser::AdditionalParameterContext* TocParser::additionalParameter() { - AdditionalParameterContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 18, TocParser::RuleAdditionalParameter); - -#if __cplusplus > 201703L - auto onExit = finally([=, this] { -#else - auto onExit = finally([=] { -#endif - exitRule(); - }); - try { - enterOuterAlt(_localctx, 1); - setState(122); - match(TocParser::T__6); - setState(123); - var(); - - } - catch (RecognitionException &e) { - _errHandler->reportError(this, e); - _localctx->exception = std::current_exception(); - _errHandler->recover(this, _localctx->exception); - } - - return _localctx; -} - //----------------- BodyContext ------------------------------------------------------------------ TocParser::BodyContext::BodyContext(ParserRuleContext *parent, size_t invokingState) @@ -728,7 +618,7 @@ void TocParser::BodyContext::exitRule(tree::ParseTreeListener *listener) { TocParser::BodyContext* TocParser::body() { BodyContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 20, TocParser::RuleBody); + enterRule(_localctx, 16, TocParser::RuleBody); size_t _la = 0; #if __cplusplus > 201703L @@ -740,9 +630,9 @@ TocParser::BodyContext* TocParser::body() { }); try { enterOuterAlt(_localctx, 1); - setState(125); + setState(119); match(TocParser::T__7); - setState(129); + setState(123); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && @@ -753,13 +643,13 @@ TocParser::BodyContext* TocParser::body() { | (1ULL << TocParser::T__12) | (1ULL << TocParser::INTLIT) | (1ULL << TocParser::NAME))) != 0)) { - setState(126); + setState(120); stmt(); - setState(131); + setState(125); _errHandler->sync(this); _la = _input->LA(1); } - setState(132); + setState(126); match(TocParser::T__8); } @@ -809,7 +699,7 @@ void TocParser::StructDeclContext::exitRule(tree::ParseTreeListener *listener) { TocParser::StructDeclContext* TocParser::structDecl() { StructDeclContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 22, TocParser::RuleStructDecl); + enterRule(_localctx, 18, TocParser::RuleStructDecl); size_t _la = 0; #if __cplusplus > 201703L @@ -821,23 +711,23 @@ TocParser::StructDeclContext* TocParser::structDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(134); + setState(128); match(TocParser::T__9); - setState(135); + setState(129); structName(); - setState(136); + setState(130); match(TocParser::T__7); - setState(140); + setState(134); _errHandler->sync(this); _la = _input->LA(1); while (_la == TocParser::NAME) { - setState(137); + setState(131); structMember(); - setState(142); + setState(136); _errHandler->sync(this); _la = _input->LA(1); } - setState(143); + setState(137); match(TocParser::T__8); } @@ -883,7 +773,7 @@ void TocParser::StructMemberContext::exitRule(tree::ParseTreeListener *listener) TocParser::StructMemberContext* TocParser::structMember() { StructMemberContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 24, TocParser::RuleStructMember); + enterRule(_localctx, 20, TocParser::RuleStructMember); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -893,19 +783,19 @@ TocParser::StructMemberContext* TocParser::structMember() { exitRule(); }); try { - setState(147); + setState(141); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 7, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(145); + setState(139); structVar(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(146); + setState(140); structMethod(); break; } @@ -953,7 +843,7 @@ void TocParser::StructVarContext::exitRule(tree::ParseTreeListener *listener) { TocParser::StructVarContext* TocParser::structVar() { StructVarContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 26, TocParser::RuleStructVar); + enterRule(_localctx, 22, TocParser::RuleStructVar); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -964,7 +854,7 @@ TocParser::StructVarContext* TocParser::structVar() { }); try { enterOuterAlt(_localctx, 1); - setState(149); + setState(143); var(); } @@ -1006,7 +896,7 @@ void TocParser::StructMethodContext::exitRule(tree::ParseTreeListener *listener) TocParser::StructMethodContext* TocParser::structMethod() { StructMethodContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 28, TocParser::RuleStructMethod); + enterRule(_localctx, 24, TocParser::RuleStructMethod); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1017,7 +907,7 @@ TocParser::StructMethodContext* TocParser::structMethod() { }); try { enterOuterAlt(_localctx, 1); - setState(151); + setState(145); func(); } @@ -1079,7 +969,7 @@ void TocParser::StmtContext::exitRule(tree::ParseTreeListener *listener) { TocParser::StmtContext* TocParser::stmt() { StmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 30, TocParser::RuleStmt); + enterRule(_localctx, 26, TocParser::RuleStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1090,41 +980,41 @@ TocParser::StmtContext* TocParser::stmt() { }); try { enterOuterAlt(_localctx, 1); - setState(159); + setState(153); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 8, _ctx)) { case 1: { - setState(153); + setState(147); varDecl(); break; } case 2: { - setState(154); + setState(148); conditional(); break; } case 3: { - setState(155); + setState(149); loop(); break; } case 4: { - setState(156); + setState(150); assignment(); break; } case 5: { - setState(157); + setState(151); returnStmt(); break; } case 6: { - setState(158); + setState(152); expr(); break; } @@ -1172,7 +1062,7 @@ void TocParser::ConditionalContext::exitRule(tree::ParseTreeListener *listener) TocParser::ConditionalContext* TocParser::conditional() { ConditionalContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 32, TocParser::RuleConditional); + enterRule(_localctx, 28, TocParser::RuleConditional); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1183,7 +1073,7 @@ TocParser::ConditionalContext* TocParser::conditional() { }); try { enterOuterAlt(_localctx, 1); - setState(161); + setState(155); ifCond(); } @@ -1229,7 +1119,7 @@ void TocParser::IfCondContext::exitRule(tree::ParseTreeListener *listener) { TocParser::IfCondContext* TocParser::ifCond() { IfCondContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 34, TocParser::RuleIfCond); + enterRule(_localctx, 30, TocParser::RuleIfCond); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1240,11 +1130,11 @@ TocParser::IfCondContext* TocParser::ifCond() { }); try { enterOuterAlt(_localctx, 1); - setState(163); + setState(157); match(TocParser::T__10); - setState(164); + setState(158); expr(); - setState(165); + setState(159); body(); } @@ -1286,7 +1176,7 @@ void TocParser::LoopContext::exitRule(tree::ParseTreeListener *listener) { TocParser::LoopContext* TocParser::loop() { LoopContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 36, TocParser::RuleLoop); + enterRule(_localctx, 32, TocParser::RuleLoop); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1297,7 +1187,7 @@ TocParser::LoopContext* TocParser::loop() { }); try { enterOuterAlt(_localctx, 1); - setState(167); + setState(161); whileLoop(); } @@ -1343,7 +1233,7 @@ void TocParser::WhileLoopContext::exitRule(tree::ParseTreeListener *listener) { TocParser::WhileLoopContext* TocParser::whileLoop() { WhileLoopContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 38, TocParser::RuleWhileLoop); + enterRule(_localctx, 34, TocParser::RuleWhileLoop); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1354,11 +1244,11 @@ TocParser::WhileLoopContext* TocParser::whileLoop() { }); try { enterOuterAlt(_localctx, 1); - setState(169); + setState(163); match(TocParser::T__11); - setState(170); + setState(164); expr(); - setState(171); + setState(165); body(); } @@ -1404,7 +1294,7 @@ void TocParser::AssignmentContext::exitRule(tree::ParseTreeListener *listener) { TocParser::AssignmentContext* TocParser::assignment() { AssignmentContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 40, TocParser::RuleAssignment); + enterRule(_localctx, 36, TocParser::RuleAssignment); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1415,11 +1305,11 @@ TocParser::AssignmentContext* TocParser::assignment() { }); try { enterOuterAlt(_localctx, 1); - setState(173); + setState(167); identifier(); - setState(174); + setState(168); match(TocParser::T__2); - setState(175); + setState(169); expr(); } @@ -1461,7 +1351,7 @@ void TocParser::ReturnStmtContext::exitRule(tree::ParseTreeListener *listener) { TocParser::ReturnStmtContext* TocParser::returnStmt() { ReturnStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 42, TocParser::RuleReturnStmt); + enterRule(_localctx, 38, TocParser::RuleReturnStmt); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1472,9 +1362,9 @@ TocParser::ReturnStmtContext* TocParser::returnStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(177); + setState(171); match(TocParser::T__12); - setState(178); + setState(172); expr(); } @@ -1540,7 +1430,7 @@ void TocParser::ExprContext::exitRule(tree::ParseTreeListener *listener) { TocParser::ExprContext* TocParser::expr() { ExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, TocParser::RuleExpr); + enterRule(_localctx, 40, TocParser::RuleExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1550,54 +1440,54 @@ TocParser::ExprContext* TocParser::expr() { exitRule(); }); try { - setState(187); + setState(181); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 9, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(180); + setState(174); funcCall(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(181); + setState(175); literal(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(182); + setState(176); identifier(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(183); + setState(177); subscript(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(184); + setState(178); memberAccess(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(185); + setState(179); parenExpr(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(186); + setState(180); operatorExpr(); break; } @@ -1665,7 +1555,7 @@ void TocParser::NonOpExprContext::exitRule(tree::ParseTreeListener *listener) { TocParser::NonOpExprContext* TocParser::nonOpExpr() { NonOpExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, TocParser::RuleNonOpExpr); + enterRule(_localctx, 42, TocParser::RuleNonOpExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1675,47 +1565,47 @@ TocParser::NonOpExprContext* TocParser::nonOpExpr() { exitRule(); }); try { - setState(195); + setState(189); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 10, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(189); + setState(183); funcCall(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(190); + setState(184); literal(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(191); + setState(185); identifier(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(192); + setState(186); subscript(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(193); + setState(187); memberAccess(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(194); + setState(188); parenExpr(); break; } @@ -1744,6 +1634,10 @@ TocParser::FuncCallContext* TocParser::NonSubscriptExprContext::funcCall() { return getRuleContext(0); } +TocParser::LiteralContext* TocParser::NonSubscriptExprContext::literal() { + return getRuleContext(0); +} + TocParser::IdentifierContext* TocParser::NonSubscriptExprContext::identifier() { return getRuleContext(0); } @@ -1775,7 +1669,7 @@ void TocParser::NonSubscriptExprContext::exitRule(tree::ParseTreeListener *liste TocParser::NonSubscriptExprContext* TocParser::nonSubscriptExpr() { NonSubscriptExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, TocParser::RuleNonSubscriptExpr); + enterRule(_localctx, 44, TocParser::RuleNonSubscriptExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1785,37 +1679,162 @@ TocParser::NonSubscriptExprContext* TocParser::nonSubscriptExpr() { exitRule(); }); try { - setState(201); + setState(196); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 11, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(197); + setState(191); funcCall(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(198); - identifier(); + setState(192); + literal(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(199); - memberAccess(); + setState(193); + identifier(); break; } case 4: { enterOuterAlt(_localctx, 4); + setState(194); + memberAccess(); + break; + } + + case 5: { + enterOuterAlt(_localctx, 5); + setState(195); + parenExpr(); + break; + } + + default: + break; + } + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- NonAccessExprContext ------------------------------------------------------------------ + +TocParser::NonAccessExprContext::NonAccessExprContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +TocParser::FuncCallContext* TocParser::NonAccessExprContext::funcCall() { + return getRuleContext(0); +} + +TocParser::LiteralContext* TocParser::NonAccessExprContext::literal() { + return getRuleContext(0); +} + +TocParser::IdentifierContext* TocParser::NonAccessExprContext::identifier() { + return getRuleContext(0); +} + +TocParser::SubscriptContext* TocParser::NonAccessExprContext::subscript() { + return getRuleContext(0); +} + +TocParser::ParenExprContext* TocParser::NonAccessExprContext::parenExpr() { + return getRuleContext(0); +} + +TocParser::OperatorExprContext* TocParser::NonAccessExprContext::operatorExpr() { + return getRuleContext(0); +} + + +size_t TocParser::NonAccessExprContext::getRuleIndex() const { + return TocParser::RuleNonAccessExpr; +} + +void TocParser::NonAccessExprContext::enterRule(tree::ParseTreeListener *listener) { + auto parserListener = dynamic_cast(listener); + if (parserListener != nullptr) + parserListener->enterNonAccessExpr(this); +} + +void TocParser::NonAccessExprContext::exitRule(tree::ParseTreeListener *listener) { + auto parserListener = dynamic_cast(listener); + if (parserListener != nullptr) + parserListener->exitNonAccessExpr(this); +} + +TocParser::NonAccessExprContext* TocParser::nonAccessExpr() { + NonAccessExprContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 46, TocParser::RuleNonAccessExpr); + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + setState(204); + _errHandler->sync(this); + switch (getInterpreter()->adaptivePredict(_input, 12, _ctx)) { + case 1: { + enterOuterAlt(_localctx, 1); + setState(198); + funcCall(); + break; + } + + case 2: { + enterOuterAlt(_localctx, 2); + setState(199); + literal(); + break; + } + + case 3: { + enterOuterAlt(_localctx, 3); setState(200); + identifier(); + break; + } + + case 4: { + enterOuterAlt(_localctx, 4); + setState(201); + subscript(); + break; + } + + case 5: { + enterOuterAlt(_localctx, 5); + setState(202); parenExpr(); break; } + case 6: { + enterOuterAlt(_localctx, 6); + setState(203); + operatorExpr(); + break; + } + default: break; } @@ -1867,7 +1886,7 @@ void TocParser::FuncCallContext::exitRule(tree::ParseTreeListener *listener) { TocParser::FuncCallContext* TocParser::funcCall() { FuncCallContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, TocParser::RuleFuncCall); + enterRule(_localctx, 48, TocParser::RuleFuncCall); size_t _la = 0; #if __cplusplus > 201703L @@ -1879,11 +1898,11 @@ TocParser::FuncCallContext* TocParser::funcCall() { }); try { enterOuterAlt(_localctx, 1); - setState(203); + setState(206); funcName(); - setState(204); + setState(207); match(TocParser::T__4); - setState(213); + setState(216); _errHandler->sync(this); _la = _input->LA(1); @@ -1891,22 +1910,22 @@ TocParser::FuncCallContext* TocParser::funcCall() { ((1ULL << _la) & ((1ULL << TocParser::T__4) | (1ULL << TocParser::INTLIT) | (1ULL << TocParser::NAME))) != 0)) { - setState(205); + setState(208); expr(); - setState(210); + setState(213); _errHandler->sync(this); _la = _input->LA(1); while (_la == TocParser::T__6) { - setState(206); + setState(209); match(TocParser::T__6); - setState(207); + setState(210); expr(); - setState(212); + setState(215); _errHandler->sync(this); _la = _input->LA(1); } } - setState(215); + setState(218); match(TocParser::T__5); } @@ -1948,7 +1967,7 @@ void TocParser::OperatorExprContext::exitRule(tree::ParseTreeListener *listener) TocParser::OperatorExprContext* TocParser::operatorExpr() { OperatorExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, TocParser::RuleOperatorExpr); + enterRule(_localctx, 50, TocParser::RuleOperatorExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -1959,7 +1978,7 @@ TocParser::OperatorExprContext* TocParser::operatorExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(217); + setState(220); binaryOperator(); } @@ -2013,7 +2032,7 @@ void TocParser::BinaryOperatorContext::exitRule(tree::ParseTreeListener *listene TocParser::BinaryOperatorContext* TocParser::binaryOperator() { BinaryOperatorContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, TocParser::RuleBinaryOperator); + enterRule(_localctx, 52, TocParser::RuleBinaryOperator); size_t _la = 0; #if __cplusplus > 201703L @@ -2025,21 +2044,21 @@ TocParser::BinaryOperatorContext* TocParser::binaryOperator() { }); try { enterOuterAlt(_localctx, 1); - setState(219); + setState(222); nonOpExpr(); - setState(220); + setState(223); match(TocParser::BINARY_OPERATOR); - setState(221); + setState(224); nonOpExpr(); - setState(226); + setState(229); _errHandler->sync(this); _la = _input->LA(1); while (_la == TocParser::BINARY_OPERATOR) { - setState(222); + setState(225); match(TocParser::BINARY_OPERATOR); - setState(223); + setState(226); nonOpExpr(); - setState(228); + setState(231); _errHandler->sync(this); _la = _input->LA(1); } @@ -2083,7 +2102,7 @@ void TocParser::IdentifierContext::exitRule(tree::ParseTreeListener *listener) { TocParser::IdentifierContext* TocParser::identifier() { IdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, TocParser::RuleIdentifier); + enterRule(_localctx, 54, TocParser::RuleIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2094,7 +2113,7 @@ TocParser::IdentifierContext* TocParser::identifier() { }); try { enterOuterAlt(_localctx, 1); - setState(229); + setState(232); varName(); } @@ -2136,7 +2155,7 @@ void TocParser::LiteralContext::exitRule(tree::ParseTreeListener *listener) { TocParser::LiteralContext* TocParser::literal() { LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, TocParser::RuleLiteral); + enterRule(_localctx, 56, TocParser::RuleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2147,7 +2166,7 @@ TocParser::LiteralContext* TocParser::literal() { }); try { enterOuterAlt(_localctx, 1); - setState(231); + setState(234); match(TocParser::INTLIT); } @@ -2193,7 +2212,7 @@ void TocParser::SubscriptContext::exitRule(tree::ParseTreeListener *listener) { TocParser::SubscriptContext* TocParser::subscript() { SubscriptContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, TocParser::RuleSubscript); + enterRule(_localctx, 58, TocParser::RuleSubscript); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2204,13 +2223,13 @@ TocParser::SubscriptContext* TocParser::subscript() { }); try { enterOuterAlt(_localctx, 1); - setState(233); + setState(236); nonSubscriptExpr(); - setState(234); + setState(237); match(TocParser::T__13); - setState(235); + setState(238); expr(); - setState(236); + setState(239); match(TocParser::T__14); } @@ -2256,7 +2275,7 @@ void TocParser::MemberAccessContext::exitRule(tree::ParseTreeListener *listener) TocParser::MemberAccessContext* TocParser::memberAccess() { MemberAccessContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, TocParser::RuleMemberAccess); + enterRule(_localctx, 60, TocParser::RuleMemberAccess); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2267,11 +2286,11 @@ TocParser::MemberAccessContext* TocParser::memberAccess() { }); try { enterOuterAlt(_localctx, 1); - setState(238); + setState(241); identifier(); - setState(239); + setState(242); match(TocParser::T__15); - setState(240); + setState(243); identifier(); } @@ -2313,7 +2332,7 @@ void TocParser::ParenExprContext::exitRule(tree::ParseTreeListener *listener) { TocParser::ParenExprContext* TocParser::parenExpr() { ParenExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, TocParser::RuleParenExpr); + enterRule(_localctx, 62, TocParser::RuleParenExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2324,11 +2343,11 @@ TocParser::ParenExprContext* TocParser::parenExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(242); + setState(245); match(TocParser::T__4); - setState(243); + setState(246); expr(); - setState(244); + setState(247); match(TocParser::T__5); } @@ -2370,7 +2389,7 @@ void TocParser::FuncNameContext::exitRule(tree::ParseTreeListener *listener) { TocParser::FuncNameContext* TocParser::funcName() { FuncNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 66, TocParser::RuleFuncName); + enterRule(_localctx, 64, TocParser::RuleFuncName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2381,7 +2400,7 @@ TocParser::FuncNameContext* TocParser::funcName() { }); try { enterOuterAlt(_localctx, 1); - setState(246); + setState(249); match(TocParser::NAME); } @@ -2423,7 +2442,7 @@ void TocParser::VarNameContext::exitRule(tree::ParseTreeListener *listener) { TocParser::VarNameContext* TocParser::varName() { VarNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 68, TocParser::RuleVarName); + enterRule(_localctx, 66, TocParser::RuleVarName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2434,7 +2453,7 @@ TocParser::VarNameContext* TocParser::varName() { }); try { enterOuterAlt(_localctx, 1); - setState(248); + setState(251); match(TocParser::NAME); } @@ -2476,7 +2495,7 @@ void TocParser::TypeNameContext::exitRule(tree::ParseTreeListener *listener) { TocParser::TypeNameContext* TocParser::typeName() { TypeNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, TocParser::RuleTypeName); + enterRule(_localctx, 68, TocParser::RuleTypeName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2487,7 +2506,7 @@ TocParser::TypeNameContext* TocParser::typeName() { }); try { enterOuterAlt(_localctx, 1); - setState(250); + setState(253); match(TocParser::NAME); } @@ -2529,7 +2548,7 @@ void TocParser::StructNameContext::exitRule(tree::ParseTreeListener *listener) { TocParser::StructNameContext* TocParser::structName() { StructNameContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, TocParser::RuleStructName); + enterRule(_localctx, 70, TocParser::RuleStructName); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2540,7 +2559,7 @@ TocParser::StructNameContext* TocParser::structName() { }); try { enterOuterAlt(_localctx, 1); - setState(252); + setState(255); match(TocParser::NAME); } @@ -2563,12 +2582,11 @@ std::vector TocParser::_serializedATN; std::vector TocParser::_ruleNames = { "prog", "decl", "varDecl", "var", "type", "funcDecl", "func", "parameter", - "firstParameter", "additionalParameter", "body", "structDecl", "structMember", - "structVar", "structMethod", "stmt", "conditional", "ifCond", "loop", - "whileLoop", "assignment", "returnStmt", "expr", "nonOpExpr", "nonSubscriptExpr", - "funcCall", "operatorExpr", "binaryOperator", "identifier", "literal", - "subscript", "memberAccess", "parenExpr", "funcName", "varName", "typeName", - "structName" + "body", "structDecl", "structMember", "structVar", "structMethod", "stmt", + "conditional", "ifCond", "loop", "whileLoop", "assignment", "returnStmt", + "expr", "nonOpExpr", "nonSubscriptExpr", "nonAccessExpr", "funcCall", + "operatorExpr", "binaryOperator", "identifier", "literal", "subscript", + "memberAccess", "parenExpr", "funcName", "varName", "typeName", "structName" }; std::vector TocParser::_literalNames = { @@ -2601,7 +2619,7 @@ TocParser::Initializer::Initializer() { static const uint16_t serializedATNSegment0[] = { 0x3, 0x608b, 0xa72a, 0x8133, 0xb9ed, 0x417c, 0x3be7, 0x7786, 0x5964, - 0x3, 0x17, 0x101, 0x4, 0x2, 0x9, 0x2, 0x4, 0x3, 0x9, 0x3, 0x4, 0x4, + 0x3, 0x17, 0x104, 0x4, 0x2, 0x9, 0x2, 0x4, 0x3, 0x9, 0x3, 0x4, 0x4, 0x9, 0x4, 0x4, 0x5, 0x9, 0x5, 0x4, 0x6, 0x9, 0x6, 0x4, 0x7, 0x9, 0x7, 0x4, 0x8, 0x9, 0x8, 0x4, 0x9, 0x9, 0x9, 0x4, 0xa, 0x9, 0xa, 0x4, 0xb, 0x9, 0xb, 0x4, 0xc, 0x9, 0xc, 0x4, 0xd, 0x9, 0xd, 0x4, @@ -2612,162 +2630,167 @@ TocParser::Initializer::Initializer() { 0x9, 0x1a, 0x4, 0x1b, 0x9, 0x1b, 0x4, 0x1c, 0x9, 0x1c, 0x4, 0x1d, 0x9, 0x1d, 0x4, 0x1e, 0x9, 0x1e, 0x4, 0x1f, 0x9, 0x1f, 0x4, 0x20, 0x9, 0x20, 0x4, 0x21, 0x9, 0x21, 0x4, 0x22, 0x9, 0x22, 0x4, 0x23, - 0x9, 0x23, 0x4, 0x24, 0x9, 0x24, 0x4, 0x25, 0x9, 0x25, 0x4, 0x26, - 0x9, 0x26, 0x3, 0x2, 0x6, 0x2, 0x4e, 0xa, 0x2, 0xd, 0x2, 0xe, 0x2, - 0x4f, 0x3, 0x2, 0x3, 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x5, 0x3, - 0x57, 0xa, 0x3, 0x3, 0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x5, 0x3, 0x5, - 0x3, 0x5, 0x3, 0x5, 0x3, 0x5, 0x3, 0x5, 0x5, 0x5, 0x62, 0xa, 0x5, - 0x3, 0x6, 0x3, 0x6, 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x3, 0x8, 0x3, - 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, - 0x3, 0x8, 0x3, 0x9, 0x3, 0x9, 0x7, 0x9, 0x74, 0xa, 0x9, 0xc, 0x9, - 0xe, 0x9, 0x77, 0xb, 0x9, 0x5, 0x9, 0x79, 0xa, 0x9, 0x3, 0xa, 0x3, - 0xa, 0x3, 0xb, 0x3, 0xb, 0x3, 0xb, 0x3, 0xc, 0x3, 0xc, 0x7, 0xc, - 0x82, 0xa, 0xc, 0xc, 0xc, 0xe, 0xc, 0x85, 0xb, 0xc, 0x3, 0xc, 0x3, - 0xc, 0x3, 0xd, 0x3, 0xd, 0x3, 0xd, 0x3, 0xd, 0x7, 0xd, 0x8d, 0xa, - 0xd, 0xc, 0xd, 0xe, 0xd, 0x90, 0xb, 0xd, 0x3, 0xd, 0x3, 0xd, 0x3, - 0xe, 0x3, 0xe, 0x5, 0xe, 0x96, 0xa, 0xe, 0x3, 0xf, 0x3, 0xf, 0x3, - 0x10, 0x3, 0x10, 0x3, 0x11, 0x3, 0x11, 0x3, 0x11, 0x3, 0x11, 0x3, - 0x11, 0x3, 0x11, 0x5, 0x11, 0xa2, 0xa, 0x11, 0x3, 0x12, 0x3, 0x12, - 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x14, 0x3, 0x14, - 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x16, 0x3, 0x16, - 0x3, 0x16, 0x3, 0x16, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x18, - 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, - 0x5, 0x18, 0xbe, 0xa, 0x18, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, - 0x19, 0x3, 0x19, 0x3, 0x19, 0x5, 0x19, 0xc6, 0xa, 0x19, 0x3, 0x1a, - 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x5, 0x1a, 0xcc, 0xa, 0x1a, 0x3, - 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x7, 0x1b, 0xd3, - 0xa, 0x1b, 0xc, 0x1b, 0xe, 0x1b, 0xd6, 0xb, 0x1b, 0x5, 0x1b, 0xd8, - 0xa, 0x1b, 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1d, - 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1d, 0x7, 0x1d, 0xe3, 0xa, - 0x1d, 0xc, 0x1d, 0xe, 0x1d, 0xe6, 0xb, 0x1d, 0x3, 0x1e, 0x3, 0x1e, - 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, 0x3, 0x20, - 0x3, 0x20, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x22, - 0x3, 0x22, 0x3, 0x22, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, - 0x3, 0x24, 0x3, 0x25, 0x3, 0x25, 0x3, 0x26, 0x3, 0x26, 0x3, 0x26, - 0x2, 0x2, 0x27, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, - 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x22, 0x24, 0x26, 0x28, 0x2a, - 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, 0x40, - 0x42, 0x44, 0x46, 0x48, 0x4a, 0x2, 0x2, 0x2, 0xfa, 0x2, 0x4d, 0x3, - 0x2, 0x2, 0x2, 0x4, 0x56, 0x3, 0x2, 0x2, 0x2, 0x6, 0x58, 0x3, 0x2, - 0x2, 0x2, 0x8, 0x5b, 0x3, 0x2, 0x2, 0x2, 0xa, 0x63, 0x3, 0x2, 0x2, - 0x2, 0xc, 0x65, 0x3, 0x2, 0x2, 0x2, 0xe, 0x68, 0x3, 0x2, 0x2, 0x2, - 0x10, 0x78, 0x3, 0x2, 0x2, 0x2, 0x12, 0x7a, 0x3, 0x2, 0x2, 0x2, 0x14, - 0x7c, 0x3, 0x2, 0x2, 0x2, 0x16, 0x7f, 0x3, 0x2, 0x2, 0x2, 0x18, 0x88, - 0x3, 0x2, 0x2, 0x2, 0x1a, 0x95, 0x3, 0x2, 0x2, 0x2, 0x1c, 0x97, 0x3, - 0x2, 0x2, 0x2, 0x1e, 0x99, 0x3, 0x2, 0x2, 0x2, 0x20, 0xa1, 0x3, 0x2, - 0x2, 0x2, 0x22, 0xa3, 0x3, 0x2, 0x2, 0x2, 0x24, 0xa5, 0x3, 0x2, 0x2, - 0x2, 0x26, 0xa9, 0x3, 0x2, 0x2, 0x2, 0x28, 0xab, 0x3, 0x2, 0x2, 0x2, - 0x2a, 0xaf, 0x3, 0x2, 0x2, 0x2, 0x2c, 0xb3, 0x3, 0x2, 0x2, 0x2, 0x2e, - 0xbd, 0x3, 0x2, 0x2, 0x2, 0x30, 0xc5, 0x3, 0x2, 0x2, 0x2, 0x32, 0xcb, - 0x3, 0x2, 0x2, 0x2, 0x34, 0xcd, 0x3, 0x2, 0x2, 0x2, 0x36, 0xdb, 0x3, - 0x2, 0x2, 0x2, 0x38, 0xdd, 0x3, 0x2, 0x2, 0x2, 0x3a, 0xe7, 0x3, 0x2, - 0x2, 0x2, 0x3c, 0xe9, 0x3, 0x2, 0x2, 0x2, 0x3e, 0xeb, 0x3, 0x2, 0x2, - 0x2, 0x40, 0xf0, 0x3, 0x2, 0x2, 0x2, 0x42, 0xf4, 0x3, 0x2, 0x2, 0x2, - 0x44, 0xf8, 0x3, 0x2, 0x2, 0x2, 0x46, 0xfa, 0x3, 0x2, 0x2, 0x2, 0x48, - 0xfc, 0x3, 0x2, 0x2, 0x2, 0x4a, 0xfe, 0x3, 0x2, 0x2, 0x2, 0x4c, 0x4e, - 0x5, 0x4, 0x3, 0x2, 0x4d, 0x4c, 0x3, 0x2, 0x2, 0x2, 0x4e, 0x4f, 0x3, - 0x2, 0x2, 0x2, 0x4f, 0x4d, 0x3, 0x2, 0x2, 0x2, 0x4f, 0x50, 0x3, 0x2, - 0x2, 0x2, 0x50, 0x51, 0x3, 0x2, 0x2, 0x2, 0x51, 0x52, 0x7, 0x2, 0x2, - 0x3, 0x52, 0x3, 0x3, 0x2, 0x2, 0x2, 0x53, 0x57, 0x5, 0x6, 0x4, 0x2, - 0x54, 0x57, 0x5, 0xc, 0x7, 0x2, 0x55, 0x57, 0x5, 0x18, 0xd, 0x2, - 0x56, 0x53, 0x3, 0x2, 0x2, 0x2, 0x56, 0x54, 0x3, 0x2, 0x2, 0x2, 0x56, - 0x55, 0x3, 0x2, 0x2, 0x2, 0x57, 0x5, 0x3, 0x2, 0x2, 0x2, 0x58, 0x59, - 0x7, 0x3, 0x2, 0x2, 0x59, 0x5a, 0x5, 0x8, 0x5, 0x2, 0x5a, 0x7, 0x3, - 0x2, 0x2, 0x2, 0x5b, 0x5c, 0x5, 0x46, 0x24, 0x2, 0x5c, 0x5d, 0x7, - 0x4, 0x2, 0x2, 0x5d, 0x5e, 0x5, 0xa, 0x6, 0x2, 0x5e, 0x61, 0x3, 0x2, - 0x2, 0x2, 0x5f, 0x60, 0x7, 0x5, 0x2, 0x2, 0x60, 0x62, 0x5, 0x2e, - 0x18, 0x2, 0x61, 0x5f, 0x3, 0x2, 0x2, 0x2, 0x61, 0x62, 0x3, 0x2, - 0x2, 0x2, 0x62, 0x9, 0x3, 0x2, 0x2, 0x2, 0x63, 0x64, 0x5, 0x48, 0x25, - 0x2, 0x64, 0xb, 0x3, 0x2, 0x2, 0x2, 0x65, 0x66, 0x7, 0x6, 0x2, 0x2, - 0x66, 0x67, 0x5, 0xe, 0x8, 0x2, 0x67, 0xd, 0x3, 0x2, 0x2, 0x2, 0x68, - 0x69, 0x5, 0x44, 0x23, 0x2, 0x69, 0x6a, 0x7, 0x7, 0x2, 0x2, 0x6a, - 0x6b, 0x5, 0x10, 0x9, 0x2, 0x6b, 0x6c, 0x7, 0x8, 0x2, 0x2, 0x6c, - 0x6d, 0x7, 0x4, 0x2, 0x2, 0x6d, 0x6e, 0x5, 0xa, 0x6, 0x2, 0x6e, 0x6f, - 0x3, 0x2, 0x2, 0x2, 0x6f, 0x70, 0x5, 0x16, 0xc, 0x2, 0x70, 0xf, 0x3, - 0x2, 0x2, 0x2, 0x71, 0x75, 0x5, 0x12, 0xa, 0x2, 0x72, 0x74, 0x5, - 0x14, 0xb, 0x2, 0x73, 0x72, 0x3, 0x2, 0x2, 0x2, 0x74, 0x77, 0x3, - 0x2, 0x2, 0x2, 0x75, 0x73, 0x3, 0x2, 0x2, 0x2, 0x75, 0x76, 0x3, 0x2, - 0x2, 0x2, 0x76, 0x79, 0x3, 0x2, 0x2, 0x2, 0x77, 0x75, 0x3, 0x2, 0x2, - 0x2, 0x78, 0x71, 0x3, 0x2, 0x2, 0x2, 0x78, 0x79, 0x3, 0x2, 0x2, 0x2, - 0x79, 0x11, 0x3, 0x2, 0x2, 0x2, 0x7a, 0x7b, 0x5, 0x8, 0x5, 0x2, 0x7b, - 0x13, 0x3, 0x2, 0x2, 0x2, 0x7c, 0x7d, 0x7, 0x9, 0x2, 0x2, 0x7d, 0x7e, - 0x5, 0x8, 0x5, 0x2, 0x7e, 0x15, 0x3, 0x2, 0x2, 0x2, 0x7f, 0x83, 0x7, - 0xa, 0x2, 0x2, 0x80, 0x82, 0x5, 0x20, 0x11, 0x2, 0x81, 0x80, 0x3, - 0x2, 0x2, 0x2, 0x82, 0x85, 0x3, 0x2, 0x2, 0x2, 0x83, 0x81, 0x3, 0x2, - 0x2, 0x2, 0x83, 0x84, 0x3, 0x2, 0x2, 0x2, 0x84, 0x86, 0x3, 0x2, 0x2, - 0x2, 0x85, 0x83, 0x3, 0x2, 0x2, 0x2, 0x86, 0x87, 0x7, 0xb, 0x2, 0x2, - 0x87, 0x17, 0x3, 0x2, 0x2, 0x2, 0x88, 0x89, 0x7, 0xc, 0x2, 0x2, 0x89, - 0x8a, 0x5, 0x4a, 0x26, 0x2, 0x8a, 0x8e, 0x7, 0xa, 0x2, 0x2, 0x8b, - 0x8d, 0x5, 0x1a, 0xe, 0x2, 0x8c, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x8d, - 0x90, 0x3, 0x2, 0x2, 0x2, 0x8e, 0x8c, 0x3, 0x2, 0x2, 0x2, 0x8e, 0x8f, - 0x3, 0x2, 0x2, 0x2, 0x8f, 0x91, 0x3, 0x2, 0x2, 0x2, 0x90, 0x8e, 0x3, - 0x2, 0x2, 0x2, 0x91, 0x92, 0x7, 0xb, 0x2, 0x2, 0x92, 0x19, 0x3, 0x2, - 0x2, 0x2, 0x93, 0x96, 0x5, 0x1c, 0xf, 0x2, 0x94, 0x96, 0x5, 0x1e, - 0x10, 0x2, 0x95, 0x93, 0x3, 0x2, 0x2, 0x2, 0x95, 0x94, 0x3, 0x2, - 0x2, 0x2, 0x96, 0x1b, 0x3, 0x2, 0x2, 0x2, 0x97, 0x98, 0x5, 0x8, 0x5, - 0x2, 0x98, 0x1d, 0x3, 0x2, 0x2, 0x2, 0x99, 0x9a, 0x5, 0xe, 0x8, 0x2, - 0x9a, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x9b, 0xa2, 0x5, 0x6, 0x4, 0x2, 0x9c, - 0xa2, 0x5, 0x22, 0x12, 0x2, 0x9d, 0xa2, 0x5, 0x26, 0x14, 0x2, 0x9e, - 0xa2, 0x5, 0x2a, 0x16, 0x2, 0x9f, 0xa2, 0x5, 0x2c, 0x17, 0x2, 0xa0, - 0xa2, 0x5, 0x2e, 0x18, 0x2, 0xa1, 0x9b, 0x3, 0x2, 0x2, 0x2, 0xa1, - 0x9c, 0x3, 0x2, 0x2, 0x2, 0xa1, 0x9d, 0x3, 0x2, 0x2, 0x2, 0xa1, 0x9e, - 0x3, 0x2, 0x2, 0x2, 0xa1, 0x9f, 0x3, 0x2, 0x2, 0x2, 0xa1, 0xa0, 0x3, - 0x2, 0x2, 0x2, 0xa2, 0x21, 0x3, 0x2, 0x2, 0x2, 0xa3, 0xa4, 0x5, 0x24, - 0x13, 0x2, 0xa4, 0x23, 0x3, 0x2, 0x2, 0x2, 0xa5, 0xa6, 0x7, 0xd, - 0x2, 0x2, 0xa6, 0xa7, 0x5, 0x2e, 0x18, 0x2, 0xa7, 0xa8, 0x5, 0x16, - 0xc, 0x2, 0xa8, 0x25, 0x3, 0x2, 0x2, 0x2, 0xa9, 0xaa, 0x5, 0x28, - 0x15, 0x2, 0xaa, 0x27, 0x3, 0x2, 0x2, 0x2, 0xab, 0xac, 0x7, 0xe, - 0x2, 0x2, 0xac, 0xad, 0x5, 0x2e, 0x18, 0x2, 0xad, 0xae, 0x5, 0x16, - 0xc, 0x2, 0xae, 0x29, 0x3, 0x2, 0x2, 0x2, 0xaf, 0xb0, 0x5, 0x3a, - 0x1e, 0x2, 0xb0, 0xb1, 0x7, 0x5, 0x2, 0x2, 0xb1, 0xb2, 0x5, 0x2e, - 0x18, 0x2, 0xb2, 0x2b, 0x3, 0x2, 0x2, 0x2, 0xb3, 0xb4, 0x7, 0xf, - 0x2, 0x2, 0xb4, 0xb5, 0x5, 0x2e, 0x18, 0x2, 0xb5, 0x2d, 0x3, 0x2, - 0x2, 0x2, 0xb6, 0xbe, 0x5, 0x34, 0x1b, 0x2, 0xb7, 0xbe, 0x5, 0x3c, - 0x1f, 0x2, 0xb8, 0xbe, 0x5, 0x3a, 0x1e, 0x2, 0xb9, 0xbe, 0x5, 0x3e, - 0x20, 0x2, 0xba, 0xbe, 0x5, 0x40, 0x21, 0x2, 0xbb, 0xbe, 0x5, 0x42, - 0x22, 0x2, 0xbc, 0xbe, 0x5, 0x36, 0x1c, 0x2, 0xbd, 0xb6, 0x3, 0x2, - 0x2, 0x2, 0xbd, 0xb7, 0x3, 0x2, 0x2, 0x2, 0xbd, 0xb8, 0x3, 0x2, 0x2, - 0x2, 0xbd, 0xb9, 0x3, 0x2, 0x2, 0x2, 0xbd, 0xba, 0x3, 0x2, 0x2, 0x2, - 0xbd, 0xbb, 0x3, 0x2, 0x2, 0x2, 0xbd, 0xbc, 0x3, 0x2, 0x2, 0x2, 0xbe, - 0x2f, 0x3, 0x2, 0x2, 0x2, 0xbf, 0xc6, 0x5, 0x34, 0x1b, 0x2, 0xc0, - 0xc6, 0x5, 0x3c, 0x1f, 0x2, 0xc1, 0xc6, 0x5, 0x3a, 0x1e, 0x2, 0xc2, - 0xc6, 0x5, 0x3e, 0x20, 0x2, 0xc3, 0xc6, 0x5, 0x40, 0x21, 0x2, 0xc4, - 0xc6, 0x5, 0x42, 0x22, 0x2, 0xc5, 0xbf, 0x3, 0x2, 0x2, 0x2, 0xc5, - 0xc0, 0x3, 0x2, 0x2, 0x2, 0xc5, 0xc1, 0x3, 0x2, 0x2, 0x2, 0xc5, 0xc2, - 0x3, 0x2, 0x2, 0x2, 0xc5, 0xc3, 0x3, 0x2, 0x2, 0x2, 0xc5, 0xc4, 0x3, - 0x2, 0x2, 0x2, 0xc6, 0x31, 0x3, 0x2, 0x2, 0x2, 0xc7, 0xcc, 0x5, 0x34, - 0x1b, 0x2, 0xc8, 0xcc, 0x5, 0x3a, 0x1e, 0x2, 0xc9, 0xcc, 0x5, 0x40, - 0x21, 0x2, 0xca, 0xcc, 0x5, 0x42, 0x22, 0x2, 0xcb, 0xc7, 0x3, 0x2, - 0x2, 0x2, 0xcb, 0xc8, 0x3, 0x2, 0x2, 0x2, 0xcb, 0xc9, 0x3, 0x2, 0x2, - 0x2, 0xcb, 0xca, 0x3, 0x2, 0x2, 0x2, 0xcc, 0x33, 0x3, 0x2, 0x2, 0x2, - 0xcd, 0xce, 0x5, 0x44, 0x23, 0x2, 0xce, 0xd7, 0x7, 0x7, 0x2, 0x2, - 0xcf, 0xd4, 0x5, 0x2e, 0x18, 0x2, 0xd0, 0xd1, 0x7, 0x9, 0x2, 0x2, - 0xd1, 0xd3, 0x5, 0x2e, 0x18, 0x2, 0xd2, 0xd0, 0x3, 0x2, 0x2, 0x2, - 0xd3, 0xd6, 0x3, 0x2, 0x2, 0x2, 0xd4, 0xd2, 0x3, 0x2, 0x2, 0x2, 0xd4, - 0xd5, 0x3, 0x2, 0x2, 0x2, 0xd5, 0xd8, 0x3, 0x2, 0x2, 0x2, 0xd6, 0xd4, - 0x3, 0x2, 0x2, 0x2, 0xd7, 0xcf, 0x3, 0x2, 0x2, 0x2, 0xd7, 0xd8, 0x3, - 0x2, 0x2, 0x2, 0xd8, 0xd9, 0x3, 0x2, 0x2, 0x2, 0xd9, 0xda, 0x7, 0x8, - 0x2, 0x2, 0xda, 0x35, 0x3, 0x2, 0x2, 0x2, 0xdb, 0xdc, 0x5, 0x38, - 0x1d, 0x2, 0xdc, 0x37, 0x3, 0x2, 0x2, 0x2, 0xdd, 0xde, 0x5, 0x30, - 0x19, 0x2, 0xde, 0xdf, 0x7, 0x13, 0x2, 0x2, 0xdf, 0xe4, 0x5, 0x30, - 0x19, 0x2, 0xe0, 0xe1, 0x7, 0x13, 0x2, 0x2, 0xe1, 0xe3, 0x5, 0x30, - 0x19, 0x2, 0xe2, 0xe0, 0x3, 0x2, 0x2, 0x2, 0xe3, 0xe6, 0x3, 0x2, - 0x2, 0x2, 0xe4, 0xe2, 0x3, 0x2, 0x2, 0x2, 0xe4, 0xe5, 0x3, 0x2, 0x2, - 0x2, 0xe5, 0x39, 0x3, 0x2, 0x2, 0x2, 0xe6, 0xe4, 0x3, 0x2, 0x2, 0x2, - 0xe7, 0xe8, 0x5, 0x46, 0x24, 0x2, 0xe8, 0x3b, 0x3, 0x2, 0x2, 0x2, - 0xe9, 0xea, 0x7, 0x14, 0x2, 0x2, 0xea, 0x3d, 0x3, 0x2, 0x2, 0x2, - 0xeb, 0xec, 0x5, 0x32, 0x1a, 0x2, 0xec, 0xed, 0x7, 0x10, 0x2, 0x2, - 0xed, 0xee, 0x5, 0x2e, 0x18, 0x2, 0xee, 0xef, 0x7, 0x11, 0x2, 0x2, - 0xef, 0x3f, 0x3, 0x2, 0x2, 0x2, 0xf0, 0xf1, 0x5, 0x3a, 0x1e, 0x2, - 0xf1, 0xf2, 0x7, 0x12, 0x2, 0x2, 0xf2, 0xf3, 0x5, 0x3a, 0x1e, 0x2, - 0xf3, 0x41, 0x3, 0x2, 0x2, 0x2, 0xf4, 0xf5, 0x7, 0x7, 0x2, 0x2, 0xf5, - 0xf6, 0x5, 0x2e, 0x18, 0x2, 0xf6, 0xf7, 0x7, 0x8, 0x2, 0x2, 0xf7, - 0x43, 0x3, 0x2, 0x2, 0x2, 0xf8, 0xf9, 0x7, 0x15, 0x2, 0x2, 0xf9, - 0x45, 0x3, 0x2, 0x2, 0x2, 0xfa, 0xfb, 0x7, 0x15, 0x2, 0x2, 0xfb, - 0x47, 0x3, 0x2, 0x2, 0x2, 0xfc, 0xfd, 0x7, 0x15, 0x2, 0x2, 0xfd, - 0x49, 0x3, 0x2, 0x2, 0x2, 0xfe, 0xff, 0x7, 0x15, 0x2, 0x2, 0xff, - 0x4b, 0x3, 0x2, 0x2, 0x2, 0x11, 0x4f, 0x56, 0x61, 0x75, 0x78, 0x83, - 0x8e, 0x95, 0xa1, 0xbd, 0xc5, 0xcb, 0xd4, 0xd7, 0xe4, + 0x9, 0x23, 0x4, 0x24, 0x9, 0x24, 0x4, 0x25, 0x9, 0x25, 0x3, 0x2, + 0x6, 0x2, 0x4c, 0xa, 0x2, 0xd, 0x2, 0xe, 0x2, 0x4d, 0x3, 0x2, 0x3, + 0x2, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x5, 0x3, 0x55, 0xa, 0x3, 0x3, + 0x4, 0x3, 0x4, 0x3, 0x4, 0x3, 0x5, 0x3, 0x5, 0x3, 0x5, 0x3, 0x5, + 0x3, 0x5, 0x3, 0x5, 0x5, 0x5, 0x60, 0xa, 0x5, 0x3, 0x6, 0x3, 0x6, + 0x3, 0x7, 0x3, 0x7, 0x3, 0x7, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, + 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x8, 0x3, 0x9, + 0x3, 0x9, 0x3, 0x9, 0x7, 0x9, 0x73, 0xa, 0x9, 0xc, 0x9, 0xe, 0x9, + 0x76, 0xb, 0x9, 0x5, 0x9, 0x78, 0xa, 0x9, 0x3, 0xa, 0x3, 0xa, 0x7, + 0xa, 0x7c, 0xa, 0xa, 0xc, 0xa, 0xe, 0xa, 0x7f, 0xb, 0xa, 0x3, 0xa, + 0x3, 0xa, 0x3, 0xb, 0x3, 0xb, 0x3, 0xb, 0x3, 0xb, 0x7, 0xb, 0x87, + 0xa, 0xb, 0xc, 0xb, 0xe, 0xb, 0x8a, 0xb, 0xb, 0x3, 0xb, 0x3, 0xb, + 0x3, 0xc, 0x3, 0xc, 0x5, 0xc, 0x90, 0xa, 0xc, 0x3, 0xd, 0x3, 0xd, + 0x3, 0xe, 0x3, 0xe, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, 0xf, 0x3, + 0xf, 0x3, 0xf, 0x5, 0xf, 0x9c, 0xa, 0xf, 0x3, 0x10, 0x3, 0x10, 0x3, + 0x11, 0x3, 0x11, 0x3, 0x11, 0x3, 0x11, 0x3, 0x12, 0x3, 0x12, 0x3, + 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x13, 0x3, 0x14, 0x3, 0x14, 0x3, + 0x14, 0x3, 0x14, 0x3, 0x15, 0x3, 0x15, 0x3, 0x15, 0x3, 0x16, 0x3, + 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x3, 0x16, 0x5, + 0x16, 0xb8, 0xa, 0x16, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, 0x3, 0x17, + 0x3, 0x17, 0x3, 0x17, 0x5, 0x17, 0xc0, 0xa, 0x17, 0x3, 0x18, 0x3, + 0x18, 0x3, 0x18, 0x3, 0x18, 0x3, 0x18, 0x5, 0x18, 0xc7, 0xa, 0x18, + 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, 0x3, 0x19, + 0x5, 0x19, 0xcf, 0xa, 0x19, 0x3, 0x1a, 0x3, 0x1a, 0x3, 0x1a, 0x3, + 0x1a, 0x3, 0x1a, 0x7, 0x1a, 0xd6, 0xa, 0x1a, 0xc, 0x1a, 0xe, 0x1a, + 0xd9, 0xb, 0x1a, 0x5, 0x1a, 0xdb, 0xa, 0x1a, 0x3, 0x1a, 0x3, 0x1a, + 0x3, 0x1b, 0x3, 0x1b, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, 0x3, 0x1c, + 0x3, 0x1c, 0x7, 0x1c, 0xe6, 0xa, 0x1c, 0xc, 0x1c, 0xe, 0x1c, 0xe9, + 0xb, 0x1c, 0x3, 0x1d, 0x3, 0x1d, 0x3, 0x1e, 0x3, 0x1e, 0x3, 0x1f, + 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x1f, 0x3, 0x20, 0x3, 0x20, + 0x3, 0x20, 0x3, 0x20, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, 0x3, 0x21, + 0x3, 0x22, 0x3, 0x22, 0x3, 0x23, 0x3, 0x23, 0x3, 0x24, 0x3, 0x24, + 0x3, 0x25, 0x3, 0x25, 0x3, 0x25, 0x2, 0x2, 0x26, 0x2, 0x4, 0x6, 0x8, + 0xa, 0xc, 0xe, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1a, 0x1c, 0x1e, 0x20, + 0x22, 0x24, 0x26, 0x28, 0x2a, 0x2c, 0x2e, 0x30, 0x32, 0x34, 0x36, + 0x38, 0x3a, 0x3c, 0x3e, 0x40, 0x42, 0x44, 0x46, 0x48, 0x2, 0x2, 0x2, + 0x104, 0x2, 0x4b, 0x3, 0x2, 0x2, 0x2, 0x4, 0x54, 0x3, 0x2, 0x2, 0x2, + 0x6, 0x56, 0x3, 0x2, 0x2, 0x2, 0x8, 0x59, 0x3, 0x2, 0x2, 0x2, 0xa, + 0x61, 0x3, 0x2, 0x2, 0x2, 0xc, 0x63, 0x3, 0x2, 0x2, 0x2, 0xe, 0x66, + 0x3, 0x2, 0x2, 0x2, 0x10, 0x77, 0x3, 0x2, 0x2, 0x2, 0x12, 0x79, 0x3, + 0x2, 0x2, 0x2, 0x14, 0x82, 0x3, 0x2, 0x2, 0x2, 0x16, 0x8f, 0x3, 0x2, + 0x2, 0x2, 0x18, 0x91, 0x3, 0x2, 0x2, 0x2, 0x1a, 0x93, 0x3, 0x2, 0x2, + 0x2, 0x1c, 0x9b, 0x3, 0x2, 0x2, 0x2, 0x1e, 0x9d, 0x3, 0x2, 0x2, 0x2, + 0x20, 0x9f, 0x3, 0x2, 0x2, 0x2, 0x22, 0xa3, 0x3, 0x2, 0x2, 0x2, 0x24, + 0xa5, 0x3, 0x2, 0x2, 0x2, 0x26, 0xa9, 0x3, 0x2, 0x2, 0x2, 0x28, 0xad, + 0x3, 0x2, 0x2, 0x2, 0x2a, 0xb7, 0x3, 0x2, 0x2, 0x2, 0x2c, 0xbf, 0x3, + 0x2, 0x2, 0x2, 0x2e, 0xc6, 0x3, 0x2, 0x2, 0x2, 0x30, 0xce, 0x3, 0x2, + 0x2, 0x2, 0x32, 0xd0, 0x3, 0x2, 0x2, 0x2, 0x34, 0xde, 0x3, 0x2, 0x2, + 0x2, 0x36, 0xe0, 0x3, 0x2, 0x2, 0x2, 0x38, 0xea, 0x3, 0x2, 0x2, 0x2, + 0x3a, 0xec, 0x3, 0x2, 0x2, 0x2, 0x3c, 0xee, 0x3, 0x2, 0x2, 0x2, 0x3e, + 0xf3, 0x3, 0x2, 0x2, 0x2, 0x40, 0xf7, 0x3, 0x2, 0x2, 0x2, 0x42, 0xfb, + 0x3, 0x2, 0x2, 0x2, 0x44, 0xfd, 0x3, 0x2, 0x2, 0x2, 0x46, 0xff, 0x3, + 0x2, 0x2, 0x2, 0x48, 0x101, 0x3, 0x2, 0x2, 0x2, 0x4a, 0x4c, 0x5, + 0x4, 0x3, 0x2, 0x4b, 0x4a, 0x3, 0x2, 0x2, 0x2, 0x4c, 0x4d, 0x3, 0x2, + 0x2, 0x2, 0x4d, 0x4b, 0x3, 0x2, 0x2, 0x2, 0x4d, 0x4e, 0x3, 0x2, 0x2, + 0x2, 0x4e, 0x4f, 0x3, 0x2, 0x2, 0x2, 0x4f, 0x50, 0x7, 0x2, 0x2, 0x3, + 0x50, 0x3, 0x3, 0x2, 0x2, 0x2, 0x51, 0x55, 0x5, 0x6, 0x4, 0x2, 0x52, + 0x55, 0x5, 0xc, 0x7, 0x2, 0x53, 0x55, 0x5, 0x14, 0xb, 0x2, 0x54, + 0x51, 0x3, 0x2, 0x2, 0x2, 0x54, 0x52, 0x3, 0x2, 0x2, 0x2, 0x54, 0x53, + 0x3, 0x2, 0x2, 0x2, 0x55, 0x5, 0x3, 0x2, 0x2, 0x2, 0x56, 0x57, 0x7, + 0x3, 0x2, 0x2, 0x57, 0x58, 0x5, 0x8, 0x5, 0x2, 0x58, 0x7, 0x3, 0x2, + 0x2, 0x2, 0x59, 0x5a, 0x5, 0x44, 0x23, 0x2, 0x5a, 0x5b, 0x7, 0x4, + 0x2, 0x2, 0x5b, 0x5c, 0x5, 0xa, 0x6, 0x2, 0x5c, 0x5f, 0x3, 0x2, 0x2, + 0x2, 0x5d, 0x5e, 0x7, 0x5, 0x2, 0x2, 0x5e, 0x60, 0x5, 0x2a, 0x16, + 0x2, 0x5f, 0x5d, 0x3, 0x2, 0x2, 0x2, 0x5f, 0x60, 0x3, 0x2, 0x2, 0x2, + 0x60, 0x9, 0x3, 0x2, 0x2, 0x2, 0x61, 0x62, 0x5, 0x46, 0x24, 0x2, + 0x62, 0xb, 0x3, 0x2, 0x2, 0x2, 0x63, 0x64, 0x7, 0x6, 0x2, 0x2, 0x64, + 0x65, 0x5, 0xe, 0x8, 0x2, 0x65, 0xd, 0x3, 0x2, 0x2, 0x2, 0x66, 0x67, + 0x5, 0x42, 0x22, 0x2, 0x67, 0x68, 0x7, 0x7, 0x2, 0x2, 0x68, 0x69, + 0x5, 0x10, 0x9, 0x2, 0x69, 0x6a, 0x7, 0x8, 0x2, 0x2, 0x6a, 0x6b, + 0x7, 0x4, 0x2, 0x2, 0x6b, 0x6c, 0x5, 0xa, 0x6, 0x2, 0x6c, 0x6d, 0x3, + 0x2, 0x2, 0x2, 0x6d, 0x6e, 0x5, 0x12, 0xa, 0x2, 0x6e, 0xf, 0x3, 0x2, + 0x2, 0x2, 0x6f, 0x74, 0x5, 0x8, 0x5, 0x2, 0x70, 0x71, 0x7, 0x9, 0x2, + 0x2, 0x71, 0x73, 0x5, 0x8, 0x5, 0x2, 0x72, 0x70, 0x3, 0x2, 0x2, 0x2, + 0x73, 0x76, 0x3, 0x2, 0x2, 0x2, 0x74, 0x72, 0x3, 0x2, 0x2, 0x2, 0x74, + 0x75, 0x3, 0x2, 0x2, 0x2, 0x75, 0x78, 0x3, 0x2, 0x2, 0x2, 0x76, 0x74, + 0x3, 0x2, 0x2, 0x2, 0x77, 0x6f, 0x3, 0x2, 0x2, 0x2, 0x77, 0x78, 0x3, + 0x2, 0x2, 0x2, 0x78, 0x11, 0x3, 0x2, 0x2, 0x2, 0x79, 0x7d, 0x7, 0xa, + 0x2, 0x2, 0x7a, 0x7c, 0x5, 0x1c, 0xf, 0x2, 0x7b, 0x7a, 0x3, 0x2, + 0x2, 0x2, 0x7c, 0x7f, 0x3, 0x2, 0x2, 0x2, 0x7d, 0x7b, 0x3, 0x2, 0x2, + 0x2, 0x7d, 0x7e, 0x3, 0x2, 0x2, 0x2, 0x7e, 0x80, 0x3, 0x2, 0x2, 0x2, + 0x7f, 0x7d, 0x3, 0x2, 0x2, 0x2, 0x80, 0x81, 0x7, 0xb, 0x2, 0x2, 0x81, + 0x13, 0x3, 0x2, 0x2, 0x2, 0x82, 0x83, 0x7, 0xc, 0x2, 0x2, 0x83, 0x84, + 0x5, 0x48, 0x25, 0x2, 0x84, 0x88, 0x7, 0xa, 0x2, 0x2, 0x85, 0x87, + 0x5, 0x16, 0xc, 0x2, 0x86, 0x85, 0x3, 0x2, 0x2, 0x2, 0x87, 0x8a, + 0x3, 0x2, 0x2, 0x2, 0x88, 0x86, 0x3, 0x2, 0x2, 0x2, 0x88, 0x89, 0x3, + 0x2, 0x2, 0x2, 0x89, 0x8b, 0x3, 0x2, 0x2, 0x2, 0x8a, 0x88, 0x3, 0x2, + 0x2, 0x2, 0x8b, 0x8c, 0x7, 0xb, 0x2, 0x2, 0x8c, 0x15, 0x3, 0x2, 0x2, + 0x2, 0x8d, 0x90, 0x5, 0x18, 0xd, 0x2, 0x8e, 0x90, 0x5, 0x1a, 0xe, + 0x2, 0x8f, 0x8d, 0x3, 0x2, 0x2, 0x2, 0x8f, 0x8e, 0x3, 0x2, 0x2, 0x2, + 0x90, 0x17, 0x3, 0x2, 0x2, 0x2, 0x91, 0x92, 0x5, 0x8, 0x5, 0x2, 0x92, + 0x19, 0x3, 0x2, 0x2, 0x2, 0x93, 0x94, 0x5, 0xe, 0x8, 0x2, 0x94, 0x1b, + 0x3, 0x2, 0x2, 0x2, 0x95, 0x9c, 0x5, 0x6, 0x4, 0x2, 0x96, 0x9c, 0x5, + 0x1e, 0x10, 0x2, 0x97, 0x9c, 0x5, 0x22, 0x12, 0x2, 0x98, 0x9c, 0x5, + 0x26, 0x14, 0x2, 0x99, 0x9c, 0x5, 0x28, 0x15, 0x2, 0x9a, 0x9c, 0x5, + 0x2a, 0x16, 0x2, 0x9b, 0x95, 0x3, 0x2, 0x2, 0x2, 0x9b, 0x96, 0x3, + 0x2, 0x2, 0x2, 0x9b, 0x97, 0x3, 0x2, 0x2, 0x2, 0x9b, 0x98, 0x3, 0x2, + 0x2, 0x2, 0x9b, 0x99, 0x3, 0x2, 0x2, 0x2, 0x9b, 0x9a, 0x3, 0x2, 0x2, + 0x2, 0x9c, 0x1d, 0x3, 0x2, 0x2, 0x2, 0x9d, 0x9e, 0x5, 0x20, 0x11, + 0x2, 0x9e, 0x1f, 0x3, 0x2, 0x2, 0x2, 0x9f, 0xa0, 0x7, 0xd, 0x2, 0x2, + 0xa0, 0xa1, 0x5, 0x2a, 0x16, 0x2, 0xa1, 0xa2, 0x5, 0x12, 0xa, 0x2, + 0xa2, 0x21, 0x3, 0x2, 0x2, 0x2, 0xa3, 0xa4, 0x5, 0x24, 0x13, 0x2, + 0xa4, 0x23, 0x3, 0x2, 0x2, 0x2, 0xa5, 0xa6, 0x7, 0xe, 0x2, 0x2, 0xa6, + 0xa7, 0x5, 0x2a, 0x16, 0x2, 0xa7, 0xa8, 0x5, 0x12, 0xa, 0x2, 0xa8, + 0x25, 0x3, 0x2, 0x2, 0x2, 0xa9, 0xaa, 0x5, 0x38, 0x1d, 0x2, 0xaa, + 0xab, 0x7, 0x5, 0x2, 0x2, 0xab, 0xac, 0x5, 0x2a, 0x16, 0x2, 0xac, + 0x27, 0x3, 0x2, 0x2, 0x2, 0xad, 0xae, 0x7, 0xf, 0x2, 0x2, 0xae, 0xaf, + 0x5, 0x2a, 0x16, 0x2, 0xaf, 0x29, 0x3, 0x2, 0x2, 0x2, 0xb0, 0xb8, + 0x5, 0x32, 0x1a, 0x2, 0xb1, 0xb8, 0x5, 0x3a, 0x1e, 0x2, 0xb2, 0xb8, + 0x5, 0x38, 0x1d, 0x2, 0xb3, 0xb8, 0x5, 0x3c, 0x1f, 0x2, 0xb4, 0xb8, + 0x5, 0x3e, 0x20, 0x2, 0xb5, 0xb8, 0x5, 0x40, 0x21, 0x2, 0xb6, 0xb8, + 0x5, 0x34, 0x1b, 0x2, 0xb7, 0xb0, 0x3, 0x2, 0x2, 0x2, 0xb7, 0xb1, + 0x3, 0x2, 0x2, 0x2, 0xb7, 0xb2, 0x3, 0x2, 0x2, 0x2, 0xb7, 0xb3, 0x3, + 0x2, 0x2, 0x2, 0xb7, 0xb4, 0x3, 0x2, 0x2, 0x2, 0xb7, 0xb5, 0x3, 0x2, + 0x2, 0x2, 0xb7, 0xb6, 0x3, 0x2, 0x2, 0x2, 0xb8, 0x2b, 0x3, 0x2, 0x2, + 0x2, 0xb9, 0xc0, 0x5, 0x32, 0x1a, 0x2, 0xba, 0xc0, 0x5, 0x3a, 0x1e, + 0x2, 0xbb, 0xc0, 0x5, 0x38, 0x1d, 0x2, 0xbc, 0xc0, 0x5, 0x3c, 0x1f, + 0x2, 0xbd, 0xc0, 0x5, 0x3e, 0x20, 0x2, 0xbe, 0xc0, 0x5, 0x40, 0x21, + 0x2, 0xbf, 0xb9, 0x3, 0x2, 0x2, 0x2, 0xbf, 0xba, 0x3, 0x2, 0x2, 0x2, + 0xbf, 0xbb, 0x3, 0x2, 0x2, 0x2, 0xbf, 0xbc, 0x3, 0x2, 0x2, 0x2, 0xbf, + 0xbd, 0x3, 0x2, 0x2, 0x2, 0xbf, 0xbe, 0x3, 0x2, 0x2, 0x2, 0xc0, 0x2d, + 0x3, 0x2, 0x2, 0x2, 0xc1, 0xc7, 0x5, 0x32, 0x1a, 0x2, 0xc2, 0xc7, + 0x5, 0x3a, 0x1e, 0x2, 0xc3, 0xc7, 0x5, 0x38, 0x1d, 0x2, 0xc4, 0xc7, + 0x5, 0x3e, 0x20, 0x2, 0xc5, 0xc7, 0x5, 0x40, 0x21, 0x2, 0xc6, 0xc1, + 0x3, 0x2, 0x2, 0x2, 0xc6, 0xc2, 0x3, 0x2, 0x2, 0x2, 0xc6, 0xc3, 0x3, + 0x2, 0x2, 0x2, 0xc6, 0xc4, 0x3, 0x2, 0x2, 0x2, 0xc6, 0xc5, 0x3, 0x2, + 0x2, 0x2, 0xc7, 0x2f, 0x3, 0x2, 0x2, 0x2, 0xc8, 0xcf, 0x5, 0x32, + 0x1a, 0x2, 0xc9, 0xcf, 0x5, 0x3a, 0x1e, 0x2, 0xca, 0xcf, 0x5, 0x38, + 0x1d, 0x2, 0xcb, 0xcf, 0x5, 0x3c, 0x1f, 0x2, 0xcc, 0xcf, 0x5, 0x40, + 0x21, 0x2, 0xcd, 0xcf, 0x5, 0x34, 0x1b, 0x2, 0xce, 0xc8, 0x3, 0x2, + 0x2, 0x2, 0xce, 0xc9, 0x3, 0x2, 0x2, 0x2, 0xce, 0xca, 0x3, 0x2, 0x2, + 0x2, 0xce, 0xcb, 0x3, 0x2, 0x2, 0x2, 0xce, 0xcc, 0x3, 0x2, 0x2, 0x2, + 0xce, 0xcd, 0x3, 0x2, 0x2, 0x2, 0xcf, 0x31, 0x3, 0x2, 0x2, 0x2, 0xd0, + 0xd1, 0x5, 0x42, 0x22, 0x2, 0xd1, 0xda, 0x7, 0x7, 0x2, 0x2, 0xd2, + 0xd7, 0x5, 0x2a, 0x16, 0x2, 0xd3, 0xd4, 0x7, 0x9, 0x2, 0x2, 0xd4, + 0xd6, 0x5, 0x2a, 0x16, 0x2, 0xd5, 0xd3, 0x3, 0x2, 0x2, 0x2, 0xd6, + 0xd9, 0x3, 0x2, 0x2, 0x2, 0xd7, 0xd5, 0x3, 0x2, 0x2, 0x2, 0xd7, 0xd8, + 0x3, 0x2, 0x2, 0x2, 0xd8, 0xdb, 0x3, 0x2, 0x2, 0x2, 0xd9, 0xd7, 0x3, + 0x2, 0x2, 0x2, 0xda, 0xd2, 0x3, 0x2, 0x2, 0x2, 0xda, 0xdb, 0x3, 0x2, + 0x2, 0x2, 0xdb, 0xdc, 0x3, 0x2, 0x2, 0x2, 0xdc, 0xdd, 0x7, 0x8, 0x2, + 0x2, 0xdd, 0x33, 0x3, 0x2, 0x2, 0x2, 0xde, 0xdf, 0x5, 0x36, 0x1c, + 0x2, 0xdf, 0x35, 0x3, 0x2, 0x2, 0x2, 0xe0, 0xe1, 0x5, 0x2c, 0x17, + 0x2, 0xe1, 0xe2, 0x7, 0x13, 0x2, 0x2, 0xe2, 0xe7, 0x5, 0x2c, 0x17, + 0x2, 0xe3, 0xe4, 0x7, 0x13, 0x2, 0x2, 0xe4, 0xe6, 0x5, 0x2c, 0x17, + 0x2, 0xe5, 0xe3, 0x3, 0x2, 0x2, 0x2, 0xe6, 0xe9, 0x3, 0x2, 0x2, 0x2, + 0xe7, 0xe5, 0x3, 0x2, 0x2, 0x2, 0xe7, 0xe8, 0x3, 0x2, 0x2, 0x2, 0xe8, + 0x37, 0x3, 0x2, 0x2, 0x2, 0xe9, 0xe7, 0x3, 0x2, 0x2, 0x2, 0xea, 0xeb, + 0x5, 0x44, 0x23, 0x2, 0xeb, 0x39, 0x3, 0x2, 0x2, 0x2, 0xec, 0xed, + 0x7, 0x14, 0x2, 0x2, 0xed, 0x3b, 0x3, 0x2, 0x2, 0x2, 0xee, 0xef, + 0x5, 0x2e, 0x18, 0x2, 0xef, 0xf0, 0x7, 0x10, 0x2, 0x2, 0xf0, 0xf1, + 0x5, 0x2a, 0x16, 0x2, 0xf1, 0xf2, 0x7, 0x11, 0x2, 0x2, 0xf2, 0x3d, + 0x3, 0x2, 0x2, 0x2, 0xf3, 0xf4, 0x5, 0x38, 0x1d, 0x2, 0xf4, 0xf5, + 0x7, 0x12, 0x2, 0x2, 0xf5, 0xf6, 0x5, 0x38, 0x1d, 0x2, 0xf6, 0x3f, + 0x3, 0x2, 0x2, 0x2, 0xf7, 0xf8, 0x7, 0x7, 0x2, 0x2, 0xf8, 0xf9, 0x5, + 0x2a, 0x16, 0x2, 0xf9, 0xfa, 0x7, 0x8, 0x2, 0x2, 0xfa, 0x41, 0x3, + 0x2, 0x2, 0x2, 0xfb, 0xfc, 0x7, 0x15, 0x2, 0x2, 0xfc, 0x43, 0x3, + 0x2, 0x2, 0x2, 0xfd, 0xfe, 0x7, 0x15, 0x2, 0x2, 0xfe, 0x45, 0x3, + 0x2, 0x2, 0x2, 0xff, 0x100, 0x7, 0x15, 0x2, 0x2, 0x100, 0x47, 0x3, + 0x2, 0x2, 0x2, 0x101, 0x102, 0x7, 0x15, 0x2, 0x2, 0x102, 0x49, 0x3, + 0x2, 0x2, 0x2, 0x12, 0x4d, 0x54, 0x5f, 0x74, 0x77, 0x7d, 0x88, 0x8f, + 0x9b, 0xb7, 0xbf, 0xc6, 0xce, 0xd7, 0xda, 0xe7, }; _serializedATN.insert(_serializedATN.end(), serializedATNSegment0, diff --git a/gen/TocParser.h b/gen/TocParser.h index 6dc941c..a1438fb 100644 --- a/gen/TocParser.h +++ b/gen/TocParser.h @@ -20,14 +20,14 @@ public: enum { RuleProg = 0, RuleDecl = 1, RuleVarDecl = 2, RuleVar = 3, RuleType = 4, - RuleFuncDecl = 5, RuleFunc = 6, RuleParameter = 7, RuleFirstParameter = 8, - RuleAdditionalParameter = 9, RuleBody = 10, RuleStructDecl = 11, RuleStructMember = 12, - RuleStructVar = 13, RuleStructMethod = 14, RuleStmt = 15, RuleConditional = 16, - RuleIfCond = 17, RuleLoop = 18, RuleWhileLoop = 19, RuleAssignment = 20, - RuleReturnStmt = 21, RuleExpr = 22, RuleNonOpExpr = 23, RuleNonSubscriptExpr = 24, - RuleFuncCall = 25, RuleOperatorExpr = 26, RuleBinaryOperator = 27, RuleIdentifier = 28, - RuleLiteral = 29, RuleSubscript = 30, RuleMemberAccess = 31, RuleParenExpr = 32, - RuleFuncName = 33, RuleVarName = 34, RuleTypeName = 35, RuleStructName = 36 + RuleFuncDecl = 5, RuleFunc = 6, RuleParameter = 7, RuleBody = 8, RuleStructDecl = 9, + RuleStructMember = 10, RuleStructVar = 11, RuleStructMethod = 12, RuleStmt = 13, + RuleConditional = 14, RuleIfCond = 15, RuleLoop = 16, RuleWhileLoop = 17, + RuleAssignment = 18, RuleReturnStmt = 19, RuleExpr = 20, RuleNonOpExpr = 21, + RuleNonSubscriptExpr = 22, RuleNonAccessExpr = 23, RuleFuncCall = 24, + RuleOperatorExpr = 25, RuleBinaryOperator = 26, RuleIdentifier = 27, + RuleLiteral = 28, RuleSubscript = 29, RuleMemberAccess = 30, RuleParenExpr = 31, + RuleFuncName = 32, RuleVarName = 33, RuleTypeName = 34, RuleStructName = 35 }; explicit TocParser(antlr4::TokenStream *input); @@ -48,8 +48,6 @@ public: class FuncDeclContext; class FuncContext; class ParameterContext; - class FirstParameterContext; - class AdditionalParameterContext; class BodyContext; class StructDeclContext; class StructMemberContext; @@ -65,6 +63,7 @@ public: class ExprContext; class NonOpExprContext; class NonSubscriptExprContext; + class NonAccessExprContext; class FuncCallContext; class OperatorExprContext; class BinaryOperatorContext; @@ -182,9 +181,8 @@ public: public: ParameterContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - FirstParameterContext *firstParameter(); - std::vector additionalParameter(); - AdditionalParameterContext* additionalParameter(size_t i); + std::vector var(); + VarContext* var(size_t i); virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override; virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override; @@ -193,32 +191,6 @@ public: ParameterContext* parameter(); - class FirstParameterContext : public antlr4::ParserRuleContext { - public: - FirstParameterContext(antlr4::ParserRuleContext *parent, size_t invokingState); - virtual size_t getRuleIndex() const override; - VarContext *var(); - - virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override; - virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override; - - }; - - FirstParameterContext* firstParameter(); - - class AdditionalParameterContext : public antlr4::ParserRuleContext { - public: - AdditionalParameterContext(antlr4::ParserRuleContext *parent, size_t invokingState); - virtual size_t getRuleIndex() const override; - VarContext *var(); - - virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override; - virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override; - - }; - - AdditionalParameterContext* additionalParameter(); - class BodyContext : public antlr4::ParserRuleContext { public: BodyContext(antlr4::ParserRuleContext *parent, size_t invokingState); @@ -429,6 +401,7 @@ public: NonSubscriptExprContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; FuncCallContext *funcCall(); + LiteralContext *literal(); IdentifierContext *identifier(); MemberAccessContext *memberAccess(); ParenExprContext *parenExpr(); @@ -440,6 +413,24 @@ public: NonSubscriptExprContext* nonSubscriptExpr(); + class NonAccessExprContext : public antlr4::ParserRuleContext { + public: + NonAccessExprContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + FuncCallContext *funcCall(); + LiteralContext *literal(); + IdentifierContext *identifier(); + SubscriptContext *subscript(); + ParenExprContext *parenExpr(); + OperatorExprContext *operatorExpr(); + + virtual void enterRule(antlr4::tree::ParseTreeListener *listener) override; + virtual void exitRule(antlr4::tree::ParseTreeListener *listener) override; + + }; + + NonAccessExprContext* nonAccessExpr(); + class FuncCallContext : public antlr4::ParserRuleContext { public: FuncCallContext(antlr4::ParserRuleContext *parent, size_t invokingState); diff --git a/src/main.cpp b/src/main.cpp index a7742ac..7d8d5c7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,12 +32,6 @@ int main(int argc, const char * argv[]) { //std::cout << "Parse Tree: " << s << std::endl; - //toc(std::cout, prog); - - //std::ofstream ofs("output.c"); - //toc(ofs, prog); - //ofs.close(); - Program prg = getProgram(prog); std::cout << "Variables:\n"; for (auto v : prg.variables) @@ -46,5 +40,11 @@ int main(int argc, const char * argv[]) { for (auto f : prg.functions) std::cout << " " << f.name << endl; + tocProgram(std::cout, prg); + + //std::ofstream ofs("output.c"); + //tocProg(ofs, prg); + //ofs.close(); + return 0; } \ No newline at end of file diff --git a/src/repr.h b/src/repr.h index ce176ef..6737ef4 100644 --- a/src/repr.h +++ b/src/repr.h @@ -43,6 +43,7 @@ struct Body { }; struct Function { + Type returnType; std::string name; std::vector parameters; Body body; @@ -65,7 +66,7 @@ enum class ExprType { }; struct CallExpr { - Function function; + std::string functionName; std::vector arguments; }; @@ -78,11 +79,8 @@ struct VariableExpr { }; struct BracketsExpr { - BracketsExpr() {} - BracketsExpr(const BracketsExpr &) {} - BracketsExpr & operator=(const BracketsExpr &) {return *this;}; - std::unique_ptr lexpr; - std::unique_ptr rexpr; + std::shared_ptr lexpr; + std::shared_ptr rexpr; }; enum class OperatorType { @@ -92,19 +90,13 @@ enum class OperatorType { }; struct OperatorExpr { - OperatorExpr() {} - OperatorExpr(const OperatorExpr &) {} - OperatorExpr & operator=(const OperatorExpr &) {return *this;}; - std::unique_ptr lexpr; - std::unique_ptr rexpr; + std::shared_ptr lexpr; + std::shared_ptr rexpr; OperatorType type; }; struct DotExpr { - DotExpr() {} - DotExpr(const DotExpr &) {} - DotExpr & operator=(const DotExpr &) {return *this;}; - std::unique_ptr lexpr; + std::shared_ptr lexpr; std::string name; }; diff --git a/src/repr_get.h b/src/repr_get.h index 67ff40f..7dbeea3 100644 --- a/src/repr_get.h +++ b/src/repr_get.h @@ -2,15 +2,17 @@ #include "repr.h" -Type getType(TocParser::TypeContext * ctx); -Variable getVariable(TocParser::VarContext * ctx); -Body getBody(TocParser::BodyContext * ctx); -Function getFunction(TocParser::FuncContext * ctx); -Struct getStruct(TocParser::StructDeclContext * ctx); -Program getProgram(TocParser::ProgContext * ctx); +Type getType(TocParser::TypeContext * ctx); +Variable getVariable(TocParser::VarContext * ctx); +Body getBody(TocParser::BodyContext * ctx); +Function getFunction(TocParser::FuncContext * ctx); +Struct getStruct(TocParser::StructDeclContext * ctx); +Program getProgram(TocParser::ProgContext * ctx); OperatorExpr getOperatorExpr(TocParser::OperatorExprContext * ctx); -Expr getExpression(TocParser::ExprContext * ctx); -Stmt getStmt(TocParser::StmtContext * ctx); +Expr getExpr(TocParser::NonOpExprContext * ctx); +Expr getExpr(TocParser::NonSubscriptExprContext * ctx); +Expr getExpr(TocParser::ExprContext * ctx); +Stmt getStmt(TocParser::StmtContext * ctx); Type getType(TocParser::TypeContext * ctx) { Type result; @@ -38,10 +40,10 @@ Body getBody(TocParser::BodyContext * ctx) { Function getFunction(TocParser::FuncContext * ctx) { Function result; result.name = ctx->funcName()->NAME()->toString(); - if (ctx->parameter()->firstParameter() != nullptr) { - result.parameters.push_back(getVariable(ctx->parameter()->firstParameter()->var())); - for (auto p : ctx->parameter()->additionalParameter()) - result.parameters.push_back(getVariable(p->var())); + result.returnType = getType(ctx->type()); + if (!ctx->parameter()->var().empty()) { + for (auto p : ctx->parameter()->var()) + result.parameters.push_back(getVariable(p)); } result.body = getBody(ctx->body()); return result; @@ -76,8 +78,9 @@ Program getProgram(TocParser::ProgContext * ctx) { } OperatorExpr getOperatorExpr(TocParser::OperatorExprContext * ctx) { OperatorExpr result; - //result.lexpr = getExpr(ctx->binaryOperator()->nonOpExpr(0)); - //result.rexpr = getExpr(ctx->binaryOperator()->nonOpExpr(1)); + result.lexpr = std::make_unique(getExpr(ctx->binaryOperator()->nonOpExpr(0))); + result.rexpr = std::make_unique(getExpr(ctx->binaryOperator()->nonOpExpr(1))); + std::string op = ctx->binaryOperator()->BINARY_OPERATOR(0)->toString(); if (op == "+") result.type = OperatorType::Plus; if (op == "-") result.type = OperatorType::Minus; @@ -89,13 +92,66 @@ OperatorExpr getOperatorExpr(TocParser::OperatorExprContext * ctx) { if (op == ">") result.type = OperatorType::GreaterThan; return result; } +Expr getExpr(TocParser::NonOpExprContext * ctx) { + Expr result; + if (ctx->funcCall() != nullptr) { + result.type = ExprType::Call; + for (auto e : ctx->funcCall()->expr()) + result._call.arguments.push_back(getExpr(e)); + result._call.functionName = ctx->funcCall()->funcName()->NAME()->toString(); + } + if (ctx->literal() != nullptr) { + result.type = ExprType::Literal; + result._literal.i = atoi(ctx->literal()->INTLIT()->toString().c_str()); + } + if (ctx->identifier() != nullptr) { + result.type = ExprType::Variable; + result._variable.name = ctx->identifier()->varName()->NAME()->toString(); + } + if (ctx->subscript() != nullptr) { + result.type = ExprType::Brackets; + result._brackets.lexpr = std::make_unique(getExpr(ctx->subscript()->nonSubscriptExpr())); + result._brackets.rexpr = std::make_unique(getExpr(ctx->subscript()->expr())); + } + if (ctx->memberAccess() != nullptr) { + result.type = ExprType::Dot; + Expr e; e.type = ExprType::Variable; e._variable.name = ctx->memberAccess()->identifier(0)->varName()->NAME()->toString(); + result._dot.lexpr = std::make_unique(e); + result._dot.name = ctx->memberAccess()->identifier(1)->varName()->NAME()->toString(); + } + return result; +} +Expr getExpr(TocParser::NonSubscriptExprContext * ctx) { + Expr result; + if (ctx->funcCall() != nullptr) { + result.type = ExprType::Call; + for (auto e : ctx->funcCall()->expr()) + result._call.arguments.push_back(getExpr(e)); + result._call.functionName = ctx->funcCall()->funcName()->NAME()->toString(); + } + if (ctx->literal() != nullptr) { + result.type = ExprType::Literal; + result._literal.i = atoi(ctx->literal()->INTLIT()->toString().c_str()); + } + if (ctx->identifier() != nullptr) { + result.type = ExprType::Variable; + result._variable.name = ctx->identifier()->varName()->NAME()->toString(); + } + if (ctx->memberAccess() != nullptr) { + result.type = ExprType::Dot; + Expr e; e.type = ExprType::Variable; e._variable.name = ctx->memberAccess()->identifier(0)->varName()->NAME()->toString(); + result._dot.lexpr = std::make_unique(e); + result._dot.name = ctx->memberAccess()->identifier(1)->varName()->NAME()->toString(); + } + return result; +} Expr getExpr(TocParser::ExprContext * ctx) { Expr result; if (ctx->funcCall() != nullptr) { result.type = ExprType::Call; for (auto e : ctx->funcCall()->expr()) result._call.arguments.push_back(getExpr(e)); - //result._call.function = ctx->funcCall()->funcName(); + result._call.functionName = ctx->funcCall()->funcName()->NAME()->toString(); } if (ctx->literal() != nullptr) { result.type = ExprType::Literal; @@ -107,12 +163,13 @@ Expr getExpr(TocParser::ExprContext * ctx) { } if (ctx->subscript() != nullptr) { result.type = ExprType::Brackets; - //result._brackets.lexpr = getExpr(ctx->subscript()->nonSubscriptExpr()); + result._brackets.lexpr = std::make_unique(getExpr(ctx->subscript()->nonSubscriptExpr())); result._brackets.rexpr = std::make_unique(getExpr(ctx->subscript()->expr())); } if (ctx->memberAccess() != nullptr) { result.type = ExprType::Dot; - //result._dot.lexpr = ctx->memberAccess()->identifier(0); + Expr e; e.type = ExprType::Variable; e._variable.name = ctx->memberAccess()->identifier(0)->varName()->NAME()->toString(); + result._dot.lexpr = std::make_unique(e); result._dot.name = ctx->memberAccess()->identifier(1)->varName()->NAME()->toString(); } if (ctx->operatorExpr() != nullptr) { diff --git a/src/toc.h b/src/toc.h index b36d878..642bc37 100644 --- a/src/toc.h +++ b/src/toc.h @@ -2,273 +2,423 @@ #include -#include "TocParser.h" - -void toc(std::ostream & o, TocParser::ProgContext * ctx); -void toc(std::ostream & o, TocParser::VarDeclContext * ctx); -void toc(std::ostream & o, TocParser::FuncContext * ctx); -void toc(std::ostream & o, TocParser::StructDeclContext * ctx); -void toc(std::ostream & o, TocParser::BodyContext * ctx); -void toc(std::ostream & o, TocParser::StmtContext * ctx); -void toc(std::ostream & o, TocParser::IfCondContext * ctx); -void toc(std::ostream & o, TocParser::WhileLoopContext * ctx); -void toc(std::ostream & o, TocParser::AssignmentContext * ctx); -void toc(std::ostream & o, TocParser::ReturnStmtContext * ctx); -void toc(std::ostream & o, TocParser::ExprContext * ctx); -void toc(std::ostream & o, TocParser::NonOpExprContext * ctx); -void toc(std::ostream & o, TocParser::NonSubscriptExprContext * ctx); -void toc(std::ostream & o, TocParser::FuncCallContext * ctx); -void toc(std::ostream & o, TocParser::IdentifierContext * ctx); -void toc(std::ostream & o, TocParser::LiteralContext * ctx); -void toc(std::ostream & o, TocParser::SubscriptContext * ctx); -void toc(std::ostream & o, TocParser::MemberAccessContext * ctx); -void toc(std::ostream & o, TocParser::ParenExprContext * ctx); -void toc(std::ostream & o, TocParser::BinaryOperatorContext * ctx); - -void toc_stub(std::ostream & o, TocParser::FuncContext * ctx); -void toc_stub(std::ostream & o, TocParser::StructDeclContext * ctx); - - -void toc(std::ostream & o, TocParser::ProgContext * ctx) { - for (auto * decl : ctx->decl()) { - /**/ if (decl->structDecl() != nullptr) toc_stub(o, decl->structDecl()); - else if (decl->funcDecl() != nullptr) toc_stub(o, decl->funcDecl()->func()); - } - for (auto * decl : ctx->decl()) { - if (decl->varDecl() != nullptr) { - toc(o, decl->varDecl()); - o << ";\n"; - } - else if (decl->structDecl() != nullptr) toc(o, decl->structDecl()); - else if (decl->funcDecl() != nullptr) toc(o, decl->funcDecl()->func()); +#include "repr.h" + +template +std::ostream & operator<< (std::ostream & out, const std::vector & v) { + bool comma = false; + for (auto t : v) { + if (comma) out << ", "; + else comma = true; + out << t; } + return out; } -void toc(std::ostream & o, TocParser::VarDeclContext * ctx) { - o - << ctx->var()->type()->getText() - << " " - << ctx->var()->varName()->getText(); - - if (ctx->var()->expr() != nullptr) { - o << " = "; - toc(o, ctx->var()->expr()); - } + +std::ostream & operator<< (std::ostream & out, const Type & t); +std::ostream & operator<< (std::ostream & out, const Variable & v); +std::ostream & operator<< (std::ostream & out, const Body & b); +std::ostream & operator<< (std::ostream & out, const OperatorExpr & o); +std::ostream & operator<< (std::ostream & out, const Expr & e); +std::ostream & operator<< (std::ostream & out, const Stmt & s); + +void tocFunction (std::ostream & out, const Function & f, bool stub); +void tocStruct (std::ostream & out, const Struct & s, bool stub); +void tocProgram (std::ostream & out, const Program & p); + +static const int TAB_WIDTH = 2; +static int indentation = 0; +static void indent(std::ostream & out, int change = 0) { + indentation += change; + out << std::string(indentation, ' '); } -void toc(std::ostream & o, TocParser::FuncContext * ctx) { - o - << ctx->type()->getText() - << " " - << ctx->funcName()->getText() - << "("; - - if (ctx->parameter()->firstParameter() != nullptr) { - o - << ctx->parameter()->firstParameter()->var()->type()->getText() - << " " - << ctx->parameter()->firstParameter()->var()->varName()->getText(); - - for (auto * par : ctx->parameter()->additionalParameter()) { - o - << ", " - << par->var()->type()->getText() - << " " - << par->var()->varName()->getText(); - } - } - o << ")\n{\n"; +std::ostream & operator<< (std::ostream & out, const Type & t) { + out << t.name; - toc(o, ctx->body()); + return out; +} +std::ostream & operator<< (std::ostream & out, const Variable & v) { + out << v.type << " " << v.name; - o << "}\n"; + return out; } -void toc(std::ostream & o, TocParser::StructDeclContext * ctx) { - o - << "typedef struct " - << ctx->structName()->getText() - << "\n{\n"; - - for (auto * member : ctx->structMember()) { - if (member->structVar() != nullptr) { - o - << member->structVar()->var()->type()->getText() - << " " - << member->structVar()->var()->varName()->getText() - << ";\n"; - } +std::ostream & operator<< (std::ostream & out, const Body & b) { + indent(out); + out << "{\n"; + indentation += 2; + + for (auto v : b.variables) { + indent(out); + out << v << ";\n"; } - o << "} " - << ctx->structName()->getText() - << ";\n"; - for (auto * member : ctx->structMember()) { - if (member->structMethod() != nullptr) { - o - << member->structMethod()->func()->type()->getText() - << " " - << ctx->structName()->getText() - << "_" - << member->structMethod()->func()->funcName()->getText() - << "(" - << ctx->structName()->getText() - << " * this"; - - if (member->structMethod()->func()->parameter()->firstParameter() != nullptr) { - o - << ", " - << member->structMethod()->func()->parameter()->firstParameter()->var()->type()->getText() - << " " - << member->structMethod()->func()->parameter()->firstParameter()->var()->varName()->getText(); - - for (auto * par : member->structMethod()->func()->parameter()->additionalParameter()) { - o - << ", " - << par->var()->type()->getText() - << " " - << par->var()->varName()->getText(); - } - } - - o << ")\n{\n"; - - toc(o, member->structMethod()->func()->body()); - - o << "}\n"; - } + + out << "\n"; + + for (auto s : b.statements) { + indent(out); + out << s << ";\n"; } + + indent(out, -2); + out << "}\n"; + + return out; } -void toc(std::ostream & o, TocParser::BodyContext * ctx) { - for (auto * stmt : ctx->stmt()) { - toc(o, stmt); - o << "\n"; +std::ostream & operator<< (std::ostream & out, const OperatorExpr & o) { + out << *o.lexpr << " "; + + switch (o.type) { + case OperatorType::Plus: out << "+"; break; + case OperatorType::Minus: out << "-"; break; + case OperatorType::Multiply: out << "*"; break; + case OperatorType::Divide: out << "/"; break; + case OperatorType::Equals: out << "=="; break; + case OperatorType::NotEquals: out << "!="; break; + case OperatorType::LessThan: out << "<"; break; + case OperatorType::GreaterThan: out << ">"; break; } + + out << " " << *o.rexpr; + + return out; } -void toc(std::ostream & o, TocParser::StmtContext * ctx) { - /**/ if (ctx->varDecl() != nullptr) toc(o, ctx->varDecl()); - else if (ctx->conditional() != nullptr) toc(o, ctx->conditional()->ifCond()); - else if (ctx->loop() != nullptr) toc(o, ctx->loop()->whileLoop()); - else if (ctx->assignment() != nullptr) toc(o, ctx->assignment()); - else if (ctx->returnStmt() != nullptr) toc(o, ctx->returnStmt()); - else if (ctx->expr() != nullptr) toc(o, ctx->expr()); - - if (ctx->conditional() == nullptr && ctx->loop() == nullptr) - o << ";"; -} -void toc(std::ostream & o, TocParser::IfCondContext * ctx) { - o << "if ("; - toc(o, ctx->expr()); - o << ")\n{\n"; - toc(o, ctx->body()); - o << "}\n"; -} -void toc(std::ostream & o, TocParser::WhileLoopContext * ctx) { - o << "while ("; - toc(o, ctx->expr()); - o << ")\n{\n"; - toc(o, ctx->body()); - o << "}\n"; -} -void toc(std::ostream & o, TocParser::AssignmentContext * ctx) { - toc(o, ctx->identifier()); - o << " = "; - toc(o, ctx->expr()); -} -void toc(std::ostream & o, TocParser::ReturnStmtContext * ctx) { - o << "return "; - toc(o, ctx->expr()); -} -void toc(std::ostream & o, TocParser::ExprContext * ctx) { - /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); - else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); - else if (ctx->literal() != nullptr) toc(o, ctx->literal()); - else if (ctx->subscript() != nullptr) toc(o, ctx->subscript()); - else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); - else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); - else if (ctx->operatorExpr() != nullptr) toc(o, ctx->operatorExpr()->binaryOperator()); -} -void toc(std::ostream & o, TocParser::NonOpExprContext * ctx) { - /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); - else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); - else if (ctx->literal() != nullptr) toc(o, ctx->literal()); - else if (ctx->subscript() != nullptr) toc(o, ctx->subscript()); - else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); - else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); -} -void toc(std::ostream & o, TocParser::NonSubscriptExprContext * ctx) { - /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); - else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); - else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); - else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); -} -void toc(std::ostream & o, TocParser::FuncCallContext * ctx) { - o - << ctx->funcName()->getText() - << "("; - for (int i = 0; i < ctx->expr().size(); i++) { - if (i != 0) o << ", "; - toc(o, ctx->expr(i)); +std::ostream & operator<< (std::ostream & out, const Expr & e) { + switch (e.type) { + case ExprType::Brackets: + out << *e._brackets.lexpr << "[" << *e._brackets.rexpr << "]"; break; + case ExprType::Call: + out << e._call.functionName << "(" << e._call.arguments << ")"; break; + case ExprType::Dot: + out << e._dot.name << "." << *e._dot.lexpr; break; + case ExprType::Literal: + out << e._literal.i; break; + case ExprType::Operator: + out << e._operator; break; + case ExprType::Variable: + out << e._variable.name; break; } - o << ")"; -} -void toc(std::ostream & o, TocParser::IdentifierContext * ctx) { - o << ctx->getText(); -} -void toc(std::ostream & o, TocParser::LiteralContext * ctx) { - if (ctx->INTLIT() != nullptr) o << ctx->INTLIT()->getText(); -} -void toc(std::ostream & o, TocParser::SubscriptContext * ctx) { - toc(o, ctx->nonSubscriptExpr()); - o << "["; - toc(o, ctx->expr()); - o << "]"; -} -void toc(std::ostream & o, TocParser::MemberAccessContext * ctx) { - toc(o, ctx->identifier(0)); - o << "."; - toc(o, ctx->identifier(1)); + + return out; } -void toc(std::ostream & o, TocParser::ParenExprContext * ctx) { - o << "("; - toc(o, ctx->expr()); - o << ")"; +std::ostream & operator<< (std::ostream & out, const Stmt & s) { + switch (s.type) { + case StmtType::Assign: + out << s._assign.lexpr << "=" << s._assign.rexpr; break; + case StmtType::Expr: + out << s._expr; break; + case StmtType::If: + out << "if (" << s._if.condition << ")\n" << s._if.body; break; + case StmtType::Return: + out << "return " << s._return.expr; break; + case StmtType::While: + out << "while (" << s._while.condition << ")\n" << s._while.body; break; + } + + return out; } -void toc(std::ostream & o, TocParser::BinaryOperatorContext * ctx) { - for (int i = 0; i < ctx->BINARY_OPERATOR().size(); i++) { - toc(o, ctx->nonOpExpr(i)); - o - << " " - << ctx->BINARY_OPERATOR(i)->getText() - << " "; - toc(o, ctx->nonOpExpr(i + 1)); + + +void tocFunction (std::ostream & out, const Function & f, bool stub) { + out << f.returnType << " " << f.name << " ("; + + bool comma = false; + for (auto p : f.parameters) { + if (comma) out << ", "; + else comma = true; + + out << p.type << " " << p.name; + } + + out << ")"; + + if (stub) { + out << ";\n"; + } + else { + out << "\n" << f.body; } } +void tocStruct (std::ostream & out, const Struct & s, bool stub) { + out << "struct " << s.name; + if (stub) { + out << ";\n"; + return; + } + out << "\n{\n"; + indentation += 2; -void toc_stub(std::ostream & o, TocParser::FuncContext * ctx) { - o - << ctx->type()->getText() - << " " - << ctx->funcName()->getText() - << "("; - - if (ctx->parameter()->firstParameter() != nullptr) { - o - << ctx->parameter()->firstParameter()->var()->type()->getText() - << " " - << ctx->parameter()->firstParameter()->var()->varName()->getText(); - - for (auto * par : ctx->parameter()->additionalParameter()) { - o - << ", " - << par->var()->type()->getText() - << " " - << par->var()->varName()->getText(); - } + for (auto m : s.members) { + indent(out); + out << m << ";\n"; } - o << ");\n"; + indent(out, -2); + out << "};\n"; } -void toc_stub(std::ostream & o, TocParser::StructDeclContext * ctx) { - o - << "struct " - << ctx->structName()->getText() - << ";\n"; +void tocProgram (std::ostream & out, const Program & p) { + for (auto s : p.structs) { + tocStruct(out, s, true); + } + for (auto s : p.structs) { + tocStruct(out, s, false); + } + + for (auto v : p.variables) { + out << v << ";\n"; + } + + for (auto f : p.functions) { + tocFunction(out, f, true); + } + for (auto f : p.functions) { + tocFunction(out, f, false); + } } + + + + +// void toc(std::ostream & o, TocParser::ProgContext * ctx) { +// for (auto * decl : ctx->decl()) { +// /**/ if (decl->structDecl() != nullptr) toc_stub(o, decl->structDecl()); +// else if (decl->funcDecl() != nullptr) toc_stub(o, decl->funcDecl()->func()); +// } +// for (auto * decl : ctx->decl()) { +// if (decl->varDecl() != nullptr) { +// toc(o, decl->varDecl()); +// out << ";\n"; +// } +// else if (decl->structDecl() != nullptr) toc(o, decl->structDecl()); +// else if (decl->funcDecl() != nullptr) toc(o, decl->funcDecl()->func()); +// } +// } +// void toc(std::ostream & o, TocParser::VarDeclContext * ctx) { +// o +// << ctx->var()->type()->getText() +// << " " +// << ctx->var()->varName()->getText(); + +// if (ctx->var()->expr() != nullptr) { +// out << " = "; +// toc(o, ctx->var()->expr()); +// } +// } +// void toc(std::ostream & o, TocParser::FuncContext * ctx) { +// o +// << ctx->type()->getText() +// << " " +// << ctx->funcName()->getText() +// << "("; + +// if (ctx->parameter()->firstParameter() != nullptr) { +// o +// << ctx->parameter()->firstParameter()->var()->type()->getText() +// << " " +// << ctx->parameter()->firstParameter()->var()->varName()->getText(); + +// for (auto * par : ctx->parameter()->additionalParameter()) { +// o +// << ", " +// << par->var()->type()->getText() +// << " " +// << par->var()->varName()->getText(); +// } +// } + +// out << ")\n{\n"; + +// toc(o, ctx->body()); + +// out << "}\n"; +// } +// void toc(std::ostream & o, TocParser::StructDeclContext * ctx) { +// o +// << "typedef struct " +// << ctx->structName()->getText() +// << "\n{\n"; + +// for (auto * member : ctx->structMember()) { +// if (member->structVar() != nullptr) { +// o +// << member->structVar()->var()->type()->getText() +// << " " +// << member->structVar()->var()->varName()->getText() +// << ";\n"; +// } +// } +// out << "} " +// << ctx->structName()->getText() +// << ";\n"; +// for (auto * member : ctx->structMember()) { +// if (member->structMethod() != nullptr) { +// o +// << member->structMethod()->func()->type()->getText() +// << " " +// << ctx->structName()->getText() +// << "_" +// << member->structMethod()->func()->funcName()->getText() +// << "(" +// << ctx->structName()->getText() +// << " * this"; + +// if (member->structMethod()->func()->parameter()->firstParameter() != nullptr) { +// o +// << ", " +// << member->structMethod()->func()->parameter()->firstParameter()->var()->type()->getText() +// << " " +// << member->structMethod()->func()->parameter()->firstParameter()->var()->varName()->getText(); + +// for (auto * par : member->structMethod()->func()->parameter()->additionalParameter()) { +// o +// << ", " +// << par->var()->type()->getText() +// << " " +// << par->var()->varName()->getText(); +// } +// } + +// out << ")\n{\n"; + +// toc(o, member->structMethod()->func()->body()); + +// out << "}\n"; +// } +// } +// } +// void toc(std::ostream & o, TocParser::BodyContext * ctx) { +// for (auto * stmt : ctx->stmt()) { +// toc(o, stmt); +// out << "\n"; +// } +// } +// void toc(std::ostream & o, TocParser::StmtContext * ctx) { +// /**/ if (ctx->varDecl() != nullptr) toc(o, ctx->varDecl()); +// else if (ctx->conditional() != nullptr) toc(o, ctx->conditional()->ifCond()); +// else if (ctx->loop() != nullptr) toc(o, ctx->loop()->whileLoop()); +// else if (ctx->assignment() != nullptr) toc(o, ctx->assignment()); +// else if (ctx->returnStmt() != nullptr) toc(o, ctx->returnStmt()); +// else if (ctx->expr() != nullptr) toc(o, ctx->expr()); + +// if (ctx->conditional() == nullptr && ctx->loop() == nullptr) +// out << ";"; +// } +// void toc(std::ostream & o, TocParser::IfCondContext * ctx) { +// out << "if ("; +// toc(o, ctx->expr()); +// out << ")\n{\n"; +// toc(o, ctx->body()); +// out << "}\n"; +// } +// void toc(std::ostream & o, TocParser::WhileLoopContext * ctx) { +// out << "while ("; +// toc(o, ctx->expr()); +// out << ")\n{\n"; +// toc(o, ctx->body()); +// out << "}\n"; +// } +// void toc(std::ostream & o, TocParser::AssignmentContext * ctx) { +// toc(o, ctx->identifier()); +// out << " = "; +// toc(o, ctx->expr()); +// } +// void toc(std::ostream & o, TocParser::ReturnStmtContext * ctx) { +// out << "return "; +// toc(o, ctx->expr()); +// } +// void toc(std::ostream & o, TocParser::ExprContext * ctx) { +// /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); +// else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); +// else if (ctx->literal() != nullptr) toc(o, ctx->literal()); +// else if (ctx->subscript() != nullptr) toc(o, ctx->subscript()); +// else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); +// else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); +// else if (ctx->operatorExpr() != nullptr) toc(o, ctx->operatorExpr()->binaryOperator()); +// } +// void toc(std::ostream & o, TocParser::NonOpExprContext * ctx) { +// /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); +// else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); +// else if (ctx->literal() != nullptr) toc(o, ctx->literal()); +// else if (ctx->subscript() != nullptr) toc(o, ctx->subscript()); +// else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); +// else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); +// } +// void toc(std::ostream & o, TocParser::NonSubscriptExprContext * ctx) { +// /**/ if (ctx->funcCall() != nullptr) toc(o, ctx->funcCall()); +// else if (ctx->identifier() != nullptr) toc(o, ctx->identifier()); +// else if (ctx->memberAccess() != nullptr) toc(o, ctx->memberAccess()); +// else if (ctx->parenExpr() != nullptr) toc(o, ctx->parenExpr()); +// } +// void toc(std::ostream & o, TocParser::FuncCallContext * ctx) { +// o +// << ctx->funcName()->getText() +// << "("; +// for (int i = 0; i < ctx->expr().size(); i++) { +// if (i != 0) out << ", "; +// toc(o, ctx->expr(i)); +// } +// out << ")"; +// } +// void toc(std::ostream & o, TocParser::IdentifierContext * ctx) { +// out << ctx->getText(); +// } +// void toc(std::ostream & o, TocParser::LiteralContext * ctx) { +// if (ctx->INTLIT() != nullptr) out << ctx->INTLIT()->getText(); +// } +// void toc(std::ostream & o, TocParser::SubscriptContext * ctx) { +// toc(o, ctx->nonSubscriptExpr()); +// out << "["; +// toc(o, ctx->expr()); +// out << "]"; +// } +// void toc(std::ostream & o, TocParser::MemberAccessContext * ctx) { +// toc(o, ctx->identifier(0)); +// out << "."; +// toc(o, ctx->identifier(1)); +// } +// void toc(std::ostream & o, TocParser::ParenExprContext * ctx) { +// out << "("; +// toc(o, ctx->expr()); +// out << ")"; +// } +// void toc(std::ostream & o, TocParser::BinaryOperatorContext * ctx) { +// for (int i = 0; i < ctx->BINARY_OPERATOR().size(); i++) { +// toc(o, ctx->nonOpExpr(i)); +// o +// << " " +// << ctx->BINARY_OPERATOR(i)->getText() +// << " "; +// toc(o, ctx->nonOpExpr(i + 1)); +// } +// } + +// void toc_stub(std::ostream & o, TocParser::FuncContext * ctx) { +// o +// << ctx->type()->getText() +// << " " +// << ctx->funcName()->getText() +// << "("; + +// if (ctx->parameter()->firstParameter() != nullptr) { +// o +// << ctx->parameter()->firstParameter()->var()->type()->getText() +// << " " +// << ctx->parameter()->firstParameter()->var()->varName()->getText(); + +// for (auto * par : ctx->parameter()->additionalParameter()) { +// o +// << ", " +// << par->var()->type()->getText() +// << " " +// << par->var()->varName()->getText(); +// } +// } + +// out << ");\n"; +// } +// void toc_stub(std::ostream & o, TocParser::StructDeclContext * ctx) { +// o +// << "struct " +// << ctx->structName()->getText() +// << ";\n"; +// } diff --git a/todo.txt b/todo.txt index 3b5d313..e434bea 100644 --- a/todo.txt +++ b/todo.txt @@ -19,8 +19,32 @@ define grammar: - . - cast -- complete grammar -- semantic checks when visiting -- type modifier -- operator precedence -- ... + + +==grammar== +- exprs/stmts +- operators (precedence) +- types (modifiers) +- dot/[] +- literals +- cast + +==compiler== +- type checks +- cast + +==new features== +- generics +- namespaces +- methods +- private + + +Zeitplan: +29.07: grammar +30.07: compiler +31.07: new features +01.08: Schreiben, vorabversion +02.08: Schreiben +03.08: Schreiben +04.08: Schreiben, abgeben \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index ed0f9e5..658a3d5 100644 --- a/xmake.lua +++ b/xmake.lua @@ -12,6 +12,10 @@ target("main") "gen", "antlr4-cpp-runtime-4.9.2-source/install/include/antlr4-runtime/" ) + set_languages("c++20") + + +-- "C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe" -jar antlr-4.9.2-complete.jar -Dlanguage=Cpp -o gen Toc.g4 -- -- If you want to known more usage about xmake, please see https://xmake.io -- 2.50.1