编译原理-理论

值得掌握的点有这么几个

1、消除左递归

2、LL(1)文法,构造预测分析表

如果我用一个文法,就像是后缀表达式那样的,对于LL(1)文法(可以理解成有一棵树),我可以有一个自顶向下的语法分析。

类似于dfs求次短路的建边方式,计算First和Follow集合。First先递归左子树,按照左右根来算,Follow则需要先递归右子树,从根开始算,根右左。

有了First集合和Follow集合之后就可以构建预测分析表,主要关注First是否为空,先把不是空的元素直接填到表格里,有空的还可以把Follow填到表格里。

然后就可以用栈的方法来解。

3、LR文法,最大的可以构造移进-归约语法分析器的语法类。

大概就是能变就变,但是一定要还能走到最后。感觉有点像区间DP的贪心实现。句柄是指当前句型中可以被规约的最右子串。变成自底向上就变成了最左边的那个。

然后就变成了压栈(移进),考虑要不要选栈顶规约。也可能不知道,所以 $LR(k)$ 就是往前看k个,就是S->Aa|Bb,A->c,B->c 。一个产生式对应 $|a|+1$ 个LR项。这个闭包就是所有可能的位置,类似于epsilon闭包,然后GOTO就是一个往后平移的操作。

所以同样有一个LR(0)分析表,但还是有一些冲突,所以用上了Follow集做一个SLR分析表。