Class: RLSL::Prism::ASTVisitor

Inherits:
Object
  • Object
show all
Includes:
ControlFlowVisiting, DefinitionVisiting, ExpressionVisiting
Defined in:
lib/rlsl/prism/ast_visitor.rb,
lib/rlsl/prism/ast_visitor/scope_context.rb,
lib/rlsl/prism/ast_visitor/visitor_registry.rb,
lib/rlsl/prism/ast_visitor/definition_visiting.rb,
lib/rlsl/prism/ast_visitor/expression_visiting.rb,
lib/rlsl/prism/ast_visitor/control_flow_visiting.rb

Defined Under Namespace

Modules: ControlFlowVisiting, DefinitionVisiting, ExpressionVisiting Classes: ScopeContext, VisitorRegistry

Constant Summary collapse

BINARY_OPERATORS =
%w[+ - * / % == != < > <= >= && ||].freeze
UNARY_OPERATORS =
%w[- !].freeze
TRANSPARENT_NODES =
VisitorRegistry::TRANSPARENT_NODES
NODE_VISITORS =
VisitorRegistry.build(
  {}.tap do |visitors|
    visitors[::Prism::ProgramNode] = :visit_program if defined?(::Prism::ProgramNode)
    visitors[::Prism::StatementsNode] = :visit_statements if defined?(::Prism::StatementsNode)
  end,
  ExpressionVisiting::VISITORS,
  ControlFlowVisiting::VISITORS,
  DefinitionVisiting::VISITORS
)

Constants included from DefinitionVisiting

DefinitionVisiting::VISITORS

Constants included from ControlFlowVisiting

ControlFlowVisiting::VISITORS

Constants included from ExpressionVisiting

ExpressionVisiting::VISITORS

Instance Method Summary collapse

Constructor Details

#initialize(context = {}) ⇒ ASTVisitor

Returns a new instance of ASTVisitor.



34
35
36
37
38
# File 'lib/rlsl/prism/ast_visitor.rb', line 34

def initialize(context = {})
  @context = context
  @uniforms = context[:uniforms] || {}
  @scope_context = ScopeContext.new(params: context[:params] || [])
end

Instance Method Details

#parse(source) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/rlsl/prism/ast_visitor.rb', line 40

def parse(source)
  result = ::Prism.parse(source)

  unless result.success?
    errors = result.errors.map(&:message).join(", ")
    raise "Parse error: #{errors}"
  end

  program = result.value
  visit(program)
end

#visit(node) ⇒ Object



52
53
54
55
56
57
58
59
60
61
# File 'lib/rlsl/prism/ast_visitor.rb', line 52

def visit(node)
  return nil if node.nil?

  method_name = NODE_VISITORS[node.class]
  return send(method_name, node) if method_name

  raise UnsupportedSyntaxError, "Unsupported Prism node: #{node.class}" unless transparent_node?(node)

  visit_default(node)
end