Грамматики, Scala, анализирующий Combinators и беспорядочные наборы

При запросах базы данных SQL Server (Версия 7, и) необходимо заменить классы OleDb соответствующими классами в Система. Данные. Пространство имен SqlClient ( SqlConnection, SqlCommand и SqlDataReader) как те классы было оптимизировано для работы с SQL Server.

Другая вещь отметить состоит в том, что Вы никогда не должны выбирать все, поскольку это могло бы привести к неожиданным результатам позже, если Вы добавляете или удаляете столбцы к этой таблице.

7
задан BefittingTheorem 23 November 2009 в 08:03
поделиться

5 ответов

Есть способы обойти это. Взгляните, например, на анализатор здесь . Он принимает 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
3
ответ дан 7 December 2019 в 05:24
поделиться

Вы можете использовать «Парсер. ^?» для проверки группы элементов синтаксического анализа на наличие дубликатов.

  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
  */
}
4
ответ дан 7 December 2019 в 05:24
поделиться

Я не знаю, какие конструкции вы хотите поддерживать, но полагаю, вам следует указать более конкретную грамматику. Из вашего комментария к другому ответу:

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" */ }

Думаю, вам придется определять свою грамматику на этом уровне.

0
ответ дан 7 December 2019 в 05:24
поделиться

Конечно, вы могли бы написать комбинированное правило, которое сделает это за вас, если вы часто сталкиваетесь с этой ситуацией.

С другой стороны, возможно, существует возможность сделать «tokenA..C» просто «токен», а затем дифференцировать внутри обработчика «токена»

0
ответ дан 7 December 2019 в 05:24
поделиться

Я бы не стал применять это требование синтаксически. Я бы написал продукт, который допускает несколько токенов из разрешенного набора, а затем использовал бы подход без синтаксического анализа для проверки приемлемости фактически заданных ключевых слов. Помимо упрощения грамматики, это позволит вам более легко продолжить синтаксический анализ после выдачи диагностического сообщения об ошибочном использовании.

Randall Schulz

1
ответ дан 7 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: