簡體   English   中英

右遞歸文法還是左遞歸?

[英]Right recursive grammar or left recursive?

我幾乎不知道我要問什么,所以我想根據為給定語法實現解析器所需的技能水平提出建議(因為我是這種正式方法的初學者解析器和語言)。

回到幾年前,這種情況讓我想起了一些 Pascal 語法與 C/C++ 語法,這左與右的東西。

但我不會做任何這些,我的目的是為 Markdown 等文檔的標記語言實現一個簡單的解析器。

因此,考慮到我從一種標記語言開始,我想保持簡單,這是這兩個選項和原因之間最容易處理的選項。 另一種語法對我來說可能是一個更簡單的選擇? 如果是,你建議哪一個?

右遞歸與左遞歸主要取決於您將如何實現解析器。

如果您要進行自頂向下(例如,遞歸下降)解析器,您通常希望在語法中使用右遞歸(對於純遞歸下降,這是唯一的選擇)。

如果要進行自底向上的解析器,通常要使用左遞歸。 自下而上的解析器通常使用 Yacc 或 Bison 等解析器生成器生成,如果需要,它們中的大多數可以處理右遞歸,但可以更有效地處理左遞歸,因此它是首選,只要它不會對語義產生不利影響。

這取決於您使用的解析器類型。 如果使用 LL 類型,則必須使用右遞歸。

如果使用 LR 類型,則可以使用左遞歸或右遞歸。 然而,左遞歸最小化了堆棧深度。

那么有兩種基本類型的語法:

LL(k) = Left to tight, leftmost derivation, k symbols look ahead
LR(k) = Left to right, rightmost derivation, k symbols look ahead

LR 解析器手動編寫要困難得多,但是,它們比 LL 解析器更強大。 如果您正在查看一些流行的解析器生成器工具:

ANTLR : a LL parser
BISON:  a LALR(1) parser (a type of LR parser but a bit less powerful)
CUP:    a LALR(1) parser (outputs Java / C# code)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM