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".