ebnf 2.0.0 → 2.1.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.
@@ -0,0 +1,124 @@
1
+ rulelist ::= ( rule | (c_wsp* c_nl) )+
2
+
3
+ rule ::= rulename defined_as elements c_nl
4
+ # continues if next line starts
5
+ # with white space
6
+
7
+ elements ::= alternation c_wsp*
8
+
9
+ alternation ::= concatenation
10
+ (c_wsp* "/" c_wsp* concatenation)*
11
+
12
+ concatenation::= repetition (c_wsp+ repetition)*
13
+
14
+ repetition ::= repeat? element
15
+
16
+ repeat ::= (DIGIT* "*" DIGIT*) | DIGIT+
17
+
18
+ element ::= rulename | group | option |
19
+ char_val | num_val | prose_val
20
+
21
+ group ::= "(" c_wsp* alternation c_wsp* ")"
22
+
23
+ option ::= "[" c_wsp* alternation c_wsp* "]"
24
+
25
+ char_val ::= case_insensitive_string |
26
+ case_sensitive_string
27
+
28
+ case_insensitive_string ::=
29
+ "%i"? quoted_string
30
+
31
+ case_sensitive_string ::=
32
+ "%s" quoted_string
33
+
34
+ num_val ::= "%" (bin_val | dec_val | hex_val)
35
+
36
+ @terminals
37
+
38
+ # Terminals used in ABNF, itself
39
+ rulename ::= ALPHA (ALPHA | DIGIT | "-")*
40
+
41
+ defined_as ::= c_wsp* ("=" | "=/") c_wsp*
42
+ # basic rules definition and
43
+ # incremental alternatives
44
+
45
+ c_wsp ::= WSP | (c_nl WSP)
46
+
47
+ c_nl ::= COMMENT | CRLF
48
+ # comment or newline
49
+
50
+ comment ::= ";" (WSP | VCHAR)* CRLF
51
+
52
+ quoted_string::= DQUOTE [#x20-#x21#x23-#x7E]* DQUOTE
53
+ # quoted string of SP and VCHAR
54
+ # without DQUOTE
55
+
56
+ bin_val ::= "b" BIT+
57
+ (("." BIT+)+ | ("-" BIT+))?
58
+ # series of concatenated bit values
59
+ # or single ONEOF range
60
+
61
+ dec_val ::= "d" DIGIT+
62
+ (("." DIGIT+)+ | ("-" DIGIT+))?
63
+
64
+ hex_val ::= "x" HEXDIG+
65
+ (("." HEXDIG+)+ | ("-" HEXDIG+))?
66
+
67
+ prose_val ::= "<" [#x20-#x3D#x3F-#x7E]* ">"
68
+ # bracketed string of SP and VCHAR
69
+ # without angles
70
+ # prose description, to be used as
71
+ # last resort
72
+
73
+ # Core terminals available in uses of ABNF
74
+ ALPHA ::= [#x41-#x5A#x61-#x7A] # A-Z | a-z
75
+
76
+ BIT ::= '0' | '1'
77
+
78
+ CHAR ::= [#x01-#x7F]
79
+ # any 7-bit US-ASCII character,
80
+ # excluding NUL
81
+ CR ::= #x0D
82
+ # carriage return
83
+
84
+ CRLF ::= CR? LF
85
+ # Internet standard newline
86
+
87
+ CTL ::= [#x00-#x1F] | #x7F
88
+ # controls
89
+
90
+ DIGIT ::= [#x30-#x39]
91
+ # 0-9
92
+
93
+ DQUOTE ::= #x22
94
+ # " (Double Quote)
95
+
96
+ HEXDIG ::= DIGIT | "A" | "B" | "C" | "D" | "E" | "F"
97
+
98
+ HTAB ::= #x09
99
+ # horizontal tab
100
+
101
+ LF ::= #x0A
102
+ # linefeed
103
+
104
+ LWSP ::= (WSP | CRLF WSP)*
105
+ # Use of this linear-white-space rule
106
+ # permits lines containing only white
107
+ # space that are no longer legal in
108
+ # mail headers and have caused
109
+ # interoperability problems in other
110
+ # contexts.
111
+ # Do not use when defining mail
112
+ # headers and use with caution in
113
+ # other contexts.
114
+
115
+ OCTET ::= [#x00-#xFF]
116
+ # 8 bits of data
117
+
118
+ SP ::= #x20
119
+
120
+ VCHAR ::= [#x21-#x7E]
121
+ # visible (printing) characters
122
+
123
+ WSP ::= SP | HTAB
124
+ # white space
@@ -0,0 +1,45 @@
1
+ (
2
+ (rule rulelist (plus (alt rule (seq (star c_wsp) c_nl))))
3
+ (rule rule (seq rulename defined_as elements c_nl))
4
+ (rule elements (seq alternation (star c_wsp)))
5
+ (rule alternation
6
+ (seq concatenation (star (seq (star c_wsp) "/" (star c_wsp) concatenation))))
7
+ (rule concatenation (seq repetition (star (seq (plus c_wsp) repetition))))
8
+ (rule repetition (seq (opt repeat) element))
9
+ (rule repeat (alt (seq (star DIGIT) "*" (star DIGIT)) (plus DIGIT)))
10
+ (rule element (alt rulename group option char_val num_val prose_val))
11
+ (rule group (seq "(" (star c_wsp) alternation (star c_wsp) ")"))
12
+ (rule option (seq "[" (star c_wsp) alternation (star c_wsp) "]"))
13
+ (rule char_val (alt case_insensitive_string case_sensitive_string))
14
+ (rule case_insensitive_string (seq (opt "%i") quoted_string))
15
+ (rule case_sensitive_string (seq "%s" quoted_string))
16
+ (rule num_val (seq "%" (alt bin_val dec_val hex_val)))
17
+ (terminals _terminals (seq))
18
+ (terminal rulename (seq ALPHA (star (alt ALPHA DIGIT "-"))))
19
+ (terminal defined_as (seq (star c_wsp) (alt "=" "=/") (star c_wsp)))
20
+ (terminal c_wsp (alt WSP (seq c_nl WSP)))
21
+ (terminal c_nl (alt COMMENT CRLF))
22
+ (terminal comment (seq ";" (star (alt WSP VCHAR)) CRLF))
23
+ (terminal quoted_string (seq DQUOTE (star (range "#x20-#x21#x23-#x7E")) DQUOTE))
24
+ (terminal bin_val (seq "b" (plus BIT) (opt (alt (plus (seq "." (plus BIT))) (seq "-" (plus BIT))))))
25
+ (terminal dec_val
26
+ (seq "d" (plus DIGIT) (opt (alt (plus (seq "." (plus DIGIT))) (seq "-" (plus DIGIT))))))
27
+ (terminal hex_val
28
+ (seq "x" (plus HEXDIG) (opt (alt (plus (seq "." (plus HEXDIG))) (seq "-" (plus HEXDIG))))))
29
+ (terminal prose_val (seq "<" (star (range "#x20-#x3D#x3F-#x7E")) ">"))
30
+ (terminal ALPHA (range "#x41-#x5A#x61-#x7A"))
31
+ (terminal BIT (alt "0" "1"))
32
+ (terminal CHAR (range "#x01-#x7F"))
33
+ (terminal CR (hex "#x0D"))
34
+ (terminal CRLF (seq (opt CR) LF))
35
+ (terminal CTL (alt (range "#x00-#x1F") (hex "#x7F")))
36
+ (terminal DIGIT (range "#x30-#x39"))
37
+ (terminal DQUOTE (hex "#x22"))
38
+ (terminal HEXDIG (alt DIGIT "A" "B" "C" "D" "E" "F"))
39
+ (terminal HTAB (hex "#x09"))
40
+ (terminal LF (hex "#x0A"))
41
+ (terminal LWSP (star (alt WSP (seq CRLF WSP))))
42
+ (terminal OCTET (range "#x00-#xFF"))
43
+ (terminal SP (hex "#x20"))
44
+ (terminal VCHAR (range "#x21-#x7E"))
45
+ (terminal WSP (alt SP HTAB)))
@@ -3,10 +3,12 @@
3
3
 
4
4
  [2] declaration ::= '@terminals' | pass
5
5
 
6
- [3] rule ::= LHS expression
7
-
8
6
  # Use the LHS terminal to match the identifier, rule name and assignment due to
9
- # confusion between the identifier and RANGE
7
+ # confusion between the identifier and RANGE.
8
+ # Note, for grammars not using identifiers, it is still possible to confuse
9
+ # a rule ending with a range the next rule, as it may be interpreted as an identifier.
10
+ # In such case, best to enclose the rule in '()'.
11
+ [3] rule ::= LHS expression
10
12
 
11
13
  [4] expression ::= alt
12
14
 
@@ -20,10 +22,8 @@
20
22
 
21
23
  [9] primary ::= HEX
22
24
  | SYMBOL
23
- | ENUM
24
- | O_ENUM
25
- | RANGE
26
25
  | O_RANGE
26
+ | RANGE
27
27
  | STRING1
28
28
  | STRING2
29
29
  | '(' expression ')'
@@ -32,37 +32,31 @@
32
32
 
33
33
  @terminals
34
34
 
35
- [11] LHS ::= ('[' SYMBOL+ ']' ' '+)? SYMBOL ' '* '::='
35
+ [11] LHS ::= ('[' SYMBOL ']' ' '+)? SYMBOL ' '* '::='
36
36
 
37
37
  [12] SYMBOL ::= ([a-z] | [A-Z] | [0-9] | '_' | '.')+
38
38
 
39
39
  [13] HEX ::= '#x' ([a-f] | [A-F] | [0-9])+
40
40
 
41
- [14] ENUM ::= ('[' R_CHAR+ | HEX+ ']') - LHS
42
-
43
- [15] O_ENUM ::= '[^' R_CHAR+ | HEX+ ']'
44
-
45
- [16] RANGE ::= '[' (R_CHAR '-' R_CHAR) | (HEX - HEX) ']'
41
+ [14] RANGE ::= '[' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'? ']' - LHS
46
42
 
47
- [17] O_RANGE ::= '[^' (R_CHAR '-' R_CHAR) | (HEX - HEX) ']'
43
+ [15] O_RANGE ::= '[^' ((R_CHAR '-' R_CHAR) | (HEX '-' HEX) | R_CHAR | HEX)+ '-'? ']'
48
44
 
49
45
  # Strings are unescaped Unicode, excepting control characters and hash (#)
50
- [18] STRING1 ::= '"' (CHAR - '"')* '"'
46
+ [16] STRING1 ::= '"' (CHAR - '"')* '"'
51
47
 
52
- [19] STRING2 ::= "'" (CHAR - "'")* "'"
48
+ [17] STRING2 ::= "'" (CHAR - "'")* "'"
53
49
 
54
- [20] CHAR ::= [#x9#xA#xD] | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
50
+ [18] CHAR ::= [#x9#xA#xD] | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
55
51
 
56
- [21] R_CHAR ::= CHAR - ']'
52
+ [19] R_CHAR ::= CHAR - (']' | '-' | HEX)
57
53
 
58
- # Should be able to do this inline, but not until terminal regular expressions are created automatically
59
- [22] POSTFIX ::= [?*+]
54
+ [20] POSTFIX ::= [?*+]
60
55
 
61
- [23] PASS ::= ( [#x00-#x20]
62
- | ( ('#' - '#x') | '//' ) [^#x0A#x0Dx]*
63
- | '/*' (( '*' [^/] )? | [^*] )* '*/'
64
- | '(*' (( '*' [^)] )? | [^*] )* '*)'
65
- )+
56
+ # Ignore all whitespace and comments between non-terminals
57
+ [21] PASS ::= [#x9#xA#xD#x20]
58
+ | ( ('#' - '#x') | '//' ) [^#xA#xD]*
59
+ | '/*' (( '*' [^/] )? | [^*] )* '*/'
60
+ | '(*' (( '*' [^)] )? | [^*] )* '*)'
66
61
 
67
- # Should be able to do this inline, but not until terminal regular expressions are created automatically
68
62
  @pass PASS
@@ -1,207 +1,252 @@
1
- <table class='grammar'>
2
- <tbody id='grammar-productions'>
3
- <tr id='grammar-production-ebnf'>
4
- <td>[1]</td>
5
- <td><code>ebnf</code></td>
6
- <td>::=</td>
7
- <td>
8
- (declaration | rule)*
9
- </td>
10
- </tr>
11
- <tr id='grammar-production-declaration'>
12
- <td>[2]</td>
13
- <td><code>declaration</code></td>
14
- <td>::=</td>
15
- <td>
16
- "@terminals" | pass
17
- </td>
18
- </tr>
19
- <tr id='grammar-production-rule'>
20
- <td>[3]</td>
21
- <td><code>rule</code></td>
22
- <td>::=</td>
23
- <td>
24
- LHS expression
25
- </td>
26
- </tr>
27
- <tr id='grammar-production-expression'>
28
- <td>[4]</td>
29
- <td><code>expression</code></td>
30
- <td>::=</td>
31
- <td>
32
- alt
33
- </td>
34
- </tr>
35
- <tr id='grammar-production-alt'>
36
- <td>[5]</td>
37
- <td><code>alt</code></td>
38
- <td>::=</td>
39
- <td>
40
- seq ("|" seq)*
41
- </td>
42
- </tr>
43
- <tr id='grammar-production-seq'>
44
- <td>[6]</td>
45
- <td><code>seq</code></td>
46
- <td>::=</td>
47
- <td>
48
- diff+
49
- </td>
50
- </tr>
51
- <tr id='grammar-production-diff'>
52
- <td>[7]</td>
53
- <td><code>diff</code></td>
54
- <td>::=</td>
55
- <td>
56
- postfix ("-" postfix)?
57
- </td>
58
- </tr>
59
- <tr id='grammar-production-postfix'>
60
- <td>[8]</td>
61
- <td><code>postfix</code></td>
62
- <td>::=</td>
63
- <td>
64
- primary POSTFIX?
65
- </td>
66
- </tr>
67
- <tr id='grammar-production-primary'>
68
- <td>[9]</td>
69
- <td><code>primary</code></td>
70
- <td>::=</td>
71
- <td>
72
- HEX
73
- | SYMBOL
74
- | ENUM
75
- | O_ENUM
76
- | RANGE
77
- | O_RANGE
78
- | STRING1
79
- | STRING2
80
- | "(" expression ")"
81
- </td>
82
- </tr>
83
- <tr id='grammar-production-pass'>
84
- <td>[10]</td>
85
- <td><code>pass</code></td>
86
- <td>::=</td>
87
- <td>
88
- "@pass" expression
89
- </td>
90
- </tr>
91
- <tr id='grammar-production-LHS'>
92
- <td>[11]</td>
93
- <td><code>LHS</code></td>
94
- <td>::=</td>
95
- <td>
96
- ("[" SYMBOL+ "]" #x20+)? SYMBOL #x20* "::="
97
- </td>
98
- </tr>
99
- <tr id='grammar-production-SYMBOL'>
100
- <td>[12]</td>
101
- <td><code>SYMBOL</code></td>
102
- <td>::=</td>
103
- <td>
104
- ([a-z] | [A-Z] | [0-9] | "_" | ".")+
105
- </td>
106
- </tr>
107
- <tr id='grammar-production-HEX'>
108
- <td>[13]</td>
109
- <td><code>HEX</code></td>
110
- <td>::=</td>
111
- <td>
112
- "#x" ([a-f] | [A-F] | [0-9])+
113
- </td>
114
- </tr>
115
- <tr id='grammar-production-ENUM'>
116
- <td>[14]</td>
117
- <td><code>ENUM</code></td>
118
- <td>::=</td>
119
- <td>
120
- "[" R_CHAR+ | HEX+ "]" - LHS
121
- </td>
122
- </tr>
123
- <tr id='grammar-production-O_ENUM'>
124
- <td>[15]</td>
125
- <td><code>O_ENUM</code></td>
126
- <td>::=</td>
127
- <td>
128
- "[^" R_CHAR+ | HEX+ "]"
129
- </td>
130
- </tr>
131
- <tr id='grammar-production-RANGE'>
132
- <td>[16]</td>
133
- <td><code>RANGE</code></td>
134
- <td>::=</td>
135
- <td>
136
- "[" (R_CHAR "-" R_CHAR) | (HEX - HEX) "]"
137
- </td>
138
- </tr>
139
- <tr id='grammar-production-O_RANGE'>
140
- <td>[17]</td>
141
- <td><code>O_RANGE</code></td>
142
- <td>::=</td>
143
- <td>
144
- "[^" (R_CHAR "-" R_CHAR) | (HEX - HEX) "]"
145
- </td>
146
- </tr>
147
- <tr id='grammar-production-STRING1'>
148
- <td>[18]</td>
149
- <td><code>STRING1</code></td>
150
- <td>::=</td>
151
- <td>
152
- '"' (CHAR - '"')* '"'
153
- </td>
154
- </tr>
155
- <tr id='grammar-production-STRING2'>
156
- <td>[19]</td>
157
- <td><code>STRING2</code></td>
158
- <td>::=</td>
159
- <td>
160
- "'" (CHAR - "'")* "'"
161
- </td>
162
- </tr>
163
- <tr id='grammar-production-CHAR'>
164
- <td>[20]</td>
165
- <td><code>CHAR</code></td>
166
- <td>::=</td>
167
- <td>
168
- [#x9#xA#xD]
169
- | [#x20-#xD7FF]
170
- | [#xE000-#xFFFD]
171
- | [#x10000-#x10FFFF]
172
- </td>
173
- </tr>
174
- <tr id='grammar-production-R_CHAR'>
175
- <td>[21]</td>
176
- <td><code>R_CHAR</code></td>
177
- <td>::=</td>
178
- <td>
179
- CHAR - "]"
180
- </td>
181
- </tr>
182
- <tr id='grammar-production-POSTFIX'>
183
- <td>[22]</td>
184
- <td><code>POSTFIX</code></td>
185
- <td>::=</td>
186
- <td>
187
- [?*+]
188
- </td>
189
- </tr>
190
- <tr id='grammar-production-PASS'>
191
- <td>[23]</td>
192
- <td><code>PASS</code></td>
193
- <td>::=</td>
194
- <td>
195
- ([#x00-#x20] | ("#" - "#x" | "//") ([^#x0A#x0Dx])* | "/*" ("*" [^/])? | [^*]* "*/" | "(*" ("*" [^)])? | [^*]* "*)")+
196
- </td>
197
- </tr>
198
- <tr id='grammar-production-'>
199
- <td colspan='3'>
200
- <code>@pass</code>
201
- </td>
202
- <td>
203
- PASS
204
- </td>
205
- </tr>
206
- </tbody>
1
+
2
+ <table class="grammar">
3
+ <tbody id="grammar-productions" class="ebnf">
4
+ <tr id="grammar-production-ebnf">
5
+ <td>[1]</td>
6
+ <td><code>ebnf</code></td>
7
+ <td>::=</td>
8
+ <td><code>(</code> <a href="#grammar-production-declaration">declaration</a> <code>|</code> <a href="#grammar-production-rule">rule</a><code>)</code> <code>*</code> </td>
9
+ </tr>
10
+ <tr id="grammar-production-declaration">
11
+ <td>[2]</td>
12
+ <td><code>declaration</code></td>
13
+ <td>::=</td>
14
+ <td>"@terminals" <code>|</code> <a href="#grammar-production-pass">pass</a></td>
15
+ </tr>
16
+ <tr id="grammar-production-rule">
17
+ <td>[3]</td>
18
+ <td><code>rule</code></td>
19
+ <td>::=</td>
20
+ <td><a href="#grammar-production-LHS">LHS</a> <a href="#grammar-production-expression">expression</a></td>
21
+ </tr>
22
+ <tr id="grammar-production-expression">
23
+ <td>[4]</td>
24
+ <td><code>expression</code></td>
25
+ <td>::=</td>
26
+ <td><a href="#grammar-production-alt">alt</a></td>
27
+ </tr>
28
+ <tr id="grammar-production-alt">
29
+ <td>[5]</td>
30
+ <td><code>alt</code></td>
31
+ <td>::=</td>
32
+ <td><a href="#grammar-production-seq">seq</a> <code>(</code> "<code class="grammar-literal">|</code>" <a href="#grammar-production-seq">seq</a><code>)</code> <code>*</code> </td>
33
+ </tr>
34
+ <tr id="grammar-production-seq">
35
+ <td>[6]</td>
36
+ <td><code>seq</code></td>
37
+ <td>::=</td>
38
+ <td><a href="#grammar-production-diff">diff</a><code>+</code> </td>
39
+ </tr>
40
+ <tr id="grammar-production-diff">
41
+ <td>[7]</td>
42
+ <td><code>diff</code></td>
43
+ <td>::=</td>
44
+ <td><a href="#grammar-production-postfix">postfix</a> <code>(</code> "<code class="grammar-literal">-</code>" <a href="#grammar-production-postfix">postfix</a><code>)</code> <code>?</code> </td>
45
+ </tr>
46
+ <tr id="grammar-production-postfix">
47
+ <td>[8]</td>
48
+ <td><code>postfix</code></td>
49
+ <td>::=</td>
50
+ <td><a href="#grammar-production-primary">primary</a> <a href="#grammar-production-POSTFIX">POSTFIX</a><code>?</code> </td>
51
+ </tr>
52
+ <tr id="grammar-production-primary">
53
+ <td>[9]</td>
54
+ <td><code>primary</code></td>
55
+ <td>::=</td>
56
+ <td><a href="#grammar-production-HEX">HEX</a></td>
57
+ </tr>
58
+ <tr>
59
+ <td>[9]</td>
60
+ <td><code></code></td>
61
+ <td>|</td>
62
+ <td><a href="#grammar-production-SYMBOL">SYMBOL</a></td>
63
+ </tr>
64
+ <tr>
65
+ <td>[9]</td>
66
+ <td><code></code></td>
67
+ <td>|</td>
68
+ <td><a href="#grammar-production-O_RANGE">O_RANGE</a></td>
69
+ </tr>
70
+ <tr>
71
+ <td>[9]</td>
72
+ <td><code></code></td>
73
+ <td>|</td>
74
+ <td><a href="#grammar-production-RANGE">RANGE</a></td>
75
+ </tr>
76
+ <tr>
77
+ <td>[9]</td>
78
+ <td><code></code></td>
79
+ <td>|</td>
80
+ <td><a href="#grammar-production-STRING1">STRING1</a></td>
81
+ </tr>
82
+ <tr>
83
+ <td>[9]</td>
84
+ <td><code></code></td>
85
+ <td>|</td>
86
+ <td><a href="#grammar-production-STRING2">STRING2</a></td>
87
+ </tr>
88
+ <tr>
89
+ <td>[9]</td>
90
+ <td><code></code></td>
91
+ <td>|</td>
92
+ <td><code>(</code> "<code class="grammar-literal">(</code>" <a href="#grammar-production-expression">expression</a> "<code class="grammar-literal">)</code>"<code>)</code> </td>
93
+ </tr>
94
+ <tr id="grammar-production-pass">
95
+ <td>[10]</td>
96
+ <td><code>pass</code></td>
97
+ <td>::=</td>
98
+ <td>"@pass" <a href="#grammar-production-expression">expression</a></td>
99
+ </tr>
100
+ <tr id="grammar-production-">
101
+ <td>@terminals</td>
102
+ <td><code></code></td>
103
+ <td></td>
104
+ <td><strong>Productions for terminals</strong></td>
105
+ </tr>
106
+ <tr id="grammar-production-LHS">
107
+ <td>[11]</td>
108
+ <td><code>LHS</code></td>
109
+ <td>::=</td>
110
+ <td><code>(</code> "<code class="grammar-literal">[</code>" <a href="#grammar-production-SYMBOL">SYMBOL</a> "<code class="grammar-literal">]</code>" <code class="grammar-char-escape"><abbr title="space">#x20</abbr></code><code>+</code> <code>)</code> <code>?</code> <a href="#grammar-production-SYMBOL">SYMBOL</a> <code class="grammar-char-escape"><abbr title="space">#x20</abbr></code><code>*</code> "::="</td>
111
+ </tr>
112
+ <tr id="grammar-production-SYMBOL">
113
+ <td>[12]</td>
114
+ <td><code>SYMBOL</code></td>
115
+ <td>::=</td>
116
+ <td><code>(</code> <code>[</code> <code class="grammar-literal">a-z</code><code>]</code> <code>|</code> <code>[</code> <code class="grammar-literal">A-Z</code><code>]</code> <code>|</code> <code>[</code> <code class="grammar-literal">0-9</code><code>]</code> <code>|</code> "<code class="grammar-literal">_</code>" <code>|</code> "<code class="grammar-literal">.</code>"<code>)</code> <code>+</code> </td>
117
+ </tr>
118
+ <tr id="grammar-production-HEX">
119
+ <td>[13]</td>
120
+ <td><code>HEX</code></td>
121
+ <td>::=</td>
122
+ <td>"#x" <code>(</code> <code>[</code> <code class="grammar-literal">a-f</code><code>]</code> <code>|</code> <code>[</code> <code class="grammar-literal">A-F</code><code>]</code> <code>|</code> <code>[</code> <code class="grammar-literal">0-9</code><code>]</code> <code>)</code> <code>+</code> </td>
123
+ </tr>
124
+ <tr id="grammar-production-RANGE">
125
+ <td>[14]</td>
126
+ <td><code>RANGE</code></td>
127
+ <td>::=</td>
128
+ <td>"<code class="grammar-literal">[</code>"</td>
129
+ </tr>
130
+ <tr id="grammar-production-">
131
+ <td>[14]</td>
132
+ <td><code></code></td>
133
+ <td></td>
134
+ <td><code>(</code> <code>(</code> <a href="#grammar-production-R_CHAR">R_CHAR</a> "<code class="grammar-literal">-</code>" <a href="#grammar-production-R_CHAR">R_CHAR</a><code>)</code><code>(</code> <a href="#grammar-production-HEX">HEX</a> "<code class="grammar-literal">-</code>" <a href="#grammar-production-HEX">HEX</a><code>)</code> <code>|</code> <a href="#grammar-production-R_CHAR">R_CHAR</a> <code>|</code> <a href="#grammar-production-HEX">HEX</a><code>)</code> <code>+</code></td>
135
+ </tr>
136
+ <tr id="grammar-production-">
137
+ <td>[14]</td>
138
+ <td><code></code></td>
139
+ <td></td>
140
+ <td>"<code class="grammar-literal">-</code>"<code>?</code></td>
141
+ </tr>
142
+ <tr id="grammar-production-">
143
+ <td>[14]</td>
144
+ <td><code></code></td>
145
+ <td></td>
146
+ <td><code>(</code> "<code class="grammar-literal">]</code>" <code>-</code> <a href="#grammar-production-LHS">LHS</a><code>)</code> </td>
147
+ </tr>
148
+ <tr id="grammar-production-O_RANGE">
149
+ <td>[15]</td>
150
+ <td><code>O_RANGE</code></td>
151
+ <td>::=</td>
152
+ <td>"[^"</td>
153
+ </tr>
154
+ <tr id="grammar-production-">
155
+ <td>[15]</td>
156
+ <td><code></code></td>
157
+ <td></td>
158
+ <td><code>(</code> <code>(</code> <a href="#grammar-production-R_CHAR">R_CHAR</a> "<code class="grammar-literal">-</code>" <a href="#grammar-production-R_CHAR">R_CHAR</a><code>)</code><code>(</code> <a href="#grammar-production-HEX">HEX</a> "<code class="grammar-literal">-</code>" <a href="#grammar-production-HEX">HEX</a><code>)</code> <code>|</code> <a href="#grammar-production-R_CHAR">R_CHAR</a> <code>|</code> <a href="#grammar-production-HEX">HEX</a><code>)</code> <code>+</code></td>
159
+ </tr>
160
+ <tr id="grammar-production-">
161
+ <td>[15]</td>
162
+ <td><code></code></td>
163
+ <td></td>
164
+ <td>"<code class="grammar-literal">-</code>"<code>?</code></td>
165
+ </tr>
166
+ <tr id="grammar-production-">
167
+ <td>[15]</td>
168
+ <td><code></code></td>
169
+ <td></td>
170
+ <td>"<code class="grammar-literal">]</code>"</td>
171
+ </tr>
172
+ <tr id="grammar-production-STRING1">
173
+ <td>[16]</td>
174
+ <td><code>STRING1</code></td>
175
+ <td>::=</td>
176
+ <td>'<code class="grammar-literal">"</code>' <code>(</code> <a href="#grammar-production-CHAR">CHAR</a> <code>-</code> '<code class="grammar-literal">"</code>'<code>)</code> <code>*</code> '<code class="grammar-literal">"</code>'</td>
177
+ </tr>
178
+ <tr id="grammar-production-STRING2">
179
+ <td>[17]</td>
180
+ <td><code>STRING2</code></td>
181
+ <td>::=</td>
182
+ <td>"<code class="grammar-literal">'</code>" <code>(</code> <a href="#grammar-production-CHAR">CHAR</a> <code>-</code> "<code class="grammar-literal">'</code>"<code>)</code> <code>*</code> "<code class="grammar-literal">'</code>"</td>
183
+ </tr>
184
+ <tr id="grammar-production-CHAR">
185
+ <td>[18]</td>
186
+ <td><code>CHAR</code></td>
187
+ <td>::=</td>
188
+ <td><code>[</code> <code class="grammar-char-escape"><abbr title="horizontal tab">#x09</abbr></code><code class="grammar-char-escape"><abbr title="new line">#x0A</abbr></code><code class="grammar-char-escape"><abbr title="carriage return">#x0D</abbr></code><code>]</code></td>
189
+ </tr>
190
+ <tr>
191
+ <td>[18]</td>
192
+ <td><code></code></td>
193
+ <td>|</td>
194
+ <td><code>[</code> <code class="grammar-char-escape"><abbr title="space">#x20</abbr></code><code class="grammar-literal">-</code><code class="grammar-char-escape"><abbr title="unicode '퟿'">#xD7FF</abbr></code><code>]</code></td>
195
+ </tr>
196
+ <tr>
197
+ <td>[18]</td>
198
+ <td><code></code></td>
199
+ <td>|</td>
200
+ <td><code>[</code> <code class="grammar-char-escape"><abbr title="unicode ''">#xE000</abbr></code><code class="grammar-literal">-</code><code class="grammar-char-escape"><abbr title="unicode '�'">#xFFFD</abbr></code><code>]</code></td>
201
+ </tr>
202
+ <tr>
203
+ <td>[18]</td>
204
+ <td><code></code></td>
205
+ <td>|</td>
206
+ <td><code>[</code> <code class="grammar-char-escape"><abbr title="unicode '𐀀'">#x00010000</abbr></code><code class="grammar-literal">-</code><code class="grammar-char-escape"><abbr title="unicode '􏿿'">#x0010FFFF</abbr></code><code>]</code> </td>
207
+ </tr>
208
+ <tr id="grammar-production-R_CHAR">
209
+ <td>[19]</td>
210
+ <td><code>R_CHAR</code></td>
211
+ <td>::=</td>
212
+ <td><a href="#grammar-production-CHAR">CHAR</a> <code>-</code> <code>(</code> "<code class="grammar-literal">]</code>" <code>|</code> "<code class="grammar-literal">-</code>" <code>|</code> <a href="#grammar-production-HEX">HEX</a><code>)</code> </td>
213
+ </tr>
214
+ <tr id="grammar-production-POSTFIX">
215
+ <td>[20]</td>
216
+ <td><code>POSTFIX</code></td>
217
+ <td>::=</td>
218
+ <td><code>[</code> <code class="grammar-literal">?*+</code><code>]</code> </td>
219
+ </tr>
220
+ <tr id="grammar-production-PASS">
221
+ <td>[21]</td>
222
+ <td><code>PASS</code></td>
223
+ <td>::=</td>
224
+ <td><code>[</code> <code class="grammar-char-escape"><abbr title="horizontal tab">#x09</abbr></code><code class="grammar-char-escape"><abbr title="new line">#x0A</abbr></code><code class="grammar-char-escape"><abbr title="carriage return">#x0D</abbr></code><code class="grammar-char-escape"><abbr title="space">#x20</abbr></code><code>]</code></td>
225
+ </tr>
226
+ <tr>
227
+ <td>[21]</td>
228
+ <td><code></code></td>
229
+ <td>|</td>
230
+ <td><code>(</code> <code>(</code> <code>(</code> "<code class="grammar-literal">#</code>" <code>-</code> "#x"<code>)</code> <code>|</code> "//"<code>)</code> <code>[</code> <code class="grammar-literal">^</code><code class="grammar-char-escape"><abbr title="new line">#x0A</abbr></code><code class="grammar-char-escape"><abbr title="carriage return">#x0D</abbr></code><code>]</code> <code>*</code> <code>)</code></td>
231
+ </tr>
232
+ <tr>
233
+ <td>[21]</td>
234
+ <td><code></code></td>
235
+ <td>|</td>
236
+ <td><code>(</code> "/*" <code>(</code> <code>(</code> "<code class="grammar-literal">*</code>" <code>[</code> <code class="grammar-literal">^/</code><code>]</code> <code>)</code> <code>?</code> <code>|</code> <code>[</code> <code class="grammar-literal">^*</code><code>]</code> <code>)</code> <code>*</code> "*/"<code>)</code></td>
237
+ </tr>
238
+ <tr>
239
+ <td>[21]</td>
240
+ <td><code></code></td>
241
+ <td>|</td>
242
+ <td><code>(</code> "(*" <code>(</code> <code>(</code> "<code class="grammar-literal">*</code>" <code>[</code> <code class="grammar-literal">^)</code><code>]</code> <code>)</code> <code>?</code> <code>|</code> <code>[</code> <code class="grammar-literal">^*</code><code>]</code> <code>)</code> <code>*</code> "*)"<code>)</code> </td>
243
+ </tr>
244
+ <tr id="grammar-production-">
245
+ <td>@pass</td>
246
+ <td><code></code></td>
247
+ <td></td>
248
+ <td></td>
249
+ </tr>
250
+ </tbody>
207
251
  </table>
252
+