自顶向下递归下降法在python中实现解析器

2024-03-28 15:01:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要重写EBNF中的语法。使用自顶向下的递归下降方法实现解析器 (即tdrd parser.py)在python3中用于EBNF语法。输入数据文件名由 命令行。假设两个端子之间有一个空格字符 (例如a c b)在数据文件中

下面是语法:

<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,我会得到一个“通过”。否则-语法错误

你能帮忙吗


Tags: ifdefmatchexit语法errorglobalelse