Beispiel #1
0
def reduce_8(*args):
    I = args[0]
    L = Token(idt="L")
    backpatch(I.nextlist, nextstm)
    return L
Beispiel #2
0
def reduce_35(*args):
    d = args[0]
    R = Token(idt="R")
    d.place = d.name
    R.place = d.place
    return R
Beispiel #3
0
def reduce_37(*args):
    X = args[1]
    R = Token(idt="R")
    R.place = X.place
    return R
Beispiel #4
0
def reduce_26(*args):
    M = Token(idt="M")
    M.gotostm = nextstm
    return M
Beispiel #5
0
def reduce_29(*args):
    G = args[0]
    X = Token(idt="X")
    X.place = G.place
    return X
Beispiel #6
0
def reduce_19(*args):
    d = args[0]
    X = args[2]
    d.place = d.name
    gen('=', X.place, None, d.place)
    return Token(idt="F")
Beispiel #7
0
def reduce_21(*args):
    E = Token(idt="E")
    E.value = "real"
    return E
Beispiel #8
0
def reduce_48(*args):
    X = args[2]
    gen('read', X.place, None, None)
    return Token(idt="W")
Beispiel #9
0
def reduce_49(*args):
    X = args[2]
    gen('write', X.place, None, None)
    return Token(idt="T")
Beispiel #10
0
def reduce_45(*args):
    S = Token(idt="S")
    S.value = '=='
    return S
Beispiel #11
0
def reduce_46(*args):
    S = Token(idt="S")
    S.value = '<>'
    return S
Beispiel #12
0
def reduce_44(*args):
    S = Token(idt="S")
    S.value = '>='
    return S
Beispiel #13
0
def reduce_42(*args):
    S = Token(idt="S")
    S.value = '<='
    return S
Beispiel #14
0
def reduce_9(*args):
    A = args[0]
    backpatch(A.nextlist, nextstm)
    return Token(idt="L")
Beispiel #15
0
def reduce_17(*args):
    N = Token(idt="N")
    N.value = []
    return N
Beispiel #16
0
def reduce_0(*args):
    # 一个非常糟糕临时处理的想法,通过step命令记录的行号来找到函数位置
    d = args[1]
    d.place = d.name
    func_dict[d.name] = d.line
    return Token(idt="P")
Beispiel #17
0
def reduce_18(*args):
    n = args[1]
    N0 = args[2]
    N = Token(idt="N")
    N.value = [n.value] + N0.value
    return N
Beispiel #18
0
def reduce_1(*args):
    d = args[1]
    d.place = d.name
    func_dict[d.name] = d.line
    return Token(idt="P")
Beispiel #19
0
def reduce_20(*args):
    return Token(idt="F")
Beispiel #20
0
def reduce_2(*args):
    return Token(idt="P")
Beispiel #21
0
def reduce_22(*args):
    E = Token(idt="E")
    E.value = "int"
    return E
Beispiel #22
0
def reduce_3(*args):
    return Token(idt="B")
Beispiel #23
0
def reduce_27(*args):
    j_command = gen('j', None, None, None)
    H = Token(idt="H")
    H.nextlist += [j_command]
    return H
Beispiel #24
0
def reduce_5(*args):
    return Token(idt="C")
Beispiel #25
0
def reduce_32(*args):
    R = args[0]
    G = Token(idt="G")
    G.place = R.place
    return G
Beispiel #26
0
def reduce_6(*args):
    return Token(idt="L")
Beispiel #27
0
def reduce_36(*args):
    n = args[0]
    R = Token(idt="R")
    R.place = newtemp()
    gen('=', n.value, None, R.place)
    return R
Beispiel #28
0
def reduce_7(*args):
    X = args[1]
    gen('ret', X.place, None, None)
    return Token(idt="L")
Beispiel #29
0
def reduce_39(*args):
    S = Token(idt="S")
    S.value = '<'
    return S
Beispiel #30
0
    def parse_tokens(self,
                     tokens,
                     show_syntax=False,
                     file_name=None,
                     draw_graph=False,
                     checkpoints=[]):

        err_list = []
        sem_err_mark = False

        succeeded = False

        dot.clear()

        table = ActionTable(action_table_data)

        analysis_stack = []
        # TODO 赋予结束标志token更有意义的值
        analysis_stack.append((0, Token(idt="#")))

        i = 0
        length = len(tokens)

        if file_name:
            fout = open(file_name + ".syn", 'w')
            outstream = fout
        else:
            outstream = sys.stdout

        line = 1
        temp_str = ""

        gen('step', None, None, 1)

        while i < length:
            token = tokens[i]

            current_line = token.line

            state = analysis_stack[-1][0]

            # 加入断点
            if int(token.line) in checkpoints:
                gen('check', None, None, int(current_line))
                checkpoints.remove(token.line)

            if line != token.line:
                gen('step', None, None, int(current_line))
                line = token.line
            # end

            try:
                action = table.action(state, token)
            except:
                # TODO 这种处理不妥

                mark = ""
                mark_type = ""
                if token.idt == 'constnum':
                    mark_type = 'const num'
                    mark = token.value
                elif token.idt == 'identity':
                    mark_type = 'variable'
                    mark = token.name
                else:
                    mark_type = 'key word'
                    mark = token.idt

                parse_err = ParseErrData(
                    SYN_ERR,
                    int(token.line),
                    message="Action failed. Unexpected {}: '{}'.".format(
                        mark_type, mark))
                print(parse_err)
                exit(1)

            if show_syntax:

                def show_stack():
                    print("analysis stack:", end="\t", file=outstream)
                    print(" ".join([
                        "{}:{}".format(elem[0], elem[1].idt)
                        for elem in analysis_stack
                    ]),
                          file=outstream)

                show_stack()
                print("token incoming: {}".format(token.idt), file=outstream)
                print("action: {}".format(action[0]), file=outstream)
                print(file=outstream)
                # input() 单步好像没啥意义

            if 's' is action[0]:
                analysis_stack.append((action[1], action[2]))
                i += 1
            elif 'r' is action[0]:
                num2reduce = action[1]

                reduce_action_args = []

                new_nodes = []

                for _ in range(num2reduce):
                    pop_token = analysis_stack.pop()[1]
                    # reduce_action_args[replace_symbol_reverse(pop_token.idt)] = pop_token
                    reduce_action_args.append(pop_token)

                    new_nodes.append(pop_token)

                reduce_action_args.reverse()

                try:
                    token = action[2](*reduce_action_args)
                except ParseErrData as ped:
                    ped.line = int(current_line)
                    err_list.append(ped)
                    sem_err_mark = True
                    token = ped.token

                # TODO 一种很简单的处理
                try:
                    state = table.goto(analysis_stack[-1][0], token)
                except Exception:
                    parse_err = ParseErrData(
                        SYN_ERR,
                        int(current_line),
                        message=
                        "Reduction failed. Thers's something wrong with the forms usually."
                    )
                    print(parse_err)
                    exit(1)

                analysis_stack.append((state, token))

                if draw_graph:
                    dot.node(str(token.count), token.idt)
                    new_nodes.reverse()
                    for child in new_nodes:
                        dot.node(str(child.count), child.idt)
                        dot.edge(str(token.count), str(child.count))

            elif '#' in action[0]:
                if draw_graph:
                    print(file_name)
                    dot.render(file_name)

                succeeded = True
                break
            else:
                succeeded = False
                break

        if sem_err_mark:
            for err in err_list:
                print(err)
            exit(1)

        if outstream is not sys.stdout:
            outstream.close()
            outstream = sys.stdout

        return succeeded