kpeg 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 51480429b1da586193cac01b5aacafc05b79e338
4
- data.tar.gz: c5df043d969c4a8149cdd83cb8733b2fa0d05ed3
2
+ SHA256:
3
+ metadata.gz: 8addf56b471f186a44651884101f4159a94927b8c27d5c5eaed867388797fb49
4
+ data.tar.gz: cb1c89881fc980f4fd1bedd485a6f4cc0ac2e8aa9df8ffeb9690b9839be6b8be
5
5
  SHA512:
6
- metadata.gz: 93fc5844b6f727b5bc946e5d33449c93a0828ddc4177da0d479e474cf67a5e0cf3ad9fb57bd6e9ccb461e2fa2f84d90ed613af6963c3881539ec3a905a83c5f8
7
- data.tar.gz: 1b03c363938623ba1f9abdea0ca0b06106bf038f5c0bf6e00a3090ea7751936d5a74b3626612bda7879b2a34f0f11143e066bd4cea1ade45d77f33717004ec20
6
+ metadata.gz: 7207c6d8774c8eec993b962306df6fd529ae7910b279e98dda4f4d2000c4c2dd5183ca5d1ee28ba377fa4664d4b5c417c283fd539cf1b8c80db3ff9f6d66be1b
7
+ data.tar.gz: c6980f3355fb4a64cb49ae29ab050e09039074aea8720fab12000e6ce7716749276f4d4cf3a5831982e263de7b3c25c22f5850d4edc4fb06e5468be75943e41c
data/History.txt CHANGED
@@ -1,3 +1,10 @@
1
+ === 1.2.0 / 2021-10-20
2
+
3
+ * Speed up current_line
4
+
5
+
6
+ === (entries lost to time)
7
+
1
8
  === 0.10 / 2012-04-16
2
9
 
3
10
  * Minor enhancements
data/Manifest.txt CHANGED
@@ -1,6 +1,5 @@
1
1
  .autotest
2
2
  .hoeignore
3
- .travis.yml
4
3
  Gemfile
5
4
  History.txt
6
5
  LICENSE
