跳转至

预测分析方法

非递归的预测分析法

非递归的预测分析不需要为每个非终结符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析

输入:一个串w和文法G的分析表 M

输出:如果w在L(G)中,输出w的最左推导;否则给出错误指示

方法:最初,语法分析器的格局是:输入缓冲区中是w\(\$\),G的开始符号位于栈顶,其下面是\(\$\)

示例

给出下列预测分析表

具体分析过程如下:

递归的预测分析法

递归的预测分析法是指:在递归下降分析中,根据预测分析表进行产生式的选择

根据每个非终结符的产生式和LL(1)文法的预测分析表,为每个非终结符编写对应的过程

例:给出下列产生式

(1) <PROGRAM> → program <DECLIST> :<TYPE> ; <STLIST> end
(2) <DECLIST> → id <DECLISTN>
(3) <DECLISTN> → , id <DECLISTN>
(4) <DECLISTN> → ε
(5) <STLIST> → s <STLISTN>
(6) <STLISTN> → ; s <STLISTN>
(7) <STLISTN> → ε
(8) <TYPE> → real
(9) <TYPE> → int
program DESCENT;
    begin
        GETNEXT(TOKEN);
        PROGRAM(TOKEN);
        GETNEXT(TOKEN);
        if TOKEN≠’$’  then ERROR;
    end

为非终结符PROGRAM编写选择逻辑

procedure PROGRAM(TOKEN);
    begin
        if TOKEN≠’program’  then ERROR;

        GETNEXT(TOKEN);
        DECLIST(TOKEN);

        if TOKEN≠’:’  then ERROR;

        GETNEXT(TOKEN);
        TYPE(TOKEN);

        GETNEXT(TOKEN);
        if TOKEN≠’;’  then ERROR;

        GETNEXT(TOKEN);
        STLIST(TOKEN);

        if TOKEN≠’end’  then ERROR;
    end