[英]How to parse S-expression in Erlang?
我正在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 . . . )
ObjInfos的格式如下:
(對象名稱距離方向[DistChange DirChange [BodyFacingDir HeadFacingDir]])
其中的對象是:(b)球,(gr)右門,(f ...)代表各種標志。
我想要的是解析此信息,並在某些數據庫(記錄)中存儲/更新以用於分析。 我面臨的主要困難是解析此信息。 請建議我這樣做的方法嗎? (Erlang是否包含用於此類工作的任何庫)
Yecc和Leex是您的朋友: http ://erlang.org/doc/apps/parsetools/index.html
Leex是Erlang的詞法分析器生成器,它將標記您的數據。 Yecc是LALR-1解析器生成器,可以將您的令牌解析為有意義的結構。
Relops, Leex和Yecc撰寫了一篇不錯的博客文章,其中詳細介紹了一些基礎知識。
如果加載LFE(Lisp風味Erlang),則其中包含Lisp掃描儀和解析器。 您需要的模塊是lfe_scan
, lfe_parse
和lfe_io
,它們包裝了其他兩個模塊。 掃描程序是使用leex
編寫的(來源是lfe_scan.xrl
),而解析器是手寫的,因為yecc
工作方式有些功能不太合適。
正確的方法是只編寫一個小型LISP閱讀器。
快速且(非常)骯臟的方式(僅用於初始測試):用逗號替換空格,用“(”和“}”替換為“(”)和“}”。 然后,您將獲得一個erlang文字。
看看erl_scan
和erl_parse
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.