class CDDL

Constants

RULE_OP_TO_CHOICE

Attributes

ast[RW]
tree[RW]

Public Class Methods

from_cddl(s) click to toggle source
# File lib/cddlc.rb, line 17
def self.from_cddl(s)
  ast = @@parser.parse s
  if !ast
    fail self.reason(@@parser, s)
  end
  CDDL.new(ast)
end
new(ast_) click to toggle source
# File lib/cddlc.rb, line 26
def initialize(ast_)
  @ast = ast_
  @tree = ast.ast
  @rules = nil                # only fill in if needed
end
reason(parser, s) click to toggle source
# File lib/cddlc.rb, line 6
def self.reason(parser, s)
  reason = [parser.failure_reason]
  parser.failure_reason =~ /^(Expected .+) after/m
  reason << "#{$1.gsub("\n", '<<<NEWLINE>>>')}:" if $1
  if line = s.lines.to_a[parser.failure_line - 1]
    reason << line
    reason << "#{'~' * (parser.failure_column - 1)}^"
  end
  reason.join("\n")
end

Public Instance Methods

rules() click to toggle source
# File lib/cddlc.rb, line 34
def rules
  if @rules.nil?              # memoize
    @rules = {}
    fail unless @tree.first == "cddl"
    @tree[1..-1].each do |x|
      op, name, val, rest = x
      cho = RULE_OP_TO_CHOICE[op]
      fail rest if rest
      fail name unless Array === name
      case name[0]
      when "name"
        fail unless name.size == 2
        name = name[1]
      when "gen"
        name = name[1..-1]
      else
        fail name
      end
      @rules[name] =
        if old = @rules[name]
          fail "duplicate rule for name #{name}" unless cho
          if Array === old && old[0] == cho
            old.dup << val
          else
            [cho, old, val]
          end
        else
          val
        end
    end
    # warn "** rules #{rules.inspect}"
  end
  @rules
end