2017-05-31 90 views
0

我試圖使用FastParse library創建一個解析器一種非常原始的模板系統是這樣的:FastParse - 內存不足的錯誤

你好,你的名字是{{名}},今天是{ {日期}}。

到目前爲止,我有:

scala> import fastparse.all._ 
import fastparse.all._ 

scala> val FieldStart = "{{" 
FieldStart: String = {{ 

scala> val FieldEnd = "}}" 
FieldEnd: String = }} 

scala> val Field = P(FieldStart ~ (!FieldEnd ~ AnyChar).rep.! ~ FieldEnd) 
Field: fastparse.all.Parser[String] = Field 

scala> val Static = P((!FieldStart ~ !FieldEnd ~ AnyChar).rep.!) 
Static: fastparse.all.Parser[String] = Static 

scala> val Template = P(Start ~ (Field | Static) ~ End) 
Template: fastparse.all.Parser[String] = Template 

scala> Template parse "{{foo}}" 
res0: fastparse.core.Parsed[String,Char,String] = Success(foo,7) 

scala> Template parse "foo" 
res1: fastparse.core.Parsed[String,Char,String] = Success(foo,3) 

scala> Template parse "{{foo" 
res2: fastparse.core.Parsed[String,Char,String] = Failure(End:1:1 ..."{{foo") 

但是當我嘗試我覺得應該是正確的最終形式:

scala> val Template = P(Start ~ (Field | Static).rep ~ End) 
Template: fastparse.all.Parser[Seq[String]] = Template 

我得到:

scala> Template parse "{{foo}}" 
java.lang.OutOfMemoryError: Java heap space 
    at scala.collection.mutable.ResizableArray$class.ensureSize(ResizableArray.scala:103) 
    at scala.collection.mutable.ArrayBuffer.ensureSize(ArrayBuffer.scala:48) 
    at scala.collection.mutable.ArrayBuffer.$plus$eq(ArrayBuffer.scala:84) 
    at scala.collection.mutable.ArrayBuffer.$plus$eq(ArrayBuffer.scala:48) 
    at fastparse.core.Implicits$LowPriRepeater$GenericRepeater.accumulate(Implicits.scala:47) 
    at fastparse.core.Implicits$LowPriRepeater$GenericRepeater.accumulate(Implicits.scala:44) 
    at fastparse.parsers.Combinators$Repeat.rec$3(Combinators.scala:462) 
    at fastparse.parsers.Combinators$Repeat.parseRec(Combinators.scala:489) 
    at fastparse.parsers.Combinators$Sequence$Flat.rec$1(Combinators.scala:297) 
    at fastparse.parsers.Combinators$Sequence$Flat.parseRec(Combinators.scala:319) 
    at fastparse.parsers.Combinators$Rule.parseRec(Combinators.scala:160) 
    at fastparse.core.Parser.parseInput(Parsing.scala:374) 
    at fastparse.core.Parser.parse(Parsing.scala:358) 
    ... 19 elided 

什麼我做錯了嗎?

+0

什麼'靜態'應該在這裏解析? –

+0

任何不是{{字段}}的文字。 –

回答

1

嘗試這樣的:

val Field = P(FieldStart ~ (!FieldEnd ~ AnyChar).rep(min=1).! ~ FieldEnd) 
val Static = P((!(FieldStart | FieldEnd) ~ AnyChar).rep(min=1).!) 

val Template = P(Start ~ (Field | Static) ~ End) 

你應該小心.rep,它的字面意思是或更多...
此外,在Static解析器,負先行應該像!(FieldStart | FieldEnd)
我想,因爲你不想要(開放的括號或封閉的大括號)。

希望它有幫助! ;)

+0

謝謝!這工作。 (除了模板解析器中的threre仍然是.rep。) –