Spec-Zone.ru › Ruby 4.0
  1. RubyVM::
  2. AbstractSyntaxTree

module RubyVM::AbstractSyntaxTree

AbstractSyntaxTree предоставляет методы для разбора кода Ruby в абстрактные синтаксические деревья. Узлы дерева являются экземплярами RubyVM::AbstractSyntaxTree::Node.

Этот модуль специфичен для MRI, поскольку предоставляет доступ к деталям реализации абстрактного синтаксического дерева MRI.

Этот модуль является экспериментальным, а его API нестабилен и поэтому может измениться без предварительного уведомления. Например, порядок дочерних узлов не гарантируется, число дочерних узлов может измениться, отсутствует возможность обращаться к дочерним узлам по имени и т. д.

Если вам нужен стабильный API или API, работающий в нескольких реализациях Ruby, рассмотрите возможность использования гемa prism — официального API Ruby для разбора кода Ruby.

Открытые методы класса

RubyVM::AbstractSyntaxTree.node_id_for_backtrace_location(backtrace_location) → integer Показать исходный код
# File ast.rb, line 110
def self.node_id_for_backtrace_location backtrace_location
  Primitive.node_id_for_backtrace_location backtrace_location
end

Возвращает идентификатор узла для указанной позиции в трассировке стека.

begin
  raise
rescue =>  e
  loc = e.backtrace_locations.first
  RubyVM::AbstractSyntaxTree.node_id_for_backtrace_location(loc)
end # => 0
RubyVM::AbstractSyntaxTree.of(proc, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false) → RubyVM::AbstractSyntaxTree::Node Показать исходный код
RubyVM::AbstractSyntaxTree.of(method, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false) → RubyVM::AbstractSyntaxTree::Node
# File ast.rb, line 95
def self.of body, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false
  Primitive.ast_s_of body, keep_script_lines, error_tolerant, keep_tokens
end

Возвращает узлы AST для указанного proc или method.

RubyVM::AbstractSyntaxTree.of(proc {1 + 2})
# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:35-1:42>

def hello
  puts "hello, world"
end

RubyVM::AbstractSyntaxTree.of(method(:hello))
# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-3:3>

Пояснения о значении и использовании именованных аргументов см. в разделе ::parse.

RubyVM::AbstractSyntaxTree.parse(string, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false) → RubyVM::AbstractSyntaxTree::Node Показать исходный код
# File ast.rb, line 57
def self.parse string, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false
  Primitive.ast_s_parse string, keep_script_lines, error_tolerant, keep_tokens
end

Разбирает указанную string в абстрактное синтаксическое дерево и возвращает корневой узел этого дерева.

RubyVM::AbstractSyntaxTree.parse("x = 1 + 2")
# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:9>

Если указан параметр keep_script_lines: true, текст разобранного исходного кода связывается с узлами и становится доступен через Node#script_lines.

Если указан параметр keep_tokens: true, заполняются Node#tokens.

Если указанная string содержит синтаксическую ошибку, возникает исключение SyntaxError. Чтобы изменить это поведение, можно указать error_tolerant: true. В этом случае парсер создаст дерево, в котором выражения с синтаксическими ошибками будут представлены узлами Node с type=:ERROR.

root = RubyVM::AbstractSyntaxTree.parse("x = 1; p(x; y=2")
# <internal:ast>:33:in `parse': syntax error, unexpected ';', expecting ')' (SyntaxError)
# x = 1; p(x; y=2
#           ^

root = RubyVM::AbstractSyntaxTree.parse("x = 1; p(x; y=2", error_tolerant: true)
# (SCOPE@1:0-1:15
#  tbl: [:x, :y]
#  args: nil
#  body: (BLOCK@1:0-1:15 (LASGN@1:0-1:5 :x (LIT@1:4-1:5 1)) (ERROR@1:7-1:11) (LASGN@1:12-1:15 :y (LIT@1:14-1:15 2))))
root.children.last.children
# [(LASGN@1:0-1:5 :x (LIT@1:4-1:5 1)),
#  (ERROR@1:7-1:11),
#  (LASGN@1:12-1:15 :y (LIT@1:14-1:15 2))]

Обратите внимание: разбор продолжается даже после выражения с ошибкой.

RubyVM::AbstractSyntaxTree.parse_file(pathname, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false) → RubyVM::AbstractSyntaxTree::Node Показать исходный код
# File ast.rb, line 74
def self.parse_file pathname, keep_script_lines: RubyVM.keep_script_lines, error_tolerant: false, keep_tokens: false
  Primitive.ast_s_parse_file pathname, keep_script_lines, error_tolerant, keep_tokens
end

Читает файл по пути pathname, а затем разбирает его, как описано в разделе ::parse, и возвращает корневой узел абстрактного синтаксического дерева.

Если содержимое файла по пути pathname не является допустимым синтаксисом Ruby, возникает исключение SyntaxError.

RubyVM::AbstractSyntaxTree.parse_file("my-app/app.rb")
# => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-31:3>

Пояснения о значении и использовании именованных аргументов см. в разделе ::parse.

Ruby Core © 1993–2025 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API