2012-09-16 25 views
6

我目前正試圖創建一個軟件組件,將能夠interprete動態字符串如:如何解析字符串沒有正則表達式

%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT")) 

這將導致該字符串:

asampletext 

我希望能夠定義一組可用的函數和語義參數等。 我已經知道(或多或少)如何使用正則表達式來完成它。

我的問題是:

  • 是詞法/這樣一個目的解析方式比正則表達式更好,或者我應該去與正則表達式,而忘記了嗎?
  • 這樣的庫在Java中是否已經存在?
  • 你知道任何教程顯示一些示例解析/ lexing算法?

謝謝!

+5

是的,antlr是解決方案。你不應該使用正則表達式來解析語言。一個很好的例子是在堆棧溢出 - http://stackoverflow.com/questions/1931307/antlr-is-there-a-simple-example –

+0

通常,這些自定義語言爲特定目的被稱爲[域特定語言](http ://en.wikipedia.org/wiki/Domain-specific_language)。 –

回答

7

對於這樣的目的,lexing /解析的方式比regexp更好還是應該用正則表達式去忘記?

正則表達式無法表達遞歸語法,而且您的語法似乎需要遞歸語法。如果是這種情況,那麼正則表達式根本無法解決問題。

這樣的庫在Java中是否已經存在?

這不是庫問題所解決的問題。您可能需要使用解析器生成器系統(如Antlr或Javacc)來生成詞法分析器和解析器,或者從頭開始虛擬編寫它們。前者的方法可能會更好......除非你已經參加了涵蓋該領域的統一級別主題,或準備進行大量閱讀。

你知道任何教程顯示一些示例解析/ lexing算法?

Antlr和Javacc都有豐富的教程資料和示例。

0

當不綁定到純Java時,您可以使用另一種語言的PEG解析器或Rebol(它具有與PEG等效的解析「方言」) - 或返回WAY返回Icon或Unicon或現在甚至Object圖標at code.google.com/p/objecticon

當我意識到MIT Curl網頁內容語言(www.curl.com)爲用戶選擇正則表達式時,即使Curl具有宏並提供訪問到AST。

一般主題:解析器表達式語法(PEG)和一般的packrat解析。

Perl的使用遺留給我們PCRE,所以我們可以做什麼,但不需要時它可以避免它(有antlr和野牛...毫無疑問,他們也有他們的地方,他們很容易適合)

注意:Rebol,圖標和捲曲是基於表達式的語言(圖標有限回溯)。

其他出-A-的方式選擇包括奧茲和水星(後者可以輸出二郎)我不使用pyPEG因爲我只限於對Python 2.6.6

;蟒蛇解析Lepl不再支持 - 但將安裝爲2.6

Python中的解析選項包括YAPPS在http://theory.stanford.edu/~amitp/yapps/和其他各種;注意:pyparsing未能在安裝一些Python env的

和斯卡拉/ Java的有這樣PEG項目:https://github.com/sirthias/parboiled/wiki

你會發現每http://piumarta.com/software/peg/

CiteSeer一個Java當量,以PEG和腿部有拉爾夫貝克特文章packrat解析和水星(谷歌PEG解析汞網站:psu.edu)

AdventuresInMercury博客中還有一系列的3篇博文。