toylang
Version:
A toy programming language built with TypeScript for learning purposes
72 lines (71 loc) • 3.52 kB
JavaScript
;
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;