2010-07-14 89 views
1

我是JFlex的新手。我收集了JFlex是一個解析器生成器。 但是,我仍然不清楚以下內容,需要就此進行澄清。使用JFlex代替正則表達式

  1. 與使用正則表達式進行模式識別和數據隔離以及使用JFlex有哪些額外的好處有什麼不同。

  2. 任何特定用途的情況下JFlex的是在正則表達式非常有用。

  3. 是它反正一般的分析是有用的,說的文本/ XML文件?

在此先感謝。

回答

8

JFlex不是一個解析器生成,但掃描儀生成。它標記了的輸入。將它與解析器生成器(如CUPBYACC/J)結合使用。

有掃描器和分析器之間的一個重要區別:

您的問題:

1)和2)假設你有字符的輸入流轉換爲給出以下模式標記流,:

  • 如果輸入相匹配[0-9]+(跟\.不同的東西),那麼它是一個無符號整數。發送"INTEGER"到輸出。
  • 如果匹配輸入[0.9]+\.[0-9]*那麼它是一個無符號的浮點。發送"FLOAT"到輸出。

需要注意的是,他們都有一個共同的前綴。如果你想用正則表達式掃描輸入,你必須將它們分成它們的通用前綴(除非你想讓它很慢,因爲正則表達式很昂貴)。在運行時,你必須首先評估前綴,如果匹配,然後評估後面的內容,如果^\.,你有一個積分,並將重新開始,如果\.你將不得不評估如果下面的文本是尾數的一個浮點數。如果是這樣,你有一個FLOAT

基本上你要建立的是一個finite state automaton,其中狀態是決定點並反映到目前爲止看到的輸入,轉換是對輸入中看到的當前字符的評估。

JFlex的(許多其他掃描儀發電機)將允許你自動生成這樣的自動機的代碼,只提供正則表達式(基本上)。並會爲其生成非常高效的代碼。

3)您可以同時使用生成的掃描程序和生成的解析程序來識別任何上下文無關的語言。如編程語言。雖然應該可以用它解析XML(我從來沒有嘗試過),但特定用途的解析器通常用於XML(例如SAX,StAX等等),因爲XML具有衆所周知的結構,因此不需要到生成解析器。請注意,you cannot parse XML with Regex。 ;)

問候。

+0

謝謝mrrtnn,很好解釋。 – Nrj 2010-10-07 17:10:02