X12 0.0.5 → 0.1.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 (60) hide show
  1. data/CHANGELOG +6 -1
  2. data/Rakefile +14 -3
  3. data/example/parse.rb +1 -0
  4. data/lib/X12.rb +2 -2
  5. data/lib/X12/Base.rb +5 -1
  6. data/lib/X12/Field.rb +18 -14
  7. data/lib/X12/Loop.rb +10 -6
  8. data/lib/X12/Parser.rb +31 -5
  9. data/lib/X12/Segment.rb +15 -2
  10. data/misc/997.d12 +8 -775
  11. data/misc/IEA.d12 +10 -0
  12. data/misc/ISA.d12 +24 -0
  13. data/misc/SE.d12 +12 -0
  14. data/misc/ST.d12 +7 -0
  15. data/misc/Tbl143.d12 +302 -0
  16. data/misc/Tbl479.d12 +238 -0
  17. data/misc/Tbl715.d12 +11 -0
  18. data/misc/Tbl716.d12 +27 -0
  19. data/misc/Tbl717.d12 +10 -0
  20. data/misc/Tbl718.d12 +29 -0
  21. data/misc/Tbl720.d12 +12 -0
  22. data/misc/Tbl723.d12 +14 -0
  23. data/misc/TblI01.d12 +11 -0
  24. data/misc/TblI03.d12 +6 -0
  25. data/misc/TblI05.d12 +42 -0
  26. data/misc/TblI10.d12 +5 -0
  27. data/misc/TblI11.d12 +18 -0
  28. data/misc/TblI13.d12 +6 -0
  29. data/misc/TblI14.d12 +7 -0
  30. data/test/tc_factory_997.rb +6 -6
  31. data/test/tc_parse_997.rb +4 -4
  32. metadata +23 -37
  33. data/doc/classes/X12.html +0 -174
  34. data/doc/classes/X12/Base.html +0 -677
  35. data/doc/classes/X12/Composite.html +0 -156
  36. data/doc/classes/X12/Empty.html +0 -186
  37. data/doc/classes/X12/Field.html +0 -339
  38. data/doc/classes/X12/Loop.html +0 -202
  39. data/doc/classes/X12/Parser.html +0 -306
  40. data/doc/classes/X12/Segment.html +0 -277
  41. data/doc/classes/X12/Table.html +0 -198
  42. data/doc/created.rid +0 -1
  43. data/doc/files/CHANGELOG.html +0 -108
  44. data/doc/files/README.html +0 -474
  45. data/doc/files/TODO.html +0 -95
  46. data/doc/files/lib/X12/Base_rb.html +0 -83
  47. data/doc/files/lib/X12/Composite_rb.html +0 -83
  48. data/doc/files/lib/X12/Empty_rb.html +0 -83
  49. data/doc/files/lib/X12/Field_rb.html +0 -83
  50. data/doc/files/lib/X12/Loop_rb.html +0 -83
  51. data/doc/files/lib/X12/Parser_rb.html +0 -83
  52. data/doc/files/lib/X12/Segment_rb.html +0 -83
  53. data/doc/files/lib/X12/Table_rb.html +0 -83
  54. data/doc/files/lib/X12_rb.html +0 -100
  55. data/doc/fr_class_index.html +0 -35
  56. data/doc/fr_file_index.html +0 -38
  57. data/doc/fr_method_index.html +0 -62
  58. data/doc/index.html +0 -27
  59. data/doc/rdoc-style.css +0 -208
  60. data/test/ts_x12.rb +0 -27
