Class: RLSL::Prism::ASTVisitor
- Inherits:
-
Object
- Object
- RLSL::Prism::ASTVisitor
- 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
Constants included from ControlFlowVisiting
Constants included from ExpressionVisiting
Instance Method Summary collapse
-
#initialize(context = {}) ⇒ ASTVisitor
constructor
A new instance of ASTVisitor.
- #parse(source) ⇒ Object
- #visit(node) ⇒ Object
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 |