class ANTLR3::AST::Wizard::PatternParser

A class that is used internally by AST::Wizard to construct AST tree objects from a tokenized tree pattern

Constants

CONTINUE_TYPES

Public Class Methods

new( tokenizer, token_scheme, adaptor ) click to toggle source
# File lib/antlr3/tree/wizard.rb, line 193
def initialize( tokenizer, token_scheme, adaptor )
  @tokenizer = tokenizer
  @token_scheme = token_scheme
  @adaptor   = adaptor
  @token_type = tokenizer.next_token
end
parse( pattern, token_scheme, adaptor ) click to toggle source
# File lib/antlr3/tree/wizard.rb, line 186
def self.parse( pattern, token_scheme, adaptor )
  lexer = PatternLexer.new( pattern )
  new( lexer, token_scheme, adaptor ).pattern
end

Public Instance Methods

parse_node() click to toggle source
# File lib/antlr3/tree/wizard.rb, line 234
def parse_node
  label = nil
  if @token_type == :percent
    ( @token_type = @tokenizer.next_token ) == :identifier or return nil
    label = @tokenizer.text
    ( @token_type = @tokenizer.next_token ) == :colon or return nil
    @token_type = @tokenizer.next_token
  end
  
  if @token_type == :dot
    @token_type = @tokenizer.next_token
    wildcard_payload = CommonToken.create( :type => 0, :text => '.' )
    node = WildcardPattern.new( wildcard_payload )
    label and node.label = label
    return node
  end
  
  @token_type == :identifier or return nil
  token_name = @tokenizer.text
  @token_type = @tokenizer.next_token
  token_name == 'nil' and return @adaptor.create_flat_list
  
  text = token_name
  arg = nil
  if @token_type == :argument
    arg = @tokenizer.text
    text = arg
    @token_type = @tokenizer.next_token
  end
  
  node_type = @token_scheme[ token_name ] || INVALID_TOKEN_TYPE
  node = @adaptor.create_from_type( node_type, text )
  
  if Pattern === node
    node.label, node.has_text_arg = label, arg
  end
  return node
end
parse_tree() click to toggle source
# File lib/antlr3/tree/wizard.rb, line 213
def parse_tree
  @token_type != :open and return nil
  @token_type = @tokenizer.next_token
  root = parse_node or return nil
  
  loop do
    case @token_type
    when :open
      subtree = parse_tree
      @adaptor.add_child( root, subtree )
    when :identifier, :percent, :dot
      child = parse_node or return nil
      @adaptor.add_child( root, child )
    else break
    end
  end
  @token_type == :close or return nil
  @token_type = @tokenizer.next_token
  return root
end
pattern() click to toggle source
# File lib/antlr3/tree/wizard.rb, line 200
def pattern
  case @token_type
  when :open then return parse_tree
  when :identifier
    node = parse_node
    @token_type == EOF and return node
    return nil
  end
  return nil
end