解析公共函数
package com.yst.core.parser
import scala.util.Try
import scala.util.parsing.combinator.{JavaTokenParsers, PackratParsers}
/**
* 抽象解析器
*/
abstract class FunParser(map:java.util.Map[String,Object]) extends JavaTokenParsers with PackratParsers {
/**
* 任意字符
*/
def jAny:Parser[Any] = stringLiteral
/**
* 任意java内容
*/
def jStr: Parser[Any] = ident|wholeNumber^^(s=>s)
/**
* 字符内容
*/
def jtxt:Parser[Any] = ("'"~>rep("-"|","|"%"|"|"|":"|jStr)<~"'")^^{
s=>s.mkString
}
/**
* 约定的参数格式
*/
def param:Parser[Any] = "${"~>jStr<~"}"^^(
s=>map.get(s)
)
/**
* 取param里面的key
*/
def paramKey:Parser[String] = "${"~>jStr<~"}"^^{
s =>s.toString()
}
/**
* 字符+参数
*/
def cparam:Parser[Any] = (rep(substrFun|param|jtxt))^^{
case s=>{
s.mkString
}
}
/**
* 括号内内容
*/
def bracketsContent:Parser[List[Any]]="("~>repsep(substrFun|cparam|param|jStr,",")<~")"^^{
s=>s
}
/**
* 字符截取函数substr
*/
def substrFun:Parser[String]="substr("~>param~","~wholeNumber~","~wholeNumber<~")"^^{
case a~b~c~d~e=>{
val str =a.toString()
str.substring(Integer.valueOf(c), Integer.valueOf(e))
}
}
/**
* 定义表达式
*/
def model:Parser[Object]
/**
* 解析入口方法
*/
def parse(text : String):Object ={
val p= parseAll(model, text)
if(p.successful){
p.get
}else{
println(p)
"error"
}
}
}