bio-vcf 0.8.2 → 0.9.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.
- checksums.yaml +4 -4
- data/.travis.yml +8 -2
- data/Gemfile +4 -6
- data/README.md +92 -57
- data/Rakefile +3 -41
- data/TAGS +115 -0
- data/VERSION +1 -1
- data/bin/bio-vcf +58 -70
- data/bio-vcf.gemspec +23 -75
- data/features/cli.feature +6 -1
- data/features/multisample.feature +12 -0
- data/features/step_definitions/cli-feature.rb +2 -2
- data/features/step_definitions/multisample.rb +19 -0
- data/features/step_definitions/vcf_header.rb +1 -1
- data/features/support/env.rb +0 -9
- data/lib/bio-vcf/pcows.rb +210 -0
- data/lib/bio-vcf/vcfheader.rb +28 -9
- data/lib/bio-vcf/vcfheader_line.rb +455 -160
- data/lib/bio-vcf/vcfrecord.rb +30 -15
- data/ragel/gen_vcfheaderline_parser.rl +68 -25
- data/ragel/generate.sh +4 -1
- data/template/vcf2json.erb +16 -16
- data/template/vcf2json_full_header.erb +16 -17
- data/template/vcf2json_use_meta.erb +35 -35
- data/test/data/input/gatk_exome.vcf +237 -0
- data/test/data/input/gatk_wgs.vcf +1000 -0
- data/test/data/input/test.bed +632 -0
- data/test/data/regression/eval_once-stderr.new +1 -0
- data/test/data/regression/eval_once.new +1 -0
- data/test/data/regression/eval_once.ref +1 -0
- data/test/data/regression/eval_r.info.dp-stderr.new +4 -0
- data/test/data/regression/eval_r.info.dp.new +150 -0
- data/test/data/regression/ifilter_s.dp-stderr.new +28 -0
- data/test/data/regression/ifilter_s.dp.new +31 -0
- data/test/data/regression/r.info.dp-stderr.new +4 -0
- data/test/data/regression/r.info.dp.new +147 -0
- data/test/data/regression/rewrite.info.sample-stderr.new +4 -0
- data/test/data/regression/rewrite.info.sample.new +150 -0
- data/test/data/regression/s.dp-stderr.new +12 -0
- data/test/data/regression/s.dp.new +145 -0
- data/test/data/regression/seval_s.dp-stderr.new +4 -0
- data/test/data/regression/seval_s.dp.new +36 -0
- data/test/data/regression/sfilter_seval_s.dp-stderr.new +12 -0
- data/test/data/regression/sfilter_seval_s.dp.new +31 -0
- data/test/data/regression/thread4-stderr.new +4 -0
- data/test/data/regression/thread4.new +150 -0
- data/test/data/regression/thread4_4-stderr.new +15 -0
- data/test/data/regression/thread4_4.new +150 -0
- data/test/data/regression/thread4_4_failed_filter-stderr.new +5 -0
- data/test/data/regression/thread4_4_failed_filter-stderr.ref +5 -2
- data/test/data/regression/thread4_4_failed_filter.new +110 -0
- data/test/data/regression/vcf2json_full_header-stderr.new +4 -0
- data/test/data/regression/vcf2json_full_header.new +225 -0
- data/test/data/regression/vcf2json_full_header.ref +222 -258
- data/test/data/regression/vcf2json_use_meta-stderr.new +4 -0
- data/test/data/regression/vcf2json_use_meta.new +4697 -0
- data/test/data/regression/vcf2json_use_meta.ref +4697 -0
- data/test/performance/metrics.md +18 -1
- data/test/tmp/test.vcf +12469 -0
- metadata +38 -62
- data/Gemfile.lock +0 -81
- data/ragel/gen_vcfheaderline_parser.rb +0 -483
@@ -37,6 +37,18 @@ Then(/^I expect rec\.info\.readposranksum to be (\d+)\.(\d+)$/) do |arg1, arg2|
|
|
37
37
|
expect(@rec1.info.readposranksum).to eq 0.815
|
38
38
|
end
|
39
39
|
|
40
|
+
Then(/^I expect rec\.info\['dp'\] to be (\d+)$/) do |arg1|
|
41
|
+
expect(@rec1.info['dp']).to eq 1537
|
42
|
+
end
|
43
|
+
|
44
|
+
Then(/^I expect rec\.info\['ReadPosRankSum'\] to be (\d+)\.(\d+)$/) do |arg1, arg2|
|
45
|
+
expect(@rec1.info['ReadPosRankSum']).to eq 0.815
|
46
|
+
end
|
47
|
+
|
48
|
+
Then(/^I expect rec\.info\.fields to contain \["(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)", "(.*?)"\]$/) do |arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15|
|
49
|
+
expect(@rec1.info.fields).to eq ["AC", "AF", "AN", "BASEQRANKSUM", "DP", "DELS", "FS", "HAPLOTYPESCORE", "MLEAC", "MLEAF", "MQ", "MQ0", "MQRANKSUM", "QD", "READPOSRANKSUM"]
|
50
|
+
end
|
51
|
+
|
40
52
|
Then(/^I expect rec\.sample\.original\.gt to be "(.*?)"$/) do |arg1|
|
41
53
|
expect(@rec1.sample['Original'].gt).to eq "0/1"
|
42
54
|
end
|
@@ -161,3 +173,10 @@ Then(/^I expect r\.original\.gts\[(\d+)\] to be "(.*?)"$/) do |arg1, arg2|
|
|
161
173
|
expect(@rec1.original.gts[arg1.to_i]).to eq arg2
|
162
174
|
end
|
163
175
|
|
176
|
+
Then(/^I expect r\.info\.end to be (\d+)$/) do |arg1|
|
177
|
+
expect(@rec1.info.end).to eq arg1.to_i
|
178
|
+
end
|
179
|
+
|
180
|
+
Then(/^I expect r\.info\.ciend to be (\d+)$/) do |arg1|
|
181
|
+
expect(@rec1.info.ciend).to eq arg1.to_i
|
182
|
+
end
|
data/features/support/env.rb
CHANGED
@@ -1,12 +1,3 @@
|
|
1
|
-
require 'bundler'
|
2
|
-
begin
|
3
|
-
Bundler.setup(:default, :development)
|
4
|
-
rescue Bundler::BundlerError => e
|
5
|
-
$stderr.puts e.message
|
6
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
7
|
-
exit e.status_code
|
8
|
-
end
|
9
|
-
|
10
1
|
# require 'mini/test'
|
11
2
|
|
12
3
|
$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
|
@@ -0,0 +1,210 @@
|
|
1
|
+
# Parallel copy-on-write streaming (PCOWS)
|
2
|
+
|
3
|
+
require 'tempfile'
|
4
|
+
|
5
|
+
class PCOWS
|
6
|
+
|
7
|
+
RUNNINGEXT = 'part'
|
8
|
+
|
9
|
+
def initialize(num_threads,name=File.basename(__FILE__),timeout=180)
|
10
|
+
num_threads = cpu_count() if not num_threads # FIXME: set to cpu_num by default
|
11
|
+
# $stderr.print "Using ",num_threads,"threads \n"
|
12
|
+
@num_threads = num_threads
|
13
|
+
@pid_list = []
|
14
|
+
@name = name
|
15
|
+
@timeout = timeout
|
16
|
+
if multi_threaded
|
17
|
+
@tmpdir = Dir::mktmpdir(@name+'_')
|
18
|
+
end
|
19
|
+
@last_output = 0 # counter
|
20
|
+
@output_locked = nil
|
21
|
+
end
|
22
|
+
|
23
|
+
# Feed the worker func and state to COWS. Note that func is a lambda
|
24
|
+
# closure so it can pick up surrounding scope at invocation in
|
25
|
+
# addition to the data captured in 'state'.
|
26
|
+
|
27
|
+
def submit_worker(func,state)
|
28
|
+
pid = nil
|
29
|
+
if multi_threaded
|
30
|
+
count = @pid_list.size+1
|
31
|
+
fn = mktmpfilename(count)
|
32
|
+
pid = fork do
|
33
|
+
# ---- This is running a new copy-on-write process
|
34
|
+
tempfn = fn+'.'+RUNNINGEXT
|
35
|
+
STDOUT.reopen(File.open(tempfn, 'w+'))
|
36
|
+
func.call(state).each { | line | print line }
|
37
|
+
STDOUT.flush
|
38
|
+
STDOUT.close
|
39
|
+
FileUtils::mv(tempfn,fn)
|
40
|
+
exit 0
|
41
|
+
end
|
42
|
+
else
|
43
|
+
# ---- Call in main process and output immediately
|
44
|
+
func.call(state).each { | line | print line }
|
45
|
+
end
|
46
|
+
@pid_list << [ pid,count,fn ]
|
47
|
+
return true
|
48
|
+
end
|
49
|
+
|
50
|
+
# Make sure no more than num_threads are running at the same time -
|
51
|
+
# this is achieved by checking the PID table and the running files
|
52
|
+
# in the tmpdir
|
53
|
+
|
54
|
+
def wait_for_worker_slot()
|
55
|
+
return if single_threaded
|
56
|
+
Timeout.timeout(@timeout) do
|
57
|
+
|
58
|
+
while true
|
59
|
+
# ---- count running pids
|
60
|
+
running = @pid_list.reduce(0) do | sum, info |
|
61
|
+
(pid,count,fn) = info
|
62
|
+
if pid_or_file_running?(pid,fn)
|
63
|
+
sum+1
|
64
|
+
else
|
65
|
+
sum
|
66
|
+
end
|
67
|
+
end
|
68
|
+
return if running < @num_threads
|
69
|
+
$stderr.print "Waiting for slot (timeout=#{@timeout})\n"
|
70
|
+
sleep 0.1
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# ---- In this section the output gets collected and passed on to a
|
77
|
+
# printer thread. This function makes sure the printing is
|
78
|
+
# ordered and that no printers are running at the same
|
79
|
+
# time. The printer thread should be doing as little processing
|
80
|
+
# as possible.
|
81
|
+
#
|
82
|
+
# In this implementation type==:by_line will call func for
|
83
|
+
# each line. Otherwise it is called once with the filename.
|
84
|
+
|
85
|
+
def process_output(func=nil,type = :by_line, blocking=false)
|
86
|
+
return if single_threaded
|
87
|
+
output = lambda { |fn|
|
88
|
+
if type == :by_line
|
89
|
+
File.new(fn).each_line { |buf|
|
90
|
+
print buf
|
91
|
+
}
|
92
|
+
else
|
93
|
+
func.call(fn)
|
94
|
+
end
|
95
|
+
File.unlink(fn)
|
96
|
+
}
|
97
|
+
if @output_locked
|
98
|
+
(pid,count,fn) = @output_locked
|
99
|
+
return if File.exist?(fn) # still processing
|
100
|
+
# on to the next one
|
101
|
+
@last_output += 1
|
102
|
+
@output_locked = nil
|
103
|
+
end
|
104
|
+
if info = @pid_list[@last_output]
|
105
|
+
(pid,count,fn) = info
|
106
|
+
$stderr.print "Processing #{fn}\n"
|
107
|
+
if File.exist?(fn)
|
108
|
+
# Yes! We have the next output, create outputter
|
109
|
+
if not blocking
|
110
|
+
pid = fork do
|
111
|
+
output.call(fn)
|
112
|
+
exit(0)
|
113
|
+
end
|
114
|
+
@output_locked = info
|
115
|
+
else
|
116
|
+
output.call(fn)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def wait_for_worker(info)
|
123
|
+
(pid,count,fn) = info
|
124
|
+
if pid_or_file_running?(pid,fn)
|
125
|
+
$stderr.print "Waiting up to #{@timeout} seconds for pid=#{pid} to complete\n"
|
126
|
+
begin
|
127
|
+
Timeout.timeout(@timeout) do
|
128
|
+
while not File.exist?(fn) # wait for the result to appear
|
129
|
+
sleep 0.2
|
130
|
+
end
|
131
|
+
end
|
132
|
+
# Thread file should have gone:
|
133
|
+
raise "FATAL: child process appears to have crashed #{fn}" if not File.exist?(fn)
|
134
|
+
$stderr.print "OK pid=#{pid}, processing #{fn}\n"
|
135
|
+
rescue Timeout::Error
|
136
|
+
if pid_running?(pid)
|
137
|
+
# Kill it to speed up exit
|
138
|
+
Process.kill 9, pid
|
139
|
+
Process.wait pid
|
140
|
+
end
|
141
|
+
$stderr.print "FATAL: child process killed because it stopped responding, pid = #{pid}\n"
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# This is the final cleanup after the reader thread is done. All workers
|
147
|
+
# need to complete.
|
148
|
+
|
149
|
+
def wait_for_workers()
|
150
|
+
return if single_threaded
|
151
|
+
@pid_list.each do |info|
|
152
|
+
wait_for_worker(info)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def process_remaining_output()
|
157
|
+
return if single_threaded
|
158
|
+
while @output_locked
|
159
|
+
sleep 0.2
|
160
|
+
process_output()
|
161
|
+
end
|
162
|
+
@pid_list.each do |info|
|
163
|
+
process_output(nil,:by_line,true)
|
164
|
+
end
|
165
|
+
# final cleanup
|
166
|
+
Dir.unlink(@tmpdir) if @tmpdir
|
167
|
+
end
|
168
|
+
|
169
|
+
private
|
170
|
+
|
171
|
+
def mktmpfilename(num,ext=nil)
|
172
|
+
@tmpdir+sprintf("/%0.6d-",num)+@name+(ext ? '.'+ext : '')
|
173
|
+
end
|
174
|
+
|
175
|
+
def pid_or_file_running?(pid,fn)
|
176
|
+
(pid && pid_running?(pid)) or File.exist?(fn+'.'+RUNNINGEXT)
|
177
|
+
end
|
178
|
+
|
179
|
+
def pid_running?(pid)
|
180
|
+
begin
|
181
|
+
fpid,status=Process.waitpid2(pid,Process::WNOHANG)
|
182
|
+
rescue Errno::ECHILD, Errno::ESRCH
|
183
|
+
return false
|
184
|
+
end
|
185
|
+
return true if nil == fpid && nil == status
|
186
|
+
return ! (status.exited? || status.signaled?)
|
187
|
+
end
|
188
|
+
|
189
|
+
def single_threaded
|
190
|
+
@num_threads == 1
|
191
|
+
end
|
192
|
+
|
193
|
+
def multi_threaded
|
194
|
+
@num_threads > 1
|
195
|
+
end
|
196
|
+
|
197
|
+
def cpu_count
|
198
|
+
begin
|
199
|
+
return File.read('/proc/cpuinfo').scan(/^processor\s*:/).size if File.exist? '/proc/cpuinfo'
|
200
|
+
# Actually, the JVM does not allow fork...
|
201
|
+
return Java::Java.lang.Runtime.getRuntime.availableProcessors if defined? Java::Java
|
202
|
+
rescue LoadError
|
203
|
+
# Count on MAC
|
204
|
+
return Integer `sysctl -n hw.ncpu 2>/dev/null`
|
205
|
+
end
|
206
|
+
$stderr.print "Could not determine number of CPUs"
|
207
|
+
1
|
208
|
+
end
|
209
|
+
|
210
|
+
end
|
data/lib/bio-vcf/vcfheader.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# containing fields. Most fields are of 'key=value' type and appear
|
3
3
|
# only once. These can be retrieved with the find_field method.
|
4
4
|
#
|
5
|
-
# INFO and
|
5
|
+
# INFO, FORMAT and contig fields are special as they appear multiple times
|
6
6
|
# and contain multiple key values (identified by an ID field).
|
7
7
|
# To retrieve these call 'info' and 'format' functions respectively,
|
8
8
|
# which return a hash on the contained ID.
|
@@ -25,8 +25,8 @@ module BioVcf
|
|
25
25
|
nil
|
26
26
|
end
|
27
27
|
|
28
|
-
def VcfHeaderParser.parse_field(line)
|
29
|
-
BioVcf::VcfHeaderParser::RagelKeyValues.run_lexer(line, debug:
|
28
|
+
def VcfHeaderParser.parse_field(line, debug)
|
29
|
+
BioVcf::VcfHeaderParser::RagelKeyValues.run_lexer(line, debug: debug)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -34,9 +34,11 @@ module BioVcf
|
|
34
34
|
|
35
35
|
attr_reader :lines, :field
|
36
36
|
|
37
|
-
def initialize
|
37
|
+
def initialize(debug = false)
|
38
|
+
@debug = debug
|
38
39
|
@lines = []
|
39
40
|
@field = {}
|
41
|
+
@meta = nil
|
40
42
|
end
|
41
43
|
|
42
44
|
# Add a new field to the header
|
@@ -125,7 +127,7 @@ module BioVcf
|
|
125
127
|
if value[0]
|
126
128
|
str = value[0][0]
|
127
129
|
# p str
|
128
|
-
v = VcfHeaderParser.parse_field(line)
|
130
|
+
v = VcfHeaderParser.parse_field(line,@debug)
|
129
131
|
id = v['ID']
|
130
132
|
res[id] = v
|
131
133
|
end
|
@@ -138,25 +140,42 @@ module BioVcf
|
|
138
140
|
find_fields('FORMAT')
|
139
141
|
end
|
140
142
|
|
143
|
+
def filter
|
144
|
+
find_fields('FILTER')
|
145
|
+
end
|
146
|
+
|
147
|
+
def contig
|
148
|
+
find_fields('contig')
|
149
|
+
end
|
150
|
+
|
141
151
|
def info
|
142
152
|
find_fields('INFO')
|
143
153
|
end
|
144
154
|
|
155
|
+
def gatkcommandline
|
156
|
+
find_fields('GATKCommandLine')
|
157
|
+
end
|
158
|
+
|
145
159
|
def meta
|
146
|
-
|
160
|
+
return @meta if @meta
|
161
|
+
res = { 'INFO' => {}, 'FORMAT' => {}, 'FILTER' => {}, 'contig' => {}, 'GATKCommandLine' => {} }
|
147
162
|
@lines.each do | line |
|
148
163
|
value = line.scan(/##(.*?)=(.*)/)
|
149
164
|
if value[0]
|
150
165
|
k,v = value[0]
|
151
|
-
if k != 'FORMAT' and k != 'INFO'
|
166
|
+
if k != 'FORMAT' and k != 'INFO' and k != 'FILTER' and k != 'contig' and k != 'GATKCommandLine'
|
152
167
|
# p [k,v]
|
153
168
|
res[k] = v
|
154
169
|
end
|
155
170
|
end
|
156
171
|
end
|
157
|
-
res['INFO'] = info
|
158
|
-
res['FORMAT'] = format
|
172
|
+
res['INFO'] = info()
|
173
|
+
res['FORMAT'] = format()
|
174
|
+
res['FILTER'] = filter()
|
175
|
+
res['contig'] = contig()
|
176
|
+
res['GATKCommandLine'] = gatkcommandline()
|
159
177
|
# p [:res, res]
|
178
|
+
@meta = res # cache values
|
160
179
|
res
|
161
180
|
end
|
162
181
|
|
@@ -2,38 +2,51 @@
|
|
2
2
|
# line 1 "gen_vcfheaderline_parser.rl"
|
3
3
|
# Ragel lexer for VCF-header
|
4
4
|
#
|
5
|
-
# This is a
|
6
|
-
# to generate meta information
|
7
|
-
#
|
8
|
-
# parsing of key-value pairs with
|
9
|
-
# escaped quotes in quoted string
|
10
|
-
#
|
5
|
+
# This is compact a parser/lexer for the VCF header format. Bio-vcf
|
6
|
+
# uses the parser to generate meta information that can be output to
|
7
|
+
# (for example) JSON format. The advantage of using ragel as a state
|
8
|
+
# engine is that it allows for easy parsing of key-value pairs with
|
9
|
+
# syntax checking and, for example, escaped quotes in quoted string
|
10
|
+
# values. This ragel parser/lexer generates valid Ruby; it should be
|
11
|
+
# fairly trivial to generate python/C/JAVA instead. Note that this
|
12
|
+
# edition validates ID and Number fields only. Other fields are
|
13
|
+
# dumped 'AS IS'.
|
11
14
|
#
|
12
15
|
# Note the .rb version is generated from ./ragel/gen_vcfheaderline_parser.rl
|
16
|
+
#
|
17
|
+
# by Pjotr Prins (c) 2014/2015
|
13
18
|
|
14
19
|
module BioVcf
|
15
20
|
|
16
21
|
module VcfHeaderParser
|
17
22
|
|
18
23
|
module RagelKeyValues
|
19
|
-
|
24
|
+
|
25
|
+
def self.debug msg
|
26
|
+
# nothing
|
27
|
+
# $stderr.print "DEBUG: ",msg,"\n"
|
28
|
+
end
|
29
|
+
|
20
30
|
=begin
|
21
31
|
|
22
|
-
# line
|
32
|
+
# line 75 "gen_vcfheaderline_parser.rl"
|
23
33
|
|
24
34
|
=end
|
25
35
|
|
26
36
|
|
27
|
-
# line
|
37
|
+
# line 38 "gen_vcfheaderline_parser.rb"
|
28
38
|
class << self
|
29
39
|
attr_accessor :_simple_lexer_actions
|
30
40
|
private :_simple_lexer_actions, :_simple_lexer_actions=
|
31
41
|
end
|
32
42
|
self._simple_lexer_actions = [
|
33
43
|
0, 1, 0, 1, 1, 1, 2, 1,
|
34
|
-
3, 1,
|
35
|
-
|
36
|
-
|
44
|
+
3, 1, 15, 1, 16, 2, 0, 1,
|
45
|
+
2, 4, 15, 2, 6, 15, 2, 7,
|
46
|
+
15, 2, 9, 16, 2, 10, 16, 2,
|
47
|
+
11, 16, 2, 12, 15, 2, 13, 16,
|
48
|
+
2, 14, 16, 3, 5, 8, 15, 6,
|
49
|
+
9, 10, 13, 11, 14, 16
|
37
50
|
]
|
38
51
|
|
39
52
|
class << self
|
@@ -41,13 +54,23 @@ class << self
|
|
41
54
|
private :_simple_lexer_key_offsets, :_simple_lexer_key_offsets=
|
42
55
|
end
|
43
56
|
self._simple_lexer_key_offsets = [
|
44
|
-
0, 0, 1, 2,
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
57
|
+
0, 0, 1, 2, 7, 8, 9, 10,
|
58
|
+
13, 26, 35, 49, 51, 53, 58, 60,
|
59
|
+
62, 62, 62, 64, 70, 72, 77, 80,
|
60
|
+
91, 101, 111, 121, 131, 141, 151, 161,
|
61
|
+
171, 181, 191, 201, 211, 221, 231, 241,
|
62
|
+
251, 261, 270, 275, 277, 279, 279, 281,
|
63
|
+
283, 283, 293, 303, 313, 322, 327, 329,
|
64
|
+
331, 331, 333, 335, 335, 345, 354, 360,
|
65
|
+
371, 381, 391, 401, 411, 421, 430, 438,
|
66
|
+
440, 445, 448, 458, 468, 478, 488, 498,
|
67
|
+
508, 517, 524, 526, 528, 533, 535, 537,
|
68
|
+
537, 537, 549, 559, 569, 579, 589, 599,
|
69
|
+
609, 619, 629, 639, 649, 659, 669, 671,
|
70
|
+
672, 673, 674, 675, 676, 677, 678, 679,
|
71
|
+
680, 681, 682, 683, 684, 685, 686, 687,
|
72
|
+
688, 689, 690, 691, 692, 693, 694, 695,
|
73
|
+
696, 697, 698, 699, 700
|
51
74
|
]
|
52
75
|
|
53
76
|
class << self
|
@@ -55,31 +78,94 @@ class << self
|
|
55
78
|
private :_simple_lexer_trans_keys, :_simple_lexer_trans_keys=
|
56
79
|
end
|
57
80
|
self._simple_lexer_trans_keys = [
|
58
|
-
35, 35, 65, 70,
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
81
|
+
35, 35, 65, 70, 71, 73, 99, 76,
|
82
|
+
84, 61, 44, 60, 62, 67, 68, 73,
|
83
|
+
78, 86, 97, 108, 48, 57, 65, 90,
|
84
|
+
98, 122, 46, 61, 95, 48, 57, 65,
|
85
|
+
90, 97, 122, 34, 39, 44, 46, 60,
|
86
|
+
62, 43, 45, 48, 57, 65, 90, 97,
|
87
|
+
122, 34, 92, 34, 92, 34, 39, 44,
|
88
|
+
60, 62, 39, 92, 39, 92, 48, 57,
|
89
|
+
44, 46, 60, 62, 48, 57, 48, 57,
|
90
|
+
44, 60, 62, 48, 57, 44, 60, 62,
|
91
|
+
44, 46, 60, 62, 95, 48, 57, 65,
|
92
|
+
90, 97, 122, 46, 61, 95, 111, 48,
|
93
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
94
|
+
109, 48, 57, 65, 90, 97, 122, 46,
|
95
|
+
61, 95, 109, 48, 57, 65, 90, 97,
|
96
|
+
122, 46, 61, 95, 97, 48, 57, 65,
|
97
|
+
90, 98, 122, 46, 61, 95, 110, 48,
|
98
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
99
|
+
100, 48, 57, 65, 90, 97, 122, 46,
|
100
|
+
61, 76, 95, 48, 57, 65, 90, 97,
|
101
|
+
122, 46, 61, 95, 105, 48, 57, 65,
|
102
|
+
90, 97, 122, 46, 61, 95, 110, 48,
|
103
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
104
|
+
101, 48, 57, 65, 90, 97, 122, 46,
|
105
|
+
61, 79, 95, 48, 57, 65, 90, 97,
|
106
|
+
122, 46, 61, 95, 112, 48, 57, 65,
|
107
|
+
90, 97, 122, 46, 61, 95, 116, 48,
|
108
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
109
|
+
105, 48, 57, 65, 90, 97, 122, 46,
|
110
|
+
61, 95, 111, 48, 57, 65, 90, 97,
|
111
|
+
122, 46, 61, 95, 110, 48, 57, 65,
|
112
|
+
90, 97, 122, 46, 61, 95, 115, 48,
|
113
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
114
|
+
48, 57, 65, 90, 97, 122, 34, 39,
|
115
|
+
44, 60, 62, 34, 92, 34, 92, 39,
|
116
|
+
92, 39, 92, 46, 61, 95, 97, 48,
|
117
|
+
57, 65, 90, 98, 122, 46, 61, 95,
|
118
|
+
116, 48, 57, 65, 90, 97, 122, 46,
|
119
|
+
61, 95, 101, 48, 57, 65, 90, 97,
|
120
|
+
122, 46, 61, 95, 48, 57, 65, 90,
|
121
|
+
97, 122, 34, 39, 44, 60, 62, 34,
|
122
|
+
92, 34, 92, 39, 92, 39, 92, 46,
|
123
|
+
61, 68, 95, 48, 57, 65, 90, 97,
|
124
|
+
122, 46, 61, 95, 48, 57, 65, 90,
|
125
|
+
97, 122, 48, 57, 65, 90, 97, 122,
|
126
|
+
44, 46, 60, 62, 95, 48, 57, 65,
|
127
|
+
90, 97, 122, 46, 61, 95, 117, 48,
|
128
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
129
|
+
109, 48, 57, 65, 90, 97, 122, 46,
|
130
|
+
61, 95, 98, 48, 57, 65, 90, 97,
|
131
|
+
122, 46, 61, 95, 101, 48, 57, 65,
|
132
|
+
90, 97, 122, 46, 61, 95, 114, 48,
|
133
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
134
|
+
48, 57, 65, 90, 97, 122, 43, 45,
|
135
|
+
46, 65, 71, 82, 48, 57, 48, 57,
|
136
|
+
44, 60, 62, 48, 57, 44, 60, 62,
|
137
|
+
46, 61, 95, 101, 48, 57, 65, 90,
|
138
|
+
97, 122, 46, 61, 95, 114, 48, 57,
|
139
|
+
65, 90, 97, 122, 46, 61, 95, 115,
|
140
|
+
48, 57, 65, 90, 97, 122, 46, 61,
|
141
|
+
95, 105, 48, 57, 65, 90, 97, 122,
|
142
|
+
46, 61, 95, 111, 48, 57, 65, 90,
|
143
|
+
97, 122, 46, 61, 95, 110, 48, 57,
|
144
|
+
65, 90, 97, 122, 46, 61, 95, 48,
|
145
|
+
57, 65, 90, 97, 122, 34, 39, 44,
|
146
|
+
60, 62, 48, 57, 34, 92, 34, 92,
|
147
|
+
34, 39, 44, 60, 62, 39, 92, 39,
|
148
|
+
92, 44, 60, 62, 95, 45, 46, 48,
|
149
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
150
|
+
115, 48, 57, 65, 90, 97, 122, 46,
|
151
|
+
61, 95, 115, 48, 57, 65, 90, 97,
|
152
|
+
122, 46, 61, 95, 101, 48, 57, 65,
|
153
|
+
90, 97, 122, 46, 61, 95, 109, 48,
|
154
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
155
|
+
98, 48, 57, 65, 90, 97, 122, 46,
|
156
|
+
61, 95, 108, 48, 57, 65, 90, 97,
|
157
|
+
122, 46, 61, 95, 121, 48, 57, 65,
|
158
|
+
90, 97, 122, 46, 61, 95, 101, 48,
|
159
|
+
57, 65, 90, 97, 122, 46, 61, 95,
|
160
|
+
110, 48, 57, 65, 90, 97, 122, 46,
|
161
|
+
61, 95, 103, 48, 57, 65, 90, 97,
|
162
|
+
122, 46, 61, 95, 116, 48, 57, 65,
|
163
|
+
90, 97, 122, 46, 61, 95, 104, 48,
|
164
|
+
57, 65, 90, 97, 122, 73, 79, 76,
|
165
|
+
84, 69, 82, 82, 77, 65, 65, 84,
|
166
|
+
75, 67, 111, 109, 109, 97, 110, 100,
|
167
|
+
76, 105, 110, 101, 78, 70, 79, 111,
|
168
|
+
110, 116, 105, 103, 0
|
83
169
|
]
|
84
170
|
|
85
171
|
class << self
|
@@ -87,13 +173,23 @@ class << self
|
|
87
173
|
private :_simple_lexer_single_lengths, :_simple_lexer_single_lengths=
|
88
174
|
end
|
89
175
|
self._simple_lexer_single_lengths = [
|
90
|
-
0, 1, 1,
|
91
|
-
|
92
|
-
0, 0, 0,
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
176
|
+
0, 1, 1, 5, 1, 1, 1, 3,
|
177
|
+
7, 3, 6, 2, 2, 5, 2, 2,
|
178
|
+
0, 0, 0, 4, 0, 3, 3, 5,
|
179
|
+
4, 4, 4, 4, 4, 4, 4, 4,
|
180
|
+
4, 4, 4, 4, 4, 4, 4, 4,
|
181
|
+
4, 3, 5, 2, 2, 0, 2, 2,
|
182
|
+
0, 4, 4, 4, 3, 5, 2, 2,
|
183
|
+
0, 2, 2, 0, 4, 3, 0, 5,
|
184
|
+
4, 4, 4, 4, 4, 3, 6, 0,
|
185
|
+
3, 3, 4, 4, 4, 4, 4, 4,
|
186
|
+
3, 5, 2, 2, 5, 2, 2, 0,
|
187
|
+
0, 4, 4, 4, 4, 4, 4, 4,
|
188
|
+
4, 4, 4, 4, 4, 4, 2, 1,
|
189
|
+
1, 1, 1, 1, 1, 1, 1, 1,
|
190
|
+
1, 1, 1, 1, 1, 1, 1, 1,
|
191
|
+
1, 1, 1, 1, 1, 1, 1, 1,
|
192
|
+
1, 1, 1, 1, 0
|
97
193
|
]
|
98
194
|
|
99
195
|
class << self
|
@@ -101,13 +197,23 @@ class << self
|
|
101
197
|
private :_simple_lexer_range_lengths, :_simple_lexer_range_lengths=
|
102
198
|
end
|
103
199
|
self._simple_lexer_range_lengths = [
|
104
|
-
0, 0, 0, 0, 0, 0, 0,
|
105
|
-
3, 3,
|
106
|
-
0,
|
200
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
201
|
+
3, 3, 4, 0, 0, 0, 0, 0,
|
202
|
+
0, 0, 1, 1, 1, 1, 0, 3,
|
203
|
+
3, 3, 3, 3, 3, 3, 3, 3,
|
204
|
+
3, 3, 3, 3, 3, 3, 3, 3,
|
205
|
+
3, 3, 0, 0, 0, 0, 0, 0,
|
206
|
+
0, 3, 3, 3, 3, 0, 0, 0,
|
207
|
+
0, 0, 0, 0, 3, 3, 3, 3,
|
107
208
|
3, 3, 3, 3, 3, 3, 1, 1,
|
209
|
+
1, 0, 3, 3, 3, 3, 3, 3,
|
210
|
+
3, 1, 0, 0, 0, 0, 0, 0,
|
211
|
+
0, 4, 3, 3, 3, 3, 3, 3,
|
212
|
+
3, 3, 3, 3, 3, 3, 0, 0,
|
213
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
214
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
108
215
|
0, 0, 0, 0, 0, 0, 0, 0,
|
109
|
-
0, 0, 0, 0,
|
110
|
-
3, 3, 1, 0
|
216
|
+
0, 0, 0, 0, 0
|
111
217
|
]
|
112
218
|
|
113
219
|
class << self
|
@@ -115,44 +221,23 @@ class << self
|
|
115
221
|
private :_simple_lexer_index_offsets, :_simple_lexer_index_offsets=
|
116
222
|
end
|
117
223
|
self._simple_lexer_index_offsets = [
|
118
|
-
0, 0, 2, 4,
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
14, 14, 14, 13, 16, 17, 18, 16,
|
136
|
-
13, 20, 21, 19, 23, 24, 22, 20,
|
137
|
-
26, 25, 23, 28, 27, 27, 22, 29,
|
138
|
-
13, 30, 13, 31, 31, 31, 13, 33,
|
139
|
-
14, 14, 14, 32, 34, 14, 14, 14,
|
140
|
-
32, 35, 35, 32, 36, 36, 36, 32,
|
141
|
-
38, 14, 14, 14, 37, 15, 39, 14,
|
142
|
-
14, 14, 37, 15, 40, 14, 14, 14,
|
143
|
-
37, 15, 41, 14, 14, 14, 37, 15,
|
144
|
-
42, 14, 14, 14, 37, 43, 14, 14,
|
145
|
-
14, 37, 44, 44, 45, 45, 45, 45,
|
146
|
-
46, 37, 47, 37, 48, 49, 1, 50,
|
147
|
-
1, 51, 1, 52, 1, 7, 1, 53,
|
148
|
-
1, 54, 1, 6, 1, 55, 1, 56,
|
149
|
-
1, 7, 1, 57, 57, 1, 16, 17,
|
150
|
-
18, 57, 8, 57, 16, 58, 29, 59,
|
151
|
-
59, 1, 16, 17, 18, 57, 57, 16,
|
152
|
-
1, 57, 60, 57, 29, 1, 57, 57,
|
153
|
-
30, 1, 61, 61, 31, 31, 31, 1,
|
154
|
-
62, 62, 36, 36, 36, 1, 63, 63,
|
155
|
-
47, 1, 63, 63, 1, 0
|
224
|
+
0, 0, 2, 4, 10, 12, 14, 16,
|
225
|
+
20, 31, 38, 49, 52, 55, 61, 64,
|
226
|
+
67, 68, 69, 71, 77, 79, 84, 88,
|
227
|
+
97, 105, 113, 121, 129, 137, 145, 153,
|
228
|
+
161, 169, 177, 185, 193, 201, 209, 217,
|
229
|
+
225, 233, 240, 246, 249, 252, 253, 256,
|
230
|
+
259, 260, 268, 276, 284, 291, 297, 300,
|
231
|
+
303, 304, 307, 310, 311, 319, 326, 330,
|
232
|
+
339, 347, 355, 363, 371, 379, 386, 394,
|
233
|
+
396, 401, 405, 413, 421, 429, 437, 445,
|
234
|
+
453, 460, 467, 470, 473, 479, 482, 485,
|
235
|
+
486, 487, 496, 504, 512, 520, 528, 536,
|
236
|
+
544, 552, 560, 568, 576, 584, 592, 595,
|
237
|
+
597, 599, 601, 603, 605, 607, 609, 611,
|
238
|
+
613, 615, 617, 619, 621, 623, 625, 627,
|
239
|
+
629, 631, 633, 635, 637, 639, 641, 643,
|
240
|
+
645, 647, 649, 651, 653
|
156
241
|
]
|
157
242
|
|
158
243
|
class << self
|
@@ -160,14 +245,88 @@ class << self
|
|
160
245
|
private :_simple_lexer_trans_targs, :_simple_lexer_trans_targs=
|
161
246
|
end
|
162
247
|
self._simple_lexer_trans_targs = [
|
163
|
-
2, 0, 3,
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
248
|
+
2, 0, 3, 0, 4, 102, 110, 124,
|
249
|
+
127, 0, 5, 0, 6, 0, 7, 0,
|
250
|
+
8, 8, 132, 0, 24, 49, 60, 64,
|
251
|
+
74, 90, 97, 9, 9, 9, 0, 9,
|
252
|
+
10, 9, 9, 9, 9, 0, 11, 14,
|
253
|
+
8, 22, 8, 132, 18, 23, 23, 23,
|
254
|
+
0, 13, 17, 12, 13, 17, 12, 11,
|
255
|
+
14, 8, 8, 132, 0, 13, 16, 15,
|
256
|
+
13, 16, 15, 15, 12, 19, 0, 8,
|
257
|
+
20, 8, 132, 19, 0, 21, 0, 8,
|
258
|
+
8, 132, 21, 0, 8, 8, 132, 0,
|
259
|
+
8, 23, 8, 132, 23, 23, 23, 23,
|
260
|
+
0, 9, 10, 9, 25, 9, 9, 9,
|
261
|
+
0, 9, 10, 9, 26, 9, 9, 9,
|
262
|
+
0, 9, 10, 9, 27, 9, 9, 9,
|
263
|
+
0, 9, 10, 9, 28, 9, 9, 9,
|
264
|
+
0, 9, 10, 9, 29, 9, 9, 9,
|
265
|
+
0, 9, 10, 9, 30, 9, 9, 9,
|
266
|
+
0, 9, 10, 31, 9, 9, 9, 9,
|
267
|
+
0, 9, 10, 9, 32, 9, 9, 9,
|
268
|
+
0, 9, 10, 9, 33, 9, 9, 9,
|
269
|
+
0, 9, 10, 9, 34, 9, 9, 9,
|
270
|
+
0, 9, 10, 35, 9, 9, 9, 9,
|
271
|
+
0, 9, 10, 9, 36, 9, 9, 9,
|
272
|
+
0, 9, 10, 9, 37, 9, 9, 9,
|
273
|
+
0, 9, 10, 9, 38, 9, 9, 9,
|
274
|
+
0, 9, 10, 9, 39, 9, 9, 9,
|
275
|
+
0, 9, 10, 9, 40, 9, 9, 9,
|
276
|
+
0, 9, 10, 9, 41, 9, 9, 9,
|
277
|
+
0, 9, 42, 9, 9, 9, 9, 0,
|
278
|
+
43, 46, 8, 8, 132, 0, 42, 45,
|
279
|
+
44, 42, 45, 44, 44, 42, 48, 47,
|
280
|
+
42, 48, 47, 47, 9, 10, 9, 50,
|
281
|
+
9, 9, 9, 0, 9, 10, 9, 51,
|
282
|
+
9, 9, 9, 0, 9, 10, 9, 52,
|
283
|
+
9, 9, 9, 0, 9, 53, 9, 9,
|
284
|
+
9, 9, 0, 54, 57, 8, 8, 132,
|
285
|
+
0, 53, 56, 55, 53, 56, 55, 55,
|
286
|
+
53, 59, 58, 53, 59, 58, 58, 9,
|
287
|
+
10, 61, 9, 9, 9, 9, 0, 9,
|
288
|
+
62, 9, 9, 9, 9, 0, 63, 63,
|
289
|
+
63, 0, 8, 63, 8, 132, 63, 63,
|
290
|
+
63, 63, 0, 9, 10, 9, 65, 9,
|
291
|
+
9, 9, 0, 9, 10, 9, 66, 9,
|
292
|
+
9, 9, 0, 9, 10, 9, 67, 9,
|
293
|
+
9, 9, 0, 9, 10, 9, 68, 9,
|
294
|
+
9, 9, 0, 9, 10, 9, 69, 9,
|
295
|
+
9, 9, 0, 9, 70, 9, 9, 9,
|
296
|
+
9, 0, 71, 71, 73, 73, 73, 73,
|
297
|
+
72, 0, 72, 0, 8, 8, 132, 72,
|
298
|
+
0, 8, 8, 132, 0, 9, 10, 9,
|
299
|
+
75, 9, 9, 9, 0, 9, 10, 9,
|
300
|
+
76, 9, 9, 9, 0, 9, 10, 9,
|
301
|
+
77, 9, 9, 9, 0, 9, 10, 9,
|
302
|
+
78, 9, 9, 9, 0, 9, 10, 9,
|
303
|
+
79, 9, 9, 9, 0, 9, 10, 9,
|
304
|
+
80, 9, 9, 9, 0, 9, 81, 9,
|
305
|
+
9, 9, 9, 0, 82, 85, 8, 8,
|
306
|
+
132, 89, 0, 84, 88, 83, 84, 88,
|
307
|
+
83, 82, 85, 8, 8, 132, 0, 84,
|
308
|
+
87, 86, 84, 87, 86, 86, 83, 8,
|
309
|
+
8, 132, 89, 89, 89, 89, 89, 0,
|
310
|
+
9, 10, 9, 91, 9, 9, 9, 0,
|
311
|
+
9, 10, 9, 92, 9, 9, 9, 0,
|
312
|
+
9, 10, 9, 93, 9, 9, 9, 0,
|
313
|
+
9, 10, 9, 94, 9, 9, 9, 0,
|
314
|
+
9, 10, 9, 95, 9, 9, 9, 0,
|
315
|
+
9, 10, 9, 96, 9, 9, 9, 0,
|
316
|
+
9, 10, 9, 61, 9, 9, 9, 0,
|
317
|
+
9, 10, 9, 98, 9, 9, 9, 0,
|
318
|
+
9, 10, 9, 99, 9, 9, 9, 0,
|
319
|
+
9, 10, 9, 100, 9, 9, 9, 0,
|
320
|
+
9, 10, 9, 101, 9, 9, 9, 0,
|
321
|
+
9, 10, 9, 69, 9, 9, 9, 0,
|
322
|
+
103, 107, 0, 104, 0, 105, 0, 106,
|
323
|
+
0, 6, 0, 108, 0, 109, 0, 5,
|
324
|
+
0, 111, 0, 112, 0, 113, 0, 114,
|
325
|
+
0, 115, 0, 116, 0, 117, 0, 118,
|
326
|
+
0, 119, 0, 120, 0, 121, 0, 122,
|
327
|
+
0, 123, 0, 6, 0, 125, 0, 126,
|
328
|
+
0, 6, 0, 128, 0, 129, 0, 130,
|
329
|
+
0, 131, 0, 6, 0, 0, 0
|
171
330
|
]
|
172
331
|
|
173
332
|
class << self
|
@@ -176,13 +335,87 @@ class << self
|
|
176
335
|
end
|
177
336
|
self._simple_lexer_trans_actions = [
|
178
337
|
0, 0, 0, 0, 0, 0, 0, 0,
|
179
|
-
0, 26, 1, 1, 1, 15, 0, 7,
|
180
|
-
0, 0, 0, 1, 17, 1, 0, 3,
|
181
|
-
0, 1, 1, 0, 0, 0, 0, 0,
|
182
|
-
20, 0, 5, 1, 0, 23, 0, 0,
|
183
|
-
0, 0, 0, 5, 1, 1, 1, 0,
|
184
338
|
0, 0, 0, 0, 0, 0, 0, 0,
|
185
|
-
0, 0, 0, 1,
|
339
|
+
0, 0, 0, 0, 1, 1, 1, 1,
|
340
|
+
1, 1, 1, 1, 1, 1, 47, 0,
|
341
|
+
7, 0, 0, 0, 0, 11, 0, 0,
|
342
|
+
9, 0, 9, 9, 0, 1, 1, 1,
|
343
|
+
0, 13, 1, 1, 3, 0, 0, 0,
|
344
|
+
0, 9, 9, 9, 0, 13, 1, 1,
|
345
|
+
3, 0, 0, 0, 0, 0, 11, 9,
|
346
|
+
0, 9, 9, 0, 0, 0, 11, 9,
|
347
|
+
9, 9, 0, 0, 9, 9, 9, 0,
|
348
|
+
16, 0, 16, 16, 0, 0, 0, 0,
|
349
|
+
0, 0, 7, 0, 0, 0, 0, 0,
|
350
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
351
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
352
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
353
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
354
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
355
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
356
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
357
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
358
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
359
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
360
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
361
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
362
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
363
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
364
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
365
|
+
40, 0, 7, 0, 0, 0, 0, 0,
|
366
|
+
40, 0, 5, 0, 0, 0, 0, 40,
|
367
|
+
0, 0, 9, 9, 9, 0, 13, 1,
|
368
|
+
1, 3, 0, 0, 0, 13, 1, 1,
|
369
|
+
3, 0, 0, 0, 0, 7, 0, 0,
|
370
|
+
0, 0, 0, 37, 0, 7, 0, 0,
|
371
|
+
0, 0, 0, 37, 0, 7, 0, 0,
|
372
|
+
0, 0, 0, 37, 0, 5, 0, 0,
|
373
|
+
0, 0, 37, 0, 0, 34, 34, 34,
|
374
|
+
0, 13, 1, 1, 3, 0, 0, 0,
|
375
|
+
13, 1, 1, 3, 0, 0, 0, 0,
|
376
|
+
7, 0, 0, 0, 0, 0, 25, 0,
|
377
|
+
5, 0, 0, 0, 0, 25, 1, 1,
|
378
|
+
1, 25, 43, 0, 43, 43, 0, 0,
|
379
|
+
0, 0, 0, 0, 7, 0, 0, 0,
|
380
|
+
0, 0, 31, 0, 7, 0, 0, 0,
|
381
|
+
0, 0, 31, 0, 7, 0, 0, 0,
|
382
|
+
0, 0, 31, 0, 7, 0, 0, 0,
|
383
|
+
0, 0, 31, 0, 7, 0, 0, 0,
|
384
|
+
0, 0, 31, 0, 5, 0, 0, 0,
|
385
|
+
0, 31, 1, 1, 1, 1, 1, 1,
|
386
|
+
1, 31, 0, 31, 22, 22, 22, 0,
|
387
|
+
0, 22, 22, 22, 0, 0, 7, 0,
|
388
|
+
0, 0, 0, 0, 28, 0, 7, 0,
|
389
|
+
0, 0, 0, 0, 28, 0, 7, 0,
|
390
|
+
0, 0, 0, 0, 28, 0, 7, 0,
|
391
|
+
0, 0, 0, 0, 28, 0, 7, 0,
|
392
|
+
0, 0, 0, 0, 28, 0, 7, 0,
|
393
|
+
0, 0, 0, 0, 28, 0, 5, 0,
|
394
|
+
0, 0, 0, 28, 0, 0, 9, 9,
|
395
|
+
9, 1, 0, 13, 1, 1, 3, 0,
|
396
|
+
0, 0, 0, 9, 9, 9, 0, 13,
|
397
|
+
1, 1, 3, 0, 0, 0, 0, 19,
|
398
|
+
19, 19, 0, 0, 0, 0, 0, 0,
|
399
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
400
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
401
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
402
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
403
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
404
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
405
|
+
0, 7, 0, 0, 0, 0, 0, 25,
|
406
|
+
0, 7, 0, 0, 0, 0, 0, 31,
|
407
|
+
0, 7, 0, 0, 0, 0, 0, 31,
|
408
|
+
0, 7, 0, 0, 0, 0, 0, 31,
|
409
|
+
0, 7, 0, 0, 0, 0, 0, 31,
|
410
|
+
0, 7, 0, 0, 0, 0, 0, 31,
|
411
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
412
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
413
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
414
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
415
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
416
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
417
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
418
|
+
0, 0, 0, 0, 0, 0, 0
|
186
419
|
]
|
187
420
|
|
188
421
|
class << self
|
@@ -190,13 +423,23 @@ class << self
|
|
190
423
|
private :_simple_lexer_eof_actions, :_simple_lexer_eof_actions=
|
191
424
|
end
|
192
425
|
self._simple_lexer_eof_actions = [
|
193
|
-
0, 0, 0, 0, 0, 0, 0,
|
194
|
-
|
195
|
-
|
196
|
-
|
426
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
427
|
+
47, 11, 0, 11, 11, 0, 11, 11,
|
428
|
+
11, 11, 11, 0, 11, 0, 0, 0,
|
429
|
+
40, 40, 40, 40, 40, 40, 40, 40,
|
430
|
+
40, 40, 40, 40, 40, 40, 40, 40,
|
431
|
+
40, 40, 0, 40, 40, 40, 40, 40,
|
432
|
+
40, 37, 37, 37, 37, 0, 37, 37,
|
433
|
+
37, 37, 37, 37, 25, 25, 25, 0,
|
434
|
+
31, 31, 31, 31, 31, 31, 31, 31,
|
435
|
+
0, 0, 28, 28, 28, 28, 28, 28,
|
436
|
+
28, 0, 28, 28, 0, 28, 28, 28,
|
437
|
+
28, 0, 25, 25, 25, 25, 25, 25,
|
438
|
+
25, 31, 31, 31, 31, 31, 0, 0,
|
197
439
|
0, 0, 0, 0, 0, 0, 0, 0,
|
198
440
|
0, 0, 0, 0, 0, 0, 0, 0,
|
199
|
-
|
441
|
+
0, 0, 0, 0, 0, 0, 0, 0,
|
442
|
+
0, 0, 0, 0, 0
|
200
443
|
]
|
201
444
|
|
202
445
|
class << self
|
@@ -206,7 +449,7 @@ self.simple_lexer_start = 1;
|
|
206
449
|
class << self
|
207
450
|
attr_accessor :simple_lexer_first_final
|
208
451
|
end
|
209
|
-
self.simple_lexer_first_final =
|
452
|
+
self.simple_lexer_first_final = 132;
|
210
453
|
class << self
|
211
454
|
attr_accessor :simple_lexer_error
|
212
455
|
end
|
@@ -218,11 +461,12 @@ end
|
|
218
461
|
self.simple_lexer_en_main = 1;
|
219
462
|
|
220
463
|
|
221
|
-
# line
|
222
|
-
# %% this just fixes
|
464
|
+
# line 79 "gen_vcfheaderline_parser.rl"
|
465
|
+
# %% this just fixes syntax highlighting...
|
223
466
|
|
224
467
|
def self.run_lexer(buf, options = {})
|
225
468
|
do_debug = (options[:debug] == true)
|
469
|
+
$stderr.print "---> ",buf,"\n" if do_debug
|
226
470
|
data = buf.unpack("c*") if(buf.is_a?(String))
|
227
471
|
eof = data.length
|
228
472
|
values = []
|
@@ -231,23 +475,23 @@ def self.run_lexer(buf, options = {})
|
|
231
475
|
emit = lambda { |type, data, ts, p|
|
232
476
|
# Print the type and text of the last read token
|
233
477
|
# p ts,p
|
234
|
-
|
478
|
+
$stderr.print "EMITTED: #{type}: #{data[ts...p].pack('c*')}\n" if do_debug
|
235
479
|
values << [type,data[ts...p].pack('c*')]
|
236
480
|
}
|
237
481
|
|
238
482
|
error_code = nil
|
239
483
|
|
240
484
|
|
241
|
-
# line
|
485
|
+
# line 486 "gen_vcfheaderline_parser.rb"
|
242
486
|
begin
|
243
487
|
p ||= 0
|
244
488
|
pe ||= data.length
|
245
489
|
cs = simple_lexer_start
|
246
490
|
end
|
247
491
|
|
248
|
-
# line
|
492
|
+
# line 99 "gen_vcfheaderline_parser.rl"
|
249
493
|
|
250
|
-
# line
|
494
|
+
# line 495 "gen_vcfheaderline_parser.rb"
|
251
495
|
begin
|
252
496
|
_klen, _trans, _keys, _acts, _nacts = nil
|
253
497
|
_goto_level = 0
|
@@ -318,7 +562,6 @@ begin
|
|
318
562
|
_trans += _klen
|
319
563
|
end
|
320
564
|
end while false
|
321
|
-
_trans = _simple_lexer_indicies[_trans]
|
322
565
|
cs = _simple_lexer_trans_targs[_trans]
|
323
566
|
if _simple_lexer_trans_actions[_trans] != 0
|
324
567
|
_acts = _simple_lexer_trans_actions[_trans]
|
@@ -329,50 +572,78 @@ begin
|
|
329
572
|
_acts += 1
|
330
573
|
case _simple_lexer_actions[_acts - 1]
|
331
574
|
when 0 then
|
332
|
-
# line
|
575
|
+
# line 33 "gen_vcfheaderline_parser.rl"
|
333
576
|
begin
|
334
577
|
ts=p end
|
335
578
|
when 1 then
|
336
|
-
# line
|
579
|
+
# line 34 "gen_vcfheaderline_parser.rl"
|
337
580
|
begin
|
338
581
|
|
339
582
|
emit.call(:value,data,ts,p)
|
340
583
|
end
|
341
584
|
when 2 then
|
342
|
-
# line
|
585
|
+
# line 38 "gen_vcfheaderline_parser.rl"
|
343
586
|
begin
|
344
587
|
|
345
588
|
emit.call(:kw,data,ts,p)
|
346
589
|
end
|
347
590
|
when 3 then
|
348
|
-
# line
|
591
|
+
# line 58 "gen_vcfheaderline_parser.rl"
|
349
592
|
begin
|
350
593
|
emit.call(:key_word,data,ts,p) end
|
351
594
|
when 4 then
|
352
|
-
# line
|
595
|
+
# line 59 "gen_vcfheaderline_parser.rl"
|
353
596
|
begin
|
354
597
|
emit.call(:value,data,ts,p) end
|
355
598
|
when 5 then
|
356
|
-
# line
|
599
|
+
# line 60 "gen_vcfheaderline_parser.rl"
|
357
600
|
begin
|
358
601
|
emit.call(:value,data,ts,p) end
|
359
602
|
when 6 then
|
360
|
-
# line
|
603
|
+
# line 62 "gen_vcfheaderline_parser.rl"
|
361
604
|
begin
|
362
605
|
emit.call(:value,data,ts,p) end
|
363
606
|
when 7 then
|
364
|
-
# line
|
607
|
+
# line 65 "gen_vcfheaderline_parser.rl"
|
365
608
|
begin
|
366
|
-
|
609
|
+
emit.call(:value,data,ts,p) end
|
367
610
|
when 8 then
|
368
|
-
# line
|
611
|
+
# line 67 "gen_vcfheaderline_parser.rl"
|
369
612
|
begin
|
370
|
-
|
613
|
+
debug("ID FOUND") end
|
371
614
|
when 9 then
|
372
|
-
# line
|
615
|
+
# line 67 "gen_vcfheaderline_parser.rl"
|
616
|
+
begin
|
617
|
+
error_code="Malformed ID" end
|
618
|
+
when 10 then
|
619
|
+
# line 68 "gen_vcfheaderline_parser.rl"
|
620
|
+
begin
|
621
|
+
error_code="Version" end
|
622
|
+
when 11 then
|
623
|
+
# line 69 "gen_vcfheaderline_parser.rl"
|
373
624
|
begin
|
374
|
-
error_code="
|
375
|
-
|
625
|
+
error_code="Number" end
|
626
|
+
when 12 then
|
627
|
+
# line 70 "gen_vcfheaderline_parser.rl"
|
628
|
+
begin
|
629
|
+
debug("DATE FOUND") end
|
630
|
+
when 13 then
|
631
|
+
# line 70 "gen_vcfheaderline_parser.rl"
|
632
|
+
begin
|
633
|
+
error_code="Date" end
|
634
|
+
when 14 then
|
635
|
+
# line 71 "gen_vcfheaderline_parser.rl"
|
636
|
+
begin
|
637
|
+
error_code="GATK" end
|
638
|
+
when 15 then
|
639
|
+
# line 72 "gen_vcfheaderline_parser.rl"
|
640
|
+
begin
|
641
|
+
debug("KEY_VALUE found") end
|
642
|
+
when 16 then
|
643
|
+
# line 72 "gen_vcfheaderline_parser.rl"
|
644
|
+
begin
|
645
|
+
error_code="unknown key-value " end
|
646
|
+
# line 647 "gen_vcfheaderline_parser.rb"
|
376
647
|
end # action switch
|
377
648
|
end
|
378
649
|
end
|
@@ -400,31 +671,31 @@ when 9 then
|
|
400
671
|
__nacts -= 1
|
401
672
|
__acts += 1
|
402
673
|
case _simple_lexer_actions[__acts - 1]
|
403
|
-
when
|
404
|
-
# line
|
674
|
+
when 9 then
|
675
|
+
# line 67 "gen_vcfheaderline_parser.rl"
|
405
676
|
begin
|
406
|
-
|
407
|
-
when
|
408
|
-
# line
|
677
|
+
error_code="Malformed ID" end
|
678
|
+
when 10 then
|
679
|
+
# line 68 "gen_vcfheaderline_parser.rl"
|
409
680
|
begin
|
410
|
-
|
411
|
-
when
|
412
|
-
# line
|
681
|
+
error_code="Version" end
|
682
|
+
when 11 then
|
683
|
+
# line 69 "gen_vcfheaderline_parser.rl"
|
413
684
|
begin
|
414
|
-
|
415
|
-
when
|
416
|
-
# line
|
685
|
+
error_code="Number" end
|
686
|
+
when 13 then
|
687
|
+
# line 70 "gen_vcfheaderline_parser.rl"
|
417
688
|
begin
|
418
|
-
error_code="
|
419
|
-
when
|
420
|
-
# line
|
689
|
+
error_code="Date" end
|
690
|
+
when 14 then
|
691
|
+
# line 71 "gen_vcfheaderline_parser.rl"
|
421
692
|
begin
|
422
|
-
error_code="
|
423
|
-
when
|
424
|
-
# line
|
693
|
+
error_code="GATK" end
|
694
|
+
when 16 then
|
695
|
+
# line 72 "gen_vcfheaderline_parser.rl"
|
425
696
|
begin
|
426
|
-
error_code="key-value" end
|
427
|
-
# line
|
697
|
+
error_code="unknown key-value " end
|
698
|
+
# line 699 "gen_vcfheaderline_parser.rb"
|
428
699
|
end # eof action switch
|
429
700
|
end
|
430
701
|
if _trigger_goto
|
@@ -438,7 +709,7 @@ end
|
|
438
709
|
end
|
439
710
|
end
|
440
711
|
|
441
|
-
# line
|
712
|
+
# line 100 "gen_vcfheaderline_parser.rl"
|
442
713
|
|
443
714
|
raise "ERROR: "+error_code+" in "+buf if error_code
|
444
715
|
|
@@ -446,8 +717,11 @@ end
|
|
446
717
|
res = {}
|
447
718
|
# p values
|
448
719
|
values.each_slice(2) do | a,b |
|
449
|
-
|
450
|
-
|
720
|
+
$stderr.print '*',a,b if do_debug
|
721
|
+
keyword = a[1]
|
722
|
+
value = b[1]
|
723
|
+
value = value.to_i if ['length','Epoch'].index(keyword)
|
724
|
+
res[keyword] = value
|
451
725
|
# p h[:value] if h[:name]==:identifier or h[:name]==:value or h[:name]==:string
|
452
726
|
end
|
453
727
|
rescue
|
@@ -455,7 +729,7 @@ end
|
|
455
729
|
p values
|
456
730
|
raise
|
457
731
|
end
|
458
|
-
|
732
|
+
$stderr.print(res,"\n") if do_debug
|
459
733
|
res
|
460
734
|
end
|
461
735
|
end
|
@@ -464,7 +738,19 @@ end
|
|
464
738
|
|
465
739
|
if __FILE__ == $0
|
466
740
|
|
741
|
+
gatkcommandline = <<LINE1
|
742
|
+
##GATKCommandLine=<ID=CombineVariants,Version=3.2-2-gec30cee,Date="Thu Oct 30 13:41:59 CET 2014",Epoch=1414672919266,CommandLineOptions="analysis_type=CombineVariants input_file=[] showFullBamList=false read_buffer_size=null phone_home=AWS gatk_key=null tag=NA read_filter=[] intervals=null excludeIntervals=null interval_set_rule=UNION interval_merging=ALL interval_padding=0 reference_sequence=/hpc/cog_bioinf/GENOMES/Homo_sapiens.GRCh37.GATK.illumina/Homo_sapiens.GRCh37.GATK.illumina.fasta nonDeterministicRandomSeed=false disableDithering=false maxRuntime=-1 maxRuntimeUnits=MINUTES downsampling_type=BY_SAMPLE downsample_to_fraction=null downsample_to_coverage=1000 baq=OFF baqGapOpenPenalty=40.0 refactor_NDN_cigar_string=false fix_misencoded_quality_scores=false allow_potentially_misencoded_quality_scores=false useOriginalQualities=false defaultBaseQualities=-1 performanceLog=null BQSR=null quantize_quals=0 disable_indel_quals=false emit_original_quals=false preserve_qscores_less_than=6 globalQScorePrior=-1.0 validation_strictness=SILENT remove_program_records=false keep_program_records=false sample_rename_mapping_file=null unsafe=null disable_auto_index_creation_and_locking_when_reading_rods=false num_threads=1 num_cpu_threads_per_data_thread=1 num_io_threads=0 monitorThreadEfficiency=false num_bam_file_handles=null read_group_black_list=null pedigree=[] pedigreeString=[] pedigreeValidationType=STRICT allow_intervals_with_unindexed_bam=false generateShadowBCF=false variant_index_type=DYNAMIC_SEEK variant_index_parameter=-1 logging_level=INFO log_to_file=null help=false version=false variant=[(RodBindingCollection [(RodBinding name=variant source=/hpc/cog_bioinf/data/robert/testIAP/testSubsetExome/tmp/testSubsetExome.filtered_snps.vcf)]), (RodBindingCollection [(RodBinding name=variant2 source=/hpc/cog_bioinf/data/robert/testIAP/testSubsetExome/tmp/testSubsetExome.filtered_indels.vcf)])] out=org.broadinstitute.gatk.engine.io.stubs.VariantContextWriterStub no_cmdline_in_header=org.broadinstitute.gatk.engine.io.stubs.VariantContextWriterStub sites_only=org.broadinstitute.gatk.engine.io.stubs.VariantContextWriterStub bcf=org.broadinstitute.gatk.engine.io.stubs.VariantContextWriterStub genotypemergeoption=UNSORTED filteredrecordsmergetype=KEEP_IF_ANY_UNFILTERED multipleallelesmergetype=BY_TYPE rod_priority_list=null printComplexMerges=false filteredAreUncalled=false minimalVCF=false excludeNonVariants=false setKey=set assumeIdenticalSamples=false minimumN=1 suppressCommandLineHeader=false mergeInfoWithMaxAC=false filter_reads_with_N_cigar=false filter_mismatching_base_and_quals=false filter_bases_not_stored=false">
|
743
|
+
LINE1
|
744
|
+
|
745
|
+
h = {}
|
746
|
+
s = gatkcommandline.strip
|
747
|
+
# print s,"\n"
|
748
|
+
result = BioVcf::VcfHeaderParser::RagelKeyValues.run_lexer(s, debug: true)
|
749
|
+
# h[result['ID']] = result
|
750
|
+
# p result
|
751
|
+
|
467
752
|
lines = <<LINES
|
753
|
+
##FILTER=<ID=HaplotypeScoreHigh,Description="HaplotypeScore > 13.0">
|
468
754
|
##FORMAT=<ID=GT,Number=1,Type=String,Description="Genotype">
|
469
755
|
##FORMAT=<ID=DP,Number=1,Type=Integer,Description="Total read depth",Extra="Yes?">
|
470
756
|
##FORMAT=<ID=DP4,Number=4,Type=Integer,Description="# high-quality ref-forward bases, ref-reverse, alt-forward and alt-reverse bases">
|
@@ -473,11 +759,20 @@ lines = <<LINES
|
|
473
759
|
##INFO=<ID=GENEINFO,Number=1,Type=String,Description="Pairs each of gene symbol:gene id. The gene symbol and id are delimited by a colon (:), and each pair is delimited by a vertical bar (|)">
|
474
760
|
##INFO=<ID=CLNHGVS,Number=.,Type=String,Description="Variant names from HGVS. The order of these variants corresponds to the order of the info in the other clinical INFO tags.">
|
475
761
|
##INFO=<ID=CLNHGVS1,Number=.,Type=String,Description="Variant names from \\"HGVS\\". The order of these 'variants' corresponds to the order of the info in the other clinical INFO tags.">
|
762
|
+
##contig=<ID=XXXY12>
|
763
|
+
##contig=<ID=Y,length=59373566>
|
476
764
|
LINES
|
477
765
|
|
766
|
+
h = {}
|
478
767
|
lines.strip.split("\n").each { |s|
|
479
|
-
print s,"\n"
|
480
|
-
|
768
|
+
# print s,"\n"
|
769
|
+
result = BioVcf::VcfHeaderParser::RagelKeyValues.run_lexer(s, debug: true)
|
770
|
+
h[result['ID']] = result
|
771
|
+
p result
|
481
772
|
}
|
773
|
+
p h
|
774
|
+
|
775
|
+
raise "ERROR" if h != {"HaplotypeScoreHigh"=>{"ID"=>"HaplotypeScoreHigh", "Description"=>"HaplotypeScore > 13.0"}, "GT"=>{"ID"=>"GT", "Number"=>"1", "Type"=>"String", "Description"=>"Genotype"}, "DP"=>{"ID"=>"DP", "Number"=>"1", "Type"=>"Integer", "Description"=>"Total read depth", "Extra"=>"Yes?"}, "DP4"=>{"ID"=>"DP4", "Number"=>"4", "Type"=>"Integer", "Description"=>"# high-quality ref-forward bases, ref-reverse, alt-forward and alt-reverse bases"}, "PM"=>{"ID"=>"PM", "Number"=>"0", "Type"=>"Flag", "Description"=>"Variant is Precious(Clinical,Pubmed Cited)"}, "VP"=>{"ID"=>"VP", "Number"=>"1", "Type"=>"String", "Description"=>"Variation Property. Documentation is at ftp://ftp.ncbi.nlm.nih.gov/snp/specs/dbSNP_BitField_latest.pdf", "Source"=>"dbsnp", "Version"=>"138"}, "GENEINFO"=>{"ID"=>"GENEINFO", "Number"=>"1", "Type"=>"String", "Description"=>"Pairs each of gene symbol:gene id. The gene symbol and id are delimited by a colon (:), and each pair is delimited by a vertical bar (|)"}, "CLNHGVS"=>{"ID"=>"CLNHGVS", "Number"=>".", "Type"=>"String", "Description"=>"Variant names from HGVS. The order of these variants corresponds to the order of the info in the other clinical INFO tags."}, "CLNHGVS1"=>{"ID"=>"CLNHGVS1", "Number"=>".", "Type"=>"String", "Description"=>"Variant names from \\\"HGVS\\\". The order of these 'variants' corresponds to the order of the info in the other clinical INFO tags."}, "XXXY12"=>{"ID"=>"XXXY12"}, "Y"=>{"ID"=>"Y", "length"=>59373566}}
|
776
|
+
|
482
777
|
|
483
778
|
end # test
|