ebnf 1.0.1 → 1.0.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cfb54bb9dd73a30b949c335b3b3ec864b3050041
4
- data.tar.gz: 2bfbee2ec0bf5768ae03d2a36b7f830e814e1c6f
3
+ metadata.gz: b7016a2ce8e6c7b23ec669880a9b3f3ddd381793
4
+ data.tar.gz: 625460a7f6f2c8155960fc5a8640e4b0d854d1cd
5
5
  SHA512:
6
- metadata.gz: 8cf6fde1acbc6282ee6da0f6eb9d6b10854bdd8473e8af87e53705903950ee6ac7f476dc830b9c1864f579628e6d4c383c97db08a44beafe399dc8f53f66a8f3
7
- data.tar.gz: 830ed0642e8967a4f0f0bfba231a509d3dca6f4c05c0774aa68dc1e4bc11d08661eb6e49ca97839661720aef68a2242dffb29507a6cf8b6d239a6dbc951f11ff
6
+ metadata.gz: e09689686d97b44c8845f66129a313006a7264722eb9694b35a675edf2c369b7795f7b3ca6bb6ee82c7567d3be4a752c74b4388b1d57e3f242759eec47e37199
7
+ data.tar.gz: 6aa62a952f16d3ccd018397a6652b65d3053f68b00c0d0ee767cae3e4686d659e7c5f7e94d89a80a10fdab271ad45e3a733e780372379be5aa7a611ef71b6e46
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.1
1
+ 1.0.2
data/bin/ebnf CHANGED
@@ -17,10 +17,10 @@ options = {
17
17
  :namespace => "http://www.w3.org/ns/formats/Turtle#",
18
18
  }
19
19
 
20
- out = STDOUT
20
+ input, out = nil, STDOUT
21
21
 
22
22
  OPT_ARGS = [
23
- ["--dbg", GetoptLong::NO_ARGUMENT, "Turn on debugging output"],
23
+ ["--debug", GetoptLong::NO_ARGUMENT, "Turn on debugging output"],
24
24
  ["--bnf", GetoptLong::NO_ARGUMENT, "Transform EBNF to BNF"],
25
25
  ["--evaluate","-e", GetoptLong::REQUIRED_ARGUMENT,"Evaluate argument as an EBNF document"],
26
26
  ["--ll1", GetoptLong::REQUIRED_ARGUMENT,"Generate First/Follow rules, argument is start symbol"],
@@ -53,7 +53,7 @@ opts = GetoptLong.new(*OPT_ARGS.map {|o| o[0..-2]})
53
53
 
54
54
  opts.each do |opt, arg|
55
55
  case opt
56
- when '--dbg' then options[:debug] = true
56
+ when '--debug' then options[:debug] = true
57
57
  when '--bnf' then options[:bnf] = true
58
58
  when '--evaluate' then input = arg
59
59
  when '--input-format' then options[:format] = arg.to_sym
data/lib/ebnf/ll1.rb CHANGED
@@ -285,7 +285,7 @@ module EBNF
285
285
  # A First/Follow conflict appears when _eps is in the first
286
286
  # of one rule and there is a token in the first and
287
287
  # follow of the same rule
288
- if rule.first.include?(:_eps) && !(overlap = ((rule.first & rule.follow) - [:eps])).empty?
288
+ if rule.first.include?(:_eps) && !(overlap = ((rule.first & (rule.follow || [])) - [:eps])).empty?
289
289
  error("First/Follow Conflict: #{overlap.first.inspect} is both first and follow of #{rule.sym}")
290
290
  end
291
291
 
@@ -306,7 +306,8 @@ module EBNF
306
306
  # A First/First conflict appears when there are two rules having
307
307
  # the same first, so the parser can't know which one to choose.
308
308
  if branchDict.has_key?(f)
309
- error("First/First Conflict: #{f.inspect} is also the condition for #{branchDict[f].first}")
309
+ #require 'byebug'; byebug
310
+ error("First/First Conflict: #{f.inspect} is the condition for both #{prod_rule.sym} and #{branchDict[f].first}")
310
311
  end
311
312
 
312
313
  debug(" alt") {"[#{f}] => #{prod}"}
data/lib/ebnf/parser.rb CHANGED
@@ -18,14 +18,20 @@ module EBNF
18
18
  #debug("eachRule(ws)") { "[#{cur_lineno}] #{s.inspect}" }
19
19
  when s = scanner.scan(%r(/\*([^\*]|\*[^\/])*\*/)m)
20
20
  # Eat comments /* .. */
21
+ cur_lineno += s.count("\n")
21
22
  debug("eachRule(comment)") { "[#{cur_lineno}] #{s.inspect}" }
22
23
  when s = scanner.scan(%r(\(\*([^\*]|\*[^\)])*\*\))m)
