@tsukiroku/tiny
Version:
Tiny interpreter
145 lines (144 loc) • 5.02 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.fromLiteral = exports.tokens = exports.TokenType = void 0;
var TokenType;
(function (TokenType) {
TokenType["ILLEGAL"] = "ILLEGAL";
TokenType["EOF"] = "EOF";
TokenType["IDENT"] = "IDENT";
TokenType["NUMBER"] = "NUMBER";
TokenType["STRING"] = "STRING";
TokenType["TRUE"] = "TRUE";
TokenType["FALSE"] = "FALSE";
TokenType["NULL"] = "NULL";
TokenType["FUNCTION"] = "FUNCTION";
TokenType["COMMENT"] = "COMMENT";
TokenType["ELEMENT"] = "ELEMENT";
TokenType["NULLISH"] = "NULLISH";
TokenType["ASSIGN"] = "=";
TokenType["PLUS"] = "+";
TokenType["MINUS"] = "-";
TokenType["BANG"] = "!";
TokenType["ASTERISK"] = "*";
TokenType["SLASH"] = "/";
TokenType["PERCENT"] = "%";
TokenType["QUESTION"] = "?";
TokenType["AT"] = "@";
TokenType["QUOTE"] = "\"";
TokenType["SINGLE_QUOTE"] = "'";
TokenType["LT"] = "<";
TokenType["GT"] = ">";
TokenType["LTE"] = "<=";
TokenType["GTE"] = ">=";
TokenType["EQUAL"] = "==";
TokenType["NOT_EQUAL"] = "!=";
TokenType["AND"] = "&&";
TokenType["OR"] = "||";
TokenType["COMMA"] = ",";
TokenType["COLON"] = ":";
TokenType["SEMICOLON"] = ";";
TokenType["LPAREN"] = "(";
TokenType["RPAREN"] = ")";
TokenType["LBRACE"] = "{";
TokenType["RBRACE"] = "}";
TokenType["LBRACKET"] = "[";
TokenType["RBRACKET"] = "]";
TokenType["LET"] = "LET";
TokenType["IF"] = "IF";
TokenType["ELSE"] = "ELSE";
TokenType["RETURN"] = "RETURN";
TokenType["WHILE"] = "WHILE";
TokenType["IN"] = "IN";
TokenType["TYPEOF"] = "TYPEOF";
TokenType["THROW"] = "THROW";
TokenType["DELETE"] = "DELETE";
TokenType["USE"] = "USE";
TokenType["VOID"] = "VOID";
TokenType["EXPR"] = "EXPR";
TokenType["CLASS"] = "CLASS";
TokenType["FOR"] = "FOR";
TokenType["CONST"] = "CONST";
})(TokenType || (TokenType = {}));
exports.TokenType = TokenType;
const tokens = [
{ curr: '=', next: '=', tokenType: TokenType.EQUAL },
{ curr: '/', next: '/', commentToken: TokenType.COMMENT },
{ curr: '!', next: '=', tokenType: TokenType.NOT_EQUAL },
{ curr: '<', next: '-', tokenType: TokenType.ELEMENT },
{ curr: '<', next: '=', tokenType: TokenType.LTE },
{ curr: '>', next: '=', tokenType: TokenType.GTE },
{ curr: '&', next: '&', tokenType: TokenType.AND },
{ curr: '|', next: '|', tokenType: TokenType.OR },
{ curr: '?', next: '?', tokenType: TokenType.NULLISH },
{ curr: '=', tokenType: TokenType.ASSIGN },
{ curr: '(', tokenType: TokenType.LPAREN },
{ curr: ')', tokenType: TokenType.RPAREN },
{ curr: '{', tokenType: TokenType.LBRACE },
{ curr: '}', tokenType: TokenType.RBRACE },
{ curr: '[', tokenType: TokenType.LBRACKET },
{ curr: ']', tokenType: TokenType.RBRACKET },
{ curr: ';', tokenType: TokenType.SEMICOLON },
{ curr: '.', tokenType: TokenType.ELEMENT },
{ curr: ',', tokenType: TokenType.COMMA },
{ curr: '+', tokenType: TokenType.PLUS },
{ curr: '-', tokenType: TokenType.MINUS },
{ curr: '*', tokenType: TokenType.ASTERISK },
{ curr: '/', tokenType: TokenType.SLASH },
{ curr: '%', tokenType: TokenType.PERCENT },
{ curr: '!', tokenType: TokenType.BANG },
{ curr: '<', tokenType: TokenType.LT },
{ curr: '>', tokenType: TokenType.GT },
{ curr: '?', tokenType: TokenType.QUESTION },
{ curr: '@', tokenType: TokenType.AT },
{ curr: '"', stringToken: TokenType.QUOTE },
{ curr: "'", stringToken: TokenType.SINGLE_QUOTE },
{ curr: ':', tokenType: TokenType.COLON },
{ curr: '\0', tokenType: TokenType.EOF },
];
exports.tokens = tokens;
const fromLiteral = (literal) => {
switch (literal) {
case 'let':
return TokenType.LET;
case 'func':
return TokenType.FUNCTION;
case 'true':
return TokenType.TRUE;
case 'false':
return TokenType.FALSE;
case 'null':
return TokenType.NULL;
case 'if':
return TokenType.IF;
case 'else':
return TokenType.ELSE;
case 'return':
return TokenType.RETURN;
case 'while':
return TokenType.WHILE;
case 'in':
return TokenType.IN;
case 'typeof':
return TokenType.TYPEOF;
case 'throw':
return TokenType.THROW;
case 'delete':
return TokenType.DELETE;
case 'use':
return TokenType.USE;
case 'void':
return TokenType.VOID;
case 'expr':
return TokenType.EXPR;
// Not used, but may be added later
case 'class':
return TokenType.CLASS;
case 'for':
return TokenType.FOR;
case 'const':
return TokenType.CONST;
default:
return TokenType.IDENT;
}
};
exports.fromLiteral = fromLiteral;