Class: Yadriggy::ASTree

Inherits:
ASTnode show all
Defined in:
lib/yadriggy/ast.rb

Overview

Abstract syntax tree (AST).

Instance Attribute Summary collapse

Attributes inherited from ASTnode

#parent, #usertype

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ASTnode

#add_child, #add_children, #const_value, #const_value_in_class, #get_context_class, #get_receiver_object, #is_proc?, #root, #source_location, #source_location_string, #value, #value_in_class

Constructor Details

#initialize(ast_table, proc, file, sexp) ⇒ ASTree



1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
# File 'lib/yadriggy/ast.rb', line 1781

def initialize(ast_table, proc, file, sexp)
  unless proc.is_a?(Proc) || proc.is_a?(Method) ||
         proc.is_a?(UnboundMethod)
    raise "unknown context #{proc.class.name}"
  end

  @astrees = ast_table   # ASTreeTable
  @context = proc # Proc or Method
  @file_name = file
  @tree = ASTree.to_node(sexp)
  add_child(@tree)
  @astrees[proc] = self
end

Instance Attribute Details

#astreesASTreeTable (readonly)



1769
1770
1771
# File 'lib/yadriggy/ast.rb', line 1769

def astrees
  @astrees
end

#contextMethod|Proc (readonly)



1773
1774
1775
# File 'lib/yadriggy/ast.rb', line 1773

def context
  @context
end

#file_nameString (readonly)



1776
1777
1778
# File 'lib/yadriggy/ast.rb', line 1776

def file_name
  @file_name
end

#treeASTnode (readonly)



1779
1780
1781
# File 'lib/yadriggy/ast.rb', line 1779

def tree
  @tree
end

Class Method Details

.append_tags(clazz) ⇒ Object



1845
1846
1847
# File 'lib/yadriggy/ast.rb', line 1845

def self.append_tags(clazz)
  clazz.tags.each {|t| @tags[t] = clazz }
end

.to_node(sexp) ⇒ Object



1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
# File 'lib/yadriggy/ast.rb', line 1868

def self.to_node(sexp)
  if sexp.nil?
    nil
  elsif sexp[0] == :var_ref || sexp[0] == :var_field ||
        sexp[0] == :const_ref
    to_node(sexp[1])
  else
    klass = @tags[sexp[0]]
    if klass.nil?
      sexp_name = if sexp.is_a?(Array)
                    sexp[0].to_s
                  else
                    ':' + sexp.to_s
                  end
      raise "unknown s-expression " + sexp_name
    else
      node = klass.new(sexp)
      StringLiteral.normalize(node)
    end
  end
end

Instance Method Details

#accept(evaluator) ⇒ void

This method returns an undefined value.

A method for Visitor pattern.



1817
1818
1819
# File 'lib/yadriggy/ast.rb', line 1817

def accept(evaluator)
  evaluator.astree(self)
end

#pretty_print(pp) ⇒ Object



1795
1796
1797
# File 'lib/yadriggy/ast.rb', line 1795

def pretty_print(pp)
  Yadriggy::simpler_pretty_print(pp, self, "@astrees")
end

#reify(proc) ⇒ ASTree|nil

Gets the abstract syntax tree of the given procedure.

See Also:



1804
1805
1806
1807
1808
1809
1810
1811
1812
# File 'lib/yadriggy/ast.rb', line 1804

def reify(proc)
  ast_obj = @astrees[proc]
  unless ast_obj.nil?
    ast_obj
  else
    ast = SourceCode.get_sexp(proc)
    ast && ast[1] && ASTree.new(@astrees, proc, ast[0], ast[1])
  end
end