回答
ANTLR article對於PEG是錯誤的。 LL(*)是DCFG(確定性上下文無關語法)的一個子集,它是CFG(上下文無關語法)的一個子集。
PEG可以表達上下文敏感的語法像A{n}B{n}C{n}
,其中A
和B
和C
都發生n
倍。這裏的定義:
s := &(x C) A+ y/ε
x := A x B/A B
y := B y C/B C
但是沒有辦法在CFG中定義這樣的語法(證明涉及泵引理)。所以PEG不是CFG的子集。 PEG是否是CFG的超集?我不知道。 LL(*)和PEG之間
兩個主要區別:
LL(*)只能先行一個DFA圖案,而PEG可先行一個遞歸模式。例如,在PEG中,您可以查找嵌套的parens,而LL(*)不能。
在PEG的選擇操作
/
是優先選擇(或「佔有慾」),這意味着如果你有規則A/AB
,它永遠不會到達右側AB
。在規則A | AB
的LL(*)中,可以匹配AB
。
如果您的PEG語法沒有預見性,或者您的預覽模式可以縮減爲DFA,則可以將其轉換爲LL(*)。否則,這是不可能的。
根據該工具上市here ANTLR是一個充滿代表性的PEG解析器:
ANTLR,由特倫斯·帕爾一套行之有效的解析器生成器,支持廣泛的PEG特點,並結合packrat與LL解析技術解析。
存在一些左遞歸Packrat擴展,這顯然不被ANTLR支持。 – 2012-01-11 12:58:31
在ANTLR中,您可以對語法中的所有生產規則啓用全局回溯,因此對於k >= 1
,您可以解析與PEG的幾乎相同的結果。當然,由於所有潛在的回溯,解析器的運行時間會降低。以(某些)內存爲代價,您還可以啓用記憶,使其表現得像一個Packrat解析器,能夠以線性時間解析輸入。
所以不,沒有太大的區別w.r.t ANTLR和PEG/Packrat(啓用正確的選項!)。
- 1. LL和LR解析有什麼區別?
- 2. PEG和CFG之間有什麼區別?
- 3. LL解析器和AST之間的區別
- 4. 「抽象解析樹」和「解析樹」有什麼區別?
- 5. 風險分析與風險緩解有什麼區別?
- 6. 文法&& LL解析器
- 7. LALR vs LL解析器
- 8. 解析器和掃描儀有什麼區別?
- 9. Hadoop批量分析與Hadoop實時分析有什麼區別
- 10. 繼承與類別有什麼區別
- 11. 模糊語法與LL(1)解析
- 12. 在進程中和解析進程中解析WPAD有什麼區別?
- 13. 解析樹和抽象語法樹有什麼區別?
- 14. 在剃刀中解析不同的IEnumerable有什麼區別嗎?
- 15. 谷歌的Json解析Gson庫:JsonElement和JsonObject有什麼區別?
- 16. 解析,閱讀和lexing有什麼區別?
- 17. 與PEG的問題製作的BBcode解析器
- 18. Chomsky層次結構和LL(*)解析器
- 19. LL(*)解析器如何工作?
- 20. 編碼/解碼有什麼區別?
- 21. 有什麼區別
- 22. 有什麼區別
- 23. 有什麼區別?
- 24. 有什麼區別?
- 25. 有什麼區別?
- 26. 有什麼區別
- 27. ....有什麼區別?
- 28. 有什麼區別?
- 29. 有什麼區別
- 30. 有什麼區別
你的PEG語法不正確。它也將解析A {n} B {n + 1} C {n + 1}。 – CoronA 2017-10-14 13:16:30
@CoronA感謝您指出,我用更新的語法編輯了答案,以確保C恰好在A {n} B {n}之後發生。 – luikore 2017-10-15 15:03:10