Комбинатор Scala Parser Replace Patterns

У меня есть программа ниже, я могу проанализировать шаблон, например convert(a.ACCOUNT_ID, string), на выражение, но я хочу заменить этот шаблон на CAST(a.ACCOUNT_ID AS VARCHAR). Я могу проанализировать полученное выражение и заменить строки указанным выше, но есть такие выражения, поэтому я не хочу этого делать .. Есть ли способ, которым я могу заменить шаблон? Например, если я найду образец как convert(a.ACCOUNT_ID, string), замените его на CAST(a.ACCOUNT_ID AS VARCHAR)

import scala.util.parsing.combinator._
import scala.util.parsing.combinator.lexical._
import scala.util.parsing.combinator.syntactical._
import scala.util.parsing.combinator.token._
import scala.util.parsing.input.CharSequenceReader


trait QParser  extends RegexParsers with JavaTokenParsers  {
  def knownFunction: Parser[Any] = ident ~ "(" ~ ident ~ ("." ~ ident <~ "," ~ ident ~ ")")

  def parse(inputString: String): Any = synchronized {
    phrase(knownFunction)(new CharSequenceReader(inputString)) match {
      case Success(result, _) => result
      case Failure(msg,_) => throw new DataTypeException(msg)
      case Error(msg,_) => throw new DataTypeException(msg)
    }
  }

 class DataTypeException(message: String) extends Exception(message)

}

object Parser extends QParser {
  def main(args: Array[String]) {
     println(parse("convert(a.ACCOUNT_ID, string)"));
  }
}

Выход: (((convert~()~a)~(.~ACCOUNT_ID))


person Sathish    schedule 20.07.2015    source источник
comment
Что вы имеете в виду, когда говорите, что хотите заменить convert(a.ACCOUNT_ID, string) на CAST(a.ACCOUNT_ID AS VARCHAR)? Что вы хотите разобрать на одно и то же представление? В этом случае следует отметить, что вы вообще не анализируете CAST(a.ACCOUNT_ID AS VARCHAR).   -  person sepp2k    schedule 20.07.2015
comment
Скажем, у меня есть длинная строка sql с некоторым шаблоном convert(ident.ident, ident) ex. выберите convert (a.ACCOUNT_ID, string) из двойного. Я хочу преобразовать его, чтобы выбрать приведение (a.ACCOUNT_ID AS VARCHAR) из двойного   -  person Sathish    schedule 20.07.2015
comment
Я понимаю. Полагаю, я был сбит с толку, потому что в настоящее время ваш синтаксический анализатор не производит строки в качестве своего результата, и я не понимал, что это было намерением.   -  person sepp2k    schedule 21.07.2015


Ответы (1)


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

Функция преобразования для вашего парсера может быть:

def knownFunction: Parser[String] = 
  ident ~ "(" ~ ident ~ "." ~ ident ~ "," ~ ident ~ ")" ^^ {
    case func ~ "(" ~ obj ~ "." ~ value ~ "," ~ castType ~ ")" =>
      val sqlFunc = Map("convert" -> "CAST")
      val sqlType = Map("string" -> "VARCHAR")
      s"${sqlFunc(func)}($obj.$value AS ${sqlType(castType)})"
  }

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

CAST(a.ACCOUNT_ID AS VARCHAR)

Дополнительную информацию о синтаксическом анализе Scala Combinator можно найти в главе в Программирование на Scala, 1 изд..

person Peter Neyens    schedule 20.07.2015
comment
@Sathish Не забудьте принять / проголосовать за полезные ответы на этот и предыдущие вопросы. - person Peter Neyens; 20.07.2015