From d8dab268a2b213e87d3f2852af255dd2c4cd826e Mon Sep 17 00:00:00 2001 From: mahdidehghandev Date: Tue, 10 Dec 2024 09:56:38 +0330 Subject: [PATCH] Fix: unary+ --- evaluate.py | 2 ++ lexer.py | 5 +---- main.py | 11 ++++++----- parser.py | 7 ++++++- symbol_table.py | 1 + 5 files changed, 16 insertions(+), 10 deletions(-) diff --git a/evaluate.py b/evaluate.py index b587108..a024cea 100644 --- a/evaluate.py +++ b/evaluate.py @@ -44,6 +44,8 @@ def _apply_binary_op(op, a, b): def _apply_single_op(op, a): if op == "unary-": return -a + elif op == "unary+": + return a elif op == "sin": return math.sin(a) elif op == "cos": diff --git a/lexer.py b/lexer.py index 78e4edc..18732a1 100644 --- a/lexer.py +++ b/lexer.py @@ -40,7 +40,7 @@ def tokenize(self): self.is_single_line_comment() elif char == '{': self.is_multi_line_comment() - # elif char in self.operators: + elif self.symbol_table.is_operator(char): self.is_operator() elif char.isdigit(): @@ -191,15 +191,12 @@ def is_identifier(self): state = 2 case 2: lexeme = self.text[self.beginning:self.forward].lower() - # if self.symbol_table.is_not_reserved(lexeme) and not self.symbol_table.is_id_existence(lexeme): - # self.symbol_table.add_id(lexeme) if self.symbol_table.is_operator(lexeme): self.create_token("OPERATOR") self.beginning = self.forward return elif self.symbol_table.is_function(lexeme): - # if lexeme in ['sin', 'cos', 'tan', 'cot', 'arcsin', 'arccos', 'arctan', 'arccot', 'log', 'sqrt', 'sqr', 'exp']: self.create_token("FUNCTION") self.beginning = self.forward return diff --git a/main.py b/main.py index f826e2f..2f002a1 100644 --- a/main.py +++ b/main.py @@ -94,10 +94,7 @@ def main(file_name): parser = Parser(symbol_table, tokens) parser.parse() - print("Parsed postfix expression:") - for i in parser.postfix: - print(i.value, end=" ") - print("\n") + while True: @@ -108,6 +105,10 @@ def main(file_name): choice = input("--> ") if choice == "1": + print("Parsed postfix expression:") + for i in parser.postfix: + print(i.value, end=" ") + print("\n") evaluate = Evaluate(parser.postfix,symbol_table) print(evaluate.evaluate()) @@ -130,4 +131,4 @@ def main(file_name): if __name__ == "__main__": - main('input1.txt') + main('test.txt') diff --git a/parser.py b/parser.py index c8de66a..d5c7c1d 100644 --- a/parser.py +++ b/parser.py @@ -130,6 +130,12 @@ def factor(self): token.value = 'unary-' self.factor() self.postfix.append(token) + elif self.lookahead.value == '+': + token = self.lookahead + self.match('+') + token.value = 'unary+' + self.factor() + self.postfix.append(token) elif self.lookahead.type == "NUM": self.number() @@ -139,7 +145,6 @@ def factor(self): self.expr() self.match(')') - # elif self.lookahead.value.lower() in ['sin', 'cos', 'tan', 'cot', 'arcsin', 'arccos', 'arctan', 'arccot', 'log', 'sqrt', 'sqr', 'exp']: elif self.symbol_table.is_function(self.lookahead.value.lower()): token = self.lookahead math_func = self.lookahead.value diff --git a/symbol_table.py b/symbol_table.py index d909383..73acd10 100644 --- a/symbol_table.py +++ b/symbol_table.py @@ -11,6 +11,7 @@ def __init__(self): 'mod': {'type': 'OPERATOR', 'args': 2, "is_reserved": True}, '^': {'type': 'OPERATOR', 'args': 2, "is_reserved": None}, 'unary-': {'type': 'OPERATOR', 'args': 1, "is_reserved": None}, + 'unary+': {'type': 'OPERATOR', 'args': 1, "is_reserved": None}, '(': {'type': 'DELIMITER', "is_reserved": None}, ')': {'type': 'DELIMITER', "is_reserved": None}, 'e': {'type': 'IDENTIFIER', 'value': 2.71, "is_reserved": True},