que estoy haciendo ejercicios analizador de combinadores de Cay Horstmann, me pregunto cuál es la mejor manera de distinguir entre cadenas que representan los números y las cadenas que representan las variables en un comunicado partido:analizadores combinator Scala - Distinguir entre cadenas de números y cadenas de variables
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".
¡Excelente! Tuve que cambiar {Number (_. ToInt)} a {x: String => Number (x)} porque obtuve "error: tipo de parámetro faltante para la función expandida", entonces funcionó como un amuleto. Todavía tiene curiosidad si hay una forma de resolverlo en clase de caso. –
Bueno, en realidad el caso solo define una función parcial. Te permite hacer una coincidencia de patrones en la entrada, que es realmente la razón por la cual es útil. También podría haber escrito mi respuesta usando funciones parciales (caso), simplemente no era necesario. :-) (lo hubiera sido, excepto para ~> y <~) –
Si quiere decir que coinciden en todo el término, creo que la respuesta es "no, no hay forma de hacerlo". A menos que el método 'wholeNumber' devuelva un analizador con un tipo de componente diferente de String, realmente no hay forma de diferenciarlo de' ident' o incluso "(" ~> expr <~ ")". –