Class: TlaParserS::SymbolTable

Inherits:
Object
  • Object
show all
Includes:
Utils::MyLogger
Defined in:
lib/semantics/symbol_table.rb

Constant Summary collapse

PROGNAME =

Logger

"symbols"

Constants included from Utils::MyLogger

Utils::MyLogger::LOGFILE

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utils::MyLogger

#getLogger, #logfile

Constructor Details

#initialize(options = {}) ⇒ SymbolTable


constructore



18
19
20
21
22
23
24
# File 'lib/semantics/symbol_table.rb', line 18

def initialize( options={} )

  @logger = getLogger( PROGNAME, options )
  @logger.info( "#{__method__} initialized" )
  
  @stack = []
end

Instance Attribute Details

#stackObject (readonly)

Array as symbol table context



7
8
9
# File 'lib/semantics/symbol_table.rb', line 7

def stack
  @stack
end

Instance Method Details

#addContext(tree_node, moduleName = nil) ⇒ Object

symbol_definitions - method returning hash entries (:value,:node_type)

Parameters:

  • tree_node (SyntaxNode)

    node implementing



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/semantics/symbol_table.rb', line 39

def addContext( tree_node, moduleName=nil )

  if tree_node && tree_node.respond_to?(:symbol_definitions)
    tree_node.symbol_definitions.each do |symbol_definition|
      @logger.debug( "#{__method__} symbol_definition=#{symbol_definition}" )
      entry = {
        :context_type => tree_node.node_type,            
        :context => tree_node.name,
        :symbol_type => symbol_definition[:node_type],
        :symbol_name => symbol_definition[:value],
      }
      # optionally add moduleName
      entry[:module] = moduleName if moduleName

      # syntax tree defined only on procedure & macros
      entry[:tree] = symbol_definition[:tree] if symbol_definition[:tree]

      addEntry( entry )
    end
  end
end

#addEntry(entry) ⇒ Object

Add a hash (with :symbol_type, :context_type, :context, :symbol_name) to ‘currentContext’

Parameters:

  • entry (Hash)

    add hash to ‘currentContext’



30
31
32
33
34
# File 'lib/semantics/symbol_table.rb', line 30

def addEntry( entry )
  # get refeence to current contex
  context = currentContext
  context[entry[:symbol_name]] = entry      
end

#contextLevelsObject



133
134
135
# File 'lib/semantics/symbol_table.rb', line 133

def contextLevels
  0
end

#currentContextObject



122
123
124
# File 'lib/semantics/symbol_table.rb', line 122

def currentContext
  return stack.last
end

#dumpContextObject



126
127
128
129
130
131
# File 'lib/semantics/symbol_table.rb', line 126

def dumpContext
  stack.reverse_each.with_index do |context, i|
    @logger.debug "Context #{i}"
    @logger.debug context.to_yaml
  end
end

#entries(level = 1) ⇒ String:Array

Returns of entry names.

Parameters:

  • level (int) (defaults to: 1)

    number of levels to recurse (default 1)

Returns:

  • (String:Array)

    of entry names



85
86
87
88
89
90
91
92
93
94
# File 'lib/semantics/symbol_table.rb', line 85

def entries( level=1)
  entries = []
  stack.reverse_each do |context|
    # add key to entries unless it is already there
    context.keys().each {  |k| entries << k unless entries.include?( k ) }
    level -= 1
    break if level <= 0
  end
  entries
end

#popContextObject



73
74
75
76
77
78
79
80
# File 'lib/semantics/symbol_table.rb', line 73

def popContext
  if stack.length == 0 then
    msg = "Stack underflow"
    @logger.error( "#{__method__} #{msg}" )        
    raise SymbolTableException.new msg
  end
  @stack.pop
end

#pushContext(tree_node, moduleName = nil) ⇒ Object

Create new context: add one more level to symbol table, add entries from ‘tree_node.symbol_definitions’

Parameters:

  • tree_node (SyntaxNode)

    define initial context content



65
66
67
68
69
70
71
# File 'lib/semantics/symbol_table.rb', line 65

def pushContext( tree_node, moduleName=nil )
  
  context = {}
  @stack.push( context )
  
  addContext( tree_node, moduleName )
end

#resolveContext(identifier) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/semantics/symbol_table.rb', line 96

def resolveContext( identifier )
  stack.reverse_each do |context|
    # @logger.debug "context=#{context}, identifier=#{identifier}"
    return context[identifier] if context.has_key?( identifier ) 
  end
  return nil
end

#resolveModule(moduleName) ⇒ Object



110
111
112
113
114
115
116
117
118
119
120
# File 'lib/semantics/symbol_table.rb', line 110

def resolveModule( moduleName )
  entries = []
  stack.reverse_each do |context|
    context.each do |symbol,entry|
      @logger.debug( "#{__method__} symbol=#{symbol}, entry=#{entry[:module]}" )      
      entries << entry if entry[:module] == moduleName
    end
  end
  @logger.debug( "#{__method__} entries-->#{entries.join(',')}" )
  return entries
end