除文法的左递归性可以采用以下方法:
- 直接左递归转换为间接左递归
- 消除间接左递归
举例说明:
直接左递归转换为间接左递归
原文法:A → Aα | β
转换后的文法:A → βA'
A' → αA' | ε
例如:S → Sabc | ε
转换后的文法:S → εS'
S' → abcS' | ε
消除间接左递归
原文法:A → Aα1 | Aα2 | ... | Aαm | β1 | β2 | ... | βn
转换后的文法:A → β1A' | β2A' | ... | βnA'
A' → α1A' | α2A' | ... | αmA' | ε
例如:S → Sa | Sb | A
转换后的文法:S → A S'
S' → aS' | bS' | ε
A → ε
例如:E → E + T | E - T | T
转换后的文法:E → TE'
E' → +TE' | -TE' | ε
T → a | b | c
例如:A → Aa | Ab | B
转换后的文法:A → BA'
A' → aA' | bA' | ε
B → ε