При запросах базы данных SQL Server (Версия 7, и) необходимо заменить классы OleDb соответствующими классами в Система. Данные. Пространство имен SqlClient ( SqlConnection, SqlCommand и SqlDataReader) как те классы было оптимизировано для работы с SQL Server.
Другая вещь отметить состоит в том, что Вы никогда не должны выбирать все, поскольку это могло бы привести к неожиданным результатам позже, если Вы добавляете или удаляете столбцы к этой таблице.
Есть способы обойти это. Взгляните, например, на анализатор здесь . Он принимает 4 заранее определенных числа, которые могут появиться в любом другом, но должны появляться только один раз.
OTOH, вы можете написать комбинатор, если этот шаблон часто встречается:
def comb3[A](a: Parser[A], b: Parser[A], c: Parser[A]) =
a ~ b ~ c | a ~ c ~ b | b ~ a ~ c | b ~ c ~ a | c ~ a ~ b | c ~ b ~ a
Вы можете использовать «Парсер. ^?» для проверки группы элементов синтаксического анализа на наличие дубликатов.
def tokens = tokenA | tokenB | tokenC
def uniqueTokens = (tokens*) ^? (
{ case t if (t == t.removeDuplicates) => t },
{ "duplicate tokens found: " + _ })
Вот пример, который позволяет вам вводить любую из четырех марионеток в любом порядке, но не может выполнить синтаксический анализ, если встречается дубликат:
package blevins.example
import scala.util.parsing.combinator._
case class Stooge(name: String)
object StoogesParser extends RegexParsers {
def moe = "Moe".r
def larry = "Larry".r
def curly = "Curly".r
def shemp = "Shemp".r
def stooge = ( moe | larry | curly | shemp ) ^^ { case s => Stooge(s) }
def certifiedStooge = stooge | """\w+""".r ^? (
{ case s: Stooge => s },
{ "not a stooge: " + _ })
def stooges = (certifiedStooge*) ^? (
{ case x if (x == x.removeDuplicates) => x.toSet },
{ "duplicate stooge in: " + _ })
def parse(s: String): String = {
parseAll(stooges, new scala.util.parsing.input.CharSequenceReader(s)) match {
case Success(r,_) => r.mkString(" ")
case Failure(r,_) => "failure: " + r
case Error(r,_) => "error: " + r
}
}
}
И некоторые примеры использования:
package blevins.example
object App extends Application {
def printParse(s: String): Unit = println(StoogesParser.parse(s))
printParse("Moe Shemp Larry")
printParse("Moe Shemp Shemp")
printParse("Curly Beyonce")
/* Output:
Stooge(Moe) Stooge(Shemp) Stooge(Larry)
failure: duplicate stooge in: List(Stooge(Moe), Stooge(Shemp), Stooge(Shemp))
failure: not a stooge: Beyonce
*/
}
Я не знаю, какие конструкции вы хотите поддерживать, но полагаю, вам следует указать более конкретную грамматику. Из вашего комментария к другому ответу:
todo message: связать класс Todo с базой данных
Я думаю, вы не хотите принимать что-то вроде
todo message: database Todo to link class
Так что вы, вероятно, захотите для определения некоторых ключевых слов на уровне сообщения, таких как «ссылка» и «на» ...
def token = alphanum~':'~ "link" ~ alphanum ~ "class" ~ "to" ~ alphanum
^^ { (a:String,b:String,c:String) => /* a == "message", b="Todo", c="database" */ }
Думаю, вам придется определять свою грамматику на этом уровне.
Конечно, вы могли бы написать комбинированное правило, которое сделает это за вас, если вы часто сталкиваетесь с этой ситуацией.
С другой стороны, возможно, существует возможность сделать «tokenA..C» просто «токен», а затем дифференцировать внутри обработчика «токена»
Я бы не стал применять это требование синтаксически. Я бы написал продукт, который допускает несколько токенов из разрешенного набора, а затем использовал бы подход без синтаксического анализа для проверки приемлемости фактически заданных ключевых слов. Помимо упрощения грамматики, это позволит вам более легко продолжить синтаксический анализ после выдачи диагностического сообщения об ошибочном использовании.
Randall Schulz