2016-03-29 8 views
2

Я пишу lexer/scanner в первый раз и столкнулся с проблемой разделения входной строки. Пример:Как разбить строку на несколько регулярных выражений при сохранении разделительных символов

val result = "func add(Num x, Num y) = x+y;".split(???) 
result == Array("func", "add", "(", "Num", "x", ",", "Num", "y", ")", "=", "x", "+", "y", ";") 

Но проблема в том, что я просто не могу разделить на пробельных символов, это не было бы отделить от add(, например.

Любая помощь?

+0

Не * * говорить Скал;), поэтому я не могу вам сказать, как обрабатывать пустые записи, но расщепление на '\ s \ \ b' - добавление границы слова - должно это сделать. См. [Образец regex101] (https://regex101.com/r/lB7sB3/2) – ClasG

+1

@ClasG, который сделал трюк, если вы разместите его в качестве ответа, я приму его – Saveyy

ответ

1

Это даст вам кучу пустых предметов, которые вам нужно будет обработать вашей EE, но добавление словесности - \b - должно это сделать.

Проверить example at regex101.

I.e. ...split('\s|\b') (или /\s|\b/).

С уважением

+0

Если я не ошибаюсь, это добавит пробелы в результате, которые, я думаю, не ожидаются –

0

Посмотрите в http://www.scala-lang.org/api/rc/index.html#scala.util.parsing.combinator.RegexParsers

Вот незаконченный пример:

import scala.util.parsing.combinator.RegexParsers 

trait Element 

case class Function(name: String, 
                    params:Map[String, String], 
                    expression:Seq[String]) extends Element 

case class Class(name: String, 
                 params: Map[String,String], 
                 body: Seq[String]) extends Element 

object LanguageParser extends RegexParsers { 

  val name: Parser[String] = ".*".r 

  val `type`: Parser[String] = ??? 

  val parameters: Parser[Map[String,String]] = "(" ~> (`type` ~ name).* <~")" ^^ { 
    case t => (t map { 
      case a ~ b => a -> b 
    }).toMap 
  } 

  val expression: Parser[Seq[String]] = ??? 

  val function: Parser[Function] = 
    "func " ~> name ~ parameters ~ "="~ expression ^^ { 
      case name ~  params ~ _ ~ expr => Function(name, params, expr) 
    } 
   
  val `class`: Parser[Class] = 
    "class " ~> name ~ parameters ~ "{" ~ expression ~ "}" ^^ { 
      case name ~  params ~ _ ~ expr ~_ => Class(name, params, expr) 
    } 

  val topLevelParsers: Parser[Seq[Element]] = 
    function | 
      `class` | 
      value | 
      ifelse 

  def parse(s: String): Seq[Element] = parseAll(topLevelParsers, s.trim) getOrElse 
    (throw newIllegalArgumentException("Could not parse the given string: " + s.trim)) 

  def parseAll(s: String):Seq[Element] = 
    s split ";" flatMap parse 
} 

Приветствие

+0

В настоящее время достаточно \ b | \ s. но я боюсь, что мне, возможно, придется переписать код, который у меня есть, и узнать о парсере regex для достижения более надежного решения. Спасибо за ваш ответ ! – Saveyy

+0

Вы сэкономите время, изучая его сразу. Я не первый раз, потому что я ленился, мне пришлось переписать все и продолжать говорить, почему я раньше этого не знал. – Joan