@roku-road/bright
Version:
Blazing fast parser for BrightScript that gives you ESTree like AST
483 lines (482 loc) • 14.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const chevrotain_1 = require("chevrotain");
exports.WS = chevrotain_1.createToken({
group: chevrotain_1.Lexer.SKIPPED,
name: "WS",
pattern: /[\s\t]+/,
});
exports.IDENTIFIER = chevrotain_1.createToken({
name: "IDENTIFIER",
pattern: /([A-Za-z_]+[A-Za-z0-9_]*)/,
});
const keyword = (words, opts = {}) => {
if (!Array.isArray(words)) {
words = [words];
}
const term = words[0].toLowerCase();
const name = words.map((word) => word.toUpperCase()).join("_");
const re = new RegExp(`\\b${words.join("[ \\t]*")}\\b`, "iy");
const pattern = (text, startOffset) => {
re.lastIndex = startOffset;
return re.exec(text);
};
const hint = term.substr(0, 1);
const startHint = hint.toUpperCase() === hint.toLowerCase()
? [hint.toUpperCase()]
: [hint.toUpperCase(), hint.toLowerCase()];
return chevrotain_1.createToken(Object.assign({ name,
pattern, longer_alt: exports.IDENTIFIER, start_chars_hint: startHint, line_breaks: false }, opts));
};
exports.BASE_TYPE = chevrotain_1.createToken({ name: "BASE_TYPE", pattern: chevrotain_1.Lexer.NA });
exports.LITERAL = chevrotain_1.createToken({ name: "LITERAL", pattern: chevrotain_1.Lexer.NA });
exports.RELATIONAL_OPERATOR = chevrotain_1.createToken({
name: "RELATIONAL_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
});
exports.EQUALITY_OPERATOR = chevrotain_1.createToken({
name: "EQUALITY_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
});
exports.PRINT = chevrotain_1.createToken({ name: "PRINT", pattern: chevrotain_1.Lexer.NA });
exports.PUNCTUATION = chevrotain_1.createToken({
name: "PUNCTUATION",
pattern: chevrotain_1.Lexer.NA,
});
exports.LOGIC_OPERATOR = chevrotain_1.createToken({
name: "LOGIC_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
categories: exports.PUNCTUATION,
});
exports.SHIFT_OPERATOR = chevrotain_1.createToken({
name: "SHIFT_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
categories: exports.PUNCTUATION,
});
exports.MULTI_OPERATOR = chevrotain_1.createToken({
name: "MULTI_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
categories: exports.PUNCTUATION,
});
exports.TERMINATOR = chevrotain_1.createToken({
name: "TERMINATOR",
pattern: chevrotain_1.Lexer.NA,
});
exports.UNARY = chevrotain_1.createToken({
name: "UNARY",
pattern: chevrotain_1.Lexer.NA,
categories: exports.PUNCTUATION,
});
exports.POSTFIX = chevrotain_1.createToken({
name: "POSTFIX",
pattern: chevrotain_1.Lexer.NA,
categories: exports.PUNCTUATION,
});
exports.ADDICTIVE_OPERATOR = chevrotain_1.createToken({
categories: exports.PUNCTUATION,
name: "ADDICTIVE_OPERATOR",
pattern: chevrotain_1.Lexer.NA,
});
exports.ATTRIBUTE = chevrotain_1.createToken({
name: "ATTRIBUTE",
pattern: "@",
line_breaks: false,
});
exports.BACK_SLASH = chevrotain_1.createToken({
name: "BACK_SLASH",
pattern: "\\",
categories: exports.MULTI_OPERATOR,
line_breaks: false,
});
exports.COMMENT_QUOTE = chevrotain_1.createToken({
name: "COMMENT_QUOTE",
pattern: /'[^\n\r]*/,
line_breaks: false,
});
exports.COMMENT_REM = chevrotain_1.createToken({
name: "COMMENT_REM",
pattern: /\b(rem|REM|Rem)\b[^\n\r]*/i,
line_breaks: false,
});
exports.CONDITIONAL_IF = chevrotain_1.createToken({
name: "CONDITIONAL_IF",
pattern: /#\bif\b/,
line_breaks: false,
});
exports.CONDITIONAL_ELSE = chevrotain_1.createToken({
name: "CONDITIONAL_ELSE",
pattern: /#\else\b/,
line_breaks: false,
});
exports.CONDITIONAL_ELSE_IF = chevrotain_1.createToken({
name: "CONDITIONAL_ELSE_IF",
pattern: /#\belse[ ]*if\b/,
});
exports.CONDITIONAL_END_IF = chevrotain_1.createToken({
name: "CONDITIONAL_END_IF",
pattern: /#\bend[ ]*if\b/,
});
exports.CONDITIONAL_ERROR = chevrotain_1.createToken({
name: "CONDITIONAL_ERROR",
pattern: /#\berror\b[^\n\r]+/,
});
exports.CONDITIONAL_CONST = chevrotain_1.createToken({
name: "CONDITIONAL_CONST",
pattern: /#\bconst\b/,
});
exports.ELSE_IF = keyword(["Else", "If"]);
exports.END_FOR = keyword(["End", "For"]);
exports.END_FUNCTION = keyword(["End", "Function"]);
exports.END_IF = keyword(["End", "If"]);
exports.END_SUB = keyword(["End", "Sub"]);
exports.END_WHILE = keyword(["End", "While"]);
exports.TRY = keyword("Try");
exports.CATCH = keyword("Catch");
exports.END_TRY = keyword(["End", "Try"]);
exports.AS = keyword("As");
exports.EVAL = keyword("Eval");
exports.EXIT = keyword("Exit");
exports.FOR = keyword("For");
exports.GOTO = keyword("Goto");
exports.LET = keyword("Let");
exports.LIBRARY = keyword("Library");
exports.LINE_NUM = keyword("LINE_NUM");
exports.ELSE = keyword("Else");
exports.END = keyword("End");
exports.DIM = keyword("Dim");
exports.EACH = keyword("Each");
exports.IF = keyword("If");
exports.IN = keyword("In");
exports.NEXT = keyword("Next");
exports.EXIT_FOR = keyword(["Exit", "For"]);
exports.EXIT_WHILE = keyword(["Exit", "While"]);
exports.TYPE_DECLARATION = chevrotain_1.createToken({
name: "TYPE_DECLARATION",
pattern: /[\$%!#&]/,
});
exports.OPEN_BRACKET = chevrotain_1.createToken({
name: "OPEN_BRACKET",
pattern: "[",
line_breaks: false,
});
exports.OPEN_CURLY_BRACE = chevrotain_1.createToken({
name: "OPEN_CURLY_BRACE",
pattern: "{",
line_breaks: false,
});
exports.OPEN_PAREN = chevrotain_1.createToken({
name: "OPEN_PAREN",
pattern: "(",
line_breaks: false,
});
exports.CLOSE_BRACKET = chevrotain_1.createToken({
name: "CLOSE_BRACKET",
pattern: "]",
line_breaks: false,
});
exports.CLOSE_CURLY_BRACE = chevrotain_1.createToken({
name: "CLOSE_CURLY_BRACE",
pattern: "}",
line_breaks: false,
});
exports.CLOSE_PAREN = chevrotain_1.createToken({
name: "CLOSE_PAREN",
pattern: ")",
line_breaks: false,
});
exports.PERIOD = chevrotain_1.createToken({ name: "PERIOD", pattern: "." });
exports.FULL_PRINT = keyword("Print", {
name: "FULL_PRINT",
categories: exports.PRINT,
line_breaks: false,
});
exports.SHORT_PRINT = chevrotain_1.createToken({
pattern: "?",
name: "SHORT_PRINT",
categories: exports.PRINT,
line_breaks: false,
});
exports.RETURN = keyword("return");
exports.STEP = keyword("step");
exports.STOP = keyword("stop");
exports.BOOLEAN = keyword("Boolean", { categories: exports.BASE_TYPE });
exports.INTEGER = keyword("Integer", { categories: exports.BASE_TYPE });
exports.LONGINTEGER = keyword("LongInteger", { categories: exports.BASE_TYPE });
exports.FLOAT = keyword("Float", { categories: exports.BASE_TYPE });
exports.DOUBLE = keyword("Double", { categories: exports.BASE_TYPE });
exports.STRING = keyword("String", { categories: exports.BASE_TYPE });
exports.OBJECT = keyword("Object", { categories: exports.BASE_TYPE });
exports.FUNCTION = keyword("Function", { categories: exports.BASE_TYPE });
exports.INTERFACE = keyword("Interface", { categories: exports.BASE_TYPE });
exports.INVALID = keyword("Invalid", { categories: [exports.BASE_TYPE, exports.LITERAL] });
exports.DYNAMIC = keyword("Dynamic", { categories: exports.BASE_TYPE });
exports.VOID = keyword("Void", { categories: exports.BASE_TYPE });
exports.SUB = keyword("Sub");
exports.THEN = keyword("Then");
exports.TO = keyword("To");
exports.WHILE = keyword("While");
exports.STRING_LITERAL = chevrotain_1.createToken({
categories: exports.LITERAL,
name: "STRING_LITERAL",
pattern: /"([^"]|"")*"/,
});
exports.BOOLEAN_LITERAL = chevrotain_1.createToken({
name: "BOOLEAN_LITERAL",
pattern: chevrotain_1.Lexer.NA,
categories: exports.LITERAL,
});
exports.TRUE = keyword("true", { categories: exports.BOOLEAN_LITERAL });
exports.FALSE = keyword("false", { categories: exports.BOOLEAN_LITERAL });
exports.NUMBER_LITERAL = chevrotain_1.createToken({
categories: exports.LITERAL,
name: "NUMBER_LITERAL",
pattern: /(?:\d*\.?\d+|\d+\.?\d*)(?:[eEdD][-+]?\d+)?/,
});
exports.HEX_LITERAL = chevrotain_1.createToken({
categories: exports.LITERAL,
name: "HEX_LITERAL",
pattern: /&[hHFf0-9EeDdCcBbAa]+&?/,
});
exports.GREATER_THAN = chevrotain_1.createToken({
name: "GREATER_THAN",
pattern: ">",
categories: exports.RELATIONAL_OPERATOR,
});
exports.GREATER_THAN_EQUAL = chevrotain_1.createToken({
categories: exports.RELATIONAL_OPERATOR,
name: "GREATER_THAN_EQUAL",
pattern: ">=",
});
exports.LESS_THAN = chevrotain_1.createToken({
name: "LESS_THAN",
pattern: "<",
categories: exports.RELATIONAL_OPERATOR,
});
exports.LESS_THAN_EQUAL = chevrotain_1.createToken({
name: "LESS_THAN_EQUAL",
pattern: "<=",
categories: exports.RELATIONAL_OPERATOR,
});
exports.NOT_EQUAL = chevrotain_1.createToken({
name: "NOT_EQUAL",
pattern: "<>",
categories: exports.RELATIONAL_OPERATOR,
});
exports.EQUAL = chevrotain_1.createToken({
name: "EQUAL",
pattern: "=",
categories: exports.EQUALITY_OPERATOR,
});
exports.OP_ASSIGNMENT_ADD = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_ADD",
pattern: "+=",
});
exports.OP_ASSIGNMENT_BITSHIFT_LEFT = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_BITSHIFT_LEFT",
pattern: "<<=",
});
exports.OP_ASSIGNMENT_BITSHIFT_RIGHT = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_BITSHIFT_RIGHT",
pattern: ">>=",
});
exports.OP_ASSIGNMENT_DIVISION = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_DIVISION",
pattern: "/=",
});
exports.OP_ASSIGNMENT_INTEGER_DIVISION = chevrotain_1.createToken({ name: 'OP_ASSIGNMENT_INTEGER_DIVISION', pattern: '\\=', categories: exports.EQUALITY_OPERATOR });
exports.OP_ASSIGNMENT_MULTIPLY = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_MULTIPLY",
pattern: "*=",
});
exports.OP_ASSIGNMENT_SUBTRACT = chevrotain_1.createToken({
categories: exports.EQUALITY_OPERATOR,
name: "OP_ASSIGNMENT_SUBTRACT",
pattern: "-=",
});
exports.COMMA = chevrotain_1.createToken({ name: "COMMA", pattern: "," });
exports.COLON = chevrotain_1.createToken({
name: "COLON",
pattern: ":",
categories: exports.TERMINATOR,
});
exports.NEWLINE = chevrotain_1.createToken({
categories: exports.TERMINATOR,
line_breaks: true,
name: "NEWLINE",
pattern: /\s*[\n\r]+/,
});
exports.MOD = keyword("Mod", { categories: exports.LOGIC_OPERATOR });
exports.OR = keyword("Or", { categories: exports.LOGIC_OPERATOR });
exports.NOT = keyword("Not", { categories: [exports.LOGIC_OPERATOR, exports.UNARY] });
exports.AND = keyword("And", { categories: exports.LOGIC_OPERATOR });
exports.SEMICOLON = chevrotain_1.createToken({
name: "SEMICOLON",
pattern: ";",
categories: exports.TERMINATOR,
});
exports.DECREMENT = chevrotain_1.createToken({
name: "DECREMENT",
pattern: "--",
categories: [exports.UNARY, exports.POSTFIX],
});
exports.INCREMENT = chevrotain_1.createToken({
name: "INCREMENT",
pattern: "++",
categories: [exports.UNARY, exports.POSTFIX],
});
exports.BITSHIFT_LEFT = chevrotain_1.createToken({
name: "BITSHIFT_LEFT",
pattern: "<<",
categories: exports.SHIFT_OPERATOR,
});
exports.BITSHIFT_RIGHT = chevrotain_1.createToken({
name: "BITSHIFT_RIGHT",
pattern: ">>",
categories: exports.SHIFT_OPERATOR,
});
exports.OP_DIVIDE = chevrotain_1.createToken({
name: "OP_DIVIDE",
pattern: "/",
categories: exports.MULTI_OPERATOR,
});
exports.OP_MULTIPLE = chevrotain_1.createToken({
name: "OP_MULTIPLE",
pattern: "*",
categories: exports.MULTI_OPERATOR,
});
exports.OP_PLUS = chevrotain_1.createToken({
name: "OP_PLUS",
pattern: "+",
categories: [exports.ADDICTIVE_OPERATOR, exports.UNARY],
});
exports.OP_MINUS = chevrotain_1.createToken({
name: "OP_MINUS",
pattern: "-",
categories: [exports.ADDICTIVE_OPERATOR, exports.UNARY],
});
exports.OP_EXPONENT = chevrotain_1.createToken({
name: "OP_EXPONENT",
pattern: "^",
categories: exports.MULTI_OPERATOR,
});
exports.ALL_TOKENS = [
exports.NEWLINE,
exports.WS,
exports.COMMENT_QUOTE,
exports.COMMENT_REM,
exports.LITERAL,
exports.STRING_LITERAL,
exports.BOOLEAN_LITERAL,
exports.TRUE,
exports.FALSE,
exports.HEX_LITERAL,
exports.NUMBER_LITERAL,
exports.AS,
exports.OP_ASSIGNMENT_ADD,
exports.OP_ASSIGNMENT_MULTIPLY,
exports.OP_ASSIGNMENT_SUBTRACT,
exports.OP_MULTIPLE,
exports.OP_ASSIGNMENT_INTEGER_DIVISION,
exports.OP_ASSIGNMENT_DIVISION,
exports.OP_ASSIGNMENT_BITSHIFT_LEFT,
exports.OP_ASSIGNMENT_BITSHIFT_RIGHT,
exports.LOGIC_OPERATOR,
exports.EQUALITY_OPERATOR,
exports.RELATIONAL_OPERATOR,
exports.SHIFT_OPERATOR,
exports.ADDICTIVE_OPERATOR,
exports.MULTI_OPERATOR,
exports.PUNCTUATION,
exports.ATTRIBUTE,
exports.BACK_SLASH,
exports.OP_EXPONENT,
exports.CLOSE_BRACKET,
exports.CLOSE_CURLY_BRACE,
exports.CLOSE_PAREN,
exports.TERMINATOR,
exports.COLON,
exports.COMMA,
exports.CONDITIONAL_CONST,
exports.CONDITIONAL_ERROR,
exports.CONDITIONAL_ELSE_IF,
exports.CONDITIONAL_END_IF,
exports.CONDITIONAL_ELSE,
exports.CONDITIONAL_IF,
exports.DIM,
exports.END_FOR,
exports.END_FUNCTION,
exports.END_IF,
exports.END_SUB,
exports.END_WHILE,
exports.TRY,
exports.CATCH,
exports.END_TRY,
exports.ELSE_IF,
exports.ELSE,
exports.END,
exports.EACH,
exports.NOT_EQUAL,
exports.EXIT_FOR,
exports.EXIT_WHILE,
exports.EXIT,
exports.FOR,
exports.DECREMENT,
exports.INCREMENT,
exports.OP_DIVIDE,
exports.OP_PLUS,
exports.OP_MINUS,
exports.UNARY,
exports.POSTFIX,
exports.FUNCTION,
exports.GOTO,
exports.GREATER_THAN_EQUAL,
exports.BITSHIFT_RIGHT,
exports.GREATER_THAN,
exports.LESS_THAN_EQUAL,
exports.BITSHIFT_LEFT,
exports.LESS_THAN,
exports.LET,
exports.LIBRARY,
exports.LINE_NUM,
exports.MOD,
exports.NEXT,
exports.AND,
exports.NOT,
exports.OR,
exports.BASE_TYPE,
exports.BOOLEAN,
exports.DOUBLE,
exports.STRING,
exports.INTEGER,
exports.LONGINTEGER,
exports.FLOAT,
exports.DYNAMIC,
exports.INTERFACE,
exports.VOID,
exports.OBJECT,
exports.OPEN_BRACKET,
exports.OPEN_CURLY_BRACE,
exports.OPEN_PAREN,
exports.IF,
exports.IN,
exports.PERIOD,
exports.PRINT,
exports.FULL_PRINT,
exports.SHORT_PRINT,
exports.RETURN,
exports.SEMICOLON,
exports.STEP,
exports.STOP,
exports.SUB,
exports.THEN,
exports.TO,
exports.WHILE,
exports.EQUAL,
exports.IDENTIFIER,
exports.TYPE_DECLARATION,
];