Class: Neg::Parser

Inherits:
Object
  • Object
show all
Defined in:
lib/neg/parser.rb

Defined Under Namespace

Classes: AlternativeParser, CharacterParser, CompositeParser, LookaheadParser, NonTerminalParser, RepetitionParser, SequenceParser, StringParser, SubParser

Class Method Summary collapse

Class Method Details

._(c = nil) ⇒ Object



35
# File 'lib/neg/parser.rb', line 35

def self._(c=nil)  ; CharacterParser.new(c); end

.`(s) ⇒ Object



34
# File 'lib/neg/parser.rb', line 34

def self.`(s)      ; StringParser.new(s); end

.method_missing(m, *args) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/neg/parser.rb', line 48

def self.method_missing(m, *args)

  return super if args.any?
  return super if m.to_s == 'to_ary'

  @root ||= m
  pa = NonTerminalParser.new(m)

  (class << self; self; end).__send__(:define_method, m) { pa }

  pa
end

.parse(s, opts = {}) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/neg/parser.rb', line 74

def self.parse(s, opts={})

  i = Neg::Input(s)

  result = __send__(@root).parse(i, opts)

  result[2] = false if result[2] && ( ! i.eoi?)

  if @translator && opts[:translate] != false
    if result[2]
      @translator.translate(result)
    else
      raise ParseError.new(result)
    end
  elsif result[2] == false || opts[:noreduce]
    result
  else
    reduce(result)
  end
end

.parser(&block) ⇒ Object



37
38
39
40
# File 'lib/neg/parser.rb', line 37

def self.parser(&block)

  self.instance_eval(&block)
end

.reduce(result) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/neg/parser.rb', line 61

def self.reduce(result)

  if result[0] && result[2] && result[3]
    result[4] =
      []
  else
    result[4] =
      result[4].each_with_object([]) { |cr, a| a << reduce(cr) if cr[2] }
  end

  result
end

.to_sObject



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/neg/parser.rb', line 95

def self.to_s

  s = [ "#{name}:" ]

  methods.sort.each do |mname|

    m = method(mname)

    next if m.owner == Class
    next if %w[ _ to_s parser translator ].include?(mname.to_s)
    next unless m.arity == (RUBY_VERSION > '1.9' ? 0 : -1)
    next unless m.owner.ancestors.include?(Class)
    next unless m.receiver.ancestors.include?(Neg::Parser)

    s << "  #{__send__(mname).to_s}"
  end

  s << "  root: #{@root}"

  s.join("\n")
end

.translator(&block) ⇒ Object



42
43
44
45
46
# File 'lib/neg/parser.rb', line 42

def self.translator(&block)

  @translator = Class.new(Neg::Translator)
  @translator.instance_eval(&block)
end