Class: RedParse::RuleSet

Inherits:
Object
  • Object
show all
Includes:
StackableClasses
Defined in:
lib/redparse/compile.rb

Constant Summary collapse

@@FFS_TABLE =
[nil]

Instance Method Summary collapse

Methods included from StackableClasses

#LEFT, #LEFT_NO_LOOKING, #LOOKAHEAD_CLASSES, #STACKABLE_CLASSES, #TOS_CLASSES, #juice, #sc_juice

Constructor Details

#initialize(rules) ⇒ RuleSet

Returns a new instance of RuleSet.



44
45
46
47
48
49
50
# File 'lib/redparse/compile.rb', line 44

def initialize(rules)
  @rules=rules.reverse
  #rule order must be reversed relative to the usual RedParse rule
  #order... merely so that ffs can work right.
  @maxmask=(1<<@rules.size)-1
  @subclasses_of=child_relations_among(*STACKABLE_CLASSES())
end

Instance Method Details

#[](i) ⇒ Object



149
150
151
# File 'lib/redparse/compile.rb', line 149

def [](i)
  @rules[i]
end

#each_rule(mask = @maxmask) ⇒ Object



77
78
79
80
81
# File 'lib/redparse/compile.rb', line 77

def each_rule(mask=-1)
  @rules.each_with_index{|r,i|
    yield r,i if mask&(1<<i)
  }
end

#mask2rules(mask) ⇒ Object



60
61
62
63
64
65
66
# File 'lib/redparse/compile.rb', line 60

def mask2rules(mask)
  rules=[]
  @rules.each_with_index{|r,i|
    rules<<r if mask&(1<<i)
  }
  return rules
end

#rb_ffs(mask) ⇒ Object



96
97
98
99
100
101
102
103
104
105
# File 'lib/redparse/compile.rb', line 96

def rb_ffs(mask)
  chunks=0
  until mask.zero?
    result=@@FFS_TABLE[mask&0xFF]
    return result+(chunks<<3) if result
    chunks+=1
    mask>>=8
  end
  return 0
end

#rules2mask(rules) ⇒ Object



52
53
54
55
56
57
58
# File 'lib/redparse/compile.rb', line 52

def rules2mask(rules)
  mask=0
  @rules.each_with_index{|r,i| 
     mask |= 1<<i if rules.include? r
  }
  return mask
end