coincidencias no codiciosas en Scala RegexParsers
Supongamos que estoy escribiendo un analizador de SQL rudimentario en Scala. Tengo lo siguiente:
class Arith extends RegexParsers {
def selectstatement: Parser[Any] = selectclause ~ fromclause
def selectclause: Parser[Any] = "(?i)SELECT".r ~ tokens
def fromclause: Parser[Any] = "(?i)FROM".r ~ tokens
def tokens: Parser[Any] = rep(token) //how to make this non-greedy?
def token: Parser[Any] = "(\\s*)\\w+(\\s*)".r
}
Cuando intente hacer coincidir la declaración select conSELECT foo FROM bar
, ¿cómo evito que la cláusula selectiva engulle la frase completa debido a larep(token)
in~ tokens
?
n otras palabras, ¿cómo especifico una coincidencia no codiciosa en Scala?
Para aclarar, soy plenamente consciente de que puedo usar la sintaxis no codiciosa estándar (*?) O (+?) Dentro del patrón String, pero me pregunté si hay una manera de especificarlo en un nivel superior dentro de tokens de definición . Por ejemplo, si hubiera definido un token como este:
def token: Parser[Any] = stringliteral | numericliteral | columnname
Entonces, ¿cómo puedo especificar una coincidencia no codiciosa para el representante (token) dentro de los tokens def?