не жадное сопоставление в Scala RegexParsers
Предположим, я пишу элементарный парсер SQL в Scala. У меня есть следующее:
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
}
При попытке сопоставить selectstatement противSELECT foo FROM bar
, как я могу предотвратить, чтобы предложение select сожрало всю фразу из-заrep(token)
в~ tokens
?
Другими словами, как мне указать не жадное сопоставление в Scala?
Чтобы уточнить, я полностью осознаю, что могу использовать стандартный не жадный синтаксис (*?) Или (+?) Внутри самого шаблона String, но мне было интересно, есть ли способ указать его на более высоком уровне внутри токенов def. Например, если бы я определил токен так:
def token: Parser[Any] = stringliteral | numericliteral | columnname
Тогда как я могу указать не жадное соответствие для rep (токена) внутри токенов def?