考试突击3语法分析上到下

自上而下

终结符和非终结符

  • 单词符号,称为终结符,(不可再分
  • 语法单位称为非终结符,(可再分,能出现再上下无关文法左边
  • 产生式:<> -> <><>
  • 开始符号只能是非终结符

直接推导

=>表示只需要一步的直接推导,

推导

a=>b=>c,
a到c是一个推导,要很多步

句型,句子,语言

img

  • 文法G所产生句子的全体称为语言L(G)
  • 句型终结符和非终结符
  • 句子全是终结符
  • 语言:就是句子的全体

语法树

产生二义性原因,有不同的语法树,产生的形态的句子


给定一个句子,判断他是否能由文法推出

  • ①S->字符串
  • ②语法树

语法分析方法

自上而下

左递归,和回溯

递归(假设是左递归 )

  • 直接左递归
    • 转右递归
  • 间接左递归
    • 1.间接转直接
    • 2.直接转右
  • 消除左递归算法,这后面没化简,
    • 1.对文法中的非终结符排序,(顺序随便
    • 用前面的非终结符的产生式表示现在后面的非终结符
    • 最后消除递归

回溯

  • 消除回溯,提取公共因子
    • 文法最左边右公共因子,

First集

First集是看产生式的开始符号后面紧跟的符号是什么,如果是终结符直接写在对应的First集合中多个或不管,连看,如果是非终结符,就要再对应的非终结里面找

follow集

follow集看右边(不是最右边,主要产生式右边有它就行),如A->BC Follow(C)其中找产生式后面有C的

  • 首先开始Follw(符号)加个#
  • \(A->\alpha B\)如果求Follow(B)其中B后面为空(就是B后面没又任何单词)将Follow(A)加入倒follow(B)中
  • A-> \(\alpha B \beta\) B后不为空,
    • 其中\(\beta\)是终结符,直接写,
    • 如果\(\beta\)不是终结符,将first(\(\beta\))(减上空字符),加入到followB中,
    • 如果\(\beta\)能推出空,那么就变成了第一个情况了

LL(1)

csdn

条件

  • 先找能推出两种或以上的产生式,就是右边有或

img

然后构造LL(1)表

分析过程

递归下降算法

img
img
大概就是在开始符号开始,然后如果是终结符就移动指针,如果是非终结符就跳下个函数

procedure 开始符号;
begin 
    if sym ='(' then //就执行下面
        begin
            advance;//移动指针
            T;//移动到T的开始符号,执行T去了类似函数,执行完T回来,说明执行完直到advance
            if sym = ')' then advance else error
        end
    if sym = 'a' then//移动的是第二条a
        begin
            advance;
            s'
        end
    else error

end

预测分析程序

构造分析表

img
构造分析表

  • 先看first集合,如果first集合A能推出a就就a列写推出a的写下
  • 如果first集合有空串,如A'的first集合有空串,那么将A'->\(\epsilon\)写到对应的follow列中

看是不是LL(1)文法
这里看有或的两个如上图,\(A'->AB|\epsilon\),那么看first(A)交集follow(A)如果是空集,属于

分析过程

img
img

posted @ 2023-06-19 08:57  壹剑霜寒十四州  阅读(9)  评论(0编辑  收藏  举报