\r
\r
funcDecl: 'func' func;\r
-func: funcName '(' parameter ')' (':' type) body;\r
+func: funcName genericDecl? '(' parameter ')' (':' type) body;\r
parameter: (var (',' var)*)?;\r
\r
body: '{' stmt* '}';\r
\r
\r
-structDecl: 'struct' structName '{' structMember* '}';\r
+structDecl: 'struct' structName genericDecl? '{' structMember* '}';\r
structMember: structVar | structMethod;\r
structVar: var ';';\r
structMethod: func;\r
\r
+genericDecl: '<' typeName (',' typeName)* '>';\r
\r
stmt: varDecl ';'\r
| ifStmt\r