tediparse 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +319 -0
  3. data/LICENSE +26 -0
  4. data/README.md +308 -0
  5. data/Rakefile +33 -0
  6. data/bin/tediparse +102 -0
  7. data/doc/Defining.md +97 -0
  8. data/doc/Generating-Grammars.md +241 -0
  9. data/doc/Generating.md +332 -0
  10. data/doc/Navigating.md +670 -0
  11. data/doc/Parsing.md +133 -0
  12. data/doc/README.md +51 -0
  13. data/doc/Serializing.md +100 -0
  14. data/doc/Tokenizing.md +136 -0
  15. data/doc/Validating.md +140 -0
  16. data/lib/ruby/array.rb +226 -0
  17. data/lib/ruby/blank.rb +52 -0
  18. data/lib/ruby/exception.rb +14 -0
  19. data/lib/ruby/hash.rb +14 -0
  20. data/lib/ruby/module.rb +60 -0
  21. data/lib/ruby/object.rb +56 -0
  22. data/lib/ruby/string.rb +89 -0
  23. data/lib/ruby/to_d.rb +82 -0
  24. data/lib/ruby/to_date.rb +26 -0
  25. data/lib/ruby/to_time.rb +21 -0
  26. data/lib/ruby/try.rb +46 -0
  27. data/lib/stupidedi/builder.rb +6 -0
  28. data/lib/stupidedi/color.rb +94 -0
  29. data/lib/stupidedi/config/code_list_config.rb +45 -0
  30. data/lib/stupidedi/config/functional_group_config.rb +72 -0
  31. data/lib/stupidedi/config/interchange_config.rb +86 -0
  32. data/lib/stupidedi/config/transaction_set_config.rb +73 -0
  33. data/lib/stupidedi/config.rb +100 -0
  34. data/lib/stupidedi/either.rb +286 -0
  35. data/lib/stupidedi/exceptions/invalid_element_error.rb +7 -0
  36. data/lib/stupidedi/exceptions/invalid_schema_error.rb +7 -0
  37. data/lib/stupidedi/exceptions/missing_grammar_error.rb +50 -0
  38. data/lib/stupidedi/exceptions/output_error.rb +7 -0
  39. data/lib/stupidedi/exceptions/parse_error.rb +7 -0
  40. data/lib/stupidedi/exceptions/stupidedi_error.rb +7 -0
  41. data/lib/stupidedi/exceptions/tokenize_error.rb +7 -0
  42. data/lib/stupidedi/exceptions/zipper_error.rb +7 -0
  43. data/lib/stupidedi/exceptions.rb +13 -0
  44. data/lib/stupidedi/inspect.rb +26 -0
  45. data/lib/stupidedi/interchanges/element_types/separator_val.rb +79 -0
  46. data/lib/stupidedi/interchanges/element_types/special_val.rb +48 -0
  47. data/lib/stupidedi/interchanges/element_types.rb +11 -0
  48. data/lib/stupidedi/interchanges.rb +21 -0
  49. data/lib/stupidedi/parser/builder_dsl.rb +292 -0
  50. data/lib/stupidedi/parser/constraint_table.rb +566 -0
  51. data/lib/stupidedi/parser/generation.rb +147 -0
  52. data/lib/stupidedi/parser/identifier_stack.rb +248 -0
  53. data/lib/stupidedi/parser/instruction.rb +112 -0
  54. data/lib/stupidedi/parser/instruction_table.rb +222 -0
  55. data/lib/stupidedi/parser/navigation.rb +786 -0
  56. data/lib/stupidedi/parser/state_machine.rb +62 -0
  57. data/lib/stupidedi/parser/states/abstract_state.rb +385 -0
  58. data/lib/stupidedi/parser/states/failure_state.rb +69 -0
  59. data/lib/stupidedi/parser/states/functional_group_state.rb +101 -0
  60. data/lib/stupidedi/parser/states/initial_state.rb +62 -0
  61. data/lib/stupidedi/parser/states/interchange_state.rb +96 -0
  62. data/lib/stupidedi/parser/states/loop_state.rb +74 -0
  63. data/lib/stupidedi/parser/states/table_state.rb +90 -0
  64. data/lib/stupidedi/parser/states/transaction_set_state.rb +120 -0
  65. data/lib/stupidedi/parser/states/transmission_state.rb +59 -0
  66. data/lib/stupidedi/parser/tokenization.rb +195 -0
  67. data/lib/stupidedi/parser.rb +32 -0
  68. data/lib/stupidedi/reader/input/abstract_input.rb +137 -0
  69. data/lib/stupidedi/reader/input/delegated_input.rb +112 -0
  70. data/lib/stupidedi/reader/input/file_input.rb +157 -0
  71. data/lib/stupidedi/reader/input.rb +31 -0
  72. data/lib/stupidedi/reader/position.rb +78 -0
  73. data/lib/stupidedi/reader/result.rb +172 -0
  74. data/lib/stupidedi/reader/segment_dict.rb +176 -0
  75. data/lib/stupidedi/reader/separators.rb +90 -0
  76. data/lib/stupidedi/reader/stream_reader.rb +173 -0
  77. data/lib/stupidedi/reader/token_reader.rb +465 -0
  78. data/lib/stupidedi/reader/tokens/component_element_tok.rb +71 -0
  79. data/lib/stupidedi/reader/tokens/composite_element_tok.rb +85 -0
  80. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +74 -0
  81. data/lib/stupidedi/reader/tokens/segment_tok.rb +74 -0
  82. data/lib/stupidedi/reader/tokens/simple_element_tok.rb +76 -0
  83. data/lib/stupidedi/reader.rb +121 -0
  84. data/lib/stupidedi/schema/abstract_def.rb +76 -0
  85. data/lib/stupidedi/schema/abstract_element_def.rb +35 -0
  86. data/lib/stupidedi/schema/abstract_element_use.rb +47 -0
  87. data/lib/stupidedi/schema/abstract_use.rb +79 -0
  88. data/lib/stupidedi/schema/code_list.rb +99 -0
  89. data/lib/stupidedi/schema/component_element_use.rb +76 -0
  90. data/lib/stupidedi/schema/composite_element_def.rb +103 -0
  91. data/lib/stupidedi/schema/composite_element_use.rb +78 -0
  92. data/lib/stupidedi/schema/element_req.rb +57 -0
  93. data/lib/stupidedi/schema/functional_group_def.rb +124 -0
  94. data/lib/stupidedi/schema/generation/definition_generator.rb +139 -0
  95. data/lib/stupidedi/schema/generation/element_generator.rb +221 -0
  96. data/lib/stupidedi/schema/generation/flat_file_reader.rb +551 -0
  97. data/lib/stupidedi/schema/generation/functional_group_generator.rb +64 -0
  98. data/lib/stupidedi/schema/generation/interchange_generator.rb +145 -0
  99. data/lib/stupidedi/schema/generation/master_loader_generator.rb +121 -0
  100. data/lib/stupidedi/schema/generation/models.rb +85 -0
  101. data/lib/stupidedi/schema/generation/module_loader_generator.rb +64 -0
  102. data/lib/stupidedi/schema/generation/registration_generator.rb +230 -0
  103. data/lib/stupidedi/schema/generation/runner.rb +161 -0
  104. data/lib/stupidedi/schema/generation/segment_generator.rb +130 -0
  105. data/lib/stupidedi/schema/generation/support.rb +78 -0
  106. data/lib/stupidedi/schema/generation/support_modules_generator.rb +126 -0
  107. data/lib/stupidedi/schema/generation/version_modules.rb +35 -0
  108. data/lib/stupidedi/schema/generation.rb +94 -0
  109. data/lib/stupidedi/schema/interchange_def.rb +103 -0
  110. data/lib/stupidedi/schema/loop_def.rb +156 -0
  111. data/lib/stupidedi/schema/repeat_count.rb +86 -0
  112. data/lib/stupidedi/schema/segment_def.rb +122 -0
  113. data/lib/stupidedi/schema/segment_req.rb +46 -0
  114. data/lib/stupidedi/schema/segment_use.rb +99 -0
  115. data/lib/stupidedi/schema/simple_element_def.rb +51 -0
  116. data/lib/stupidedi/schema/simple_element_use.rb +83 -0
  117. data/lib/stupidedi/schema/syntax_note.rb +52 -0
  118. data/lib/stupidedi/schema/table_def.rb +178 -0
  119. data/lib/stupidedi/schema/transaction_set_def.rb +125 -0
  120. data/lib/stupidedi/schema.rb +30 -0
  121. data/lib/stupidedi/sets.rb +42 -0
  122. data/lib/stupidedi/transaction_sets/builder/dsl.rb +192 -0
  123. data/lib/stupidedi/transaction_sets/builder.rb +188 -0
  124. data/lib/stupidedi/transaction_sets/common/implementations/element_reqs.rb +37 -0
  125. data/lib/stupidedi/transaction_sets/common/implementations/segment_reqs.rb +31 -0
  126. data/lib/stupidedi/transaction_sets/common/implementations.rb +11 -0
  127. data/lib/stupidedi/transaction_sets/common.rb +8 -0
  128. data/lib/stupidedi/transaction_sets/validation/ambiguity.rb +395 -0
  129. data/lib/stupidedi/transaction_sets/validation/implementation.rb +12 -0
  130. data/lib/stupidedi/transaction_sets/validation.rb +9 -0
  131. data/lib/stupidedi/transaction_sets.rb +25 -0
  132. data/lib/stupidedi/values/abstract_element_val.rb +19 -0
  133. data/lib/stupidedi/values/abstract_val.rb +133 -0
  134. data/lib/stupidedi/values/composite_element_val.rb +102 -0
  135. data/lib/stupidedi/values/functional_group_val.rb +105 -0
  136. data/lib/stupidedi/values/interchange_val.rb +102 -0
  137. data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
  138. data/lib/stupidedi/values/invalid_segment_val.rb +89 -0
  139. data/lib/stupidedi/values/loop_val.rb +73 -0
  140. data/lib/stupidedi/values/repeated_element_val.rb +113 -0
  141. data/lib/stupidedi/values/segment_val.rb +105 -0
  142. data/lib/stupidedi/values/segment_val_group.rb +20 -0
  143. data/lib/stupidedi/values/simple_element_val.rb +80 -0
  144. data/lib/stupidedi/values/table_val.rb +69 -0
  145. data/lib/stupidedi/values/transaction_set_val.rb +69 -0
  146. data/lib/stupidedi/values/transmission_val.rb +56 -0
  147. data/lib/stupidedi/values.rb +22 -0
  148. data/lib/stupidedi/version.rb +4 -0
  149. data/lib/stupidedi/versions/common/element_reqs.rb +13 -0
  150. data/lib/stupidedi/versions/common/element_types/an.rb +386 -0
  151. data/lib/stupidedi/versions/common/element_types/dt.rb +572 -0
  152. data/lib/stupidedi/versions/common/element_types/id.rb +304 -0
  153. data/lib/stupidedi/versions/common/element_types/nn.rb +312 -0
  154. data/lib/stupidedi/versions/common/element_types/operators.rb +128 -0
  155. data/lib/stupidedi/versions/common/element_types/r.rb +342 -0
  156. data/lib/stupidedi/versions/common/element_types/simple_element.rb +73 -0
  157. data/lib/stupidedi/versions/common/element_types/tm.rb +347 -0
  158. data/lib/stupidedi/versions/common/element_types.rb +29 -0
  159. data/lib/stupidedi/versions/common/segment_reqs.rb +15 -0
  160. data/lib/stupidedi/versions/common/syntax_notes.rb +172 -0
  161. data/lib/stupidedi/versions/common.rb +11 -0
  162. data/lib/stupidedi/versions.rb +25 -0
  163. data/lib/stupidedi/writer/claredi.rb +178 -0
  164. data/lib/stupidedi/writer/default.rb +119 -0
  165. data/lib/stupidedi/writer.rb +7 -0
  166. data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
  167. data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
  168. data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
  169. data/lib/stupidedi/zipper/memoized_cursor.rb +133 -0
  170. data/lib/stupidedi/zipper/path.rb +132 -0
  171. data/lib/stupidedi/zipper/root_cursor.rb +120 -0
  172. data/lib/stupidedi/zipper/stack_cursor.rb +107 -0
  173. data/lib/stupidedi/zipper.rb +45 -0
  174. data/lib/stupidedi.rb +69 -0
  175. data/lib/tediparse.rb +1 -0
  176. metadata +249 -0
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Parser
6
+ class InstructionTable
7
+ include Inspect
8
+
9
+ class NonEmpty < InstructionTable
10
+ # @return [Array<Instruction>]
11
+ attr_reader :instructions
12
+
13
+ def_delegators :@instructions, :length, :empty?
14
+
15
+ def initialize(instructions, pop)
16
+ @instructions, @pop = instructions.freeze, pop
17
+
18
+ @__push = Hash.new
19
+ @__drop = Hash.new
20
+ end
21
+
22
+ def hash
23
+ [NonEmpty, state].hash
24
+ end
25
+
26
+ # @return [InstructionTable]
27
+ def copy(changes = {})
28
+ NonEmpty.new \
29
+ changes.fetch(:instructions, @instructions),
30
+ changes.fetch(:pop, @pop)
31
+ end
32
+
33
+ # @return [Instruction]
34
+ def at(segment_use)
35
+ @instructions.find{|op| op.segment_use.eql?(segment_use) }
36
+ end
37
+
38
+ # @return [InstructionTable]
39
+ def push(instructions)
40
+ @__push[instructions] ||= begin
41
+ bottom = @instructions.map do |op|
42
+ op.copy(:pop_count => op.pop_count + 1)
43
+ end
44
+
45
+ NonEmpty.new(instructions + bottom, self)
46
+ end
47
+ end
48
+
49
+ # @return [Array<Instruction>]
50
+ def matches(segment_tok, strict = false, mode = :insert, state = nil)
51
+ if constraints.defined_at?(segment_tok.id)
52
+ constraints.at(segment_tok.id).matches(segment_tok, strict, mode, state)
53
+ else
54
+ []
55
+ end
56
+ end
57
+
58
+ def constraints
59
+ @__constraints ||= begin
60
+ constraints = Hash.new
61
+
62
+ # Group instructions by segment identifier
63
+ grouped = Hash.new{|h,k| h[k] = [] }
64
+ @instructions.each{|op| grouped[op.segment_id] << op }
65
+
66
+ # For each group of instructions that have the same segment
67
+ # id, build a constraint table that can distinguish them
68
+ grouped.each do |segment_id, instructions|
69
+ constraints[segment_id] = ConstraintTable.build(instructions)
70
+ end
71
+
72
+ constraints
73
+ end
74
+ end
75
+
76
+ # @return [InstructionTable]
77
+ def pop(count)
78
+ if count.zero?
79
+ self
80
+ else
81
+ @pop.pop(count - 1)
82
+ end
83
+ end
84
+
85
+ # @return [InstructionTable]
86
+ def drop(count)
87
+ if count.zero?
88
+ self
89
+ else
90
+ @__drop[count] ||= begin
91
+ # Calculate the fewest number of instructions we can drop. We
92
+ # drop this many to construct the next InstructionTable, from
93
+ # which we drop the remaining number of instructions.
94
+ smallest = @instructions.length
95
+ top = @instructions.take(@instructions.length - @pop.length)
96
+ top.each do |i|
97
+ unless i.drop_count.zero? or smallest < i.drop_count
98
+ smallest = i.drop_count
99
+ end
100
+ end
101
+
102
+ if smallest == count
103
+ # There are no intermediate steps to take, because we can't drop
104
+ # any fewer than the given number of instructions.
105
+ remaining = @instructions.drop(count)
106
+
107
+ # Adjust the drop_count for each remaining instruction except
108
+ # those that belong to the parent InstructionTable @pop
109
+ top, pop = remaining.split_at(remaining.length - @pop.length)
110
+
111
+ top.map!{|op| op.copy(:drop_count => op.drop_count - count) }
112
+ top.concat(pop)
113
+
114
+ NonEmpty.new(top, @pop)
115
+ else
116
+ drop(smallest).drop(count - smallest)
117
+ end
118
+ end
119
+ end
120
+ end
121
+
122
+ # @return [void]
123
+ # :nocov:
124
+ def pretty_print(q)
125
+ q.text("InstructionTable")
126
+ q.group(2, "(", ")") do
127
+ q.breakable ""
128
+
129
+ index = 0
130
+ @instructions.each do |e|
131
+ index += 1
132
+ unless q.current_group.first?
133
+ q.text ","
134
+ q.breakable
135
+ end
136
+
137
+ q.text "#{"% 2s" % index}: "
138
+ q.pp e
139
+ end
140
+ end
141
+ end
142
+ # :nocov:
143
+
144
+ private
145
+
146
+ def state
147
+ [@instructions, @pop]
148
+ end
149
+ end
150
+
151
+ Empty = Class.new(InstructionTable) do
152
+ # @return [Empty]
153
+ def copy(changes = {})
154
+ self
155
+ end
156
+
157
+ # @return [Integer]
158
+ def length
159
+ 0
160
+ end
161
+
162
+ def empty?
163
+ true
164
+ end
165
+
166
+ # @return nil
167
+ def at(segment_use)
168
+ nil
169
+ end
170
+
171
+ # @return [NonEmpty]
172
+ def push(instructions)
173
+ InstructionTable::NonEmpty.new(instructions, self)
174
+ end
175
+
176
+ def matches(segment_tok, strict = false, mode = :insert, state = nil)
177
+ raise Exceptions::ParseError,
178
+ "empty stack"
179
+ end
180
+
181
+ # @return [Empty]
182
+ def pop(count)
183
+ if count.zero?
184
+ self
185
+ else
186
+ "empty stack"
187
+ end
188
+ end
189
+
190
+ # @return [Empty]
191
+ def drop(count)
192
+ self
193
+ end
194
+
195
+ # @return [void]
196
+ # :nocov:
197
+ def pretty_print(q)
198
+ q.text "InstructionTable.empty"
199
+ end
200
+ # :nocov:
201
+ end.new
202
+ end
203
+
204
+ class << InstructionTable
205
+ # @group Constructors
206
+ #########################################################################
207
+
208
+ # @return [InstructionTable::Empty]
209
+ def empty
210
+ InstructionTable::Empty
211
+ end
212
+
213
+ # @return [InstructionTable::NonEmpty]
214
+ def build(instructions)
215
+ empty.push(instructions)
216
+ end
217
+
218
+ # @endgroup
219
+ #########################################################################
220
+ end
221
+ end
222
+ end