Compiler construction 用替换、因子分解和左递归移除构造LL(1)文法

Compiler construction 用替换、因子分解和左递归移除构造LL(1)文法,compiler-construction,context-free-grammar,left-recursion,pushdown-automaton,Compiler Construction,Context Free Grammar,Left Recursion,Pushdown Automaton,使用任何技术(替换、因子分解、左递归移除), 构造一个LL(1)语法,接受与G相同的语言 G over Σ = {0, 1, 2}: S → Y | 1X X → 1X | 0 Y → Y0 | 1X1 | 2X2 到目前为止,我做到了: X是左递归的,因此: X -> 1F | 0F F -> 1F | e 我还需要做什么来构造LL(1),我可以因子Y吗?首先,X不是左递归的,因为它的RHS不是以X开头的。相反,它是尾部递归的,它是正确的。但是Y->Y0

使用任何技术(替换、因子分解、左递归移除), 构造一个LL(1)语法,接受与G相同的语言

G over Σ = {0, 1, 2}:
    S → Y | 1X
    X → 1X | 0
    Y → Y0 | 1X1 | 2X2
到目前为止,我做到了:

X是左递归的,因此:

X -> 1F | 0F
F -> 1F | e

我还需要做什么来构造LL(1),我可以因子Y吗?

首先,X不是左递归的,因为它的RHS不是以X开头的。相反,它是尾部递归的,它是正确的。但是Y->Y0告诉您Y是左递归的。在这种情况下,请执行以下操作:

S -> Y | 1X
X -> 1X | 0
Y -> 1X1F | 2X2F
F -> 0F | e
您可能还希望将和ε规则添加到X中,并使其生效

X -> 1X | 0 | e
只是为了确保你永远不会有无限的句子