varias lineas interpolación interpolacion ecmascript concatenar cadenas scala parsing combinators

scala - lineas - string format interpolation java



Analizadores del combinador de Scala: distinga entre cadenas de números y cadenas de variables (1)

Lo dividiría un poco e introduciría el análisis de casos en | . Esta es una de las ventajas de los combinadores y realmente el análisis de LL (*) en general:

def factor: Parser[ExprTree] = ( wholeNumber ^^ { Number(_.toInt) } | "(" ~> expr <~ ")" | ident ^^ { Variable(_) } )

Me disculpo si no está familiarizado con la sintaxis del subrayado. Básicamente solo significa "sustituir el n- ésimo parámetro por el valor de la función adjunta". Por lo tanto, { Variable(_) } es equivalente a { x => Variable(x) } .

Otro poco de magia de sintaxis aquí son los operadores ~> y <~ en lugar de ~ . Estos operadores significan que el análisis sintáctico de ese término debe incluir la sintaxis de ambos parens, pero el resultado debe estar determinado únicamente por el resultado de expr . Por lo tanto, "(" ~> expr <~ ")" coincide exactamente con "(" ~ expr ~ ")" , pero no requiere el análisis de casos adicionales para recuperar el valor de resultado interno de expr .

Estoy haciendo los ejercicios del analizador combinador de Cay Horstmann, me pregunto sobre la mejor manera de distinguir entre cadenas que representan números y cadenas que representan variables en una declaración de coincidencia:

def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ { case a: wholeNumber => Number(a.toInt) case a: String => Variable(a) }

La segunda línea allí, "case a: wholeNumber" no es legal. Pensé en una expresión regular, pero no he encontrado la manera de que funcione con "caso".