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

Returns a new instance of ASTree.



1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
# File 'lib/yadriggy/ast.rb', line 1765

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)

Returns all the reified ASTs.

Returns:

  • (ASTreeTable)

    all the reified ASTs.



1753
1754
1755
# File 'lib/yadriggy/ast.rb', line 1753

def astrees
  @astrees
end

#contextMethod|Proc (readonly)

Returns the Method or Proc object given for the reification.

Returns:

  • (Method|Proc)

    the Method or Proc object given for the reification.



1757
1758
1759
# File 'lib/yadriggy/ast.rb', line 1757

def context
  @context
end

#file_nameString (readonly)

Returns the source file name.

Returns:

  • (String)

    the source file name.



1760
1761
1762
# File 'lib/yadriggy/ast.rb', line 1760

def file_name
  @file_name
end

#treeASTnode (readonly)

Returns the AST.

Returns:



1763
1764
1765
# File 'lib/yadriggy/ast.rb', line 1763

def tree
  @tree
end

Class Method Details

.append_tags(clazz) ⇒ Object



1829
1830
1831
# File 'lib/yadriggy/ast.rb', line 1829

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

.to_node(sexp) ⇒ Object



1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
# File 'lib/yadriggy/ast.rb', line 1852

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.

Parameters:

  • evaluator (Eval)

    the visitor of Visitor pattern.



1801
1802
1803
# File 'lib/yadriggy/ast.rb', line 1801

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

#pretty_print(pp) ⇒ Object



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

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.

Parameters:

  • proc (Proc|Method|UnboundMethod)

    the procedure or method.

Returns:

  • (ASTree|nil)

    the reified AST.

See Also:



1788
1789
1790
1791
1792
1793
1794
1795
1796
# File 'lib/yadriggy/ast.rb', line 1788

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