इम इस वाक्य से मिलान करने की कोशिश कर रहा:स्कैला पार्सर कॉम्बिनेटर्स रिकर्सिव बीएनएफ के लिए चाल?
pgm ::= exprs
exprs ::= expr [; exprs]
expr ::= ID | expr . [0-9]+
मेरे स्केला packrat पार्सर Combinator इस तरह दिखता है:
import scala.util.parsing.combinator.PackratParsers
import scala.util.parsing.combinator.syntactical._
object Dotter extends StandardTokenParsers with PackratParsers {
lexical.delimiters ++= List(".",";")
def pgm = repsep(expr,";")
def expr :Parser[Any]= ident | expr~"."~num
def num = numericLit
def parse(input: String) =
phrase(pgm)(new PackratReader(new lexical.Scanner(input))) match {
case Success(result, _) => println("Success!"); Some(result)
case n @ _ => println(n);println("bla"); None
}
def main(args: Array[String]) {
val prg = "x.1.2.3;" +
"y.4.1.1;" +
"z;" +
"n.1.10.30"
parse(prg);
}
}
लेकिन यह काम नहीं करता है। या तो यह "लालची मेल खाता है" और मुझसे कहता है:
[1.2] failure: end of input expected
x.1.2.3;y.4.1.1;z;n.1.10.30
या अगर मैं एक |||
को |
बदलने मैं एक stackoverflow मिलती है:
Exception in thread "main" java.lang.StackOverflowError
at java.lang.Character.isLetter(Unknown Source)
at java.lang.Character.isLetter(Unknown Source)
at scala.util.parsing.combinator.lexical.Lexical$$anonfun$letter$1.apply(Lexical.scala:32)
at scala.util.parsing.combinator.lexical.Lexical$$anonfun$letter$1.apply(Lexical.scala:32)
...
मैं समझता हूँ kindoff कारण है कि मैं त्रुटियों मिल; उपर्युक्त की तरह वाक्यविन्यास को पार्स करने के लिए मैं क्या कर सकता हूं? यह प्रतीत नहीं करता है
संपादित करें मेरे लिए गूढ़ है कि: कागज http://scala-programming-language.1934581.n4.nabble.com/Packrat-parser-guidance-td1956908.html में संदर्भित मुझे पता चला कि मेरे कार्यक्रम फ्लॉप वास्तव में नए packrat पार्सर का उपयोग के आधार पर।
आईई। PackratParser[Any]
को Parser[Any]
बदल सकते हैं और lazy val
def
के बजाय मैं यह करने के लिए ऊपर दुबारा लिखा का उपयोग करें:
import scala.util.parsing.combinator.PackratParsers
import scala.util.parsing.combinator.syntactical._
object Dotter extends StandardTokenParsers with PackratParsers {
lexical.delimiters ++= List(".",";")
lazy val pgm : PackratParser[Any] = repsep(expr,";")
lazy val expr :PackratParser[Any]= expr~"."~num | ident
lazy val num = numericLit
def parse(input: String) =
phrase(pgm)(new PackratReader(new lexical.Scanner(input))) match {
case Success(result, _) => println("Success!"); Some(result)
case n @ _ => println(n);println("bla"); None
}
def main(args: Array[String]) {
val prg = "x.1.2.3 ;" +
"y.4.1.1;" +
"z;" +
"n.1.10.30"
parse(prg);
}
}
बिल्कुल! मैं प्रलेखन को दोबारा पढ़ रहा था और इसे समझ लिया। आखिरी चीज की आवश्यकता पार्स विधि में एक टाइपो है: 'वाक्यांश (expr) 'वाक्यांश होना चाहिए (पीजीएम)'। चीयर्स! – svrist