Tôi đang cố định nghĩa ngữ pháp cho các lệnh bên dưới.Scala Parser Token Delimiter Vấn đề
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")
}
}
Lệnh thứ hai nên được tokenized như:
action = todo
message = link todo to database
properties = [deadline: next tuesday, context: app.model]
Khi tôi chạy đầu vào này về ngữ pháp được định nghĩa dưới đây, tôi nhận được thông báo lỗi sau:
[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
^
As far as Tôi có thể thấy nó không thành công vì mẫu phù hợp với các từ của thông điệp gần giống với mẫu cho khóa của cặp khóa giá trị: thuộc tính, do đó trình phân tích cú pháp không thể biết được thông báo kết thúc ở đâu và tài sản bắt đầu. Tôi có thể giải quyết vấn đề này bằng cách nhấn mạnh rằng mã thông báo bắt đầu được sử dụng cho mỗi thuộc tính như vậy:
todo link todo to database :deadline: next tuesday :context: app.model
Nhưng tôi muốn giữ lệnh như ngôn ngữ tự nhiên gần nhất có thể. Tôi có hai câu hỏi:
Thông báo lỗi thực sự có ý nghĩa gì? Và làm cách nào để tôi sửa đổi ngữ pháp hiện tại để làm việc cho các chuỗi đầu vào đã cho?
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
}
Tôi nghĩ bạn nên thay đổi cú pháp của mình thành một cái gì đó như thế này: todo "liên kết todo với cơ sở dữ liệu": hạn chót: "ngày thứ ba tới": ngữ cảnh: "ứng dụng.mô hình " – ziggystar
Đây là một giải pháp tôi muốn tránh, vì tôi muốn giữ ngữ pháp Todo càng gần với ngôn ngữ tự nhiên càng tốt. –