python - 在python中实现解析器的自顶向下递归下降法
问题描述
我需要重写 EBNF 中的语法。使用自顶向下递归下降法在python3中实现EBNF语法的解析器(即tdrd parser.py)。输入数据文件名由命令行给出。假设数据文件中的两个终端(例如 aaaccb )之间有一个空格字符。
这是语法:
<S> -> <A> c c <B> | <B> d d <A>
<A> -> a <A> | a
<B> -> b <B> | b
这是代码:
import sys
def lexan():
global mitr
try:
return next(mitr)
except StopIteration:
return ''
def match(ch):
global lookahead
if ch == lookahead:
lookahead = lexan()
else:
print("Syntax Error")
exit()
def S():
#<S> -> <A> c c <B> | <B> d d <A>
global lookahead
if lookahead == 'a':
A()
#match('c')
C()
elif lookahead == 'b':
B()
#match('c')
C()
else:
print("Syntax Error")
exit()
def A():
# <A> -> a <A> | a
global lookahead
match('a')
if lookahead == 'a':
A()
def B(): # <B> -> b <B> | b
global lookahead
match('b')
if lookahead == 'b':
B()
def C():
global lookahead
match('c')
if lookahead == 'c':
C()
file = open(sys.argv[1], "r")
wlist = file.read().split()
mitr = iter(wlist)
lookahead = lexan()
S()
if lookahead == '':
print("Pass")
else:
print("Syntax Error")
exit()
每当我运行它时:python3 tdrd_parser.py data.txt 如果我从文件中删除 b - 我得到一个“通过”。否则 - 语法错误。
你能帮忙吗?
解决方案
推荐阅读
- python-3.x - 将许多 excel 循环到单独的数据帧中
- python-3.x - 使用 pytest 在 REST 应用程序中测试权限的最佳方法是什么?
- c - 为什么我的 C 代码说两个字符串不相等,尽管它们看起来像这样?
- replace - 基于 SAS 中的查找表修改字符变量内容
- python-3.x - 仅用 2 个数据点如何估计外推值的误差?
- python - 从线程(concurrent.futures)更改小部件的可见性,在正常模式下不起作用,在调试模式下它起作用,为什么?
- python - 如何让程序打印然后再次重新启动代码
- paypal - 加载外部js文件,然后立即引用创建的对象[Vuejs2]
- swift - 如何在 Swift (ARKit, SCNKit) 中创建带起点和终点的线
- jenkins - jenkins dsl 作业脚本:如何在下游参数化步骤中访问环境变量(通过 propertiesFile 注入)