1
Необходимо извлечь жетоны и фиксированный текст. Пример: parboiled2 parser для извлечения токена и фиксированного текста
"Hello {token1} текущая дата {token2} вы хотели бы назвать {token3}"
вернетсяFixedPart("Hello ")
TokenPart(token1)
FixedPart(" today's date is ")
TokenPart(token2)
FixedPart(" would you like to call ")
TokenPart(token3)
Вот наивная реализация
import org.parboiled2.ParserInput
import org.parboiled2.Parser
import org.parboiled2.CharPredicate
sealed trait Part
case class TokenPart(tokenName : String) extends Part
case class FixedPart(text : String) extends Part
class MyParser(val input: ParserInput) extends Parser {
def Token = rule { '{' ~ capture(TokenName) ~> (TokenPart(_)) ~'}' }
//how this should be implemented??
def NotToken = rule { capture (!Token) ~>(FixedPart(_))}
def TokenName = rule { CharPredicate.Alpha ~ oneOrMore (CharPredicate.AlphaNum) }
// This would not work
def TokenNotToken = rule { (Token|NotToken) }
def InputLine = rule { zeroOrMore (TokenNotToken) }
}
object MyParser {
def main(args: Array[String]) {
val res = new MyParser("Hello {token1} today's date is {token2} would you like to call {token3}").InputLine.run() // Success
println(res)
}
}
Любой другой осуществить это ??
Пожалуйста, не звоните 'CharPredicate.NAME' внутри правила. Создайте переменную и присвойте значение предиката. В вашем коде 'CharPredicate.NAME' будет оцениваться каждый раз, когда ваш парсер сталкивается с правилом. Это ухудшает производительность. – ppopoff