Parsing 如何解析Erlang中的S表达式?

Parsing 如何解析Erlang中的S表达式?,parsing,erlang,robocup,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 -

我正在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的格式如下:

(长方形距离方向) [DistChange DirChange[BodyFac-ingDir 头面部[dir]])

其中对象类似于: (b) 球,(右)门,(f…)代表各种旗帜

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

Yecc和Leex是您的朋友:

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


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

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

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

如果加载包含lisp扫描仪和解析器,请查看
erl_scan
erl_parse

。您需要的模块有
lfe\u scan
lfe\u parse
lfe\u io
,它们包装了另外两个模块。扫描器是使用leex编写的(源代码是
lfe\u scan.xrl
),而解析器是手工编写的,因为
yecc
的一些功能不太适合