【问题标题】:How to parse S-expression in Erlang?如何在 Erlang 中解析 S 表达式?
【发布时间】:2011-03-18 05:13:14
【问题描述】:

我正在 Erlang 中为 Robocup Soccer 模拟器 实现客户端代理。模拟器以S-expressions的形式向客户端发送感官信息。像这样

(see 15 ((f c) 2 0 0 0) ((f r t) 64.1 -32) ((f r b) 64.1 32) ((f g r b) 55.1 7) 
 ((g r) 54.6 0) ((b) 2 0 -0 0) ((l r) 54.6 90)) 
(see 16 ((f r t) 72.2 -44) ((f r b) 54.1 20) ((f g r b) 52.5 -10) ((g r) 54.1 -17)
 ((l r) 51.4 -89))

模拟器在每个周期(100-200 毫秒)中发送此类传感器信息。 信息的主要格式为:

(see Time ObjInfo ObjInfo . . . )

ObjInfo 的格式如下:

(ObjName 距离方向 [DistChange DirChange [BodyFacingDir HeadFacingDir]])

对象的位置: (b) 球,(g r) 右目标,(f ...) 代表各种旗帜。

我想要的是解析这些信息并在一些数据库(记录)中存储/更新以用于分析。 我面临的主要困难是解析这些信息。 请建议我这样做? (Erlang 是否包含任何用于此类工作的库)

【问题讨论】:

    标签: parsing erlang robocup


    【解决方案1】:

    Yecc 和 Leex 是你的朋友:http://erlang.org/doc/apps/parsetools/index.html

    Leex 是 Erlang 的词法分析器生成器,它将标记您的数据。 Yecc 是 LALR-1 解析器生成器,可以将您的标记解析为有意义的结构。

    Relops 有一篇很好的博文,Leex And Yecc,详细介绍了一些基础知识。

    【讨论】:

      【解决方案2】:

      如果你加载LFE (Lisp Flavoured Erlang),它包含一个lisp扫描器和解析器。您需要的模块是 lfe_scanlfe_parselfe_io,其中包含另外两个模块。扫描器是使用leex 编写的(源代码是lfe_scan.xrl),而解析器是手写的,因为yecc 的工作方式有一些不太合适的功能。

      【讨论】:

        【解决方案3】:

        正确的方法是只编写一个小型 LISP 阅读器。

        快速且(非常)肮脏的方法(仅用于初始测试):用逗号替换空格,用“{”替换“(”,用“}”替换“)”。然后你就有了一个 erlang 文字。

        看看erl_scanerl_parse

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-10
          相关资源
          最近更新 更多