मैं नीचे दिए गए आदेशों के लिए व्याकरण परिभाषित करने की कोशिश कर रहा हूं।स्कैला पार्सर टोकन डेलीमीटर समस्या
[1.27] parsed: Command(todo,link todo to database,List())
[1.36] failure: string matching regex `\z' expected but `:' found
todo link todo to database deadline: next tuesday context: app.model
^
जहां तक:
action = todo
message = link todo to database
properties = [deadline: next tuesday, context: app.model]
जब मैं नीचे परिभाषित व्याकरण पर इस इनपुट चलाने के लिए, मैं निम्नलिखित त्रुटि संदेश मिलता है: के रूप में
object ParserWorkshop {
def main(args: Array[String]) = {
ChoiceParser("todo link todo to database")
ChoiceParser("todo link todo to database deadline: next tuesday context: app.model")
}
}
दूसरा आदेश tokenized किया जाना चाहिए मैं देख सकता हूं कि यह विफल हो जाता है क्योंकि संदेश के शब्दों से मेल खाने के लिए पैटर्न संपत्ति कुंजी की कुंजी के लिए पैटर्न के समान है: मूल्य जोड़ी, इसलिए पार्सर यह नहीं बता सकता कि संदेश कहां समाप्त होता है और संपत्ति शुरू होती है। मुझे लगता है कि शुरू टोकन आग्रह इतना की तरह प्रत्येक प्रॉपर्टी के लिए इस्तेमाल किया जा द्वारा इस का समाधान कर सकते हैं:
todo link todo to database :deadline: next tuesday :context: app.model
लेकिन मैं आदेश यथासंभव निकट प्राकृतिक भाषा में रखना चाहती हैं। मेरे दो प्रश्न हैं:
त्रुटि संदेश का वास्तव में क्या अर्थ है? और दिए गए इनपुट स्ट्रिंग के लिए काम करने के लिए मौजूदा व्याकरण को मैं कैसे संशोधित करूं?
import scala.util.parsing.combinator._
case class Command(action: String, message: String, properties: List[Property])
case class Property(name: String, value: String)
object ChoiceParser extends JavaTokenParsers {
def apply(input: String) = println(parseAll(command, input))
def command = action~message~properties ^^ {case a~m~p => new Command(a, m, p)}
def action = ident
def message = """[\w\d\s\.]+""".r
def properties = rep(property)
def property = propertyName~":"~propertyValue ^^ {
case n~":"~v => new Property(n, v)
}
def propertyName: Parser[String] = ident
def propertyValue: Parser[String] = """[\w\d\s\.]+""".r
}
मुझे लगता है कि आपको इस तरह के कुछ सिंटैक्स को इस तरह बदलना चाहिए: todo "लिंक टूडो डेटाबेस": समय सीमा: "अगली मंगलवार": संदर्भ: "ऐप।मॉडल " – ziggystar
यह एक समाधान है जिसे मैं टालना चाहता हूं, क्योंकि मैं टोडो व्याकरण को प्राकृतिक भाषा के करीब जितना संभव रखना चाहता हूं। –