预测分析法实现

系统维持一个分析表和一个分析栈,根据当前扫描到的符号,选择当前语法变量(处于栈顶)的候选式进行推导——希望找到相应的输入符号串的最左推导
本程序使用文法G为:
E → E+T | T
T → T*F | F
F → (E) | i
消除左递归:
E → TE’
E’ → +TE’ | ε
T → FT’
T’ → *FT’ | ε 
F → (E) | i
可以求得:
FIRST(TE’)={(,id} FIRST(+TE’)={+}
FIRST(FT’)={(,id} FIRST(FT’)={}
FIRST((E))={(} FIRST(id)={id}
FOLLOW( E’)={ ), # }
FOLLOW( T’)={ +, ), # }
表达式文法的预测分析表为:
在这里插入图片描述

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 21 20:54:57 2020

@author: 侯明会
"""
#文法G为:E → E+T | T
#        T → T*F | F
#        F → (E) | i
#消除左递归:E → TE'
#           E' → +TE' | ε
#           T → FT'
#           T' → *FT' | ε 
#           F → (E) | i
#FOLLOW( E')={ ), # }; FOLLOW( T')={ +, ), # };   
#FIRST(TE')={(,id}; FIRST(id)={id}; FIRST(+TE')={+};  
#FIRST(FT')={(,id}; FIRST(*FT')={*}; FIRST((E))={(}
def error():
    print("failed to match!")
def display(buffer,stack):
    list=['#']
    while buffer!=list or stack!=list:
        m=stack[-1]
        stack.pop()
        b=buffer[0]
        if m=='E':
            if b=='i' or b=='(':
                stack.append('E1')
                stack.append('T')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:E->TE'")
            elif b=='+' or b=='*' or b==')' or b=='#':
                error()
                break
        elif m=='E1':
            if b=='i' or b=='*' or b=='(':
                error()
                break
            elif b=='+':
                stack.append('E1')
                stack.append('T')
                stack.append('+')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:E'->+TE'")
            elif b==')' or b=='#':
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:E'->ε")
        elif m=='T':
            if b=='i' or b=='(':
                stack.append('T1')
                stack.append('F')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:T->FT'")
            elif b=='+' or b=='*' or b==')' or b=='#':
                error()
                break
        elif m=='T1':
            if b=='i' or b=='(':
                error()
                break
            elif b=='+' or b==')' or b=='#':
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:T'->ε")
            elif b=='*':
                stack.append('T1')
                stack.append('F')
                stack.append('*')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:T'->*FT'")
        elif m=='F':
            if b=='i':
                stack.append('i')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:F->i")
            elif b=='+' or b=='*' or b==')' or b=='#':
                error()
                break
            elif b=='(':
                stack.append(')')
                stack.append('E')
                stack.append('(')
                print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack)+" 输出:F->(E)")
        elif m=='i' or m=='+' or m=='*' or m=='(' or m==')':
            if m==b:
                buffer.pop(0)
            print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack))
if __name__=='__main__':
    s=input('请输入以#结尾的字符串:')
    buffer=list(s)#输入缓冲区
    stack=['#','E']#栈
    print("输入缓冲区:"+str(buffer)+" 栈:"+str(stack))
    display(buffer,stack)

实验结果
实验结果

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归下降分析器是一种常见的语法分析方法,适用于递归文法。在给定的算术表达式文法中,e代表表达式,t代表项,|代表或。根据该文法,我们可以编写一个简单的递归下降分析器来解析算术表达式。 首先,我们需要定义一个函数来解析表达式e。在e的定义中,e可以是e加上t,e减去t,或者只有t。因此,我们可以定义一个递归函数来解析表达式e: ```python def parse_e(): t = parse_t() if current_token == '+': consume_token('+') e = parse_e() return t + e elif current_token == '-': consume_token('-') e = parse_e() return t - e else: return t ``` 接下来,我们需要定义一个函数来解析项t。在t的定义中,t可以是e乘以t,e除以t,或者只有一个因子。因此,我们可以定义另一个递归函数来解析项t: ```python def parse_t(): factor = parse_factor() if current_token == '*': consume_token('*') t = parse_t() return factor * t elif current_token == '/': consume_token('/') t = parse_t() return factor / t else: return factor ``` 最后,我们还需要定义一个函数来解析因子。在因子的定义中,因子可以是一个数字或者一个用括号包裹的表达式。因此,我们可以定义一个简单的函数来解析因子: ```python def parse_factor(): if current_token.isdigit(): return int(current_token) elif current_token == '(': consume_token('(') e = parse_e() consume_token(')') return e else: raise SyntaxError('Invalid expression') ``` 以上就是一个简单的递归下降分析器的实现,它可以解析给定算术表达式的语法结构。通过递归地调用不同的解析函数,我们可以很容易地构建一个递归下降分析器来处理各种复杂的文法规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值