个分析过程都在预测分析程序控制下工作。B、预测分析程序用了一个预测分析表,它是预测分析程序分析时的主要依据。 3)预测分析表:预测分析表是一矩阵M[A,a],其中行标A是非终结符,列标a是终结符或串结束符;矩阵元素M[A,a]是存放A的一个候选式,指出当前栈顶符号为A且面临读入符号为a时应选的候选式;或者存放“出错标志”,指出A不该面临读入符号a。 2.预测分析程序算法描述 设栈顶符号为X,读入符号为a,则 1)若X=a=‘#’,则表示识别成功,退出分析程序; 2)若X=a=‘#’,则表示匹配,弹出栈顶符号X,读头前进一格,让读头指向下一个符号,以读入下一个符号;若X是终结符,但X<>a,则调用error处理; 3)若X属于非终结符,则查预测分析表M。若M[X,a]中存放着关于X的产生式,则弹出X,且将相应产生式右部以自右向左的顺序压入栈,在输出带上记下产生式编号;若M[X,a]中存放着出错标记,则调用相应Error处理。 二、求串α的终结首符集和非终结符A的随符集 a) 求串α的终结首符集First(α) i. 定义:假定α是文法G的一个符号串,α属于星闭包,则First(α)={a | α广义推导出a......a,a属于终结符} 注:1)若α推导出空串,那么空串就属于First(α)。 2)First(α)集合是α的所有可能推导出的开头终结符或空串所组成的集合。 ii. 算法 具体步骤: b) 求非终结符A的随符集Follow(A) i. 定义:假定S是文法G的开始符号,对于G的任何非终结符A,定义: ii. 算法 1. 对文法开始符号S,将‘#’加入到Follow(S)中; 2. 若B->αAβ是文法G的一个产生式,则将First(β)-空串加入到Folow(A)中; 3. 若B->αA是文法G的一个产生式,或B->αAβ是文法G的一个产生式,且β推导出空串,则将Follow(B)加入到Follow(A)中; 注:这里的文法必须消除左递归且提取了左因子后的文法。 三、构造预测分析表 a) 基本思想 b) 构造算法 预测分析表的形式化: 四、LL(1)文法、 a) 定义:若文法G的预测分析表M中不含有多重定义项,则称G为LL(1)文法。 注:1)LL(1)文法是无二义的,二义文法一定不是LL(1)文法。 2)LL的含义是从左到右扫描输入串,采用最做推导分析句子。 3)数字1表示分析句子时需向前看一个输入符号。 4)有LL(1)就有LL(k),LL(k)向前看k个输入符号,选择候选式更加准确,但M的尺寸会以n的k次方增长,其中对程序设计语言去k=1就够了。 b) 证明定理 文法G是LL(1)文法当且仅当对于G的每个非终结符A的任何两个不同产生式A->α|β有: 五、状态表: