递归向下子程序分析法基本思想:
对文法中的每个非终结符(语法成分)编写一个子程序,而子程序的代码结构由相应非终结符的产生式右部所决定:
(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("语句不合法!")
实验结果