23
24
  # Eat comments (* .. *)
25
+ cur_lineno += s.count("\n")
24
26
  debug("eachRule(comment)") { "[#{cur_lineno}] #{s.inspect}" }
25
27
  when s = scanner.scan(%r((#(?!x)|//).*$))
26
- # Eat comments
28
+ # Eat comments // & #
27
29
  cur_lineno += s.count("\n")
28
30
  debug("eachRule(comment)") { "[#{cur_lineno}] #{s.inspect}" }
31
+ when s = scanner.scan(/\A["']/)
32
+ # Found a quote, scan until end of matching quote
33
+ s += scanner.scan_until(/#{scanner.matched}|$/)
34
+ r += s
29
35
  when s = scanner.scan(%r(^@terminals))
30
36
  #debug("eachRule(@terminals)") { "[#{cur_lineno}] #{s.inspect}" }
31
37
  yield(r) unless r.empty?
@@ -45,8 +51,15 @@ module EBNF
45
51
  @lineno = cur_lineno
46
52
  r = s
47
53
  else
48
- # Collect until end of line, or start of comment
49
- s = scanner.scan_until(%r((?:/\*)|$)m)
54
+ # Collect until end of line, or start of comment or quote
55
+ s = scanner.scan_until(%r{(?:[/\(]\*)|#(?!x)|//|["']|$})
56
+ if scanner.matched.length > 0
57
+ # Back up scan head before ending match
58
+ scanner.pos = scanner.pos - scanner.matched.length
59
+
60
+ # Remove matched from end of string
61
+ s = s[0..-(scanner.matched.length+1)]
62
+ end
50
63
  cur_lineno += s.count("\n")
51
64
  #debug("eachRule(rest)") { "[#{cur_lineno}] #{s.inspect}" }
52
65
  r += s
@@ -268,6 +281,7 @@ module EBNF
268
281
  # ((range "^<>'{}|^`") '-\[#x00-#x20\]')
269
282
  def terminal(s)
270
283
  s = s.strip
284
+ #STDERR.puts s.inspect
271
285
  case m = s[0,1]
272
286
  when '"', "'" # STRING1 or STRING2
273
287
  l, s = s[1..-1].split(m.rstrip, 2)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ebnf
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregg Kellogg
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-10 00:00:00.000000000 Z
11
+ date: 2016-11-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sxp
@@ -161,7 +161,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
161
161
  requirements:
162
162
  - - ">="
163
163
  - !ruby/object:Gem::Version
164
- version: '2.0'
164
+ version: 2.2.2
165
165
  required_rubygems_version: !ruby/object:Gem::Requirement
166
166
  requirements:
167
167
  - - ">="
@@ -169,9 +169,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
169
169
  version: '0'
170
170
  requirements: []
171
171
  rubyforge_project:
172
- rubygems_version: 2.4.8
172
+ rubygems_version: 2.5.1
173
173
  signing_key:
174
174
  specification_version: 4
175
175
  summary: EBNF parser and parser generator.
176
176
  test_files: []
177
- has_rdoc: false