自顶向下分析面临的问题:
左递归有点像右线性的形式。
对CFG的改造:
*********
这个文法的改造很有意思,语法变量的定义是递进的,假设一开始想要识别一个乘法,那么E必须推导为T,T再推导为T*F,而T和F都不可能再返回到E,也就是说一个乘法算式的两个乘子外侧的两个位置不可能凭空出现加减符号。优先级就是依此实现的吧!
其实很好理解,A是βα*嘛 重新拆开表示就好了
LL(1)文法 :
这两个循环写的很有意思,4-6的循环,从k=1开始,但凡有哪一个k没有接上FIRST(Xk)=空,都不会继续进行,也就是说剔除了Xk推不出空而Xk+1能推出空这类情况时更新FIRST(α)(不应该更新)
7-8中if语句说明:k=n,循环进行了n-1次 Xk推出空,所有的Xk都能推出空,此时将空加入FIRST(α)。
可以看出FOLLOW集中是不会含有空的,结束符#其实也就是空了。
根据上述法则分析:
故该文法是LL(1)文法。
预测分析法:
构造分析表很简单,所有的语法变量过一遍FIRST集,有空候选式的语法变量再看FOLLOW集就行。
预测分析中的错误处理 :
一开始很疑惑既然a属于FOLLOW(A),分析表内怎么会没定义?明明有A->空啊。
A:因为只有能产生空候选式的语法变量才会考虑follow集,其他的分析表里只给出了First集能推的信息。A->空当然有定义,同步点也不是设在这。
剧透一下:synch为同步点。
递归下降分析法:
语法图:
********:注意克林闭包和正闭包的实现。