语法分析

2023/11/27 编译原理

语法分析是编译前端部分的重要部分。

# todo
class PlusMinus:
    def __init__(self, left, op, right):
        self.left = left
        self.op = op
        self.right = right

    def __str__(self):
        return '({} {} {})'.format(self.left, self.op, self.right)


class MulDiv:
    def __init__(self, left, op, right):
        self.left = left
        self.op = op
        self.right = right

    def __str__(self):
        return '({} {} {})'.format(self.left, self.op, self.right)


class Unary:
    def __init__(self, op, right):
        self.op = op
        self.right = right

    def __str__(self):
        return '({}{})'.format(self.op, self.right)


class Group:
    def __init__(self, expr):
        self.expr = expr

    def __str__(self):
        return '{}'.format(self.expr)


class Literal:
    def __init__(self, expr):
        self.expr = expr

    def __str__(self):
        return '{}'.format(self.expr)


class Parser:
    index = 0
    tokens = []
    length = 0

    def __init__(self, tokens):
        self.tokens = tokens
        self.length = len(tokens)

    def expression(self):
        return self.plus_minus()

    def plus_minus(self):
        expr = self.mul_div()

        if self.index < self.length and (self.tokens[self.index] == '+' or self.tokens[self.index] == '-'):
            op = self.tokens[self.index]
            self.index += 1
            right = self.mul_div()
            expr = PlusMinus(expr, op, right)

        return expr

    def mul_div(self):
        expr = self.unary()

        if self.index < self.length and (self.tokens[self.index] == '*' or self.tokens[self.index] == '/'):
            op = self.tokens[self.index]
            self.index += 1
            right = self.unary()
            expr = MulDiv(expr, op, right)

        return expr

    def unary(self):
        if self.index < self.length and self.tokens[self.index] == '-':
            op = self.tokens[self.index]
            self.index += 1
            right = self.primitive()
            expr = Unary(op, right)
            return expr

        return self.primitive()

    def primitive(self):
        if self.index < self.length and self.tokens[self.index] == '(':
            self.index += 1  # 消耗 (
            expr = self.plus_minus()
            self.index += 1  # 消耗 )
            expr = Group(expr)
            return expr
        else:
            ret = self.tokens[self.index]
            print(ret)
            self.index += 1
            return Literal(ret)


# (1 + 2) * 3 + 4 * (-5 + 6)
p = Parser(['(', '1', '+', '2', ')', '*', '3', '+', '4', '*', '(', '-', '5', '+', '6', ')', '+', 'add()', '-', 'a'])
expr = p.expression()
print(expr)

Search

    Table of Contents