首页 > 解决方案 > 在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 - 我得到一个“通过”。否则 - 语法错误。

你能帮忙吗?

标签: pythonpython-3.xparsing

解决方案


推荐阅读