def parseExpression(self): left = self.parseTerm() oplex = self.lexAnalizer.getLex() leftpoints = [left] while (oplex.type == "Operator" or oplex.type == "Key Word") and oplex.lex in ['+', '-', 'or']: self.curlex = self.lexAnalizer.nextLex() right = self.parseTerm() if oplex.lex == "or": if right.lexref.typeref.name == "boolean" and left.lexref.typeref.name == "boolean": newtyperef = right.lexref.typeref else: self.errorshow( f'Нельзя сравнить типы {str(right.lexref.typeref.name)} и {str(left.lexref.typeref.name)}' ) elif oplex.lex == '-': if right.lexref.typeref.name == "string" or left.lexref.typeref.name == "string": self.errorshow( f'Оператор "{oplex.lex}" не применим к типу "String"') newtyperef = right.lexref.typeref if left.lexref.typeref.name == right.lexref.typeref.name: symexpr = Symbols.SymExpr(oplex, left, right, newtyperef) elif left.lexref.typeref.name in [ 'integer', 'float' ] and right.lexref.typeref.name in ['integer', 'float']: if oplex.lex in ['-', '+']: newtyperef = Symbols.SymType("float") else: newtyperef = Symbols.SymType("integer") symexpr = Symbols.SymExpr(oplex, left, right, newtyperef) else: self.errorshow( f'Нельзя преобразовать тип {str(right.lexref.typeref.name)} к {str(left.lexref.typeref.name)}' ) leftpoints = [Symbols.BinOpNode(symexpr)] oplex = self.lexAnalizer.getLex() if (oplex.type == "Operator" or oplex.type == "Key Word") and oplex.lex in [ '=', '<>', '<', '>', '>=', '<=', 'in' ]: self.curlex = self.lexAnalizer.nextLex() right = self.parseExpression() newtyperef = Symbols.SymType("boolean") if left.lexref.typeref.name == right.lexref.typeref.name: symexpr = Symbols.SymExpr(oplex, left, right, newtyperef) else: self.errorshow( f'Нельзя сравнить переменные типа {str(right.lexref.typeref.name)} и {str(left.lexref.typeref.name)}' ) leftpoints = [Symbols.BinOpNode(symexpr)] oplex = self.lexAnalizer.getLex() return leftpoints[0] return leftpoints[0]
def parseTerm(self): left = self.parseFactor() oplex = self.lexAnalizer.getLex() leftpoints = [left] while oplex.type == "Operator" or oplex.type == "Key Word": if oplex.lex in ['*', '/', 'div', 'mod', 'and']: self.curlex = self.lexAnalizer.nextLex() right = self.parseFactor() if oplex.lex == "and": if right.lexref.typeref.name == "boolean" and left.lexref.typeref.name == "boolean": newtyperef = right.lexref.typeref else: self.errorshow( f'Нельзя сравнить типы {str(right.lexref.typeref.name)} и {str(left.lexref.typeref.name)}' ) elif oplex.lex in ["/", 'div', 'mod']: if right.lexref.typeref.name == "string" or left.lexref.typeref.name == "string": self.errorshow( f'Оператор "{oplex.lex}" не применим к типу "String"' ) elif oplex.lex == "/": newtyperef = Symbols.SymType("float") else: newtyperef = right.lexref.typeref else: newtyperef = right.lexref.typeref if left.lexref.typeref.name == right.lexref.typeref.name: symexpr = Symbols.SymExpr(oplex, left, right, newtyperef) elif left.lexref.typeref.name in [ 'integer', 'float' ] and right.lexref.typeref.name in ['integer', 'float']: if oplex.lex in [ '/' ] or left.lexref.typeref.name == 'float' or left.lexref.typeref.name == 'float': newtyperef = Symbols.SymType("float") elif oplex.lex in ['div', 'mod']: newtyperef = Symbols.SymType("integer") else: self.errorshow( "Операция {oplex.lex} не применима к переменым такого типа" ) symexpr = Symbols.SymExpr(oplex, left, right, newtyperef) else: self.errorshow( f'Нельзя преобразовать тип {str(right.lexref.typeref.name)} к {str(left.lexref.typeref.name)}' ) leftpoints = [Symbols.BinOpNode(symexpr)] oplex = self.lexAnalizer.getLex() else: return leftpoints[0] return leftpoints[0]