Я написал парсер, который правильно берет выражение и создает из него AST. Мой интерпретатор затем берет этот AST, оценивает его и затем возвращает решение. Однако я бы хотел, чтобы синтаксический анализатор (или интерпретатор) учитывал неоднозначность (отсутствие скобок) в выражении.
Например, если я напишу что-то вроде R ∩ G - B в качестве выражения, я бы хотел, чтобы AST возвращались как для (R ∩ G) - B, так и для R G (G - B). Я видел много решений для устранения двусмысленности при синтаксическом анализе выражения, но я хотел бы видеть все возможные интерпретации выражения.
Вот фрагмент из моего класса парсера:
def eat(self, token_type):
if self.current_token.type == token_type:
self.current_token = self.lexer.get_next_token()
else:
self.error()
def factor(self):
token = self.current_token
if token.type in (COLOR, EMPTY_S, UNIVERSE_OP):
self.eat(token.type)
return Num(token)
elif token.type == L_PAREN:
self.eat(L_PAREN)
node = self.expr()
self.eat(R_PAREN)
return node
def term(self):
node = self.factor()
while self.current_token.type is COMPLIMENT:
token = self.current_token
self.eat(COMPLIMENT)
node = BinOp(left = node, op = token, right = self.expr())
return node
def expr(self):
node = self.term()
while self.current_token.type in (UNION, INTERSECT, MINUS, SUBSET, EQUALS):
token = self.current_token
if token.type == UNION:
self.eat(UNION)
elif token.type == INTERSECT:
self.eat(INTERSECT)
elif token.type == MINUS:
self.eat(MINUS)
elif token.type == SUBSET:
self.eat(SUBSET)
elif token.type == EQUALS:
self.eat(EQUALS)
else:
self.error()
node = BinOp(left = node, op = token, right = self.expr())
return node
def parse(self):
return self.expr()
При моей текущей настройке парсер возвращает AST только для R ∩ (G - B).