语法分析是编译前端部分的重要部分。
# 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)