fix lexer to parse correctly quoted empty strings, #1825

This commit is contained in:
zadam 2021-04-04 23:13:18 +02:00
parent 855c5e0e67
commit 858072cc10
2 changed files with 16 additions and 4 deletions

View File

@ -87,14 +87,16 @@ describe("Lexer expression", () => {
.toEqual(["#label", "*=*", "text"]); .toEqual(["#label", "*=*", "text"]);
}); });
it("simple label operator with in quotes and without", () => { it("simple label operator with in quotes", () => {
expect(lex("#label*=*'text'").expressionTokens) expect(lex("#label*=*'text'").expressionTokens)
.toEqual([ .toEqual([
{token: "#label", inQuotes: false, startIndex: 0, endIndex: 5}, {token: "#label", inQuotes: false, startIndex: 0, endIndex: 5},
{token: "*=*", inQuotes: false, startIndex: 6, endIndex: 8}, {token: "*=*", inQuotes: false, startIndex: 6, endIndex: 8},
{token: "text", inQuotes: true, startIndex: 10, endIndex: 13} {token: "text", inQuotes: true, startIndex: 10, endIndex: 13}
]); ]);
});
it("simple label operator with param without quotes", () => {
expect(lex("#label*=*text").expressionTokens) expect(lex("#label*=*text").expressionTokens)
.toEqual([ .toEqual([
{token: "#label", inQuotes: false, startIndex: 0, endIndex: 5}, {token: "#label", inQuotes: false, startIndex: 0, endIndex: 5},
@ -103,6 +105,16 @@ describe("Lexer expression", () => {
]); ]);
}); });
it("simple label operator with empty string param", () => {
expect(lex("#label = ''").expressionTokens)
.toEqual([
{token: "#label", inQuotes: false, startIndex: 0, endIndex: 5},
{token: "=", inQuotes: false, startIndex: 7, endIndex: 7},
// weird case for empty strings which ends up with endIndex < startIndex :-(
{token: "", inQuotes: true, startIndex: 10, endIndex: 9}
]);
});
it("note. prefix also separates fulltext from expression", () => { it("note. prefix also separates fulltext from expression", () => {
expect(lex(`hello fulltext note.labels.capital = Prague`).expressionTokens.map(t => t.token)) expect(lex(`hello fulltext note.labels.capital = Prague`).expressionTokens.map(t => t.token))
.toEqual(["note", ".", "labels", ".", "capital", "=", "prague"]); .toEqual(["note", ".", "labels", ".", "capital", "=", "prague"]);

View File

@ -21,8 +21,8 @@ function lex(str) {
} }
} }
function finishWord(endIndex) { function finishWord(endIndex, createAlsoForEmptyWords = false) {
if (currentWord === '') { if (currentWord === '' && !createAlsoForEmptyWords) {
return; return;
} }
@ -71,7 +71,7 @@ function lex(str) {
} }
} }
else if (quotes === chr) { else if (quotes === chr) {
finishWord(i - 1); finishWord(i - 1, true);
quotes = false; quotes = false;
} }