Estoy construyendo una calculadora con el analizador Chevrotain y he jugado con su ejemplo de calculadora
Parque infantil Chevrotain : https://chevrotain.io/playground/
Gramática del analizador : semántica incrustada de la calculadora
Muestra de entrada : precedencia de paréntesis
El ejemplo anterior usa enteros como entrada/salida. Me gustaría admitir enteros Y matrices.
Ejemplo básico :
2 * ( 3 + 7 )
Ejemplo con arreglos :
2 * ( {{array1}} + {{array2}} )
const map = { array1: [1, 2, 3, 4, 5], array2: [10, 20, 30, 40, 50] } Sé cómo lex y analizar {{array}} pero no sé cómo visitarlos o recorrer los arreglos para lograr el siguiente resultado
2 * ( 1 + 10 ) = 22 2 * ( 2 + 20 ) = 44 2 * ( 3 + 30 ) = 66 2 * ( 4 + 40 ) = 88 2 * ( 5 + 50 ) = 110 Resultado final del análisis de 2 * ( {{array1}} + {{array2}} )
debería ser [22, 44, 66, 88, 110]
Una vez que se ha creado el AST (incluidas las matrices en algún nodo hoja), ¿cómo puedo reducirlo al resultado final, que es una matriz?
Un enfoque es tener algún tipo de estado (con el índice actual) y ejecutar el visitante tantas veces como array.length. Pero no me queda claro cómo se puede implementar con Chevretain
Esta solución funcionará
const map = { array1: [1, 2, 3, 4, 5], array2: [10, 20, 30, 40, 50] } const { array1, array2 } = map; const res = []; for (let i = 0; i < (array1.length > array2.length ? array1.length : array2.length); i++) { if (array1[i] && array2[i]) { res.push((array1[i] + array2[i]) * 2); } else if (array1[i] && !array2[i]) { res.push(array1[i] * 2); } else { res.push(array1[i] * 2); } } // res = [ 22, 44, 66, 88, 110 ]Primero, extraeremos las matrices de un objeto, luego crearemos un bucle que se ejecutará varias veces de la matriz más larga (operador trinario). Dentro del bucle, insertaremos el elemento de la matriz1 más el elemento de la matriz2 duplicado por 2 en la nueva matriz, y si no hay ningún elemento en uno de los puntos de las matrices (lo que significa que una de las matrices es más corta que la otra ) insertaremos solo un elemento.