UNPKG

toylang

Version:

A toy programming language built with TypeScript for learning purposes

72 lines (71 loc) 3.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseForStatementInit = exports.parseForStatement = exports.parseDoWhileStatement = exports.parseWhileStatement = exports.parseIterationStatement = void 0; var Tokenizer_1 = require("../Tokenizer"); var expression_1 = require("./expression"); var statement_1 = require("./statement"); var variable_1 = require("./variable"); function parseIterationStatement(parser) { var _a, _b; switch ((_a = parser._lookahead) === null || _a === void 0 ? void 0 : _a.type) { case Tokenizer_1.TokenTypes.while: return parseWhileStatement(parser); case Tokenizer_1.TokenTypes.do: return parseDoWhileStatement(parser); case Tokenizer_1.TokenTypes.for: return parseForStatement(parser); } throw new SyntaxError("invalid IterationStatement: " + ((_b = parser._lookahead) === null || _b === void 0 ? void 0 : _b.type)); } exports.parseIterationStatement = parseIterationStatement; // `while` `(` expression `)` Statement function parseWhileStatement(parser) { parser._eat(Tokenizer_1.TokenTypes.while); parser._eat(Tokenizer_1.TokenTypes.PAREN_START); var test = expression_1.parseExpression(parser); parser._eat(Tokenizer_1.TokenTypes.PAREN_END); var body = statement_1.parseStatement(parser); return parser.factory.WhileStatement(test, body); } exports.parseWhileStatement = parseWhileStatement; // `do` Statement `while` `(` expression `)` function parseDoWhileStatement(parser) { parser._eat(Tokenizer_1.TokenTypes.do); var body = statement_1.parseStatement(parser); parser._eat(Tokenizer_1.TokenTypes.while); parser._eat(Tokenizer_1.TokenTypes.PAREN_START); var test = expression_1.parseExpression(parser); parser._eat(Tokenizer_1.TokenTypes.PAREN_END); parser._eat(Tokenizer_1.TokenTypes.SEMI); return parser.factory.DoWhileStatement(test, body); } exports.parseDoWhileStatement = parseDoWhileStatement; // for `(` Statement `;` Statement `;` Statement `)` Statement function parseForStatement(parser) { var _a, _b, _c; parser._eat(Tokenizer_1.TokenTypes.for); parser._eat(Tokenizer_1.TokenTypes.PAREN_START); var init = ((_a = parser._lookahead) === null || _a === void 0 ? void 0 : _a.type) !== Tokenizer_1.TokenTypes.SEMI ? parseForStatementInit(parser) : null; parser._eat(Tokenizer_1.TokenTypes.SEMI); var test = ((_b = parser._lookahead) === null || _b === void 0 ? void 0 : _b.type) !== Tokenizer_1.TokenTypes.SEMI ? expression_1.parseExpression(parser) : null; parser._eat(Tokenizer_1.TokenTypes.SEMI); var update = ((_c = parser._lookahead) === null || _c === void 0 ? void 0 : _c.type) !== Tokenizer_1.TokenTypes.PAREN_END ? expression_1.parseExpression(parser) : null; parser._eat(Tokenizer_1.TokenTypes.PAREN_END); var body = statement_1.parseStatement(parser); return parser.factory.ForStatement({ init: init, test: test, update: update, body: body }); } exports.parseForStatement = parseForStatement; function parseForStatementInit(parser) { var _a; if (((_a = parser._lookahead) === null || _a === void 0 ? void 0 : _a.type) === Tokenizer_1.TokenTypes.let) { return variable_1.parseVariableStatementInit(parser); } return expression_1.parseExpression(parser); } exports.parseForStatementInit = parseForStatementInit;