data/README.rdoc CHANGED
@@ -240,15 +240,15 @@ For a good example of usage check out Talon[https://github.com/evanphx/talon]
240
240
  There are several examples available in the /examples directory. The upper
241
241
  parser has a readme with a step by step description of the grammar.
242
242
 
243
- == Projects using kpeg
243
+ == Projects
244
244
 
245
- Dang[https://github.com/veganstraightedge/dang]
245
+ {Dang}[https://github.com/veganstraightedge/dang]
246
246
 
247
247
  {Email Address Validator}[https://github.com/larb/email_address_validator]
248
248
 
249
- Callisto[https://github.com/dwaite/Callisto]
249
+ {Callisto}[https://github.com/dwaite/Callisto]
250
250
 
251
- Doodle[https://github.com/vito/doodle]
251
+ {Doodle}[https://github.com/vito/doodle]
252
252
 
253
- Kanbanpad[https://kanbanpad.com] (uses kpeg for parsing of the 'enter
253
+ {Kanbanpad}[https://kanbanpad.com] (uses kpeg for parsing of the 'enter
254
254
  something' bar)
@@ -112,7 +112,7 @@ module KPeg
112
112
  # Let default ruby string handling figure it out
113
113
  lang = ""
114
114
  end
115
- code << indentify("_tmp = scan(/\\A#{op.regexp}/#{lang})\n", indent)
115
+ code << indentify("_tmp = scan(/\\G#{op.regexp}/#{lang})\n", indent)
116
116
  when CharRange
117
117
  ss = save()
118
118
  if op.start.bytesize == 1 and op.fin.bytesize == 1
@@ -32,6 +32,7 @@ module KPeg
32
32
  @result = nil
33
33
  @failed_rule = nil
34
34
  @failing_rule_offset = -1
35
+ @line_offsets = nil
35
36
 
36
37
  setup_foreign_grammar
37
38
  end
@@ -150,9 +151,8 @@ module KPeg
150
151
  end
151
152
 
152
153
  def scan(reg)
153
- if m = reg.match(@string[@pos..-1])
154
- width = m.end(0)
155
- @pos += width
154
+ if m = reg.match(@string, @pos)
155
+ @pos = m.end(0)
156
156
  return true
157
157
  end
158
158
 
@@ -10,6 +10,7 @@ class KPeg::FormatParser
10
10
  @result = nil
11
11
  @failed_rule = nil
12
12
  @failing_rule_offset = -1
13
+ @line_offsets = nil
13
14
 
14
15
  setup_foreign_grammar
15
16
  end
@@ -26,17 +27,33 @@ class KPeg::FormatParser
26
27
  target + 1
27
28
  end
28
29
 
29
- def current_line(target=pos)
30
- cur_offset = 0
31
- cur_line = 0
30
+ if [].respond_to? :bsearch_index
31
+ def current_line(target=pos)
32
+ unless @line_offsets
33
+ @line_offsets = [-1]
34
+ total = 0
35
+ string.each_line do |line|
36
+ @line_offsets << total
37
+ total += line.size
38
+ end
39
+ @line_offsets << total
40
+ end
32
41
 
33
- string.each_line do |line|
34
- cur_line += 1
35
- cur_offset += line.size
36
- return cur_line if cur_offset >= target
42
+ @line_offsets.bsearch_index {|x| x >= target } || -1
37
43
  end
44
+ else
45
+ def current_line(target=pos)
46
+ cur_offset = 0
47
+ cur_line = 0
48
+
49
+ string.each_line do |line|
50
+ cur_line += 1
51
+ cur_offset += line.size
52
+ return cur_line if cur_offset >= target
53
+ end
38
54
 
39
- -1
55
+ -1
56
+ end
40
57
  end
41
58
 
42
59
  def lines
@@ -155,9 +172,8 @@ class KPeg::FormatParser
155
172
  end
156
173
 
157
174
  def scan(reg)
158
- if m = reg.match(@string[@pos..-1])
159
- width = m.end(0)
160
- @pos += width
175
+ if m = reg.match(@string, @pos)
176
+ @pos = m.end(0)
161
177
  return true
162
178
  end
163
179
 
@@ -522,7 +538,7 @@ class KPeg::FormatParser
522
538
  _tmp = match_string("-")
523
539
  break if _tmp
524
540
  self.pos = _save1
525
- _tmp = scan(/\A(?i-mx:[a-z][\w-]*)/)
541
+ _tmp = scan(/\G(?i-mx:[a-z][\w-]*)/)
526
542
  break if _tmp
527
543
  self.pos = _save1
528
544
  break
@@ -553,7 +569,7 @@ class KPeg::FormatParser
553
569
  _save = self.pos
554
570
  while true # sequence
555
571
  _text_start = self.pos
556
- _tmp = scan(/\A(?i-mx:[a-z_]\w*)/)
572
+ _tmp = scan(/\G(?i-mx:[a-z_]\w*)/)
557
573
  if _tmp
558
574
  text = get_text(_text_start)
559
575
  end
@@ -817,7 +833,7 @@ class KPeg::FormatParser
817
833
  _save1 = self.pos
818
834
  while true # sequence
819
835
  _text_start = self.pos
820
- _tmp = scan(/\A(?-mix:[0-7]{1,3})/)
836
+ _tmp = scan(/\G(?-mix:[0-7]{1,3})/)
821
837
  if _tmp
822
838
  text = get_text(_text_start)
823
839
  end
@@ -844,7 +860,7 @@ class KPeg::FormatParser
844
860
  break
845
861
  end
846
862
  _text_start = self.pos
847
- _tmp = scan(/\A(?i-mx:[a-f\d]{2})/)
863
+ _tmp = scan(/\G(?i-mx:[a-f\d]{2})/)
848
864
  if _tmp
849
865
  text = get_text(_text_start)
850
866
  end
@@ -875,7 +891,7 @@ class KPeg::FormatParser
875
891
  _save = self.pos
876
892
  while true # sequence
877
893
  _text_start = self.pos
878
- _tmp = scan(/\A(?-mix:[^\\"]+)/)
894
+ _tmp = scan(/\G(?-mix:[^\\"]+)/)
879
895
  if _tmp
880
896
  text = get_text(_text_start)
881
897
  end
@@ -1013,7 +1029,7 @@ class KPeg::FormatParser
1013
1029
  _save = self.pos
1014
1030
  while true # sequence
1015
1031
  _text_start = self.pos
1016
- _tmp = scan(/\A(?-mix:[^'])/)
1032
+ _tmp = scan(/\G(?-mix:[^'])/)
1017
1033
  if _tmp
1018
1034
  text = get_text(_text_start)
1019
1035
  end
@@ -1138,7 +1154,7 @@ class KPeg::FormatParser
1138
1154
  _tmp = match_string("\\/")
1139
1155
  break if _tmp
1140
1156
  self.pos = _save2
1141
- _tmp = scan(/\A(?-mix:[^\/])/)
1157
+ _tmp = scan(/\G(?-mix:[^\/])/)
1142
1158
  break if _tmp
1143
1159
  self.pos = _save2
1144
1160
  break
@@ -1152,7 +1168,7 @@ class KPeg::FormatParser
1152
1168
  _tmp = match_string("\\/")
1153
1169
  break if _tmp
1154
1170
  self.pos = _save3
1155
- _tmp = scan(/\A(?-mix:[^\/])/)
1171
+ _tmp = scan(/\G(?-mix:[^\/])/)
1156
1172
  break if _tmp
1157
1173
  self.pos = _save3
1158
1174
  break
@@ -1265,7 +1281,7 @@ class KPeg::FormatParser
1265
1281
  _save = self.pos
1266
1282
  while true # sequence
1267
1283
  _text_start = self.pos
1268
- _tmp = scan(/\A(?i-mx:[a-z\d])/)
1284
+ _tmp = scan(/\G(?i-mx:[a-z\d])/)
1269
1285
  if _tmp
1270
1286
  text = get_text(_text_start)
1271
1287
  end
@@ -1335,7 +1351,7 @@ class KPeg::FormatParser
1335
1351
  _save = self.pos
1336
1352
  while true # sequence
1337
1353
  _text_start = self.pos
1338
- _tmp = scan(/\A(?-mix:[1-9]\d*)/)
1354
+ _tmp = scan(/\G(?-mix:[1-9]\d*)/)
1339
1355
  if _tmp
1340
1356
  text = get_text(_text_start)
1341
1357
  end
@@ -1510,7 +1526,7 @@ class KPeg::FormatParser
1510
1526
  return _tmp
1511
1527
  end
1512
1528
 
1513
- # curly = "{" < (/[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
1529
+ # curly = "{" < (spaces | /[^{}"']+/ | string | curly)* > "}" { @g.action(text) }
1514
1530
  def _curly
1515
1531
 
1516
1532
  _save = self.pos
@@ -1525,7 +1541,10 @@ class KPeg::FormatParser
1525
1541
 
1526
1542
  _save2 = self.pos
1527
1543
  while true # choice
1528
- _tmp = scan(/\A(?-mix:[^{}"']+)/)
1544
+ _tmp = apply(:_spaces)
1545
+ break if _tmp
1546
+ self.pos = _save2
1547
+ _tmp = scan(/\G(?-mix:[^{}"']+)/)
1529
1548
  break if _tmp
1530
1549
  self.pos = _save2
1531
1550
  _tmp = apply(:_string)
@@ -1578,7 +1597,7 @@ class KPeg::FormatParser
1578
1597
 
1579
1598
  _save2 = self.pos
1580
1599
  while true # choice
1581
- _tmp = scan(/\A(?-mix:[^()"']+)/)
1600
+ _tmp = scan(/\G(?-mix:[^()"']+)/)
1582
1601
  break if _tmp
1583
1602
  self.pos = _save2
1584
1603
  _tmp = apply(:_string)
@@ -2615,7 +2634,7 @@ class KPeg::FormatParser
2615
2634
  break
2616
2635
  end
2617
2636
  _text_start = self.pos
2618
- _tmp = scan(/\A(?-mix:[:\w]+)/)
2637
+ _tmp = scan(/\G(?-mix:[:\w]+)/)
2619
2638
  if _tmp
2620
2639
  text = get_text(_text_start)
2621
2640
  end
@@ -2913,7 +2932,7 @@ class KPeg::FormatParser
2913
2932
  _save = self.pos
2914
2933
  while true # sequence
2915
2934
  _text_start = self.pos
2916
- _tmp = scan(/\A(?-mix:[A-Z]\w*)/)
2935
+ _tmp = scan(/\G(?-mix:[A-Z]\w*)/)
2917
2936
  if _tmp
2918
2937
  text = get_text(_text_start)
2919
2938
  end
@@ -2939,7 +2958,7 @@ class KPeg::FormatParser
2939
2958
  _save = self.pos
2940
2959
  while true # sequence
2941
2960
  _text_start = self.pos
2942
- _tmp = scan(/\A(?i-mx:[a-z_]\w*)/)
2961
+ _tmp = scan(/\G(?i-mx:[a-z_]\w*)/)
2943
2962
  if _tmp
2944
2963
  text = get_text(_text_start)
2945
2964
  end
@@ -3156,7 +3175,7 @@ class KPeg::FormatParser
3156
3175
  Rules[:_range_elem] = rule_info("range_elem", "< (range_num | kleene) > { text }")
3157
3176
  Rules[:_mult_range] = rule_info("mult_range", "(\"[\" - range_elem:l - \",\" - range_elem:r - \"]\" { [l == \"*\" ? nil : l.to_i, r == \"*\" ? nil : r.to_i] } | \"[\" - range_num:e - \"]\" { [e.to_i, e.to_i] })")
3158
3177
  Rules[:_curly_block] = rule_info("curly_block", "curly")
3159
- Rules[:_curly] = rule_info("curly", "\"{\" < (/[^{}\"']+/ | string | curly)* > \"}\" { @g.action(text) }")
3178
+ Rules[:_curly] = rule_info("curly", "\"{\" < (spaces | /[^{}\"']+/ | string | curly)* > \"}\" { @g.action(text) }")
3160
3179
  Rules[:_nested_paren] = rule_info("nested_paren", "\"(\" (/[^()\"']+/ | string | nested_paren)* \")\"")
3161
3180
  Rules[:_value] = rule_info("value", "(value:v \":\" var:n { @g.t(v,n) } | value:v \"?\" { @g.maybe(v) } | value:v \"+\" { @g.many(v) } | value:v \"*\" { @g.kleene(v) } | value:v mult_range:r { @g.multiple(v, *r) } | \"&\" value:v { @g.andp(v) } | \"!\" value:v { @g.notp(v) } | \"(\" - expression:o - \")\" { o } | \"@<\" - expression:o - \">\" { @g.bounds(o) } | \"<\" - expression:o - \">\" { @g.collect(o) } | curly_block | \"~\" method:m < nested_paren? > { @g.action(\"\#{m}\#{text}\") } | \".\" { @g.dot } | \"@\" var:name < nested_paren? > !(- \"=\") { @g.invoke(name, text.empty? ? nil : text) } | \"^\" var:name < nested_paren? > { @g.foreign_invoke(\"parent\", name, text) } | \"%\" var:gram \".\" var:name < nested_paren? > { @g.foreign_invoke(gram, name, text) } | var:name < nested_paren? > !(- \"=\") { @g.ref(name, nil, text.empty? ? nil : text) } | char_range | regexp | string)")
3162
3181
  Rules[:_spaces] = rule_info("spaces", "(space | comment)+")
data/lib/kpeg/position.rb CHANGED
@@ -10,17 +10,33 @@ module KPeg
10
10
  target + 1
11
11
  end
12
12
 
13
- def current_line(target=pos)
14
- cur_offset = 0
15
- cur_line = 0
16
-
17
- string.each_line do |line|
18
- cur_line += 1
19
- cur_offset += line.size
20
- return cur_line if cur_offset >= target
13
+ if [].respond_to? :bsearch_index
14
+ def current_line(target=pos)
15
+ unless @line_offsets
16
+ @line_offsets = [-1]
17
+ total = 0
18
+ string.each_line do |line|
19
+ @line_offsets << total
20
+ total += line.size
21
+ end
22
+ @line_offsets << total
23
+ end
24
+
25
+ @line_offsets.bsearch_index {|x| x >= target } || -1
26
+ end
27
+ else
28
+ def current_line(target=pos)
29
+ cur_offset = 0
30
+ cur_line = 0
31
+
32
+ string.each_line do |line|
33
+ cur_line += 1
34
+ cur_offset += line.size
35
+ return cur_line if cur_offset >= target
36
+ end
37
+
38
+ -1
21
39
  end
22
-
23
- -1
24
40
  end
25
41
 
26
42
  def lines
@@ -18,6 +18,7 @@ class KPeg::StringEscape
18
18
  @result = nil
19
19
  @failed_rule = nil
20
20
  @failing_rule_offset = -1
21
+ @line_offsets = nil
21
22
 
22
23
  setup_foreign_grammar
23
24
  end
@@ -34,17 +35,33 @@ class KPeg::StringEscape
34
35
  target + 1
35
36
  end
36
37
 
37
- def current_line(target=pos)
38
- cur_offset = 0
39
- cur_line = 0
38
+ if [].respond_to? :bsearch_index
39
+ def current_line(target=pos)
40
+ unless @line_offsets
41
+ @line_offsets = [-1]
42
+ total = 0
43
+ string.each_line do |line|
44
+ @line_offsets << total
45
+ total += line.size
46
+ end
47
+ @line_offsets << total
48
+ end
40
49
 
41
- string.each_line do |line|
42
- cur_line += 1
43
- cur_offset += line.size
44
- return cur_line if cur_offset >= target
50
+ @line_offsets.bsearch_index {|x| x >= target } || -1
45
51
  end
52
+ else
53
+ def current_line(target=pos)
54
+ cur_offset = 0
55
+ cur_line = 0
56
+
57
+ string.each_line do |line|
58
+ cur_line += 1
59
+ cur_offset += line.size
60
+ return cur_line if cur_offset >= target
61
+ end
46
62
 
47
- -1
63
+ -1
64
+ end
48
65
  end
49
66
 
50
67
  def lines
@@ -163,9 +180,8 @@ class KPeg::StringEscape
163
180
  end
164
181
 
165
182
  def scan(reg)
166
- if m = reg.match(@string[@pos..-1])
167
- width = m.end(0)
168
- @pos += width
183
+ if m = reg.match(@string, @pos)
184
+ @pos = m.end(0)
169
185
  return true
170
186
  end
171
187
 
@@ -367,7 +383,7 @@ class KPeg::StringEscape
367
383
  _save1 = self.pos
368
384
  while true # sequence
369
385
  _text_start = self.pos
370
- _tmp = scan(/\A(?-mix:[\w ]+)/)
386
+ _tmp = scan(/\G(?-mix:[\w ]+)/)
371
387
  if _tmp
372
388
  text = get_text(_text_start)
373
389
  end
data/lib/kpeg.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module KPeg
2
2
 
3
- VERSION = "1.1.0"
3
+ VERSION = "1.2.0"
4
4
 
5
5
  def self.grammar
6
6
  g = Grammar.new
@@ -80,7 +80,7 @@ class Test < KPeg::CompiledParser
80
80
 
81
81
  # root = /[0-9]/
82
82
  def _root
83
- _tmp = scan(/\\A(?-mix:[0-9])/)
83
+ _tmp = scan(/\\G(?-mix:[0-9])/)
84
84
  set_failed_rule :_root unless _tmp
85
85
  return _tmp
86
86
  end
@@ -114,7 +114,7 @@ class Test < KPeg::CompiledParser
114
114
 
115
115
  # root = /./
116
116
  def _root
117
- _tmp = scan(/\\A(?-mix:.)/)
117
+ _tmp = scan(/\\G(?-mix:.)/)
118
118
  set_failed_rule :_root unless _tmp
119
119
  return _tmp
120
120
  end
@@ -133,7 +133,7 @@ class Test < KPeg::CompiledParser
133
133
 
134
134
  # root = /./u
135
135
  def _root
136
- _tmp = scan(/\\A(?-mix:.)/u)
136
+ _tmp = scan(/\\G(?-mix:.)/u)
137
137
  set_failed_rule :_root unless _tmp
138
138
  return _tmp
139
139
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kpeg
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-07 00:00:00.000000000 Z
11
+ date: 2021-10-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: minitest
@@ -16,42 +16,48 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '5.8'
19
+ version: '5.14'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '5.8'
26
+ version: '5.14'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rdoc
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.0'
34
+ - - "<"
35
+ - !ruby/object:Gem::Version
36
+ version: '7'
34
37
  type: :development
35
38
  prerelease: false
36
39
  version_requirements: !ruby/object:Gem::Requirement
37
40
  requirements:
38
- - - "~>"
41
+ - - ">="
39
42
  - !ruby/object:Gem::Version
40
43
  version: '4.0'
44
+ - - "<"
45
+ - !ruby/object:Gem::Version
46
+ version: '7'
41
47
  - !ruby/object:Gem::Dependency
42
48
  name: hoe
43
49
  requirement: !ruby/object:Gem::Requirement
44
50
  requirements:
45
51
  - - "~>"
46
52
  - !ruby/object:Gem::Version
47
- version: '3.15'
53
+ version: '3.23'
48
54
  type: :development
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
51
57
  requirements:
52
58
  - - "~>"
53
59
  - !ruby/object:Gem::Version
54
- version: '3.15'
60
+ version: '3.23'
55
61
  description: |-
56
62
  KPeg is a simple PEG library for Ruby. It provides an API as well as native
57
63
  grammar to build the grammar.
@@ -75,7 +81,6 @@ extra_rdoc_files:
75
81
  files:
76
82
  - ".autotest"
77
83
  - ".hoeignore"
78
- - ".travis.yml"
79
84
  - Gemfile
80
85
  - History.txt
81
86
  - LICENSE
@@ -131,8 +136,10 @@ files:
131
136
  homepage: https://github.com/evanphx/kpeg
132
137
  licenses:
133
138
  - MIT
134
- metadata: {}
135
- post_install_message:
139
+ metadata:
140
+ homepage_uri: https://github.com/evanphx/kpeg
141
+ bug_tracker_uri: https://github.com/evanphx/kpeg/issues
142
+ post_install_message:
136
143
  rdoc_options:
137
144
  - "--main"
138
145
  - README.rdoc
@@ -149,9 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
156
  - !ruby/object:Gem::Version
150
157
  version: '0'
151
158
  requirements: []
152
- rubyforge_project:
153
- rubygems_version: 2.5.1
154
- signing_key:
159
+ rubygems_version: 3.2.15
160
+ signing_key:
155
161
  specification_version: 4
156
162
  summary: KPeg is a simple PEG library for Ruby
157
163
  test_files: []
data/.travis.yml DELETED
@@ -1,15 +0,0 @@
1
- ---
2
- script: rake travis
3
- before_script:
4
- - gem install hoe-travis --no-rdoc --no-ri
5
- - rake travis:before -t
6
- language: ruby
7
- notifications:
8
- email:
9
- - evan@fallingsnow.net
10
- - drbrain@segment7.net
11
- rvm:
12
- - 1.8.7
13
- - 1.9.2
14
- - 1.9.3
15
- - 2.0.0