2

我正在 Erlang 中为 Robocup Soccer 模拟器实现客户代理模拟器以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 . . . )

ObjInfo 的格式如下:

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

其中对象如下:(b)球,(gr)右目标,(f ...)代表各种标志。

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

4

3 回答 3

4

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

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

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

于 2011-03-18T08:09:05.757 回答
2

如果你加载LFE(Lisp Flavored Erlang),它包含一个 lisp 扫描器和解析器。您需要的模块是lfe_scanlfe_parse并且lfe_io包含其他两个模块。扫描器是使用leex(source is lfe_scan.xrl) 编写的,而解析器是手写的,因为有些yecc工作原理不太适合。

于 2011-03-19T23:41:23.823 回答
0

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

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

看看erl_scanerl_parse

于 2011-03-18T10:12:37.870 回答