<ahref="https://en.wikipedia.org/wiki/S-Expression"title="wp: S-Expresión">S-Expressions</a> son una forma conveniente de analizar y almacenar datos.
</p>
Tarea:
<p>
Escriba un lector / analizador simple para S-Expressions que maneje cadenas, enteros y flotantes entre comillas y sin comillas.
</p>
<p>
La función debe leer una expresión-S única pero anidada de una cadena y
devolverla como una matriz (anidada).
</p>
<p>
líneas nuevas y otros espacios en blanco pueden ignorarse a menos que estén dentro de una cadena entre comillas.
</p>
<p> “ <tt>()</tt> ” Dentro de las cadenas entre comillas no se interpretan, sino que se tratan como parte de la cadena.
</p>
<p>
manejo de citas escapadas dentro de una cadena es opcional; por lo tanto, "<tt>(foo" barra)</tt>"puede tratarse como una cadena"<tt>foo "barra</tt>", o como un error.
</p>
<p>
Para esto, el lector no necesita reconocer "<tt>\</tt> " por escapar, sino que, además, debe reconocer los números si el idioma tiene los tipos de datos apropiados.
</p>
<p>
Tenga en cuenta que con la excepción de "<tt>()"</tt>"("<tt>\</tt> "si se admite el escape) y espacios en blanco no hay caracteres especiales. Se permite cualquier otra cosa sin comillas.
</p>
<p> El lector debe poder leer la siguiente entrada </p>
- text: <code>parseSexpr('(data1 data2 data3)')</code> debe devolver una matriz con 3 elementos ")
testString: 'assert.deepEqual(parseSexpr(basicSExpr), basicSolution, "<code>parseSexpr("(data1 data2 data3)")</code> should return an array with 3 elements");'
```
</section>
## Challenge Seed
<sectionid='challengeSeed'>
<divid='js-seed'>
```js
function parseSexpr(str) {
// Good luck!
return true;
}
```
</div>
### After Test
<divid='js-teardown'>
```js
console.info('after the test');
```
</div>
</section>
## Solution
<sectionid='solution'>
```js
function parseSexpr(str) {
const t = str.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;
else t[i] = `'${ti.replace('\", '\\\")}'`;
if (i > 0 && ti != ']' && t[i - 1].trim() != '(') t.splice(i, 0, ',');