解析器生成器不需要需要掃描儀。但是如果你不使用它,你會非常瘋狂。
由解析器生成器構建的解析器不關心你餵它們,只要你稱它們爲標記。
要建立使用解析器生成沒有掃描儀,簡單地定義你的語法到人物等級,和飼料單個字符的解析器令牌。
這是瘋狂的原因是解析是一個比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:看來我錯了會不會是第一次在我的生活:)
一些更多的「廣義左到右的最右推導分析器」在這裏列出http://en.wikipedia.org/wiki/Comparison_of_parser_generators#Context-free_languages – stacker 2010-02-08 20:01:29
@stacker:維基百科列出的DParser的詞法分析器爲「生成」;而GLR並不意味着無掃描器 – Meinersbur 2010-02-08 20:09:41
我不明白爲什麼掃描儀會成爲多種語言或沒有保留關鍵字的語言的障礙。掃描儀對於吃空白和(至少經常)評論,並將字符連接成數字和單詞仍然很有用。 – 2010-03-18 14:49:50