如何在Erlang中解析S表达式?

时间:2011-03-18 05:13:14

标签: parsing erlang robocup

我正在 Erlang 中为 Robocup足球模拟器实施客户端代理。模拟器以 S表达式的形式向客户端发送感官信息。喜欢这个

(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 . . . )

ObjInfos的格式如下:

  

(ObjName距离方向   [DistChange DirChange [BodyFac- ingDir   HeadFacingDir]])

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

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

3 个答案:

答案 0 :(得分:4)

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

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

Relops的帖子很好,Leex And Yecc,详细介绍了一些基础知识。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

查看erl_scanerl_parse