编译原理LL(1)语法分析器实现

废话不多说了,开源代码!欢迎star和fork!
LL(1)语法分析器的实现

编译原理LL(1)语法分析器实现
编译原理LL(1)语法分析器实现
编译原理LL(1)语法分析器实现
编译原理LL(1)语法分析器实现
编译原理LL(1)语法分析器实现
要实现LL1文法,根据个人经验总结,需要以下步骤:
编译原理LL(1)语法分析器实现
我没有实现间接左递归的消除,所以处理不了间接左递归文法。

下面我们来说一下实现过程。
输入相关文法,使用正则表达式将文法中的空串做了清除。
对文法消除直接左递归,使用以下方法:
要是检测到一条文法中出现以下情况:
P->Pa|b
则这条文法就是左递归文法,我们可以将其改写成以下非直接左递归形式:
P->bX
X->aX|e
e是空串

下面是根据消除了左递归的文法,找所有非终结符号的first集合和follow集合

我们再来回顾一下first集合的求法:

文法G的任何符号串a=X1X2X3…Xn构造集合first(a)。
首先,置first(a) = first(X1)/e(e为空串);
若对任何1<=j<=i-1,e属于first(Xj),就把first(Xj)中e以外的元素加到first(a)中;
若所有first(Xj)均含有e,1<=j<=n,则将e加至first(a)中;

以上描述转化成流程图:
编译原理LL(1)语法分析器实现

下面求follow集合:

对于文法的开始符号S,置#到follow中;
若A->aBb是一个产生式,则将first(B)/e加到follow(B)中;
若A->aB是一个产生式,或者A->aBb是一个产生式,而b的first集合中包含空串,则将follow(A)加到follow(B)中

转化成流程图:
编译原理LL(1)语法分析器实现
输入表达式测试,是一个在一定时机出栈进栈的过程。这个比较简单,就不说了!