2012-08-29 181 views
12

我一直在使用lex/yacc,現在我試圖切換到ANTLR。主要關心的是ANTLR是一個LL(*)解析器,而不像yacc是LALR。我習慣於自下而上思考,而且我不完全知道LL語法的優點。人們說,現在的LL語法更容易理解和流行。但似乎LR解析器更強大,例如LL解析器不能處理左遞歸,儘管似乎有一些解決方法。LALR vs LL解析器

所以問題是LL語法優於LALR的優點是什麼?如果有人能給我一些例子,我會很感激。鏈接到有用的文章也很棒。

感謝您的幫助提前!

(我認爲這是一個很好的資源:What advantages do LL parsers have over LR parsers?,但它會一直好一些例子)

回答

9

最大的好處我看到LL解析器是,他們是很容易理解和執行!您可以使用與語法緊密匹配的代碼手寫recursive descent解析器。

LR被普遍認爲更強大,也快得多但也有一些權衡,我知道:

  • LR解析器只能使用合成屬性;他們不能傳遞繼承的屬性。
  • LR語法中的操作可能導致語法不確定,但不會在LL中。

然而,你會發現LL(*)也非常強大。

+1

如果有人給你分析器生成器,按照定義,它所做的是「易於實現」。在這種情況下,您可以選擇容易處理最大類語言的解析器生成器,以最大限度地減少您的工作量。從角度來看,恕我直言,LR輕鬆勝過LL。 GLR輕鬆勝過LR。 –

+0

我同意,但儘管如此,LL仍然很容易實現。我指出LR通常需要使用工具。我覺得非常有趣的是,你可以手寫遞歸下降和代碼和語法齊頭並進。 –

+3

是的,它的有趣和人們建設解析器應該知道它們。當你的語法變得很大時,把它變成LL形是不方便的,而且在一些(非常小的)點上,LR的方便勝過了你頭腦中的簡單概念。 LR非常容易理解,如果你不構建解析器生成器,並且它不像周圍沒有很多。 –

9

LR分析器比LL分析器嚴格得多,另外,LALR分析器可以像LL分析器一樣運行在O(n)中。所以你不會發現LL over LR的任何功能優勢。

因此,LL的唯一好處是LR狀態機比較複雜和難以理解,LR解析器本身並不是特別直觀。另一方面,自動生成的LL解析器代碼可以非常容易理解和調試。

+0

感謝您的意見,DeadMG。 –