欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编译原理 课程设计——基于预测分析方法的表达式语法分析器(python))

程序员文章站 2022-07-13 17:34:36
...

编译原理 课程设计(python)

基于预测分析方法的表达式语法分析器

编译原理 课程设计——基于预测分析方法的表达式语法分析器(python))
编译原理 课程设计——基于预测分析方法的表达式语法分析器(python))

import queue as q

prod_table = {
    'S': {
        'm': 'AT',
        '(': 'AT'
    },
    'T': {
        '+': '+AT',
        ')': '$',
        '#': '$'
    },
    'A': {
        'm': 'BU',
        '(': 'BU'
    },
    'U': {
        '+': '$',
        ')': '$',
        '#': '$',
        '*': '*BU'
    },
    'B': {
        'm': 'm',
        '{': '(S)'
    }
}


def print_line(cnt, stack, string, p):
    print(cnt, end='\t')
    cache = q.LifoQueue()
    stack_value = ''
    while not stack.empty():
        value = stack.get()
        cache.put(value)
    while not cache.empty():
        value = cache.get()
        stack.put(value)
        stack_value += value
        #print(value, end='')
    print('{0:5}'.format(stack_value), end='')

    print('  \t', end='')
    print('{0:10}'.format(string[p:]), end='')
    # print(string[p:], end='  \t')


def main(string):
    p = 0
    cnt = 0

    stack = q.LifoQueue()
    stack.put('#')
    stack.put('S')
    while 1:
        cnt += 1
        print_line(cnt, stack, string, p)
        X = stack.get()
        if X not in prod_table.keys() or X == '#':  # 栈顶为非终结符
            if X == string[p]:
                if string[p] == '#':
                    print('【ACCEPT】')
                    exit()
                else:  # 消去
                    p += 1
                    print(X, 'Match')
            else:
                print('\n【Error】:Stack and string not match!')
                exit()
        else:  # 栈顶为终结符
            try:
                production = prod_table[X][string[p]]
                if production == '$':
                    pass
                else:
                    for j in range(len(production)):
                        stack.put(production[-j-1])
                print('Use the production', X, '->', production)
            except KeyError:
                print('\n【Error】 syntax error: production not found')
                exit()


if __name__ == '__main__':
    input_string = 'm+m*m#'
    main(input_string)