loki.scope

Representation of symbol tables and scopes in Loki’s internal representation (IR)

Classes

Scope([parent])

Scoping object that manages type caching and derivation for typed symbols.

SymbolTable(*args[, case_sensitive])

Lookup table for symbol types that maps symbol names to SymbolAttributes

class SymbolTable(*args, case_sensitive=False, **kwargs)

Bases: dict

Lookup table for symbol types that maps symbol names to SymbolAttributes

It is used to store types for declared variables, defined types or imported symbols within their respective scope. If its associated scope is nested into an enclosing scope, it allows to perform recursive look-ups in parent scopes.

The interface of this table behaves like a dict.

Parameters:
  • parent (SymbolTable, optional) – The symbol table of the parent scope for recursive look-ups.

  • case_sensitive (bool, optional) – Respect the case of symbol names in lookups (default: False).

property parent

The symbol table of the parent scope

Return type:

SymbolTable or None

property case_sensitive

Indicate if the SymbolTable is case-sensitive when looking up names

Return type:

bool

format_lookup_name(name)

Format a variable name for look-up (e.g., convert to lower case if case-insensitive)

Parameters:

name (str) – the name to look up

Returns:

the name used for look-ups

Return type:

str

lookup(name, recursive=True)

Look-up a symbol in the symbol table and return the type or None if not found.

Parameters:
  • name (str) – Name of the type or symbol

  • recursive (bool, optional) – If no entry by that name is found, try to find it in the table of the parent scope

Return type:

SymbolAttributes or None

get(key, default=None)

Get a symbol’s entry without recursive lookup

Parameters:
  • key (str) – Name of the type or symbol

  • default (optional) – Return this value if key is not found in the table

setdefault(key, default=None)

Insert a default value for a key into the table if it does not exist

Parameters:
  • key (str) – Name of the type or symbol

  • default (optional) – The default value to store for the key. Defaults to SymbolAttributes(BasicType.DEFERRED).

update(other)

Update this symbol table with entries from other

clone(**kwargs)

Create a copy of the symbol table with the option to override individual parameters

Parameters:

**kwargs – Any parameters from the constructor of SymbolTable

Returns:

The clone symbol table with copies of all SymbolAttributes

Return type:

SymbolTable

class Scope(parent: dataclasses.InitVar[object] | None = None)

Bases: object

Scoping object that manages type caching and derivation for typed symbols.

The Scope provides a symbol table that uniquely maps a symbol’s name to its SymbolAttributes or, for a derived type definition, directly to its DerivedType.

See SymbolTable for more details on how to look-up symbols.

Parameters:
  • parent (Scope, optional) – The enclosing scope, thus allowing recursive look-ups

  • symbol_attrs (SymbolTable, optional) – Use the given symbol table instead of instantiating a new

symbol_attrs: SymbolTable
parent: dataclasses.InitVar[object] = None
property parents

All parent scopes enclosing the current scope, with the top-level scope at the end of the list

Returns:

The list of parent scopes

Return type:

tuple

rescope_symbols()

Make sure all symbols declared and used inside this node belong to a scope in the scope hierarchy

make_complete(**frontend_args)

Trigger a re-parse of the object if incomplete to produce a full Loki IR

See ProgramUnit.make_complete for more details.

This method relays the call only to the parent.

clone(**kwargs)

Create a copy of the scope object with the option to override individual parameters

Note that this will also create a copy of the symbol table via SymbolTable.clone and force rescoping of variables, unless symbol_attrs and rescope_symbols are explicitly specified.

Parameters:

**kwargs (Any parameter from the constructor)

Returns:

The cloned scope object

Return type:

type(self)

get_symbol_scope(name)

Find the scope in which name is declared

This performs a recursive lookup in the SymbolTable to find the scope in which name is declared. Note, that this may be the scope with a Import of this name and not the original declaration.

Parameters:

name (str) – The name of the symbol to look for

Returns:

The scope object in which the symbol is declared, or None if not found

Return type:

Scope or None