Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions etc/ebnf.ebnf
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@

[13] HEX ::= '#x' ([a-f] | [A-F] | [0-9])+

[14] RANGE ::= '[' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'? ']'
[14] RANGE ::= '[' ('-' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ | ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'?) ']'

[15] O_RANGE ::= '[^' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'? ']'
[15] O_RANGE ::= '[^' ('-' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ | ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'?) ']'

# Strings are unescaped Unicode, excepting control characters and hash (#)
[16] STRING1 ::= '"' (CHAR - '"')* '"'
Expand Down
10 changes: 8 additions & 2 deletions etc/ebnf.ll1.sxp
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,15 @@
(terminal O_SYMBOL "12a" (plus (alt (range "a-z") (range "A-Z") (range "0-9") '_' '.')))
(terminal HEX "13" (seq '#x' (plus (alt (range "a-f") (range "A-F") (range "0-9")))))
(terminal RANGE "14"
(seq '[' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-') ']'))
(seq '['
(alt
(seq '-' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)))
(seq (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-'))) ']' ))
(terminal O_RANGE "15"
(seq '[^' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-') ']'))
(seq '[^'
(alt
(seq '-' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)))
(seq (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-'))) ']' ))
(terminal STRING1 "16" (seq '"' (star (diff CHAR '"')) '"'))
(terminal STRING2 "17" (seq "'" (star (diff CHAR "'")) "'"))
(terminal CHAR "18"
Expand Down
40 changes: 27 additions & 13 deletions etc/ebnf.peg.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# This file is automatically generated by ebnf version 2.5.0
# This file is automatically generated by ebnf version 2.6.0
# Derived from etc/ebnf.ebnf
module EBNFMeta
RULES = [
Expand Down Expand Up @@ -38,18 +38,32 @@ module EBNFMeta
EBNF::Rule.new(:_HEX_3, "13.3", [:range, "a-f"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_HEX_4, "13.4", [:range, "A-F"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_HEX_5, "13.5", [:range, "0-9"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:RANGE, "14", [:seq, "[", :_RANGE_1, :_RANGE_2, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_1, "14.1", [:plus, :_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_3, "14.3", [:alt, :_RANGE_4, :_RANGE_5, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_4, "14.4", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_5, "14.5", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_2, "14.2", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:O_RANGE, "15", [:seq, "[^", :_O_RANGE_1, :_O_RANGE_2, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_1, "15.1", [:plus, :_O_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_3, "15.3", [:alt, :_O_RANGE_4, :_O_RANGE_5, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_4, "15.4", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_5, "15.5", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_2, "15.2", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:RANGE, "14", [:seq, "[", :_RANGE_1, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_1, "14.1", [:alt, :_RANGE_2, :_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_2, "14.2", [:seq, "-", :_RANGE_4], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_4, "14.4", [:plus, :_RANGE_5], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_5, "14.5", [:alt, :_RANGE_6, :_RANGE_7, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_6, "14.6", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_7, "14.7", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_3, "14.3", [:seq, :_RANGE_8, :_RANGE_9], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_8, "14.8", [:plus, :_RANGE_10], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_10, "14.10", [:alt, :_RANGE_11, :_RANGE_12, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_11, "14.11", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_12, "14.12", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_9, "14.9", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:O_RANGE, "15", [:seq, "[^", :_O_RANGE_1, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_1, "15.1", [:alt, :_O_RANGE_2, :_O_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_2, "15.2", [:seq, "-", :_O_RANGE_4], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_4, "15.4", [:plus, :_O_RANGE_5], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_5, "15.5", [:alt, :_O_RANGE_6, :_O_RANGE_7, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_6, "15.6", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_7, "15.7", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_3, "15.3", [:seq, :_O_RANGE_8, :_O_RANGE_9], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_8, "15.8", [:plus, :_O_RANGE_10], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_10, "15.10", [:alt, :_O_RANGE_11, :_O_RANGE_12, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_11, "15.11", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_12, "15.12", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_9, "15.9", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:STRING1, "16", [:seq, "\"", :_STRING1_1, "\""], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_STRING1_1, "16.1", [:star, :_STRING1_2], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_STRING1_2, "16.2", [:diff, :CHAR, "\""], kind: :terminal).extend(EBNF::PEG::Rule),
Expand Down
38 changes: 26 additions & 12 deletions etc/ebnf.peg.sxp
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,32 @@
(terminal _HEX_3 "13.3" (range "a-f"))
(terminal _HEX_4 "13.4" (range "A-F"))
(terminal _HEX_5 "13.5" (range "0-9"))
(terminal RANGE "14" (seq '[' _RANGE_1 _RANGE_2 ']'))
(terminal _RANGE_1 "14.1" (plus _RANGE_3))
(terminal _RANGE_3 "14.3" (alt _RANGE_4 _RANGE_5 R_CHAR HEX))
(terminal _RANGE_4 "14.4" (seq R_CHAR '-' R_CHAR))
(terminal _RANGE_5 "14.5" (seq HEX '-' HEX))
(terminal _RANGE_2 "14.2" (opt '-'))
(terminal O_RANGE "15" (seq '[^' _O_RANGE_1 _O_RANGE_2 ']'))
(terminal _O_RANGE_1 "15.1" (plus _O_RANGE_3))
(terminal _O_RANGE_3 "15.3" (alt _O_RANGE_4 _O_RANGE_5 R_CHAR HEX))
(terminal _O_RANGE_4 "15.4" (seq R_CHAR '-' R_CHAR))
(terminal _O_RANGE_5 "15.5" (seq HEX '-' HEX))
(terminal _O_RANGE_2 "15.2" (opt '-'))
(terminal RANGE "14" (seq '[' _RANGE_1 ']'))
(terminal _RANGE_1 "14.1" (alt _RANGE_2 _RANGE_3))
(terminal _RANGE_2 "14.2" (seq '-' _RANGE_4))
(terminal _RANGE_4 "14.4" (plus _RANGE_5))
(terminal _RANGE_5 "14.5" (alt _RANGE_6 _RANGE_7 R_CHAR HEX))
(terminal _RANGE_6 "14.6" (seq R_CHAR '-' R_CHAR))
(terminal _RANGE_7 "14.7" (seq HEX '-' HEX))
(terminal _RANGE_3 "14.3" (seq _RANGE_8 _RANGE_9))
(terminal _RANGE_8 "14.8" (plus _RANGE_10))
(terminal _RANGE_10 "14.10" (alt _RANGE_11 _RANGE_12 R_CHAR HEX))
(terminal _RANGE_11 "14.11" (seq R_CHAR '-' R_CHAR))
(terminal _RANGE_12 "14.12" (seq HEX '-' HEX))
(terminal _RANGE_9 "14.9" (opt '-'))
(terminal O_RANGE "15" (seq '[^' _O_RANGE_1 ']'))
(terminal _O_RANGE_1 "15.1" (alt _O_RANGE_2 _O_RANGE_3))
(terminal _O_RANGE_2 "15.2" (seq '-' _O_RANGE_4))
(terminal _O_RANGE_4 "15.4" (plus _O_RANGE_5))
(terminal _O_RANGE_5 "15.5" (alt _O_RANGE_6 _O_RANGE_7 R_CHAR HEX))
(terminal _O_RANGE_6 "15.6" (seq R_CHAR '-' R_CHAR))
(terminal _O_RANGE_7 "15.7" (seq HEX '-' HEX))
(terminal _O_RANGE_3 "15.3" (seq _O_RANGE_8 _O_RANGE_9))
(terminal _O_RANGE_8 "15.8" (plus _O_RANGE_10))
(terminal _O_RANGE_10 "15.10" (alt _O_RANGE_11 _O_RANGE_12 R_CHAR HEX))
(terminal _O_RANGE_11 "15.11" (seq R_CHAR '-' R_CHAR))
(terminal _O_RANGE_12 "15.12" (seq HEX '-' HEX))
(terminal _O_RANGE_9 "15.9" (opt '-'))
(terminal STRING1 "16" (seq '"' _STRING1_1 '"'))
(terminal _STRING1_1 "16.1" (star _STRING1_2))
(terminal _STRING1_2 "16.2" (diff CHAR '"'))
Expand Down
10 changes: 8 additions & 2 deletions etc/ebnf.sxp
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,15 @@
(terminal O_SYMBOL "12a" (plus (alt (range "a-z") (range "A-Z") (range "0-9") '_' '.')))
(terminal HEX "13" (seq '#x' (plus (alt (range "a-f") (range "A-F") (range "0-9")))))
(terminal RANGE "14"
(seq '[' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-') ']'))
(seq '['
(alt
(seq '-' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)))
(seq (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-'))) ']' ))
(terminal O_RANGE "15"
(seq '[^' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-') ']'))
(seq '[^'
(alt
(seq '-' (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)))
(seq (plus (alt (seq R_CHAR '-' R_CHAR) (seq HEX '-' HEX) R_CHAR HEX)) (opt '-'))) ']' ))
(terminal STRING1 "16" (seq '"' (star (diff CHAR '"')) '"'))
(terminal STRING2 "17" (seq "'" (star (diff CHAR "'")) "'"))
(terminal CHAR "18"
Expand Down
41 changes: 27 additions & 14 deletions lib/ebnf/ebnf/meta.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# This file is automatically generated by ebnf version 2.5.0
# This file is automatically generated by ebnf version 2.6.0
# Derived from etc/ebnf.ebnf
module EBNFMeta
RULES = [
Expand Down Expand Up @@ -38,19 +38,32 @@ module EBNFMeta
EBNF::Rule.new(:_HEX_3, "13.3", [:range, "a-f"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_HEX_4, "13.4", [:range, "A-F"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_HEX_5, "13.5", [:range, "0-9"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:RANGE, "14", [:seq, "[", :_RANGE_1, :_RANGE_2, :_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_1, "14.1", [:plus, :_RANGE_4], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_4, "14.4", [:alt, :_RANGE_5, :_RANGE_6, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_5, "14.5", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_6, "14.6", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_2, "14.2", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_3, "14.3", [:diff, "]", :LHS], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:O_RANGE, "15", [:seq, "[^", :_O_RANGE_1, :_O_RANGE_2, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_1, "15.1", [:plus, :_O_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_3, "15.3", [:alt, :_O_RANGE_4, :_O_RANGE_5, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_4, "15.4", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_5, "15.5", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_2, "15.2", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:RANGE, "14", [:seq, "[", :_RANGE_1, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_1, "14.1", [:alt, :_RANGE_2, :_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_2, "14.2", [:seq, "-", :_RANGE_4], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_4, "14.4", [:plus, :_RANGE_5], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_5, "14.5", [:alt, :_RANGE_6, :_RANGE_7, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_6, "14.6", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_7, "14.7", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_3, "14.3", [:seq, :_RANGE_8, :_RANGE_9], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_8, "14.8", [:plus, :_RANGE_10], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_10, "14.10", [:alt, :_RANGE_11, :_RANGE_12, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_11, "14.11", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_12, "14.12", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_RANGE_9, "14.9", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:O_RANGE, "15", [:seq, "[^", :_O_RANGE_1, "]"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_1, "15.1", [:alt, :_O_RANGE_2, :_O_RANGE_3], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_2, "15.2", [:seq, "-", :_O_RANGE_4], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_4, "15.4", [:plus, :_O_RANGE_5], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_5, "15.5", [:alt, :_O_RANGE_6, :_O_RANGE_7, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_6, "15.6", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_7, "15.7", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_3, "15.3", [:seq, :_O_RANGE_8, :_O_RANGE_9], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_8, "15.8", [:plus, :_O_RANGE_10], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_10, "15.10", [:alt, :_O_RANGE_11, :_O_RANGE_12, :R_CHAR, :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_11, "15.11", [:seq, :R_CHAR, "-", :R_CHAR], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_12, "15.12", [:seq, :HEX, "-", :HEX], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_O_RANGE_9, "15.9", [:opt, "-"], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:STRING1, "16", [:seq, "\"", :_STRING1_1, "\""], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_STRING1_1, "16.1", [:star, :_STRING1_2], kind: :terminal).extend(EBNF::PEG::Rule),
EBNF::Rule.new(:_STRING1_2, "16.2", [:diff, :CHAR, "\""], kind: :terminal).extend(EBNF::PEG::Rule),
Expand Down
29 changes: 16 additions & 13 deletions lib/ebnf/terminals.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
# encoding: utf-8
# Terminal definitions for the EBNF grammar
module EBNF::Terminals
SYMBOL_BASE = %r(\b[a-zA-Z0-9_\.]+\b)u.freeze # Word boundaries
SYMBOL = %r((?:#{SYMBOL_BASE}|(?:<#{SYMBOL_BASE}>))(?!\s*::=))u.freeze
HEX = %r(\#x\h+)u.freeze
CHAR = %r([\u0009\u000A\u000D\u0020-\uD7FF\u{10000}-\u{10FFFF}])u.freeze
R_CHAR = %r([\u0009\u000A\u000D\u0020-\u002C\u002E-\u005C\u005E-\uD7FF\u{10000}-\u{10FFFF}])u.freeze
LHS = %r((?:\[#{SYMBOL_BASE}\])?\s*<?#{SYMBOL_BASE}>?\s*::=)u.freeze
RANGE = %r(\[(?:(?:#{R_CHAR}\-#{R_CHAR})|(?:#{HEX}\-#{HEX})|#{R_CHAR}|#{HEX})+-?\])u.freeze
RANGE_NOT_LHS = %r(\[(?:(?:#{R_CHAR}\-#{R_CHAR})|(?:#{HEX}\-#{HEX})|#{R_CHAR}|#{HEX})+-?\](?!\s*<?#{SYMBOL_BASE}>?\s*::=))u.freeze
O_RANGE = %r(\[\^(?:(?:#{R_CHAR}\-#{R_CHAR})|(?:#{HEX}\-#{HEX}|#{R_CHAR}|#{HEX}))+-?\])u.freeze
STRING1 = %r("[\u0009\u000A\u000D\u0020\u0021\u0023-\uD7FF\u{10000}-\u{10FFFF}]*")u.freeze
STRING2 = %r('[\u0009\u000A\u000D\u0020-\u0026\u0028-\uD7FF\u{10000}-\u{10FFFF}]*')u.freeze
POSTFIX = %r([?*+])u.freeze
PASS = %r((
SYMBOL_BASE = %r(\b[a-zA-Z0-9_\.]+\b)u.freeze # Word boundaries
SYMBOL = %r((?:#{SYMBOL_BASE}|(?:<#{SYMBOL_BASE}>))(?!\s*::=))u.freeze
HEX = %r(\#x\h+)u.freeze
CHAR = %r([\u0009\u000A\u000D\u0020-\uD7FF\u{10000}-\u{10FFFF}])u.freeze
R_CHAR = %r([\u0009\u000A\u000D\u0020-\u002C\u002E-\u005C\u005E-\uD7FF\u{10000}-\u{10FFFF}])u.freeze
LHS = %r((?:\[#{SYMBOL_BASE}\])?\s*<?#{SYMBOL_BASE}>?\s*::=)u.freeze
BRKT = %r((?:#{R_CHAR}\-#{R_CHAR})|(?:#{HEX}\-#{HEX})|#{R_CHAR}|#{HEX})u.freeze
BRKT_LEAD = %r(-#{BRKT}+)u.freeze
BRKT_TRAIL = %r(#{BRKT}+-?)u.freeze
RANGE = %r(\[(?:#{BRKT_LEAD}|#{BRKT_TRAIL})\])u.freeze
RANGE_NOT_LHS = %r(\[(?:#{BRKT_LEAD}|#{BRKT_TRAIL})\](?!\s*<?#{SYMBOL_BASE}>?\s*::=))u.freeze
O_RANGE = %r(\[\^(?:#{BRKT_LEAD}|#{BRKT_TRAIL})\])u.freeze
STRING1 = %r("[\u0009\u000A\u000D\u0020\u0021\u0023-\uD7FF\u{10000}-\u{10FFFF}]*")u.freeze
STRING2 = %r('[\u0009\u000A\u000D\u0020-\u0026\u0028-\uD7FF\u{10000}-\u{10FFFF}]*')u.freeze
POSTFIX = %r([?*+])u.freeze
PASS = %r((
\s
| (?:(?:\#[^x]|//)[^\n\r]*)
| (?:/\*(?:(?:\*[^/])|[^*])*\*/)
Expand Down
13 changes: 12 additions & 1 deletion spec/parser_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@
UCHAR))
'>')))},
],
"range with leading hyphen": [
%{[14] PubidChar ::= [-'()+,./:=?;!*#@$_%]},
%{((terminal PubidChar "14" (range "-'()+,./:=?;!*#@$_%")))}
],
"range with trailing hyphen": [
%{[14] PubidChar ::= ['()+,./:=?;!*#@$_%-]},
%{((terminal PubidChar "14" (range "'()+,./:=?;!*#@$_%-")))}
],
"minimal whitespace": [
%{[xx]minimal::=whitespace[yy]whitespace::=" "},
%{((rule minimal "xx" (seq whitespace))
Expand Down Expand Up @@ -111,6 +119,8 @@
%{[#x20-#x22]} => %{(range "#x20-#x22")},
%{[abc]} => %{(range "abc")},
%{[abc-]} => %{(range "abc-")},
%{[-abc]} => %{(range "-abc")},
%{[-'()+,./:=?;!*#@$_%]} => %{(range "-'()+,./:=?;!*#@$_%")},
%{[#x20#x21#x22]} => %{(range "#x20#x21#x22")},
%{BaseDecl? PrefixDecl*} => %{(seq (opt BaseDecl) (star PrefixDecl))},
%{NCCHAR1 | '-' | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040]} =>
Expand All @@ -130,7 +140,8 @@
"illegal rule name": %{$rule.name ::= foo},
"diff missing second operand": %{rule ::= a -},
"unrecognized terminal" => %{rule ::= %foo%},
"unopened paren" => %{rule ::= a) b c}
"unopened paren" => %{rule ::= a) b c},
"leading and trailing hyphen in range" => %{rule ::= [-abc-]}
}.each do |title, input|
it title do
expect {parse(input)}.to raise_error(SyntaxError)
Expand Down
16 changes: 14 additions & 2 deletions spec/rule_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -968,8 +968,20 @@
"a ::= [#x20-b]",
/Range contains illegal components/
],
"incomplete range": [
"a ::= [-b]",
"redundant '-' in range (one intervening)": [
"a ::= [-b-]",
/syntax error,/
],
"redundant '-' in range (many intervening)": [
"a ::= [-def-]",
/syntax error,/
],
"redundant '-' in range (one hex intervening)": [
"a ::= [-#x20-]",
/syntax error,/
],
"redundant '-' in range (many hex intervening)": [
"a ::= [-#x20#x5b#x5c -]",
/syntax error,/
],
"extra range": [
Expand Down