我正在 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是否包含任何用于此类工作的库)
答案 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_scan
,lfe_parse
和lfe_io
,其中包含其他两个模块。扫描程序是使用leex
编写的(源代码为lfe_scan.xrl
),而解析器是手写的,因为yecc
的工作方式有些不太合适。
答案 2 :(得分:0)
正确的方法是编写一个小型LISP阅读器。
快速且(非常)脏的方式(仅用于初始测试):用逗号替换空格,“(”with“{”和“)”with“}”。然后你有一个erlang文字。
查看erl_scan
和erl_parse
。