2016-03-29 25 views
2

我正在第一次編寫詞法分析器/掃描程序,並且遇到了拆分輸入字符串的問題。 實施例:如何在保留拆分字符的情況下在多個正則表達式上拆分字符串

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

但問題是,我不能簡單地分開上的空白字符,這樣做從01​​例如不會分離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就足夠了。但我擔心我可能不得不重寫我的代碼,並瞭解正則表達式解析器以獲得更可靠的解決方案。感謝您的回覆 ! – Saveyy

+0

你會省時省力。我並不是第一次,因爲我很懶,我不得不重寫所有內容,並不斷說出爲什麼之前我不知道這件事。 – Joan

相關問題