blob: 31b74b9d34e9a54f3aa0e30b8e08ff96635cac3f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
# TODO: Validate position is not over rule rhs
require "forwardable"
module Lrama
class States
class Item < Struct.new(:rule, :position, keyword_init: true)
extend Forwardable
def_delegators "rule", :lhs, :rhs
# Optimization for States#setup_state
def hash
[rule_id, position].hash
end
def rule_id
rule.id
end
def empty_rule?
rule.empty_rule?
end
def number_of_rest_symbols
rhs.count - position
end
def next_sym
rhs[position]
end
def next_next_sym
rhs[position + 1]
end
def previous_sym
rhs[position - 1]
end
def end_of_rule?
rhs.count == position
end
def beginning_of_rule?
position == 0
end
def start_item?
rule.initial_rule? && beginning_of_rule?
end
def new_by_next_position
Item.new(rule: rule, position: position + 1)
end
def symbols_before_dot
rhs[0...position]
end
def symbols_after_dot
rhs[position..-1]
end
def to_s
"#{lhs.id.s_value}: #{display_name}"
end
def display_name
r = rhs.map(&:display_name).insert(position, "•").join(" ")
"#{r} (rule #{rule_id})"
end
# Right after position
def display_rest
r = rhs[position..-1].map(&:display_name).join(" ")
". #{r} (rule #{rule_id})"
end
end
end
end
|