Class: Junoser::Parser

Inherits:
Parslet::Parser
  • Object
show all
Defined in:
lib/junoser/parser.rb

Instance Method Summary collapse

Instance Method Details

#a(object, arg, *children) ⇒ Object

with an argument, and children maybe



44
45
46
# File 'lib/junoser/parser.rb', line 44

def a(object, arg, *children)
  b(object.as(:statement) >> space >> arg.as(:argument), *children)
end

#b(object, *children) ⇒ Object

block with children maybe



39
40
41
# File 'lib/junoser/parser.rb', line 39

def b(object, *children)
  children.inject(object) {|rule, child| rule.as(:label) >> (space >> child.as(:child) | eos) }
end

#c(*objects) ⇒ Object

choice



49
50
51
# File 'lib/junoser/parser.rb', line 49

def c(*objects)
  objects.inject {|rule, object| rule | object }
end

#ca(*objects) ⇒ Object



53
54
55
# File 'lib/junoser/parser.rb', line 53

def ca(*objects)
  objects.inject {|rule, object| rule | object } | arg
end

#enum(object) ⇒ Object



72
73
74
# File 'lib/junoser/parser.rb', line 72

def enum(object)
  (object.as(:enum))
end

#parse_line(line, lines_without_deactivate) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/junoser/parser.rb', line 14

def parse_line(line, lines_without_deactivate)
  if line =~ /^deactivate/
    if lines_without_deactivate.grep(/^#{line.sub(/^deactivate/, 'set')}/).empty?
      $stderr.puts %(Corresponding "set" statement is not found:  #{line})
      return false
    else
      return true
    end
  end

  begin
    # .xsd doesn't include "apply-groups"
    if line =~ /(.*)\s+apply-groups(-except)?\s+(\S+|\[.*\])$/
      return $1 == 'set' ? true : parse($1)
    end

    parse line
    true
  rescue Parslet::ParseFailed
    $stderr.puts "Invalid syntax:  #{line}"
    false
  end
end

#parse_lines(config) ⇒ Object



5
6
7
8
9
10
11
12
# File 'lib/junoser/parser.rb', line 5

def parse_lines(config)
  lines = config.split("\n").map(&:strip)
  lines_without_deactivate = lines.reject {|l| l =~ /^deactivate/ }

  lines.inject(true) do |passed, line|
    passed & parse_line(line, lines_without_deactivate)
  end
end

#s(*objects) ⇒ Object

sequence



58
59
60
61
# File 'lib/junoser/parser.rb', line 58

def s(*objects)
  # TODO:  eval "minOccurs" attribute of choice element
  objects.inject {|rule, object| rule >> (space >> object).maybe }
end

#sc(*objects) ⇒ Object

sequential choice



64
65
66
# File 'lib/junoser/parser.rb', line 64

def sc(*objects)
  (c(*objects) >> space.maybe).repeat(0)
end

#sca(*objects) ⇒ Object



68
69
70
# File 'lib/junoser/parser.rb', line 68

def sca(*objects)
  (c(*objects, arg) >> space.maybe).repeat(0)
end