rawsql-ts
Version:
[beta]High-performance SQL parser and AST analyzer written in TypeScript. Provides fast parsing and advanced transformation capabilities.
44 lines • 1.75 kB
JavaScript
import { LiteralValue, RawString } from "../models/ValueComponent";
import { literalKeywordParser } from "../tokenReaders/LiteralTokenReader";
export class LiteralParser {
static parseFromLexeme(lexemes, index) {
// Process literal value
let idx = index;
const valueText = lexemes[idx].value;
let parsedValue;
const lex = literalKeywordParser.parse(valueText.toLowerCase(), 0);
if (lex) {
const value = new RawString(lex.keyword);
idx++;
return { value, newIndex: idx };
}
// Check if it is a number
if (/^[+-]?\d+(\.\d+)?([eE][+-]?\d+)?$/.test(valueText)) {
parsedValue = Number(valueText);
idx++;
const value = new LiteralValue(parsedValue);
return { value, newIndex: idx };
}
// Otherwise, treat it as a string
else {
// Check if it's a dollar-quoted string
// Pattern: $tag$ content $tag$ where tag can be empty
const isDollarString = /^\$[^$]*\$[\s\S]*\$[^$]*\$$/.test(valueText);
if (isDollarString) {
// For dollar-quoted strings, store the entire string including tags
parsedValue = valueText;
}
else if (valueText.startsWith("'") && valueText.endsWith("'")) {
// Remove single quotes if enclosed
parsedValue = valueText.slice(1, -1);
}
else {
parsedValue = valueText;
}
idx++;
const value = new LiteralValue(parsedValue, isDollarString);
return { value, newIndex: idx };
}
}
}
//# sourceMappingURL=LiteralParser.js.map