2016-03-29 21 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

相关问题