Class: Neg::Parser
- Inherits:
-
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
.`(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_s ⇒ Object
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
|