java - 使用 Java/Scala 解析与硬件的 ASCII 通信?

标签 java scala parsing hardware-interface

我正在编写通过交换 ASCII 命令连接外部设备的软件。示例:

POS? 1 2
=>1=-1158.4405
=>2=+0000.0000

上面我们要求电动显微镜台的第一轴和第二轴的位置。它以 um 中的位置进行响应。更多 details and examples .

我的问题:是否有一个库可以轻松解析此类字符串输出,和/或帮助生成查询? 否则,使用 Java/Scala 解析和与硬件通信的最佳实践是什么?

最佳答案

尝试处理以下语法(请参阅12.1 格式):

 Reply syntax:
     [<argument>[{SP<argument>}]"="]<value>LF
 Multi-line reply syntax:
     {[<argument>[{SP<argument>}]"="]<value>SP LF}
     [<argument>[{SP<argument>}]"="]<value>LF for the last line!

这是我的代码:

import scala.util.parsing.combinator._

case class Result(argument: String, value: Float)

class ReplyParser extends RegexParsers{
    override def skipWhitespace = false
    private def floatingPointNumber: Parser[String] = 
        """(-|\+)?(\d+(\.\d*)?|\d*\.\d+)""".r
    private def value: Parser[Float] = floatingPointNumber ^^ (_.toFloat)
    private def argument: Parser[String] = "[^= \n]+".r
    private def arguments: Parser[List[String]] = rep1sep(argument," ") <~ "="
    private def result: Parser[List[Result]] = arguments.? ~ value ^^ {
        case arguments ~ value => 
            arguments.getOrElse(List("")).map {
                Result(_,value)
            }
    }
    def reply: Parser[List[Result]] = rep1sep(result, " \n".r) <~ " " ^^ {
        case result => result.flatten
    }
}

object Parsing extends ReplyParser {
    def main(args: Array[String]) {
        val result = parseAll(reply,"a=+000.123 \nc d=-999.567 \n789 ")
        println(s"$result")
    }
}

关于java - 使用 Java/Scala 解析与硬件的 ASCII 通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280761/

相关文章:

java - 对软件的哪个部分进行哪种测试?

scala - 从 scala 访问公共(public)静态 java 方法

Python,在解析 JSON 对象时正确处理关键错误

java - Apache Camel : Can I use @Produce without specifying the endpoint uri in the annotation?

java - 应用程序中的多线程 - 设计约定?

java - 如何在 Vertx 中编写异步文件处理程序

python - 使用 Python ElementTree 解析器将 xml 导入另一个 xml

java - 如何在 Eclipse 中隐藏 .svn 文件夹而不显示空包?

scala - 什么时候应该使用 Scala 的 `package` 特殊标识符?

parsing - Haskell:尽管文件中有更多输入,但解析文件在第一个表达式后完成