@abaplint/core
Version:
abaplint - Core API
155 lines • 5.02 kB
JavaScript
;
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