ตัวแยกวิเคราะห์ Scala ลด/พับซ้าย

ฉันกำลังพยายามทำสิ่งต่อไปนี้จากรายการที่เติมแบบไดนามิก:

val primitives = "x" | "y" | "z" // what I want

val primitives2 = List("x", "y", "z") // what I need to transform from

ฉันคิดว่าสิ่งนี้อาจใช้ได้ผล:

primitives2.reduce(_|_)

แต่อย่าไป จากนั้นฉันก็พบตัวอย่างนี้ซึ่งใช้งานได้:

primitives2.foldRight(failure("no matching delimiter"): Parser[Any])(_|_)

อย่างไรก็ตาม กรณีฐาน failure("no matching delimiter") ทำให้เกิดความสับสน นั่นเป็นเพียงกรณี Nil ที่เทียบเท่ากับวัตถุ Parser หรือไม่


person Dominic Bou-Samra    schedule 19.01.2013    source แหล่งที่มา


คำตอบ (1)


ฉันจะถือว่าคุณกำลังทำงานร่วมกับ RegexParsers หรือหนึ่งในผู้สืบทอด หากเป็นเช่นนั้น ปัญหาก็คือการแปลงโดยนัยจาก String เป็น Parser[String] จะไม่เริ่มทำงานโดยอัตโนมัติด้วย reduce(_ | _) หากคุณแปลงทุกรายการในรายการของคุณอย่างชัดเจนก่อน เช่นนี้

val anyPrimitive = primitives2.map(literal).reduce(_ | _)

คุณจะไม่เป็นไร เว้นแต่ว่าสิ่งนี้จะทำให้คุณได้รับข้อความแสดงข้อผิดพลาดที่น่าสับสนเล็กน้อย เช่นนี้

scala> parser.parseAll(parser.anyPrimitive, "a")
res8: parser.ParseResult[Any] = 
[1.1] failure: `z' expected but `a' found

a
^

หากคุณต้องการข้อความแสดงข้อผิดพลาดที่ชัดเจนยิ่งขึ้น คุณจะต้องระบุค่าเริ่มต้นของคุณเองโดยใช้วิธี fold

person Travis Brown    schedule 19.01.2013