递归的预测分析法

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

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

void A( ) {
    选择一个A产生式, A →X1 X2 … Xk ;
    for ( i = 1 to k ) {
        if ( Xi是一个非终结符号)
            调用过程 Xi ( ) ; 
        else if ( Xi 等于当前的输入符号a) 
            读入下一个输入符号;
        else /* 发生了一个错误 */ ;
} }

例子:

(1) → program : ; end
(2) → id
(3) → , id
(4) → ε
(5) → s
(6) → ; s
(7) → ε
(8) → real
(9) → int

SELECT(4)={:}
SELECT(7)={end}

program DESCENT;
    begin
        GETNEXT(TOKEN);
        PROGRAM(TOKEN);
        GETNEXT(TOKEN);
        if TOKEN≠’$’ then ERROR;
    end
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
procedure DECLIST(TOKEN);
    begin
        if TOKEN≠’id’ then ERROR;
            GETNEXT(TOKEN);
            DECLISTN(TOKEN);
    end
procedure DECLISTN(TOKEN);
    begin
        if TOKEN =‘,’ then
            begin 
            GETNEXT(TOKEN);
            if TOKEN≠’id’ then ERROR;
                GETNEXT(TOKEN);
                DECLISTN(TOKEN);
            end
        else if TOKEN≠’:’ then ERROR;
end 
procedure STLIST(TOKEN);
    begin
        if TOKEN≠’s’ then ERROR;
            GETNEXT(TOKEN);
            STLISTN(TOKEN);
    end
procedure STLISTN(TOKEN);
    begin
        if TOKEN =‘;’ then
        begin 
            GETNEXT(TOKEN);
            if TOKEN≠’s’ then ERROR;
                GETNEXT(TOKEN);
                STLISTN(TOKEN);
        end 
        else if TOKEN≠’end’ then ERROR;
end
procedure TYPE(TOKEN);
    begin
        if TOKEN≠’real’ or TOKEN≠’int’ 
            then ERROR;
    end
最后修改日期:2020年6月1日

留言

撰写回覆或留言