如何在 Erlang 中解析 S 表达式?
我正在 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 [BodyFacingDir] HeadFacingDir]])
其中对象如下: (b) 球,(gr) 右球门,(f ...) 代表各种旗帜。
我想要的是解析这些信息并存储/更新某些数据库(记录)以用于分析。 我面临的主要困难是解析这些信息。 请建议我一些方法来做到这一点? (Erlang 是否包含任何用于此类工作的库)
I am implementing client agent for Robocup Soccer simulator in Erlang. Simulator sends sensory information to client in form of S-expressions. Like this
(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))
Simulator sends such type of sensor informatio in each cycle(100-200 msec).
The main format of the information is:
(see Time ObjInfo ObjInfo . . . )
The ObjInfos are of the format below:
(ObjName Distance Direction
[DistChange DirChange [BodyFac- ingDir
HeadFacingDir]])
where the objects are like:
(b) Ball, (g r) Right goal, (f ...) represents various flags.
What I want is to parse this information and store/update in some database(record) to use for analysis.
The main difficulty I am facing is to Parse this information.
Please suggest me some way of doing this? (does Erlang contain any library for such work)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Yecc 和 Leex 是你的朋友: http://erlang.org/doc/apps/parsetools/ index.html
Leex 是 Erlang 的词法分析器生成器,它将标记您的数据。 Yecc 是 LALR-1 解析器生成器,可以将您的标记解析为有意义的结构。
Relops 有一篇很好的博客文章,Leex 和 Yecc,详细介绍了一些基础知识。
Yecc and Leex are your friends: http://erlang.org/doc/apps/parsetools/index.html
Leex is a lexical analyzer generator for Erlang which will tokenize your data. Yecc is LALR-1 parser generator that can parse your tokens into meaningful structures.
There's a good blog post by Relops, Leex And Yecc, detailing some of the basics.
如果你加载 LFE (Lisp Flavored Erlang) 它包含一个 lisp 扫描器和解析器。您需要的模块是
lfe_scan
、lfe_parse
和lfe_io
(包装了另外两个)。扫描器是使用leex
编写的(源代码是lfe_scan.xrl
),而解析器是手写的,因为yecc
的工作原理有一些特征不太合适。If you load LFE (Lisp Flavoured Erlang) it contains a lisp scanner and parser. The modules you need are
lfe_scan
,lfe_parse
andlfe_io
which wraps the other two. The scanner is written usingleex
(source islfe_scan.xrl
) while the parser is hand written as there are some features of howyecc
works which didn't quite fit.正确的方法是只编写一个小型 LISP 阅读器。
快速且(非常)肮脏的方法(仅用于初始测试):用逗号替换空格,用“{”替换“(”,用“}”替换“)”。然后你就有了一个 erlang 文字。
查看
erl_scan
和erl_parse
。The correct approach would be to just write a small LISP reader.
The quick and (very) dirty way (for initial testing ONLY): Substitute whitespace with a comma, "(" with "{" and ")" with "}". Then you have an erlang literal.
Have a look at
erl_scan
anderl_parse
.