diff --git a/abacus_core.py b/abacus_core.py index 39b3b5c..e8fad77 100644 --- a/abacus_core.py +++ b/abacus_core.py @@ -14,6 +14,14 @@ class AbacusCore: self._funcs['r2'] = lambda x: round(x, 2) self._funcs['r0'] = lambda x: int(x) + self._funcs['summe'] = self.summe + + + def summe(self, l): + s = 0 + for ss in l: + s = s + ss + return s def _calculate(self, input_str): @@ -23,6 +31,8 @@ class AbacusCore: res = 'Division by Zero' except NameError as e: res = 'Variable '+ e.name + ' not exists' + except SyntaxError as e: + res = 'Syntax Error' return False, res def get_vars(self): @@ -32,67 +42,70 @@ class AbacusCore: self._vars[name] = value def parse_input(self, input_str): - comment = None - input_wo_com = None - success = False - input_str = str(input_str).strip() - input_str = input_str.replace(',', '.') - if input_str[0] == '#': - comment = input_str[1:] - com_index = input_str.find('#') - if com_index > -1: - input_wo_com = input_str[:com_index] - comment = input_str[com_index + 1:] - if input_wo_com is None: - input_wo_com = input_str - print('comment', comment) - result = self._split_input(input_wo_com) - print('result:',result) - if result[1] is not None: - success, res = self._calculate(result[1]) - if success: - operators = result[0] - operators.reverse() - for op in operators: - if op[-1] == '=': - self._vars[op[:-1]] = res - elif op[-1] == ':': - res = self._funcs.get(op[:-1])(res) - print('vars:', self._vars) + ''' + versuche input_str zu parsen in comment vars und andere teile + :param input_str: + :return: + ''' + input_str, comment = self._get_input_wo_commentar(input_str) + input_str = ''.join(input_str.split()) # entferne alle leerzeichen + if input_str is not None: + for chunk in self._is_new_variable(input_str): # chunks für variablenzuweisung + self._replace_vars(chunk) else: - print("Error") + return ('comment', comment) - def _split_input(self, input_str): - last_position = 0 - varchunks = list() + def _replace_vars(self, input_str): + ''' + try to find vars and replace them + :param input_str: + :return: + ''' + first_position = None + new_input_str = '' for i, c in enumerate(input_str): - if c in [':', '=']: - chunk = input_str[last_position:i].strip() - chunk = chunk + input_str[i] - varchunks.append(chunk) - last_position = i+1 - rest = input_str[last_position:].strip() - print('rest', rest) - rest = self._find_vars(rest)[1] - return varchunks, rest + if c.isalpha(): + if first_position is None: + first_position = i + # print('alpha'+c) + elif c == '=': + if first_position is not None: # variablenzuweisung + self._vars[input_str[first_position:i]] = None # todo: wie machen? + else: # keine variable angegeben todo: womöglich eine tempvariable? + raise ValueError() + elif c.isnumeric() or c in ['+', '-', '/', '*', '(', ')', '[', ']', ';']: + if first_position is not None: + temp_var = input_str[first_position:i] + print('var', temp_var) + var = self._vars.get(temp_var) + if var is not None: + new_input_str +=str(var) + else: + raise ValueError() + first_position = None + new_input_str += input_str[i] + print(new_input_str) - def _find_vars(self, input_str): - chunks = list() - last_position = 0 - for i, c in enumerate(input_str): - if c in ['+', '-', '/', '*', '(', ')', '[', ']', ';']: - ch = input_str[last_position:i].strip() - if len(ch)>0: - chunks.append(ch) - chunks.append(input_str[i].strip()) - last_position = i+1 + def _get_input_wo_commentar(self, input_str): + ''' + Zerlege input in input und kommentar + :param input_str: + :return: + ''' + input_str = input_str.strip() + comment_index = input_str.find('#') + if comment_index == 0: # die ganze zeile ist ein kommentar + return (None, input_str) + elif comment_index == -1: + return (input_str, None) + else: + comment = input_str[comment_index + 1:] + input_str = input_str[:comment_index] + return (input_str, comment) - if last_position1, ''.join(cp_chunks) + + def _is_new_variable(self, input_str): + chunks = input_str.split('=') + chunks.reverse() + return chunks diff --git a/main.py b/main.py index 0d97bda..8510245 100644 --- a/main.py +++ b/main.py @@ -4,4 +4,4 @@ ab = AbacusCore() if __name__ == '__main__': - ab.parse_input('12') + print(ab.parse_input('alpha+ 25+15+beta+2#irgendwieso')) diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..00b32c8 --- /dev/null +++ b/readme.md @@ -0,0 +1,3 @@ +# AbacusNG + +## Sinn und Zweck