Talk:S-expressions: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (Thundergnat moved page Talk:S-Expressions to Talk:S-expressions: Follow normal task title capitalization policy) |
(JavaScript, bugfix for \" and \n in strings) |
||
Line 251: | Line 251: | ||
# 'between' is not in scope. (Not included in the imports) |
# 'between' is not in scope. (Not included in the imports) |
||
# "Precedence parsing error cannot mix ‘<?>’ [infix 0] and ‘<?>’ [infix 0] in the same infix expression"-- [[User:Hout|Hout]] ([[User talk:Hout|talk]]) 22:12, 27 April 2017 (UTC) |
# "Precedence parsing error cannot mix ‘<?>’ [infix 0] and ‘<?>’ [infix 0] in the same infix expression"-- [[User:Hout|Hout]] ([[User talk:Hout|talk]]) 22:12, 27 April 2017 (UTC) |
||
== JavaScript version bugfix for \" and \n in strings == |
|||
I found that the present solution doesn't treat escaped double quotes and newlines in strings right (used in KiCad) |
|||
For my "hack" in the procedural version see below, the functional version is too difficult to read for me - in any case, I hope that the original author comes back to fix it correctly, right now it just works for my purpose |
|||
String.prototype.parseSexpr = function () { |
|||
//schweick: modified first option in regexp to catch string containing \" |
|||
//I just trusted the expression from https://stackoverflow.com/a/30737232 (some others would not work): |
|||
var t = this.match(/\s*("(?:[^"\\]*(?:\\.)?)*"|\(|\)|"|[^\s()"]+)/g) |
|||
for (var o, c = 0, i = t.length - 1; i >= 0; i--) { |
|||
var n, ti = t[i].trim() |
|||
if (ti == '"') return |
|||
else if (ti == '(') t[i] = '[', c += 1 |
|||
else if (ti == ')') t[i] = ']', c -= 1 |
|||
else if ((n = +ti) == ti) t[i] = n |
|||
// schweick: inserted two replacements to double escape \", \n in strings |
|||
// which otherwise would loose their backslash in toPretty(): |
|||
else t[i] = '\'' + ti.replace('\'', '\\\'').replace(/\\"/g, '\\\\"').replace(/\\n/g, '\\\\n') + '\'' |
|||
if (i > 0 && ti != ']' && t[i - 1].trim() != '(') t.splice(i, 0, ',') |
|||
if (!c) if (!o) o = true; else return |
|||
} |
|||
return c ? undefined : eval(t.join('')) |
|||
} |
|||
Please delete my comment above when taken care of on the main page |
|||
[[User:Schweick|Schweick]] ([[User talk:Schweick|talk]]) 09:17, 25 January 2023 (UTC) |