def test_symbol_call(self): st = SymbolTable() integer = IntegerType() real = RealType() boolean = BooleanType() character = CharacterType() st.registerSymbol('a', integer) # call in scope self.assertEqual(type(st.getSymbol('a').basetype), IntegerType) # call in nested scope st.openScope() self.assertEqual(type(st.getSymbol('a').basetype), IntegerType) # define in nested scope st.registerSymbol('a', character) # call in nested scope self.assertEqual(type(st.getSymbol('a').basetype), CharacterType) # call original in main scope st.closeScope() self.assertEqual(type(st.getSymbol('a').basetype), IntegerType)
def test_register_symbols_nested(self): st = SymbolTable() integer = IntegerType() real = RealType() boolean = BooleanType() character = CharacterType() st.registerSymbol('a', integer) st.openScope() st.registerSymbol('a', real) st.openScope() st.registerSymbol('a', boolean) st.openScope() st.registerSymbol('a', character) # Check self.assertEqual(type(st.getSymbol('a').basetype), CharacterType) st.closeScope() self.assertEqual(type(st.getSymbol('a').basetype), BooleanType) st.closeScope() self.assertEqual(type(st.getSymbol('a').basetype), RealType) st.closeScope() self.assertEqual(type(st.getSymbol('a').basetype), IntegerType)
def test_symbol_address_in_function_with_arguments(self): st = SymbolTable() integer = IntegerType() arrayinteger = ArrayType(integer, 3) # Create arguments argumentsList = ArgumentsList() argumentsList.add(Argument('a', integer)) argumentsList.add(Argument('b', arrayinteger)) # Create parameters parametersList = ParametersList() parametersList.add(Parameter(ConstantExpression(1, 'int'))) parametersList.add( Parameter( VariableCallExpression(Symbol('b', arrayinteger, 0), None))) st.registerFunction('main', integer, argumentsList, True) function = st.getFunction('main', parametersList) st.openFunctionScope(function) self.assertEqual(st.getSymbol('a').address, 5) self.assertEqual(st.getSymbol('b').address, 6) st.registerSymbol('c', integer) self.assertEqual(st.getSymbol('c').address, 9) st.registerSymbol('d', arrayinteger) self.assertEqual(st.getSymbol('d').address, 10) st.registerSymbol('e', integer) self.assertEqual(st.getSymbol('e').address, 13) st.closeFunctionScope(function) self.assertEqual(function.getStaticSize(), 14) self.assertEqual(function.getParameterSize(), 4)
def test_symbol_address_in_function(self): st = SymbolTable() integer = IntegerType() arrayinteger = ArrayType(integer, 3) # Create arguments argumentsList = ArgumentsList() # Create parameters parametersList = ParametersList() st.registerFunction('main', integer, argumentsList, 0) function = st.getFunction('main', parametersList) st.openFunctionScope(function) st.registerSymbol('a', integer) self.assertEqual(st.getSymbol('a').address, 5) st.registerSymbol('b', arrayinteger) self.assertEqual(st.getSymbol('b').address, 6) st.registerSymbol('c', integer) self.assertEqual(st.getSymbol('c').address, 9) st.closeFunctionScope(function) self.assertEqual(function.getStaticSize(), 10) self.assertEqual(function.getParameterSize(), 0)
def test_not_registered_symbol_call(self): st = SymbolTable() integer = IntegerType() self.assertRaises(SymbolNotRegisteredError, lambda: st.getSymbol('a')) # open scope and register st.openScope() st.registerSymbol('a', integer) st.closeScope() self.assertRaises(SymbolNotRegisteredError, lambda: st.getSymbol('a'))
def test_function_parameter_size_array_full(self): st = SymbolTable() integer = IntegerType() arrayinteger = ArrayType(integer, 3) # Create arguments argumentsList = ArgumentsList() argumentsList.add(Argument('a', integer)) argumentsList.add(Argument('b', arrayinteger)) # Create array st.registerSymbol('b', arrayinteger) # Create parameters parametersList = ParametersList() parametersList.add(Parameter(ConstantExpression(1, 'int'))) parametersList.add( Parameter(VariableCallExpression(st.getSymbol('b'), None))) # Register basic function, no arguments st.registerFunction('add', integer, argumentsList, True) function = st.getFunction('add', parametersList) self.assertEqual(function.getParameterSize(), 4)