递归向下子程序分析法实现

递归向下子程序分析法基本思想:
对文法中的每个非终结符(语法成分)编写一个子程序,而子程序的代码结构由相应非终结符的产生式右部所决定:
(1)产生式右部的终结符与输入符号相匹配

(2)非终结符与相应的子程序调用对应

本程序采用文法:
E→E+T|E-T|T|-E
T→TF|T/F|F
F→(E) | i
消除左递归:
E→TE’| -EE’
E’→+TE’| -TE’|ε
T→FT’
T’→
FT’| /FT’|ε
F→( E ) | i

# -*- coding: utf-8 -*-
"""
Created on Tue Apr 21 18:33:13 2020

@author: 侯明会
"""
#文法G为:  E→E+T|E-T|T|-E
#          T→T*F|T/F|F
#          F→(E) | i
#消除左递归:E→TE'| -EE'
#           E'→+TE'| -TE'|ε
#          T→FT' 
#          T'→*FT'| /FT'|ε
#          F→( E ) | i

def error():
    print("failed to match!")
    global flag
    flag=False
def match(t):#匹配终结符(t:终结符)
    global pos 
    if s[pos] == t:  #判断当前终结符是否匹配  
         pos+=1       #指针位置后移
    else:
         error()
def E():#E→TE'| -EE'
    if s[pos]=='#':
        return
    elif s[pos] == '-':
        match('-')
        if flag==True:
            print("E->-EE'")
            E()
            E1()
        else:
            return
    else:
        print("E->TE'")
        T()
        E1()
def E1():#E'→+TE'| -TE'|ε
    if s[pos]=='+':
        match('+')
        if flag==True:
            print("E'->+TE'")
            T()
            E1()
        else:
            return
    elif s[pos]=='-':
        match('-')
        if flag==True:
            print("E'->-TE'")
            T()
            E1()
        else:
            return
def T():#T→FT' 
    print("T->FT'")
    F()
    T1()
def T1():#T'→*FT'| /FT'|ε
    if s[pos]=='*':
        match('*')
        if flag==True:
            print("T'→*FT'")
            F()
            T1()
        else:
            return
    elif s[pos]=='/':
        match('/')
        if flag==True:
            print("T'→/FT'")
            F()
            T1()
        else:
            return
def F():#F→( E ) | i
     if s[pos] == 'i':
         match('i')
         if flag==True:
             print("F->i")
         else:
            return
     elif s[pos] == '(':
         match('(')
         if flag==True:
            print("F->(E)")
            E()
            if s[pos] == ')':
                match(')')
                if flag==True:
                    pass
                else:
                    return
            else:
                error()
         else:
            return
     else:
        error()   

if __name__=='__main__':
    pos=0
    s=input('请输入以#结尾的字符串:')
    flag=True
    E()
    if s[pos]=='#' and flag==True:
        print("语句合法!")
    else:
        print("语句不合法!")
    
    

实验结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值