2017-02-01 16 views
0

で失敗します。Sbtのパーサは、私がこれまでパーサ似たものが含まれているのsbtプラグインを持っているのOutOfMemoryException

package sbtpin 

import sbt.complete._ 
import DefaultParsers._ 

object InputParser { 
    private lazy val dotParser: Parser[Char] = '.' 
    private lazy val objectId = identifier(Letter, IDChar | dotParser) 

    private lazy val addCommand1 = "add" ~> Space.+ ~> objectId ~ (Space.+ ~> NotSpace.+).? map(p => AddCommand1(p._1, p._2)) 
    private lazy val addCommand2 = "add -n" ~> Space.+ ~> objectId ~ (Space.+ ~> NotSpace.+).? map(p => AddCommand1(p._1, p._2)) 
    private lazy val addCommand2 = "add -l" ~> Space.+ ~> objectId ~ (Space.+ ~> NotSpace.+).? map(p => AddCommand1(p._1, p._2)) 

    lazy val parser: Parser[Command] = Space.* ~> (addCommand1 | addCommand2 | addCommand3) 
} 

このパーサーでテストを実行しようとすると、それは「java.lang.OutOfMemoryErrorをして失敗します。Javaのヒープスペース "

at scala.collection.mutable.StringBuilder.<init>(StringBuilder.scala:46) 
    at scala.collection.mutable.StringBuilder.<init>(StringBuilder.scala:51) 
    at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:286) 
    at scala.collection.AbstractTraversable.mkString(Traversable.scala:105) 
    at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:288) 
    at scala.collection.AbstractTraversable.mkString(Traversable.scala:105) 
    at scala.collection.TraversableOnce$class.mkString(TraversableOnce.scala:290) 
    at scala.collection.AbstractTraversable.mkString(Traversable.scala:105) 
    at sbt.complete.ParserMain$$anon$3$$anonfun$string$1.apply(Parser.scala:313) 
    at sbt.complete.ParserMain$$anon$3$$anonfun$string$1.apply(Parser.scala:313) 
    at sbt.complete.Parser$Value.map(Parser.scala:161) 
    at sbt.complete.MapParser.resultEmpty$lzycompute(Parser.scala:704) 
    at sbt.complete.MapParser.resultEmpty(Parser.scala:704) 
    at sbt.complete.Repeat.derive(Parser.scala:834) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 
    at sbt.complete.HomParser.derive(Parser.scala:632) 

コンパイルにも時間がかかりますが、予期しないことです。

答えて

0

Space、OptSpaceなどで十分なら、Space +、Space。*などを使っていることに気付きました。これは、SpaceとOptSpace(DefaultParserで定義されている)がすでに複数の文字と一致しているためです。

私は正常に動作し、以下にコードを変更:

/** Matches a single character that is not a whitespace character. */ 
lazy val NotSpaceClass = charClass(!_.isWhitespace, "non-whitespace character") 

/** Matches a single whitespace character, as determined by Char.isWhitespace.*/ 
lazy val SpaceClass = charClass(_.isWhitespace, "whitespace character") 

/** Matches a non-empty String consisting of non-whitespace characters. */ 
lazy val NotSpace = NotSpaceClass.+.string 

/** Matches a possibly empty String consisting of non-whitespace characters. */ 
lazy val OptNotSpace = NotSpaceClass.*.string 

/** Matches a non-empty String consisting of whitespace characters. 
* The suggested tab completion is a single, constant space character.*/ 
lazy val Space = SpaceClass.+.examples(" ") 

/** Matches a possibly empty String consisting of whitespace characters. 
* The suggested tab completion is a single, constant space character.*/ 
lazy val OptSpace = SpaceClass.*.examples(" ") 
:これは等のスペース、OptSpaceは、SBTに定義されている方法です

package sbtpin 

import sbt.complete._ 
import DefaultParsers._ 

object InputParser { 
    private lazy val dotParser: Parser[Char] = '.' 
    private lazy val objectId = identifier(Letter, IDChar | dotParser) 

    private lazy val addCommand1 = "add" ~> Space ~> objectId ~ (Space ~> NotSpace).? map(p => AddCommand1(p._1, p._2)) 
    private lazy val addCommand2 = "add -n" ~> Space ~> objectId ~ (Space.+ ~> NotSpace).? map(p => AddCommand1(p._1, p._2)) 
    private lazy val addCommand2 = "add -l" ~> Space ~> objectId ~ (Space ~> NotSpace).? map(p => AddCommand1(p._1, p._2)) 

    lazy val parser: Parser[Command] = OptSpace ~> (addCommand1 | addCommand2 | addCommand3) 
} 

関連する問題