@@ -1 +0,0 @@
1
- Thu, 13 Nov 2008 13:53:19 -0600
@@ -1,108 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: CHANGELOG</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <!-- banner header -->
50
-
51
- <div id="bodyContent">
52
-
53
-
54
-
55
- <div id="contextContent">
56
-
57
- <div id="description">
58
- <h1>CHANGELOG</h1>
59
- <p>
60
- $Id: CHANGELOG 35 2008-11-13 18:33:44Z ikk $
61
- </p>
62
- <h2>11/15/08 - Release 0.0.5, first public one</h2>
63
- <ul>
64
- <li>Added comments.
65
-
66
- </li>
67
- <li>Added examples.
68
-
69
- </li>
70
- <li>Wrote README
71
-
72
- </li>
73
- </ul>
74
- <h2>4/10/08 - Release 0.0.1</h2>
75
- <ul>
76
- <li>Internal release for testing
77
-
78
- </li>
79
- </ul>
80
-
81
- </div>
82
-
83
-
84
- </div>
85
-
86
-
87
- </div>
88
-
89
-
90
- <!-- if includes -->
91
-
92
- <div id="section">
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
- <!-- if method_list -->
102
-
103
-
104
- </div>
105
-
106
-
107
- </body>
108
- </html>
@@ -1,474 +0,0 @@
1
- <?xml version="1.0" encoding="iso-8859-1"?>
2
- <!DOCTYPE html
3
- PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
-
6
- <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
- <head>
8
- <title>File: README</title>
9
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
- <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
- <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
- <script type="text/javascript">
13
- // <![CDATA[
14
-
15
- function popupCode( url ) {
16
- window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
- }
18
-
19
- function toggleCode( id ) {
20
- if ( document.getElementById )
21
- elem = document.getElementById( id );
22
- else if ( document.all )
23
- elem = eval( "document.all." + id );
24
- else
25
- return false;
26
-
27
- elemStyle = elem.style;
28
-
29
- if ( elemStyle.display != "block" ) {
30
- elemStyle.display = "block"
31
- } else {
32
- elemStyle.display = "none"
33
- }
34
-
35
- return true;
36
- }
37
-
38
- // Make codeblocks hidden by default
39
- document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
-
41
- // ]]>
42
- </script>
43
-
44
- </head>
45
- <body>
46
-
47
-
48
-
49
- <!-- banner header -->
50
-
51
- <div id="bodyContent">
52
-
53
-
54
-
55
- <div id="contextContent">
56
-
57
- <div id="description">
58
- <h1>X12Parser - a library to manipulate <a href="../classes/X12.html">X12</a> structures using native Ruby syntax</h1>
59
- <p>
60
- $Id: README 40 2008-11-13 19:51:31Z ikk $
61
- </p>
62
- <p>
63
- <b>WARNING</b> <tt>The project is in development. Contributors are
64
- welcome.</tt>
65
- </p>
66
- <p>
67
- Project home is at <a
68
- href="http://rubyforge.org/projects/x12parser">rubyforge.org/projects/x12parser</a>/.
69
- Please note, this is a different project from <a
70
- href="http://rubyforge.org/projects/x12-parser/">Chris Parker's port</a> of
71
- <a
72
- href="http://search.cpan.org/~prasad/X12-0.09/lib/X12/Parser.pm">X12::Parser
73
- Perl module</a>.
74
- </p>
75
- <h2>The goal</h2>
76
- <p>
77
- The idea is to access <a href="../classes/X12.html">X12</a> messages
78
- directly from Ruby, i.e., using a syntax like
79
- </p>
80
- <pre>
81
- message.L1000.L1010[1].AK4.DataElementReferenceNumber
82
- </pre>
83
- <p>
84
- This syntax can be used to get and set any field of an <a
85
- href="../classes/X12.html">X12</a> message and it makes <a
86
- href="../classes/X12.html">X12</a> parsing much more straightforward and
87
- self-documenting.
88
- </p>
89
- <h2>The problem</h2>
90
- <p>
91
- <a href="../classes/X12.html">X12</a> is a set of &quot;standards&quot;
92
- possessing all the elegance of an elephant designed by committee, and quite
93
- literally so, see <a href="http://www.x12.org">www.x12.org</a>. <a
94
- href="../classes/X12.html">X12</a> defines rough syntax for specifying text
95
- messages, but each of more than 300 specifications defines its own message
96
- structure. While messages themselves are easy to parse with a simple
97
- tokenizer, their semantics is heavily dependent on the domain. For example,
98
- this is <a href="../classes/X12.html">X12</a>/997 message conveying
99
- &quot;Functional Acknowledgment&quot;:
100
- </p>
101
- <pre>
102
- ST*997*2878~AK1*HS*293328532~AK2*270*307272179~AK3*NM1*8*L1010_0*8~
103
- AK4*0:0*66*1~AK4*0:1*66*1~AK4*0:2*66*1~AK3*NM1*8*L1010_1*8~AK4*1:0*
104
- 66*1~AK4*1:1*66*1~AK3*NM1*8*L1010_2*8~AK4*2:0*66*1~AK5*R*5~AK9*R*1*
105
- 1*0~SE*8*2878~
106
- </pre>
107
- <p>
108
- I.e., <a href="../classes/X12.html">X12</a> defines an alphabet and
109
- somewhat of a dictionary - not a grammar or semantics for each particular
110
- data interchange conversation. Because of many entrenched implementations
111
- and government mandates, the <a href="../classes/X12.html">X12</a> is not
112
- going to die anytime soon, unfortunately.
113
- </p>
114
- <p>
115
- The message above can be easily represented in Ruby as a nested array:
116
- </p>
117
- <pre>
118
- m = [
119
- ['ST', '997', '2878'],
120
- ['AK1', 'HS', '293328532'],
121
- ['AK2', '270', '307272179'],
122
- ['AK3', 'NM1', '8', 'L1010_0', '8'],
123
- ['AK4', '0:0', '66', '1'],
124
- ['AK4', '0:1', '66', '1'],
125
- ['AK4', '0:2', '66', '1'],
126
- ['AK3', 'NM1', '8', 'L1010_1', '8'],
127
- ['AK4', '1:0', '66', '1'],
128
- ['AK4', '1:1', '66', '1'],
129
- ['AK3', 'NM1', '8', 'L1010_2', '8'],
130
- ['AK4', '2:0', '66', '1'],
131
- ['AK5', 'R', '5'],
132
- ['AK9', 'R', '1', '1', '0'],
133
- ['SE', '8', '2878'],
134
- ]
135
- </pre>
136
- <p>
137
- but it will not help any since, say, segment &#8216;AK4&#8217; is
138
- ambiguously defined and its meaning not at all obvious until the
139
- message&#8216;s structure is interpreted and correct &#8216;AK4&#8217;
140
- segment is found.
141
- </p>
142
- <h2>The solution</h2>
143
- <h3>Message structure</h3>
144
- <p>
145
- Each participant in EDI has to know the structure of the data coming across
146
- the wire - <a href="../classes/X12.html">X12</a> or no <a
147
- href="../classes/X12.html">X12</a>. The <a
148
- href="../classes/X12.html">X12</a> structures are defined in so-called
149
- Implementation Guides - thick books with all the data pieces spelled out.
150
- There is no other choice, but to invent a computer-readable definition
151
- language that will codify these books. For example, the <a
152
- href="../classes/X12.html">X12</a>/997 message can be defined as
153
- </p>
154
- <pre>
155
- loop 997 1:1
156
- {
157
- segment ST 1:1
158
- segment AK1 1:1
159
- loop L1000 0:999999
160
- {
161
- segment AK2 0:1
162
- loop L1010 0:999999
163
- {
164
- segment AK3 0:1
165
- segment AK4 0:99
166
- } # L1010
167
- segment AK5 1:1
168
- } # L1000
169
- segment AK9 1:1
170
- segment SE 1:1
171
- } # 997
172
- </pre>
173
- <p>
174
- Namely, the 997 is a &#8216;loop&#8217; containing segments ST (only one -
175
- &#8216;1:1&#8217;), AK1 (also only one), another loop L1000 (zero or many
176
- repeats), segments AK9 and SE. The loop L1000 can contain a segment AK2
177
- (optional - &#8216;0:1&#8217;) and another loop L1010 (zero or many), and
178
- so on.
179
- </p>
180
- <p>
181
- The segments&#8217; structure can be further defined as, for example,
182
- </p>
183
- <pre>
184
- segment AK2 {
185
- TransactionSetIdentifierCode S R 3-3 Tbl143
186
- TransactionSetControlNumber S R 4-9
187
- } # AK2
188
- </pre>
189
- <p>
190
- wihch defines a segment AK2 as having to fields:
191
- TransactionSetIdentifierCode and TransactionSetControlNumber. The field
192
- TransactionSetIdentifierCode is defined as having a type of string
193
- (&#8216;S&#8217;), begin required (&#8216;R&#8217;), having length of
194
- minimum 3 and maximum 3 characters (&#8216;3-3&#8217;), and being validated
195
- against a table Tbl143. The validation table is defined as
196
- </p>
197
- <pre>
198
- table Tbl143 {
199
- 100 Insurance Plan Description
200
- 101 Name and Address Lists
201
- ...
202
- 997 Functional Acknowledgment
203
- 998 Set Cancellation
204
- } # Tbl143
205
- </pre>
206
- <p>
207
- where required values are first tokens on each line, i.e., 100, 101,
208
- &#8230;, 997, 998.
209
- </p>
210
- <p>
211
- This message is fully flashed out in an example &#8216;misc/997.d12&#8217;
212
- file, copied from the ASC X12N 276/277 (004010X093) &quot;Health Care Claim
213
- Status Request and Response&quot; National Electronic Data Interchange
214
- Transaction Set Implementation Guide.
215
- </p>
216
- <p>
217
- Now expressions like
218
- </p>
219
- <pre>
220
- message.L1000.L1010[1].AK4.DataElementReferenceNumber
221
- </pre>
222
- <p>
223
- start making sense of sorts, overall <a
224
- href="../classes/X12.html">X12</a>&#8216;s idiocy notwithstanding -
225
- it&#8216;s a field called &#8216;DataElementReferenceNumber&#8217; of a
226
- first of possibly many segments &#8216;AK4&#8217; found in the second
227
- repeat of the loop &#8216;L1010&#8217; inside the enclosing loop
228
- &#8216;L1000&#8217;. The meaning of the value &#8216;66&#8217; found in
229
- this field is still in the eye of the beholder, but, at least its location
230
- is clearly identified in the message.
231
- </p>
232
- <h3><a href="../classes/X12.html">X12</a> Structure Definition Language (d12)</h3>
233
- <p>
234
- The syntax of the <a href="../classes/X12.html">X12</a> structure
235
- definition language should be apparent from the &#8216;997.d12&#8217; file
236
- enclosed with the package. The strict definition is formalized in
237
- &#8216;lib/X12/x12syntax.treetop&#8217; file.
238
- </p>
239
- <h3>Parsing</h3>
240
- <p>
241
- Here is how to parse an <a href="../classes/X12.html">X12</a>/997 message
242
- (the source is in example/parse.rb):
243
- </p>
244
- <pre>
245
- require 'x12'
246
-
247
- # Read message definition and create an actual parser
248
- # by compiling .d12 file
249
- parser = X12::Parser.new('misc/997.d12')
250
-
251
- # Define a test message to parse
252
- m997='ST*997*2878~AK1*HS*293328532~AK2*270*307272179~'\
253
- 'AK3*NM1*8*L1010_0*8~AK4*0:0*66*1~AK4*0:1*66*1~AK4*0:2*'\
254
- '66*1~AK3*NM1*8*L1010_1*8~AK4*1:0*66*1~AK4*1:1*66*1~AK3*'\
255
- 'NM1*8*L1010_2*8~AK4*2:0*66*1~AK5*R*5~AK9*R*1*1*0~SE*8*2878~'
256
-
257
- # Parse the message
258
- r = parser.parse('997', m997)
259
-
260
- # Access components of the message as desired
261
-
262
- # Whole ST segment: -&gt; ST*997*2878~
263
- puts r.ST
264
-
265
- # One filed, Group Control Number of AK1 -&gt; 293328532
266
- puts r.AK1.GroupControlNumber
267
-
268
- # Individual loop, namely, third L1010 sub-loop of
269
- # L1000 loop: -&gt; AK3*NM1*8*L1010_2*8~AK4*2:0*66*1~
270
- puts r.L1000.L1010[2]
271
-
272
- # First encounter of Data Element Reference Number of the
273
- # first L1010 sub-loop of L1000 loop -&gt; 66
274
- puts r.L1000.L1010.AK4.DataElementReferenceNumber
275
-
276
- # Number of L1010 sub-loops in L1000 loop -&gt; 3
277
- puts r.L1000.L1010.size
278
- </pre>
279
- <h3>Generating</h3>
280
- <p>
281
- Here is how to perform a reverse operation and generate a well-formed 997
282
- message (the source is in example/factory.rb):
283
- </p>
284
- <pre>
285
- require 'x12'
286
-
287
- # Read message definition and create an actual parser
288
- # by compiling .d12 file
289
- parser = X12::Parser.new('misc/997.d12')
290
-
291
- # Make a new 997 message
292
- r = parser.factory('997')
293
-
294
- #
295
- # Set various fields as desired
296
- #
297
-
298
- # Set fields directly
299
- r.ST.TransactionSetIdentifierCode = 997
300
- r.ST.TransactionSetControlNumber = '2878'
301
-
302
- # Set fields inside a segment (AK1 in this case)
303
- r.AK1 { |ak1|
304
- ak1.FunctionalIdentifierCode = 'HS'
305
- ak1.GroupControlNumber = 293328532
306
- }
307
-
308
- # Set fields deeply inside a segment inside
309
- # nested loops (L1000/L1010/AK4 in this case)
310
- r.L1000.L1010.AK4.DataElementSyntaxErrorCode = 55
311
- r.L1000.AK2.TransactionSetIdentifierCode = 270
312
-
313
- # Set nested loops
314
- r.L1000.L1010 {|l|
315
- l.AK3 {|s|
316
- s.SegmentIdCode = 'NM1'
317
- s.LoopIdentifierCode = 'L1000D'
318
- }
319
- l.AK4 {|s|
320
- s.CopyOfBadDataElement = 'Bad element'
321
- }
322
- }
323
-
324
- # Add loop repeats
325
- r.L1000.repeat {|l1000|
326
- (0..1).each {|loop_repeat| # Two repeats of the loop L1010
327
- l1000.L1010.repeat {|l1010|
328
- l1010.AK3 {|s|
329
- s.SegmentIdCode = 'DMG'
330
- s.SegmentPositionInTransactionSet = 0
331
- s.LoopIdentifierCode = 'L1010'
332
- s.SegmentSyntaxErrorCode = 22
333
- } if loop_repeat == 0 # AK3 only in the first repeat of L1010
334
- (0..1).each {|ak4_repeat| # Two repeats of the segment AK4
335
- l1010.AK4.repeat {|s|
336
- s.PositionInSegment = loop_repeat
337
- s.DataElementSyntaxErrorCode = ak4_repeat
338
- } # s
339
- } # ak4_repeat
340
- } # l1010
341
- } # loop_repeat
342
-
343
- l1000.AK5{|a|
344
- a.TransactionSetAcknowledgmentCode = 666
345
- a.TransactionSetSyntaxErrorCode4 = 999
346
- } # a
347
- } # l1000
348
-
349
- # Print the message as a string -&gt; ST*997*2878~AK1*HS*293328532~
350
- # AK2*270*~AK3*NM1**L1000D~AK4***55*Bad element~AK5*~AK3*DMG*0*
351
- # L1010*22~AK4*0**0~AK4*0**1~AK4*1**0~AK4*1**1~AK5*666****999~
352
- # AK9****~SE**~
353
- puts r.render
354
- </pre>
355
- <h2>Download</h2>
356
- <p>
357
- The latest <a href="../classes/X12.html">X12</a> library version can be
358
- downloaded from <a
359
- href="http://rubyforge.org/frs/?group_id=7297">rubyforge.org/frs/?group_id=7297</a>
360
- </p>
361
- <h2>Installation</h2>
362
- <p>
363
- You can install <a href="../classes/X12.html">X12</a> library with the
364
- following command.
365
- </p>
366
- <pre>
367
- % gem install X12
368
- </pre>
369
- <p>
370
- If you install directly from the <a href="../classes/X12.html">X12</a>*.gem
371
- file, it requires these packages to be installed first:
372
- </p>
373
- <ul>
374
- <li><a href="http://rubyforge.org/projects/treetop/">Treetop</a>
375
-
376
- </li>
377
- <li><a href="http://rubyforge.org/projects/polyglot/">Polyglot</a>
378
-
379
- </li>
380
- </ul>
381
- <h2>License</h2>
382
- <p>
383
- <a href="../classes/X12.html">X12</a> library is released under the Lesser
384
- GPL license, see <a
385
- href="http://www.gnu.org/licenses/lgpl.txt">www.gnu.org/licenses/lgpl.txt</a>
386
- </p>
387
- <h2>Major deficiencies</h2>
388
- <ul>
389
- <li>Validation is not implemented.
390
-
391
- </li>
392
- <li>Field types and sizes are ignored.
393
-
394
- </li>
395
- <li>No access methods for composites&#8217; fields.
396
-
397
- </li>
398
- </ul>
399
- <h2>Wish list</h2>
400
- <ul>
401
- <li>.d12 files should have an &#8216;include&#8217; facility, so data
402
- definitions can be reused for different messages.
403
-
404
- </li>
405
- <li>It would be nice to codify all popular <a
406
- href="../classes/X12.html">X12</a> messages in .d12 format.
407
-
408
- </li>
409
- </ul>
410
- <h2>Support</h2>
411
- <p>
412
- Please use the following:
413
- </p>
414
- <ul>
415
- <li>forums on Rubyforge for general discussions, <a
416
- href="http://rubyforge.org/forum/?group_id=7297">rubyforge.org/forum/?group_id=7297</a>
417
-
418
- </li>
419
- <li>trackers to submit bugs or feature requests, <a
420
- href="http://rubyforge.org/tracker/?group_id=7297">rubyforge.org/tracker/?group_id=7297</a>
421
-
422
- </li>
423
- <li>to contact the author, send mail to prelude rubyforge org
424
-
425
- </li>
426
- </ul>
427
- <h2>Acknowledgments</h2>
428
- <p>
429
- The authors of the project were inspired by the following works:
430
- </p>
431
- <ol>
432
- <li>The Perl <a href="../classes/X12.html">X12</a> parser by Prasad
433
- Poruporuthan, <a
434
- href="http://search.cpan.org/~prasad/X12-0.09/lib/X12/Parser.pm">search.cpan.org/~prasad/X12-0.09/lib/X12/Parser.pm</a>
435
-
436
- </li>
437
- <li>The Ruby port of the above by Chris Parker, <a
438
- href="http://rubyforge.org/projects/x12-parser">rubyforge.org/projects/x12-parser</a>/
439
-
440
- </li>
441
- <li>Treetop Ruby parser, <a
442
- href="http://treetop.rubyforge.org">treetop.rubyforge.org</a>
443
-
444
- </li>
445
- </ol>
446
-
447
- </div>
448
-
449
-
450
- </div>
451
-
452
-
453
- </div>
454
-
455
-
456
- <!-- if includes -->
457
-
458
- <div id="section">
459
-
460
-
461
-
462
-
463
-
464
-
465
-
466
-
467
- <!-- if method_list -->
468
-
469
-
470
- </div>
471
-
472
-
473
- </body>
474
- </html>