Я создаю калькулятор, используя PLY, и я хочу иметь возможность анализировать матрицы, подобные этой: [[11,1];[22,4];[13,3]]
в список списков, которые будут переданы моему собственному классу Matrix для дальнейшего расчета.
Это мой код до сих пор. Здесь три важные функции: p_comma
, p_semicolon
и p_brack
. Остальное чисто для расчета и приоритета.
def p_operations(p):
""" expression : sixth
sixth : fifth
fifth : fourth
fourth : third
third : second
second : first
first : NUMBER
first : IMAGINE
"""
p[0] = p[1]
def p_comma(p):
""" sixth : sixth ',' fifth """
if isinstance(p[1], list):
p[1].append(p[3])
p[0] = p[1]
else:
p[0] = [p[1],p[3]]
def p_semicolon(p):
""" sixth : sixth ';' fifth """
if isinstance(p[1], list):
p[1].append(p[3])
p[0] = p[1]
else:
p[0] = [p[1],p[3]]
def p_plus(p):
""" fifth : fifth '+' fourth """
p[0] = p[1] + p[3]
def p_minus(p):
""" fifth : fifth '-' fourth """
p[0] = p[1] - p[3]
def p_implicit_times(p):
""" fourth : fourth second """
p[0] = p[1] * p[2]
def p_times(p):
""" fourth : fourth '*' third """
p[0] = p[1] * p[3]
def p_divide(p):
""" fourth : fourth '/' third """
p[0] = p[1] / p[3]
def p_modulo(p):
""" fourth : fourth '%' third """
p[0] = p[1] % p[3]
def p_floor_divide(p):
""" fourth : fourth FLOORDIV third """
p[0] = p[1] // p[3]
def p_unary_minus(p):
""" third : '-' third """
p[0] = -p[2]
def p_power(p):
""" second : first '^' third """
p[0] = p[1] ** p[3]
def p_paren(p):
""" first : '(' expression ')' """
p[0] = p[2]
def p_brack(p):
""" first : '[' expression ']' """
if type(p[2][0]) == list:
p[0] = [p[2]]
else:
p[0] = Matrix.Matrix(p[2])
Проблема здесь в том, что мое решение плохо работает с такими хитрыми вещами, как это: [[1]]
, а также синтаксический анализ работает, даже когда нет скобок, а это не то, что мне нужно.
Больше всего я твердо верю, что можно найти лучшее решение.
Может ли кто-нибудь помочь мне с этим?