Предположим, что я пишу рудиментарный синтаксический синтаксический анализатор 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 из gobbling всей фразы из-за rep(token)
в ~ tokens
?
Другими словами, как указать нежелательное соответствие в Scala?
Чтобы понять, я полностью понимаю, что я могу использовать стандартный нежелательный синтаксис (*?) или (+?) внутри самого шаблона String, но я задавался вопросом, есть ли способ указать его на более высоком уровне внутри def tokens. Например, если бы я определил токен следующим образом:
def token: Parser[Any] = stringliteral | numericliteral | columnname
Затем, как я могу указать нежелательное соответствие для rep (токена) внутри def tokens?