]> gitweb.ps.run Git - toc/commitdiff
toc now uses internal representation instead of ast
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 29 Jul 2021 07:58:14 +0000 (09:58 +0200)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Thu, 29 Jul 2021 07:58:14 +0000 (09:58 +0200)
12 files changed:
Toc.g4
gen/Toc.interp
gen/TocBaseListener.h
gen/TocListener.h
gen/TocParser.cpp
gen/TocParser.h
src/main.cpp
src/repr.h
src/repr_get.h
src/toc.h
todo.txt
xmake.lua

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