UNPKG

@abaplint/core

Version:
155 lines 5.02 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CDSLexer = void 0; const tokens_1 = require("../abap/1_lexer/tokens"); const position_1 = require("../position"); // todo: Keywords must be all uppercase, all lowercase, or in lowercase with an // uppercase initial letter. Other mixes of uppercase and lowercase are not allowed class Stream { constructor(buffer) { this.buffer = buffer; } takeNext() { const next = this.buffer.substring(0, 1); this.buffer = this.buffer.substring(1); return next; } peekNext() { const next = this.buffer.substring(0, 1); return next; } length() { return this.buffer.length; } } var Mode; (function (Mode) { Mode[Mode["Default"] = 0] = "Default"; Mode[Mode["String"] = 1] = "String"; Mode[Mode["SingleLineComment"] = 2] = "SingleLineComment"; Mode[Mode["MultiLineComment"] = 3] = "MultiLineComment"; })(Mode || (Mode = {})); class Result { constructor() { this.result = []; } add(text, row, col, mode) { if (text.length > 0) { if (mode === Mode.SingleLineComment) { this.result.push(new tokens_1.Comment(new position_1.Position(row, col - text.length), text)); } else { this.result.push(new tokens_1.Identifier(new position_1.Position(row, col), text)); } } return ""; } get() { return this.result; } } class CDSLexer { static run(file) { const result = new Result(); let mode = Mode.Default; let row = 1; let col = 1; let build = ""; const stream = new Stream(file.getRaw().replace(/\r/g, "").replace(/\u00a0/g, " ")); let next = ""; while (stream.length() > 0) { const prev = next; next = stream.takeNext(); const nextNext = stream.peekNext(); col++; // string handling if (mode === Mode.String) { build += next; if (next === "'") { build = result.add(build, row, col, mode); mode = Mode.Default; } continue; } // single line comment handling if (mode === Mode.SingleLineComment) { if (next === "\n") { build = result.add(build, row, col, mode); mode = Mode.Default; } else { build += next; continue; } } else if (mode === Mode.Default && next === "/" && nextNext === "/") { mode = Mode.SingleLineComment; build = result.add(build, row, col, mode); build += next; continue; } else if (mode === Mode.Default && next === "-" && nextNext === "-") { mode = Mode.SingleLineComment; build = result.add(build, row, col, mode); build += next; continue; } // multi line comment handling if (mode === Mode.MultiLineComment) { if (next === "\n") { row++; } else if (prev === "*" && next === "/") { mode = Mode.Default; } continue; } else if (mode === Mode.Default && next === "/" && nextNext === "*") { mode = Mode.MultiLineComment; build = result.add(build, row, col, mode); continue; } switch (next) { case "'": mode = Mode.String; build += next; break; case " ": build = result.add(build, row, col, mode); break; case "\n": build = result.add(build, row, col, mode); row++; col = 0; break; case ";": case ":": case ",": case ".": case "{": case "}": case "(": case ")": case "[": case "]": case "=": case "<": case ">": case "+": case "-": case "*": case "/": build = result.add(build, row, col, mode); result.add(next, row, col, mode); break; default: build += next; break; } } result.add(build, row, col, mode); return result.get(); } } exports.CDSLexer = CDSLexer; //# sourceMappingURL=cds_lexer.js.map