Предположим, я пишу элементарный синтаксический анализатор 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?