* ```abnf * VarDef = ("let" / "var") Dest [":" Type] "=" Expr * ```
(s: ITokenStream)
| 106 | * ``` |
| 107 | */ |
| 108 | function parseVarDef(s: ITokenStream): Ast.Definition { |
| 109 | const startPos = s.getPos(); |
| 110 | |
| 111 | let mut: boolean; |
| 112 | switch (s.getTokenKind()) { |
| 113 | case TokenKind.LetKeyword: { |
| 114 | mut = false; |
| 115 | break; |
| 116 | } |
| 117 | case TokenKind.VarKeyword: { |
| 118 | mut = true; |
| 119 | break; |
| 120 | } |
| 121 | default: { |
| 122 | throw unexpectedTokenError(s.getTokenKind(), s.getPos()); |
| 123 | } |
| 124 | } |
| 125 | s.next(); |
| 126 | |
| 127 | const dest = parseDest(s); |
| 128 | |
| 129 | let type: Ast.TypeSource | undefined; |
| 130 | if (s.is(TokenKind.Colon)) { |
| 131 | s.next(); |
| 132 | type = parseType(s); |
| 133 | } |
| 134 | |
| 135 | s.expect(TokenKind.Eq); |
| 136 | s.next(); |
| 137 | |
| 138 | if (s.is(TokenKind.NewLine)) { |
| 139 | s.next(); |
| 140 | } |
| 141 | |
| 142 | const expr = parseExpr(s, false); |
| 143 | |
| 144 | return NODE('def', { dest, varType: type, expr, mut, attr: [] }, startPos, s.getPos()); |
| 145 | } |
| 146 | |
| 147 | /** |
| 148 | * ```abnf |
no test coverage detected