標準方法可用於將不是LL(1)的上下文無關語法轉換爲等價的語法。有沒有可以使這個過程自動化的工具? 在以下示例中,我使用大寫字母表示非終端,小寫字母表示終端。 下左遞歸的非終端: A -> A a | b
可以轉化爲右遞歸形式: A -> b A'
A' -> NIL | a A'
不過,請注意左遞歸的產生式規則確保表達式聯想到左邊,和右邊的遞歸製作類似;所以語法修改也會改變表達的關聯性
我正在寫一個antlr語法,我希望能夠嵌套表達式,它可以是「簡單」表達式或布爾表達式(帶有可選的圓括號)。一個簡單的表達僅僅是一個與LHS和RHS,如a = 5 我希望能夠支持這些類型的表達式: a = 5
a = 5 OR b = 10
a = 5 OR (b = 10 AND c = 12)
(a = 5 AND b = 10) OR (c = 12 AND D = 13)
我的語法
我有以下的生產 A -> Aa
A -> b
所以很顯然,有左遞歸像 parseA() {
parseA();//recursion
parsea();
}
據說左遞歸可以使用可以避免以下規則: A -> bA'
A' -> aA'|null
這裏如何避免左遞歸?仍然存在遞歸在函數A'中。 有人可以解釋我這個。我是這個主題的初學者嗎?