编译原理:LL(1)文法 语法分析器(预测分析表法)

设计要求:对于任意输入的一个LL(1)文法,构造其预测分析表,并对指定输入串分析其是否为该文法的句子。

思路:首先实现集合FIRST(X)构造算法和集合FOLLOW(A)构造算法,再根据FIRST和FOLLOW集合构造出预测分析表,并对指定的句子打印出分析栈的分析过程,判断是否为该文法的句子。

  • //文法
    E->TK
    K->+TK
    K->$
    T->FM
    M->*FM
    M->$
    F->i
    F->(E)

对于输入串i+i*i# ,这里我们先给出实验结果截图:
这里写图片描述
这里写图片描述

(1)求FIRST集的算法思想

  • 若X->a..,则将终结符a加入FIRST(X)中;
    若X->e ,则将终结符e加入FIRST(X)中(e表示空集);
    若 X->BCD…E,则将First(B)所有元素(除了空集)加入 First(X),然后检测First(B),若First(B)中不存在空集, 即e,则停止,若存在则向B的后面查看,将First(C)中所有元素(除了空集)加入First(X),然后再检测First(C)中是否有e…直 到最后,若E之前的所有非终结符的First集中都含有e,则检测到E时,将First(E)也加入First(X),若First(E)中含有e,则将 e加入First(X)。

(2)求FOLLOW集的算法思想

  • 对于文法G中每个非终结符A构造FOLLOW(A)的办法是,连续使用下面的规则,直到每个FOLLOW不在增大为止.
    (1) 对于文法的开始符号S,置#于FOLLOW(S)中;
    (2) 若A->aBb是一个产生式,则把FIRST(b){ε}加至FOLLOW(B)中;
    (3) 若A->aB是一个产生式,或A->aBb是一个产生式而b=>ε(即ε∈FIRST(b))则把FOLLOW(A)加至FOLLOW(B)中

(3)生成预测分析表的算法思想

  • 构造分析表M的算法是:
    (1) 对文法G的每个产生式A->a执行第二步和第三步;
    (2) 对每个终结符a∈FIRST(a),把A->a加至M[A,a]中;
    (3) 若ε∈FIRST(a),则把任何b∈FOLLOW(A)把A->a加至M[A,b]中;
    (4) 把所有无定义的M[A,a]标上出错标志.

(4)对符号串的分析过程
预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号行事的,对于任何(X,a),总控程序
每次都执行下述三种可能的动作之一;
(1) 若X=a=”#”,则宣布分析成功,停止分析过程.
(2) 若X=a≠”#”,则把X从STACK栈顶逐出,让a指向下一个输入符号.
(3) 若X是一个非终结符,则查看分析表M,若M[A,a]中存放着关于X的一个产生式,那么,首先把X逐出STACK栈顶,然后
把产生式的右部符号串按反序一一推进STACK栈(若右部符号为ε,则意味着不推什么东西进栈).在把产生式的右部
符号推进栈的同时应做这个产生式相应得语义动作,若M[A,a]中存放着”出错标志”,则调用出错诊察程序ERROR.

本文转自编译原理:LL(1)文法 语法分析器(预测分析表法)

猜你喜欢

转载自blog.csdn.net/qq_38262266/article/details/80138956