语法分析——预测分析程序

LL(1)文法满足下面的条件:

  1. 文法不含左递归
  2. 对于文法中每一个非终结符A的各个产生式的候选首符集两两不相交。即,若A→α1|α2|...|αn,则FIRST(αi)∩FIRST(αj)=∅ ,其中(i≠j)
  3. 对文法中的每个非终结符A,若它存在某个侯选首符集包含ε,则FIRST(A)∩FOLLOW(A)=∅

文法通过左递归消除、消除回溯、提取左公共因子可以满足LL(1)的条件,成为LL(1)文法。

预测分析程序实现步骤:

  1. 构造文法非终结符的FIRST集
  2. 构造文法非终结符的FOLLOW集
  3. 构造文法的预测分析表
  4. 构造控制程序

1、构造文法非终结符的FIRST集

假设A有n个侯选α1,α2,...,αn,即A→α1|α2|...|αn。侯选式α的FIRST集形式化描述:FIRST(α)={a | α\Rightarrowa...,a∈v_{T}},若α\Rightarrowε,则ε∈FIRST(α).。那么FIRST(A) = FIRST(α1)∪FIRST(α2)∪...∪FIRST(αn)

实现:

# 求FIRST(α) 用'@'表示'ε'
    def formula_first(self,str):
        first_keys = self.firstSET.keys()
        str_len = len(str)
        if str_len == 1:
            if str in self.terSymbol or str == '@':return [str]
            elif str in first_keys:
                return self.followSET.get(str)
            else:
                return []
        i = 0
        first_set = []
        while i < str_len - 1:
            if str[i] in self.terSymbol:
                if str[i] not in first_set:
                    first_set.append(str[i])
                return first_set
            if str[i+1] == "'":
                if str[i:i+2] in first_keys:
                    str_firstSet = self.firstSET.get(str[i:i+2])
                    for terSym in str_firstSet:
                        if terSym not in first_set:
                            first_set.append(terSym)
                    if '@' not in str_firstSet:
                        return first_set
                    else:
                        for index in range(len(first_set)):
                            if first_set[index] == '@':
                                del first_set[index]
                                break
                        i += 2
                else:
                    return first_set
            else:
                if str[i] in first_keys:
                    str_firstSet = self.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值