예제 #1
0
 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]
예제 #2
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]