【问题标题】:Scala Parser Combinator Replace PatternsScala Parser Combinator 替换模式
【发布时间】:2015-10-09 19:10:51
【问题描述】:

我有一个下面的程序,我可以将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))

【问题讨论】:

  • 当你说你想用CAST(a.ACCOUNT_ID AS VARCHAR)“替换”convert(a.ACCOUNT_ID, string)是什么意思?您想将其解析为相同的表示形式吗?在这种情况下,应该注意您当前根本没有解析CAST(a.ACCOUNT_ID AS VARCHAR)
  • 假设我有一个带有某种模式的长 sql 字符串 convert(ident.ident, ident) ex。 “从双重选择转换(a.ACCOUNT_ID,字符串)”。我想将其转换为“select cast(a.ACCOUNT_ID AS VARCHAR) from dual”
  • 我明白了。我想我很困惑,因为目前你的解析器没有生成字符串作为结果,我没有意识到这是意图。

标签: scala parsing parser-combinators


【解决方案1】:

我不太确定您对 “有这样的表达式,因此我不想那样做” 的含义,但是您可以使用 @ 转换解析器函数的结果987654322@运营商。

解析器的转换函数可以是:

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 组合器解析的更多信息,请参阅 Scala 编程,第 1 章chapter

【讨论】:

  • @Sathish 不要忘记在此问题和您之前的问题中接受/支持有用的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
相关资源
最近更新 更多