Skip to content

Commit 18dadf5

Browse files
committed
fix: empty strings hotfix
1 parent 0d8a059 commit 18dadf5

File tree

2 files changed

+26
-2
lines changed

2 files changed

+26
-2
lines changed

parser/bnf.js

+14-2
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,17 @@ compiler._ParseScript = compiler.ParseScript
7979
compiler.ParseScript = function (script) {
8080
const qLiterals = []
8181
const aqLiterals = []
82-
const quotedStrings = script.replaceAll(/"([^"\\]|\\.)+"/g, (str) => {
82+
const quotedStrings = script.replaceAll(/"([^"\\]|\\.)*"/g, (str) => {
83+
if (str.length < 512) {
84+
return str
85+
}
8386
qLiterals.push(str)
8487
return `"QL_${qLiterals.length - 1}"`
8588
})
86-
const aQuotedStrings = quotedStrings.replaceAll(/`([^`\\]|\\.)+`/g, (str) => {
89+
const aQuotedStrings = quotedStrings.replaceAll(/`([^`\\]|\\.)*`/g, (str) => {
90+
if (str.length < 512) {
91+
return str
92+
}
8793
aqLiterals.push(str)
8894
return `\`AL_${aqLiterals.length - 1}\``
8995
})
@@ -92,10 +98,16 @@ compiler.ParseScript = function (script) {
9298
return parsedScript
9399
}
94100
for (const t of parsedScript.rootToken.Children('QLITERAL')) {
101+
if (!t.value.match(/^"QL_\d+"$/)) {
102+
continue
103+
}
95104
t._value = qLiterals[parseInt(t.value.slice(4, t.value.length - 1))]
96105
t.tokens = []
97106
}
98107
for (const t of parsedScript.rootToken.Children('AQLITERAL')) {
108+
if (!t.value.match(/^`AL_\d+`$/)) {
109+
continue
110+
}
99111
t._value = aqLiterals[parseInt(t.value.slice(4, t.value.length - 1))]
100112
t.tokens = []
101113
}

test/parser.test.js

+12
Original file line numberDiff line numberDiff line change
@@ -148,3 +148,15 @@ it('should parse parameterized fns', () => {
148148
exp = bnf.ParseScript('topk(5, sum(rate({a="b"}|unwrap b[1s]) by (a)) by (b) > 1)')
149149
expect(exp.rootToken.value).toEqual('topk(5, sum(rate({a="b"}|unwrap b[1s]) by (a)) by (b) > 1)')
150150
})
151+
152+
it('should parse a default request', () => {
153+
const req = '{job="svc", level=~"ERR|WRN|INF"} |= `` | json Environment="req[\\"depl.env\\"]", AccountId="att[\\"AccId\\"]", ClientId="att[\\"ClId\\"]", RId="att[\\"Id\\"]", body="body", RequestPath="att[\\"ReqPath\\"]", id="att[\\"id\\"]", Transaction="att[\\"Txn\\"]", Scope="IS[\\"name\\"]", Whence="att[\\"Wnc\\"]", att="att[\\"ex.msg\\"]" | Environment = `A`'
154+
const exp = bnf.ParseScript(req)
155+
expect(exp.rootToken.value).toEqual(req)
156+
})
157+
158+
it('should parse a long string', () => {
159+
const req = '{job="svc", level=~"json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24|json1|json2|json3|json4|json5|json6|json7|json8|json9|json10|json11|json12|json13|json14|json15|json16|json17|json18|json19|json20|json21|json22|json23|json24"}'
160+
const exp = bnf.ParseScript(req)
161+
expect(exp.rootToken.value).toEqual(req)
162+
})

0 commit comments

Comments
 (0)