diff --git a/etc/ebnf.ebnf b/etc/ebnf.ebnf index 1f8dfce..ad777f2 100644 --- a/etc/ebnf.ebnf +++ b/etc/ebnf.ebnf @@ -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 - '"')* '"' diff --git a/etc/ebnf.ll1.sxp b/etc/ebnf.ll1.sxp index 1912786..80ba750 100644 --- a/etc/ebnf.ll1.sxp +++ b/etc/ebnf.ll1.sxp @@ -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" diff --git a/etc/ebnf.peg.rb b/etc/ebnf.peg.rb index 315e2f6..ea79e21 100644 --- a/etc/ebnf.peg.rb +++ b/etc/ebnf.peg.rb @@ -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 = [ @@ -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), diff --git a/etc/ebnf.peg.sxp b/etc/ebnf.peg.sxp index 6125475..408ac5c 100644 --- a/etc/ebnf.peg.sxp +++ b/etc/ebnf.peg.sxp @@ -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 '"')) diff --git a/etc/ebnf.sxp b/etc/ebnf.sxp index 435c333..dbd45b0 100644 --- a/etc/ebnf.sxp +++ b/etc/ebnf.sxp @@ -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" diff --git a/lib/ebnf/ebnf/meta.rb b/lib/ebnf/ebnf/meta.rb index c319b09..ea79e21 100644 --- a/lib/ebnf/ebnf/meta.rb +++ b/lib/ebnf/ebnf/meta.rb @@ -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 = [ @@ -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), diff --git a/lib/ebnf/terminals.rb b/lib/ebnf/terminals.rb index 861aa02..33a377b 100644 --- a/lib/ebnf/terminals.rb +++ b/lib/ebnf/terminals.rb @@ -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*?\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*?\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*?\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*?\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]*) | (?:/\*(?:(?:\*[^/])|[^*])*\*/) diff --git a/spec/parser_spec.rb b/spec/parser_spec.rb index db68f14..de11933 100644 --- a/spec/parser_spec.rb +++ b/spec/parser_spec.rb @@ -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)) @@ -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]} => @@ -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) diff --git a/spec/rule_spec.rb b/spec/rule_spec.rb index 7e6a269..3af8797 100644 --- a/spec/rule_spec.rb +++ b/spec/rule_spec.rb @@ -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": [