簡體   English   中英

如何在Erlang中解析S表達式?

[英]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_scanlfe_parselfe_io ,它們包裝了其他兩個模塊。 掃描程序是使用leex編寫的(來源是lfe_scan.xrl ),而解析器是手寫的,因為yecc工作方式有些功能不太合適。

正確的方法是只編寫一個小型LISP閱讀器。

快速且(非常)骯臟的方式(僅用於初始測試):用逗號替換空格,用“(”和“}”替換為“(”)和“}”。 然后,您將獲得一個erlang文字。

看看erl_scanerl_parse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM