2014-11-24 102 views
1

对于斯卡拉组合子第一个测试,我想从一个句子让所有的话,但我只是让“无”,从下面的代码:如何用scala组合器匹配句子中的所有单词?

import java.io.File 
import scala.io.Source 
import scala.util.parsing.combinator._ 

object PgnReader extends TagParser { 

    def parseFile(inputFile:File) = { 
    val pgnStream = Source.fromFile(inputFile) 
    val pgnStr = pgnStream.mkString 
    println(parseAll(tag, "Hello World !").getOrElse("None")) 
    pgnStream.close 
    } 
} 

trait TagParser extends RegexParsers { 
    val tag:Parser[String] = """[:alpha:]+""".r ^^ (_.toString) 
} 

我希望得到的东西,如:

Hello 
World 

甚至像:

List(Hello, World) 

我是在我的代码的正确方法?

我使用Scala的2.11和scala combinators

回答

1

我认为这可能让你更接近:

trait TagParser extends RegexParsers { 
    val tag = rep("""\p{Alpha}+""".r) ^^ (_.map(_.toString)) 
} 

POSIX字符类在斯卡拉(as inherited from Java)不同的语法。 rep()语法允许多次出现(给出List())。

这将仍然扼杀感叹号,所以你可以扩大你的正则表达式。我大概也有“标签”和“标签”分开的概念去让事情更清晰:

trait TagParser extends RegexParsers { 
    val tags = rep(tag) 
    val tag = """\p{Alpha}+|!""".r ^^ (_.toString) 
} 
... 
println(parseAll(tags, "Hello World !").getOrElse(None)) 
... 
4

你应该使用类似的东西相匹配的令牌序列,而不是一个令牌:

trait TagParser extends RegexParsers { 
    val tags: Parser[List[String]] = rep("""[a-zA-Z]+""".r) 
} 

rep是:

解析器发生器重复。 rep(p)重复使用p来解析输入,直到p失败(结果 是p的连续结果的列表)。

http://www.scala-lang.org/files/archive/nightly/docs/parser-combinators/index.html#scala.util.parsing.combinator.RegexParsers

+0

对不起,但我仍然得到“没有” – loloof64 2014-11-24 16:09:28

+0

也许是因为“!”与[:alpha:]不匹配? – dk14 2014-11-24 16:11:20

+0

不,即使没有额外的字符也不会得到任何结果 – loloof64 2014-11-24 16:15:40