нежадное сопоставление в 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 , как мне запретить selectclause поглотить всю фразу из-за rep (токена) в ~ токенах ?

Другими словами, как мне указать нежадное сопоставление в Scala?

Чтобы уточнить, я полностью осознаю, что могу использовать стандартный нежадный синтаксис (*?) Или (+?) В строке шаблон, но мне было интересно, есть ли способ указать его на более высоком уровне внутри токенов def. Например, если бы я определил токен следующим образом:

def token: Parser[Any] = stringliteral | numericliteral | columnname

Тогда как я могу указать нежадное сопоставление для репутации (токена) внутри токенов def?

14
задан Magnus 18 October 2011 в 20:22
поделиться