2010-02-08 124 views
23

序言:儘管解析器(上下文無關語法)識別的語言集合嚴格大於掃描器(常規語法),但大多數解析器生成器都需要掃描器。 (請不要試圖解釋背後的原因,我很瞭解他們)。無掃描器解析器生成器

我見過的解析器,不需要像

使用無掃描儀有一定的優勢:

  • 只是一個概念(上下文無關文法)兩個
  • 解析在一個文件中的多個語言(如HTML/JavaScript)的
  • 解析語言沒有保留關鍵字(如PL/1

通常相反, 「解決方法」就像使用解析器的請求切換掃描器一樣。

問題:您是否知道其他無掃描程序解析器生成器(任何語言)?這些實用性(或純粹的學術)?除了Tomita/GLR還有其他方法嗎?

數目:

+0

一些更多的「廣義左到右的最右推導分析器」在這裏列出http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages – stacker 2010-02-08 20:01:29

+0

@stacker:維基百科列出的DParser的詞法分析器爲「生成」;而GLR並不意味着無掃描器 – Meinersbur 2010-02-08 20:09:41

+0

我不明白爲什麼掃描儀會成爲多種語言或沒有保留關鍵字的語言的障礙。掃描儀對於吃空白和(至少經常)評論,並將字符連接成數字和單詞仍然很有用。 – 2010-03-18 14:49:50

回答

10

兩個人:

  • 布賴恩·福特的解析表達式語法(PEG)不需要掃描器。高效,懶惰的「packrat解析器」是可選的。我沒有任何東西,但有良好的經驗與Lua LPEG版本,它編譯爲一個高效的字節碼機器。非常實用。

  • YAKKER看起來非常有趣,雖然它仍然明顯處於預發佈狀態。他們正在使用他們聲稱在Earley的分析算法上有效的變體。

我實際上是無掃描程序解析器的狂熱粉絲;它們極大地簡化了配置。而典型的掃描儀發電機,說得輕鬆,使用起來並不是很有趣。從手冊頁萊克斯:

The asteroid to kill this dinosaur is still in orbit.

最後,我有Elkhound沒有親身經歷,但二手報告我聽到的都是讓人印象深刻。我會說沒有問題,但一些無掃描器的解析器生成器是非常實用的。

3

boost::spirit::qi不需要詞法雖然你可以使用boost::spirit::lex的前端。從引進的boost::spirit::lex

事實上,Spirit.Qi允許你寫 解析器不使用詞法分析器,直接解析 輸入字符流, 和大部分這是 精神有辦法自從其發明 以來一直使用。

boost::spirit(原來的那個)實際上按照你想要的方式工作,但它已被移動到boost::spirit::classicspirit::qi, spirit::lex是精神的新設計,所以我離開了經典版:) :)

9

解析器生成器不需要需要掃描儀。但是如果你不使用它,你會非常瘋狂。

由解析器生成器構建的解析器不關心你餵它們,只要你稱它們爲標記。

要建立使用解析器生成沒有掃描儀,簡單地定義你的語法到人物等級,和飼料單個字符的解析器令牌。

這是瘋狂的原因是解析是一個比lexing更復雜的活動。您可以將詞法分析器構建爲有限狀態機器,將其轉換爲機器碼,就像「比較並跳轉到下一個狀態」一樣。對於速度來說,這真的很難被擊敗。解析器生成器構造解析器,用於執行遞歸下降預測解析(對於大多數LL生成器,例如ANTLR),或者通過散列,二進制或線性搜索等方式進行表查找。因此,解析器花費在令牌上的能量要比詞法分析器花在字符。

如果你給人物一個解析器的令牌,它會再花相應更多的精力放在比將相當於詞法分析器的字符。如果你處理了大量的輸入文本,這將最終成爲問題,無論你是爲數以萬計的小輸入流還是少數幾個非常大的輸入流執行。

所謂無掃描GLR分析器從這個性能問題,相對於被設計爲使用令牌GLR分析器遭遇。

我的公司生成一個工具, the DMS Software Reengineering Toolkit它使用GLR解析器(並且成功地解析了所有常見的語言,你知道的很多很常見的語言,因爲它有一個GLR解析器)。我們知道無掃描語法分析器,並且由於速度差異而選擇不實施它們;我們有一個經典的(但非常強大的)類似LEX的子系統來定義詞彙標記。在DMS對與XT(無掃描儀GLR解析器的工具)基於工具處理相同輸入的XT進行對比的情況下,DMS看起來比XT包快10倍。公平地說,所做的實驗是特設的而不是重複的,但是因爲它符合我的懷疑,所以我沒有理由重複它。因人而異。 當然,如果我們想要去無掃描儀的話,那麼就像我已經指出的那樣,用字符終端編寫一個語法程序非常容易。

GLR無掃描語法分析器有另一個很不錯的屬性,對大多數人來說都沒有關係。您可以爲無掃描器的解析器採用兩個單獨的語法,並將它們逐字地連接起來,並且仍然得到一個解析器(通常有很多不明確的地方)。當你在構建另一種語言時,這很重要。如果這不是你正在做的,這只是一個學術好奇心。

而且,AFAIK,Elkhound不是無掃描儀。 (我可能在這方面是錯誤的)。 (編輯:2/10:看來我錯了會不會是第一次在我的生活:)

+0

感謝您的回答,特別是關於您的行業經驗報道。請注意,線性速度差異並不是主要障礙。否則沒有人會用腳本語言編寫掃描儀。 但GLR可以在需要無限預測(O(n³))的語法上產生非線性表現,如標識符標記。如果解析器可以處理線性複雜的令牌(並且有概念可以這樣做),爲什麼還要編寫一個掃描器? – Meinersbur 2010-02-11 00:58:30

+0

Scannerless Elkhound:http://scottmcpeak.com/elkhound/sources/elkhound/examples/scannerless/ – Meinersbur 2010-02-11 01:00:21

+0

@Meinersbur:我不明白你的觀點。你似乎在說當試圖處理標識符時,無掃描器的解析器變得非線性;這表明你同意使用無掃描器的解析器不是一個好主意。但是你會說,「爲什麼還要寫一臺掃描儀?」。我錯過了什麼? – 2010-02-11 18:52:48