xref: /aosp_15_r20/external/emboss/doc/grammar.md (revision 99e0aae7469b87d12f0ad23e61142c2d74c1ef70)
1*99e0aae7SDavid ReesThis is the context-free grammar for Emboss.  Terminal symbols are in `"quotes"`
2*99e0aae7SDavid Reesor are named in `CamelCase`; nonterminal symbols are named in `snake_case`.  The
3*99e0aae7SDavid Reesterm `<empty>` to the right of the `->` indicates an empty production (a rule
4*99e0aae7SDavid Reeswhere the left-hand-side may be parsed from an empty string).
5*99e0aae7SDavid Rees
6*99e0aae7SDavid ReesThis listing is auto-generated from the grammar defined in `module_ir.py`.
7*99e0aae7SDavid Rees
8*99e0aae7SDavid ReesNote that, unlike in many languages, comments are included in the grammar.  This
9*99e0aae7SDavid Reesis so that comments can be handled more easily by the autoformatter; comments
10*99e0aae7SDavid Reesare ignored by the compiler.  This is distinct from *documentation*, which is
11*99e0aae7SDavid Reesincluded in the IR for use by documentation generators.
12*99e0aae7SDavid Rees
13*99e0aae7SDavid Rees```shell
14*99e0aae7SDavid Reesmodule                                 -> comment-line* doc-line* import-line*
15*99e0aae7SDavid Rees                                          attribute-line* type-definition*
16*99e0aae7SDavid Reestype-definition                        -> bits
17*99e0aae7SDavid Rees                                        | enum
18*99e0aae7SDavid Rees                                        | external
19*99e0aae7SDavid Rees                                        | struct
20*99e0aae7SDavid Reesstruct                                 -> "struct" type-name
21*99e0aae7SDavid Rees                                          delimited-parameter-definition-list?
22*99e0aae7SDavid Rees                                          ":" Comment? eol struct-body
23*99e0aae7SDavid Reesstruct-body                            -> Indent doc-line* attribute-line*
24*99e0aae7SDavid Rees                                          type-definition* struct-field-block
25*99e0aae7SDavid Rees                                          Dedent
26*99e0aae7SDavid Reesstruct-field-block                     -> <empty>
27*99e0aae7SDavid Rees                                        | conditional-struct-field-block
28*99e0aae7SDavid Rees                                          struct-field-block
29*99e0aae7SDavid Rees                                        | unconditional-struct-field
30*99e0aae7SDavid Rees                                          struct-field-block
31*99e0aae7SDavid Reesunconditional-struct-field             -> anonymous-bits-field-definition
32*99e0aae7SDavid Rees                                        | field
33*99e0aae7SDavid Rees                                        | inline-bits-field-definition
34*99e0aae7SDavid Rees                                        | inline-enum-field-definition
35*99e0aae7SDavid Rees                                        | inline-struct-field-definition
36*99e0aae7SDavid Rees                                        | virtual-field
37*99e0aae7SDavid Reesvirtual-field                          -> "let" snake-name "=" expression
38*99e0aae7SDavid Rees                                          Comment? eol field-body?
39*99e0aae7SDavid Reesfield-body                             -> Indent doc-line* attribute-line* Dedent
40*99e0aae7SDavid Reesexpression                             -> choice-expression
41*99e0aae7SDavid Reeschoice-expression                      -> logical-expression
42*99e0aae7SDavid Rees                                        | logical-expression "?"
43*99e0aae7SDavid Rees                                          logical-expression ":"
44*99e0aae7SDavid Rees                                          logical-expression
45*99e0aae7SDavid Reeslogical-expression                     -> and-expression
46*99e0aae7SDavid Rees                                        | comparison-expression
47*99e0aae7SDavid Rees                                        | or-expression
48*99e0aae7SDavid Reesor-expression                          -> comparison-expression
49*99e0aae7SDavid Rees                                          or-expression-right+
50*99e0aae7SDavid Reesor-expression-right                    -> or-operator comparison-expression
51*99e0aae7SDavid Reesor-operator                            -> "||"
52*99e0aae7SDavid Reescomparison-expression                  -> additive-expression
53*99e0aae7SDavid Rees                                        | additive-expression
54*99e0aae7SDavid Rees                                          equality-expression-right+
55*99e0aae7SDavid Rees                                        | additive-expression
56*99e0aae7SDavid Rees                                          greater-expression-right-list
57*99e0aae7SDavid Rees                                        | additive-expression inequality-operator
58*99e0aae7SDavid Rees                                          additive-expression
59*99e0aae7SDavid Rees                                        | additive-expression
60*99e0aae7SDavid Rees                                          less-expression-right-list
61*99e0aae7SDavid Reesless-expression-right-list             -> equality-expression-right*
62*99e0aae7SDavid Rees                                          less-expression-right
63*99e0aae7SDavid Rees                                          equality-or-less-expression-right*
64*99e0aae7SDavid Reesequality-or-less-expression-right      -> equality-expression-right
65*99e0aae7SDavid Rees                                        | less-expression-right
66*99e0aae7SDavid Reesless-expression-right                  -> less-operator additive-expression
67*99e0aae7SDavid Reesless-operator                          -> "<"
68*99e0aae7SDavid Rees                                        | "<="
69*99e0aae7SDavid Reesinequality-operator                    -> "!="
70*99e0aae7SDavid Reesgreater-expression-right-list          -> equality-expression-right*
71*99e0aae7SDavid Rees                                          greater-expression-right
72*99e0aae7SDavid Rees                                          equality-or-greater-expression-right*
73*99e0aae7SDavid Reesequality-or-greater-expression-right   -> equality-expression-right
74*99e0aae7SDavid Rees                                        | greater-expression-right
75*99e0aae7SDavid Reesgreater-expression-right               -> greater-operator additive-expression
76*99e0aae7SDavid Reesgreater-operator                       -> ">"
77*99e0aae7SDavid Rees                                        | ">="
78*99e0aae7SDavid Reesequality-expression-right              -> equality-operator additive-expression
79*99e0aae7SDavid Reesequality-operator                      -> "=="
80*99e0aae7SDavid Reesadditive-expression                    -> times-expression
81*99e0aae7SDavid Rees                                          additive-expression-right*
82*99e0aae7SDavid Reesadditive-expression-right              -> additive-operator times-expression
83*99e0aae7SDavid Reesadditive-operator                      -> "+"
84*99e0aae7SDavid Rees                                        | "-"
85*99e0aae7SDavid Reestimes-expression                       -> negation-expression
86*99e0aae7SDavid Rees                                          times-expression-right*
87*99e0aae7SDavid Reestimes-expression-right                 -> multiplicative-operator
88*99e0aae7SDavid Rees                                          negation-expression
89*99e0aae7SDavid Reesmultiplicative-operator                -> "*"
90*99e0aae7SDavid Reesnegation-expression                    -> additive-operator bottom-expression
91*99e0aae7SDavid Rees                                        | bottom-expression
92*99e0aae7SDavid Reesbottom-expression                      -> "(" expression ")"
93*99e0aae7SDavid Rees                                        | boolean-constant
94*99e0aae7SDavid Rees                                        | builtin-reference
95*99e0aae7SDavid Rees                                        | constant-reference
96*99e0aae7SDavid Rees                                        | field-reference
97*99e0aae7SDavid Rees                                        | function-name "(" argument-list ")"
98*99e0aae7SDavid Rees                                        | numeric-constant
99*99e0aae7SDavid Reesnumeric-constant                       -> Number
100*99e0aae7SDavid Reesargument-list                          -> <empty>
101*99e0aae7SDavid Rees                                        | expression comma-then-expression*
102*99e0aae7SDavid Reescomma-then-expression                  -> "," expression
103*99e0aae7SDavid Reesfunction-name                          -> "$lower_bound"
104*99e0aae7SDavid Rees                                        | "$max"
105*99e0aae7SDavid Rees                                        | "$present"
106*99e0aae7SDavid Rees                                        | "$upper_bound"
107*99e0aae7SDavid Reesfield-reference                        -> snake-reference field-reference-tail*
108*99e0aae7SDavid Reesfield-reference-tail                   -> "." snake-reference
109*99e0aae7SDavid Reessnake-reference                        -> builtin-field-word
110*99e0aae7SDavid Rees                                        | snake-word
111*99e0aae7SDavid Reessnake-word                             -> SnakeWord
112*99e0aae7SDavid Reesbuiltin-field-word                     -> "$max_size_in_bits"
113*99e0aae7SDavid Rees                                        | "$max_size_in_bytes"
114*99e0aae7SDavid Rees                                        | "$min_size_in_bits"
115*99e0aae7SDavid Rees                                        | "$min_size_in_bytes"
116*99e0aae7SDavid Rees                                        | "$size_in_bits"
117*99e0aae7SDavid Rees                                        | "$size_in_bytes"
118*99e0aae7SDavid Reesconstant-reference                     -> constant-reference-tail
119*99e0aae7SDavid Rees                                        | snake-reference "."
120*99e0aae7SDavid Rees                                          constant-reference-tail
121*99e0aae7SDavid Reesconstant-reference-tail                -> constant-word
122*99e0aae7SDavid Rees                                        | type-word "." constant-reference-tail
123*99e0aae7SDavid Rees                                        | type-word "." snake-reference
124*99e0aae7SDavid Reestype-word                              -> CamelWord
125*99e0aae7SDavid Reesconstant-word                          -> ShoutyWord
126*99e0aae7SDavid Reesbuiltin-reference                      -> builtin-word
127*99e0aae7SDavid Reesbuiltin-word                           -> "$is_statically_sized"
128*99e0aae7SDavid Rees                                        | "$next"
129*99e0aae7SDavid Rees                                        | "$static_size_in_bits"
130*99e0aae7SDavid Reesboolean-constant                       -> BooleanConstant
131*99e0aae7SDavid Reesand-expression                         -> comparison-expression
132*99e0aae7SDavid Rees                                          and-expression-right+
133*99e0aae7SDavid Reesand-expression-right                   -> and-operator comparison-expression
134*99e0aae7SDavid Reesand-operator                           -> "&&"
135*99e0aae7SDavid Reessnake-name                             -> snake-word
136*99e0aae7SDavid Reesinline-struct-field-definition         -> field-location "struct" snake-name
137*99e0aae7SDavid Rees                                          abbreviation? ":" Comment? eol
138*99e0aae7SDavid Rees                                          struct-body
139*99e0aae7SDavid Reesabbreviation                           -> "(" snake-word ")"
140*99e0aae7SDavid Reesfield-location                         -> expression "[" "+" expression "]"
141*99e0aae7SDavid Reesinline-enum-field-definition           -> field-location "enum" snake-name
142*99e0aae7SDavid Rees                                          abbreviation? ":" Comment? eol
143*99e0aae7SDavid Rees                                          enum-body
144*99e0aae7SDavid Reesenum-body                              -> Indent doc-line* attribute-line*
145*99e0aae7SDavid Rees                                          enum-value+ Dedent
146*99e0aae7SDavid Reesenum-value                             -> constant-name "=" expression attribute*
147*99e0aae7SDavid Rees                                          doc? Comment? eol enum-value-body?
148*99e0aae7SDavid Reesenum-value-body                        -> Indent doc-line* attribute-line* Dedent
149*99e0aae7SDavid Reesdoc                                    -> Documentation
150*99e0aae7SDavid Reesattribute                              -> "[" attribute-context? "$default"?
151*99e0aae7SDavid Rees                                          snake-word ":" attribute-value "]"
152*99e0aae7SDavid Reesattribute-value                        -> expression
153*99e0aae7SDavid Rees                                        | string-constant
154*99e0aae7SDavid Reesstring-constant                        -> String
155*99e0aae7SDavid Reesattribute-context                      -> "(" snake-word ")"
156*99e0aae7SDavid Reesconstant-name                          -> constant-word
157*99e0aae7SDavid Reesinline-bits-field-definition           -> field-location "bits" snake-name
158*99e0aae7SDavid Rees                                          abbreviation? ":" Comment? eol
159*99e0aae7SDavid Rees                                          bits-body
160*99e0aae7SDavid Reesbits-body                              -> Indent doc-line* attribute-line*
161*99e0aae7SDavid Rees                                          type-definition* bits-field-block
162*99e0aae7SDavid Rees                                          Dedent
163*99e0aae7SDavid Reesbits-field-block                       -> <empty>
164*99e0aae7SDavid Rees                                        | conditional-bits-field-block
165*99e0aae7SDavid Rees                                          bits-field-block
166*99e0aae7SDavid Rees                                        | unconditional-bits-field
167*99e0aae7SDavid Rees                                          bits-field-block
168*99e0aae7SDavid Reesunconditional-bits-field               -> unconditional-anonymous-bits-field
169*99e0aae7SDavid Rees                                        | virtual-field
170*99e0aae7SDavid Reesunconditional-anonymous-bits-field     -> field
171*99e0aae7SDavid Rees                                        | inline-bits-field-definition
172*99e0aae7SDavid Rees                                        | inline-enum-field-definition
173*99e0aae7SDavid Reesconditional-bits-field-block           -> "if" expression ":" Comment? eol Indent
174*99e0aae7SDavid Rees                                          unconditional-bits-field+ Dedent
175*99e0aae7SDavid Reesfield                                  -> field-location type snake-name
176*99e0aae7SDavid Rees                                          abbreviation? attribute* doc? Comment?
177*99e0aae7SDavid Rees                                          eol field-body?
178*99e0aae7SDavid Reestype                                   -> type-reference delimited-argument-list?
179*99e0aae7SDavid Rees                                          type-size-specifier?
180*99e0aae7SDavid Rees                                          array-length-specifier*
181*99e0aae7SDavid Reesarray-length-specifier                 -> "[" "]"
182*99e0aae7SDavid Rees                                        | "[" expression "]"
183*99e0aae7SDavid Reestype-size-specifier                    -> ":" numeric-constant
184*99e0aae7SDavid Reesdelimited-argument-list                -> "(" argument-list ")"
185*99e0aae7SDavid Reestype-reference                         -> snake-word "." type-reference-tail
186*99e0aae7SDavid Rees                                        | type-reference-tail
187*99e0aae7SDavid Reestype-reference-tail                    -> type-word
188*99e0aae7SDavid Rees                                        | type-word "." type-reference-tail
189*99e0aae7SDavid Reesanonymous-bits-field-definition        -> field-location "bits" ":" Comment? eol
190*99e0aae7SDavid Rees                                          anonymous-bits-body
191*99e0aae7SDavid Reesanonymous-bits-body                    -> Indent attribute-line*
192*99e0aae7SDavid Rees                                          anonymous-bits-field-block Dedent
193*99e0aae7SDavid Reesanonymous-bits-field-block             -> <empty>
194*99e0aae7SDavid Rees                                        | conditional-anonymous-bits-field-block
195*99e0aae7SDavid Rees                                          anonymous-bits-field-block
196*99e0aae7SDavid Rees                                        | unconditional-anonymous-bits-field
197*99e0aae7SDavid Rees                                          anonymous-bits-field-block
198*99e0aae7SDavid Reesconditional-anonymous-bits-field-block -> "if" expression ":" Comment? eol Indent
199*99e0aae7SDavid Rees                                          unconditional-anonymous-bits-field+
200*99e0aae7SDavid Rees                                          Dedent
201*99e0aae7SDavid Reesconditional-struct-field-block         -> "if" expression ":" Comment? eol Indent
202*99e0aae7SDavid Rees                                          unconditional-struct-field+ Dedent
203*99e0aae7SDavid Reeseol                                    -> "\n" comment-line*
204*99e0aae7SDavid Reesdelimited-parameter-definition-list    -> "(" parameter-definition-list ")"
205*99e0aae7SDavid Reesparameter-definition-list              -> <empty>
206*99e0aae7SDavid Rees                                        | parameter-definition
207*99e0aae7SDavid Rees                                          parameter-definition-list-tail*
208*99e0aae7SDavid Reesparameter-definition-list-tail         -> "," parameter-definition
209*99e0aae7SDavid Reesparameter-definition                   -> snake-name ":" type
210*99e0aae7SDavid Reestype-name                              -> type-word
211*99e0aae7SDavid Reesexternal                               -> "external" type-name ":" Comment? eol
212*99e0aae7SDavid Rees                                          external-body
213*99e0aae7SDavid Reesexternal-body                          -> Indent doc-line* attribute-line* Dedent
214*99e0aae7SDavid Reesenum                                   -> "enum" type-name ":" Comment? eol
215*99e0aae7SDavid Rees                                          enum-body
216*99e0aae7SDavid Reesbits                                   -> "bits" type-name
217*99e0aae7SDavid Rees                                          delimited-parameter-definition-list?
218*99e0aae7SDavid Rees                                          ":" Comment? eol bits-body
219*99e0aae7SDavid Reesattribute-line                         -> attribute Comment? eol
220*99e0aae7SDavid Reesimport-line                            -> "import" string-constant "as"
221*99e0aae7SDavid Rees                                          snake-word Comment? eol
222*99e0aae7SDavid Reesdoc-line                               -> doc Comment? eol
223*99e0aae7SDavid Reescomment-line                           -> Comment? "\n"
224*99e0aae7SDavid Rees```
225*99e0aae7SDavid Rees
226*99e0aae7SDavid ReesThe following productions are automatically generated to handle zero-or-more,
227*99e0aae7SDavid Reesone-or-more, and zero-or-one repeated lists (`foo*`, `foo+`, and `foo?`
228*99e0aae7SDavid Reesnonterminals) in LR(1).  They are included for completeness, but may be ignored
229*99e0aae7SDavid Reesif you just want to understand the grammar.
230*99e0aae7SDavid Rees
231*99e0aae7SDavid Rees```shell
232*99e0aae7SDavid Rees"$default"?                           -> <empty>
233*99e0aae7SDavid Rees                                       | "$default"
234*99e0aae7SDavid ReesComment?                              -> <empty>
235*99e0aae7SDavid Rees                                       | Comment
236*99e0aae7SDavid Reesabbreviation?                         -> <empty>
237*99e0aae7SDavid Rees                                       | abbreviation
238*99e0aae7SDavid Reesadditive-expression-right*            -> <empty>
239*99e0aae7SDavid Rees                                       | additive-expression-right
240*99e0aae7SDavid Rees                                         additive-expression-right*
241*99e0aae7SDavid Reesand-expression-right*                 -> <empty>
242*99e0aae7SDavid Rees                                       | and-expression-right
243*99e0aae7SDavid Rees                                         and-expression-right*
244*99e0aae7SDavid Reesand-expression-right+                 -> and-expression-right
245*99e0aae7SDavid Rees                                         and-expression-right*
246*99e0aae7SDavid Reesarray-length-specifier*               -> <empty>
247*99e0aae7SDavid Rees                                       | array-length-specifier
248*99e0aae7SDavid Rees                                         array-length-specifier*
249*99e0aae7SDavid Reesattribute*                            -> <empty>
250*99e0aae7SDavid Rees                                       | attribute attribute*
251*99e0aae7SDavid Reesattribute-context?                    -> <empty>
252*99e0aae7SDavid Rees                                       | attribute-context
253*99e0aae7SDavid Reesattribute-line*                       -> <empty>
254*99e0aae7SDavid Rees                                       | attribute-line attribute-line*
255*99e0aae7SDavid Reescomma-then-expression*                -> <empty>
256*99e0aae7SDavid Rees                                       | comma-then-expression
257*99e0aae7SDavid Rees                                         comma-then-expression*
258*99e0aae7SDavid Reescomment-line*                         -> <empty>
259*99e0aae7SDavid Rees                                       | comment-line comment-line*
260*99e0aae7SDavid Reesdelimited-argument-list?              -> <empty>
261*99e0aae7SDavid Rees                                       | delimited-argument-list
262*99e0aae7SDavid Reesdelimited-parameter-definition-list?  -> <empty>
263*99e0aae7SDavid Rees                                       | delimited-parameter-definition-list
264*99e0aae7SDavid Reesdoc-line*                             -> <empty>
265*99e0aae7SDavid Rees                                       | doc-line doc-line*
266*99e0aae7SDavid Reesdoc?                                  -> <empty>
267*99e0aae7SDavid Rees                                       | doc
268*99e0aae7SDavid Reesenum-value*                           -> <empty>
269*99e0aae7SDavid Rees                                       | enum-value enum-value*
270*99e0aae7SDavid Reesenum-value+                           -> enum-value enum-value*
271*99e0aae7SDavid Reesenum-value-body?                      -> <empty>
272*99e0aae7SDavid Rees                                       | enum-value-body
273*99e0aae7SDavid Reesequality-expression-right*            -> <empty>
274*99e0aae7SDavid Rees                                       | equality-expression-right
275*99e0aae7SDavid Rees                                         equality-expression-right*
276*99e0aae7SDavid Reesequality-expression-right+            -> equality-expression-right
277*99e0aae7SDavid Rees                                         equality-expression-right*
278*99e0aae7SDavid Reesequality-or-greater-expression-right* -> <empty>
279*99e0aae7SDavid Rees                                       | equality-or-greater-expression-right
280*99e0aae7SDavid Rees                                         equality-or-greater-expression-right*
281*99e0aae7SDavid Reesequality-or-less-expression-right*    -> <empty>
282*99e0aae7SDavid Rees                                       | equality-or-less-expression-right
283*99e0aae7SDavid Rees                                         equality-or-less-expression-right*
284*99e0aae7SDavid Reesfield-body?                           -> <empty>
285*99e0aae7SDavid Rees                                       | field-body
286*99e0aae7SDavid Reesfield-reference-tail*                 -> <empty>
287*99e0aae7SDavid Rees                                       | field-reference-tail
288*99e0aae7SDavid Rees                                         field-reference-tail*
289*99e0aae7SDavid Reesimport-line*                          -> <empty>
290*99e0aae7SDavid Rees                                       | import-line import-line*
291*99e0aae7SDavid Reesor-expression-right*                  -> <empty>
292*99e0aae7SDavid Rees                                       | or-expression-right or-expression-right*
293*99e0aae7SDavid Reesor-expression-right+                  -> or-expression-right or-expression-right*
294*99e0aae7SDavid Reesparameter-definition-list-tail*       -> <empty>
295*99e0aae7SDavid Rees                                       | parameter-definition-list-tail
296*99e0aae7SDavid Rees                                         parameter-definition-list-tail*
297*99e0aae7SDavid Reestimes-expression-right*               -> <empty>
298*99e0aae7SDavid Rees                                       | times-expression-right
299*99e0aae7SDavid Rees                                         times-expression-right*
300*99e0aae7SDavid Reestype-definition*                      -> <empty>
301*99e0aae7SDavid Rees                                       | type-definition type-definition*
302*99e0aae7SDavid Reestype-size-specifier?                  -> <empty>
303*99e0aae7SDavid Rees                                       | type-size-specifier
304*99e0aae7SDavid Reesunconditional-anonymous-bits-field*   -> <empty>
305*99e0aae7SDavid Rees                                       | unconditional-anonymous-bits-field
306*99e0aae7SDavid Rees                                         unconditional-anonymous-bits-field*
307*99e0aae7SDavid Reesunconditional-anonymous-bits-field+   -> unconditional-anonymous-bits-field
308*99e0aae7SDavid Rees                                         unconditional-anonymous-bits-field*
309*99e0aae7SDavid Reesunconditional-bits-field*             -> <empty>
310*99e0aae7SDavid Rees                                       | unconditional-bits-field
311*99e0aae7SDavid Rees                                         unconditional-bits-field*
312*99e0aae7SDavid Reesunconditional-bits-field+             -> unconditional-bits-field
313*99e0aae7SDavid Rees                                         unconditional-bits-field*
314*99e0aae7SDavid Reesunconditional-struct-field*           -> <empty>
315*99e0aae7SDavid Rees                                       | unconditional-struct-field
316*99e0aae7SDavid Rees                                         unconditional-struct-field*
317*99e0aae7SDavid Reesunconditional-struct-field+           -> unconditional-struct-field
318*99e0aae7SDavid Rees                                         unconditional-struct-field*
319*99e0aae7SDavid Rees```
320*99e0aae7SDavid Rees
321*99e0aae7SDavid ReesThe following regexes are used to tokenize input into the corresponding symbols.
322*99e0aae7SDavid ReesNote that the `Indent`, `Dedent`, and `EndOfLine` symbols are generated using
323*99e0aae7SDavid Reesseparate logic.
324*99e0aae7SDavid Rees
325*99e0aae7SDavid ReesPattern                                    | Symbol
326*99e0aae7SDavid Rees------------------------------------------ | ------------------------------
327*99e0aae7SDavid Rees`\[`                                       | `"["`
328*99e0aae7SDavid Rees`\]`                                       | `"]"`
329*99e0aae7SDavid Rees`\(`                                       | `"("`
330*99e0aae7SDavid Rees`\)`                                       | `")"`
331*99e0aae7SDavid Rees`\:`                                       | `":"`
332*99e0aae7SDavid Rees`\=`                                       | `"="`
333*99e0aae7SDavid Rees`\+`                                       | `"+"`
334*99e0aae7SDavid Rees`\-`                                       | `"-"`
335*99e0aae7SDavid Rees`\*`                                       | `"*"`
336*99e0aae7SDavid Rees`\.`                                       | `"."`
337*99e0aae7SDavid Rees`\?`                                       | `"?"`
338*99e0aae7SDavid Rees`\=\=`                                     | `"=="`
339*99e0aae7SDavid Rees`\!\=`                                     | `"!="`
340*99e0aae7SDavid Rees`\&\&`                                     | `"&&"`
341*99e0aae7SDavid Rees`\|\|`                                     | `"||"`
342*99e0aae7SDavid Rees`\<`                                       | `"<"`
343*99e0aae7SDavid Rees`\>`                                       | `">"`
344*99e0aae7SDavid Rees`\<\=`                                     | `"<="`
345*99e0aae7SDavid Rees`\>\=`                                     | `">="`
346*99e0aae7SDavid Rees`\,`                                       | `","`
347*99e0aae7SDavid Rees`\$static_size_in_bits`                    | `"$static_size_in_bits"`
348*99e0aae7SDavid Rees`\$is_statically_sized`                    | `"$is_statically_sized"`
349*99e0aae7SDavid Rees`\$max`                                    | `"$max"`
350*99e0aae7SDavid Rees`\$present`                                | `"$present"`
351*99e0aae7SDavid Rees`\$upper_bound`                            | `"$upper_bound"`
352*99e0aae7SDavid Rees`\$lower_bound`                            | `"$lower_bound"`
353*99e0aae7SDavid Rees`\$next`                                   | `"$next"`
354*99e0aae7SDavid Rees`\$size_in_bits`                           | `"$size_in_bits"`
355*99e0aae7SDavid Rees`\$size_in_bytes`                          | `"$size_in_bytes"`
356*99e0aae7SDavid Rees`\$max_size_in_bits`                       | `"$max_size_in_bits"`
357*99e0aae7SDavid Rees`\$max_size_in_bytes`                      | `"$max_size_in_bytes"`
358*99e0aae7SDavid Rees`\$min_size_in_bits`                       | `"$min_size_in_bits"`
359*99e0aae7SDavid Rees`\$min_size_in_bytes`                      | `"$min_size_in_bytes"`
360*99e0aae7SDavid Rees`\$default`                                | `"$default"`
361*99e0aae7SDavid Rees`struct`                                   | `"struct"`
362*99e0aae7SDavid Rees`bits`                                     | `"bits"`
363*99e0aae7SDavid Rees`enum`                                     | `"enum"`
364*99e0aae7SDavid Rees`external`                                 | `"external"`
365*99e0aae7SDavid Rees`import`                                   | `"import"`
366*99e0aae7SDavid Rees`as`                                       | `"as"`
367*99e0aae7SDavid Rees`if`                                       | `"if"`
368*99e0aae7SDavid Rees`let`                                      | `"let"`
369*99e0aae7SDavid Rees`EmbossReserved[A-Za-z0-9]*`               | `BadWord`
370*99e0aae7SDavid Rees`emboss_reserved[_a-z0-9]*`                | `BadWord`
371*99e0aae7SDavid Rees`EMBOSS_RESERVED[_A-Z0-9]*`                | `BadWord`
372*99e0aae7SDavid Rees`"(?:[^"\n\\]\|\\[n\\"])*"`                | `String`
373*99e0aae7SDavid Rees`[0-9]+`                                   | `Number`
374*99e0aae7SDavid Rees`[0-9]{1,3}(?:_[0-9]{3})*`                 | `Number`
375*99e0aae7SDavid Rees`0x[0-9a-fA-F]+`                           | `Number`
376*99e0aae7SDavid Rees`0x_?[0-9a-fA-F]{1,4}(?:_[0-9a-fA-F]{4})*` | `Number`
377*99e0aae7SDavid Rees`0x_?[0-9a-fA-F]{1,8}(?:_[0-9a-fA-F]{8})*` | `Number`
378*99e0aae7SDavid Rees`0b[01]+`                                  | `Number`
379*99e0aae7SDavid Rees`0b_?[01]{1,4}(?:_[01]{4})*`               | `Number`
380*99e0aae7SDavid Rees`0b_?[01]{1,8}(?:_[01]{8})*`               | `Number`
381*99e0aae7SDavid Rees`true\|false`                              | `BooleanConstant`
382*99e0aae7SDavid Rees`[a-z][a-z_0-9]*`                          | `SnakeWord`
383*99e0aae7SDavid Rees`[A-Z][A-Z_0-9]*[A-Z_][A-Z_0-9]*`          | `ShoutyWord`
384*99e0aae7SDavid Rees`[A-Z][a-zA-Z0-9]*[a-z][a-zA-Z0-9]*`       | `CamelWord`
385*99e0aae7SDavid Rees`-- .*`                                    | `Documentation`
386*99e0aae7SDavid Rees`--$`                                      | `Documentation`
387*99e0aae7SDavid Rees`--.*`                                     | `BadDocumentation`
388*99e0aae7SDavid Rees`\s+`                                      | *no symbol emitted*
389*99e0aae7SDavid Rees`#.*`                                      | `Comment`
390*99e0aae7SDavid Rees`[0-9][bxBX]?[0-9a-fA-F_]*`                | `BadNumber`
391*99e0aae7SDavid Rees`[a-zA-Z_$0-9]+`                           | `BadWord`
392*99e0aae7SDavid Rees
393*99e0aae7SDavid ReesThe following 534 keywords are reserved, but not used, by Emboss.  They may not
394*99e0aae7SDavid Reesbe used as field, type, or enum value names.
395*99e0aae7SDavid Rees
396*99e0aae7SDavid Rees`ATOMIC_BOOL_LOCK_FREE` `ATOMIC_CHAR16_T_LOCK_FREE` `ATOMIC_CHAR32_T_LOCK_FREE`
397*99e0aae7SDavid Rees`ATOMIC_CHAR_LOCK_FREE` `ATOMIC_FLAG_INIT` `ATOMIC_INT_LOCK_FREE`
398*99e0aae7SDavid Rees`ATOMIC_LLONG_LOCK_FREE` `ATOMIC_LONG_LOCK_FREE` `ATOMIC_POINTER_LOCK_FREE`
399*99e0aae7SDavid Rees`ATOMIC_SHORT_LOCK_FREE` `ATOMIC_VAR_INIT` `ATOMIC_WCHAR_T_LOCK_FREE` `BUFSIZ`
400*99e0aae7SDavid Rees`CGFloat` `CHAR_BIT` `CHAR_MAX` `CHAR_MIN` `CLOCKS_PER_SEC` `CMPLX` `CMPLXF`
401*99e0aae7SDavid Rees`CMPLXL` `DBL_DECIMAL_DIG` `DBL_DIG` `DBL_EPSILON` `DBL_HAS_SUBNORM`
402*99e0aae7SDavid Rees`DBL_MANT_DIG` `DBL_MAX` `DBL_MAX_10_EXP` `DBL_MAX_EXP` `DBL_MIN`
403*99e0aae7SDavid Rees`DBL_MIN_10_EXP` `DBL_MIN_EXP` `DBL_TRUE_MIN` `DECIMAL_DIG` `DOMAIN` `EDOM`
404*99e0aae7SDavid Rees`EILSEQ` `EOF` `ERANGE` `EXIT_FAILURE` `EXIT_SUCCESS` `FE_ALL_EXCEPT`
405*99e0aae7SDavid Rees`FE_DFL_ENV` `FE_DIVBYZERO` `FE_DOWNWARD` `FE_INEXACT` `FE_INVALID`
406*99e0aae7SDavid Rees`FE_OVERFLOW` `FE_TONEAREST` `FE_TOWARDZERO` `FE_UNDERFLOW` `FE_UPWARD`
407*99e0aae7SDavid Rees`FILENAME_MAX` `FLT_DECIMAL_DIG` `FLT_DIG` `FLT_EPSILON` `FLT_EVAL_METHOD`
408*99e0aae7SDavid Rees`FLT_HAS_SUBNORM` `FLT_MANT_DIG` `FLT_MAX` `FLT_MAX_10_EXP` `FLT_MAX_EXP`
409*99e0aae7SDavid Rees`FLT_MIN` `FLT_MIN_10_EXP` `FLT_MIN_EXP` `FLT_RADIX` `FLT_ROUNDS` `FLT_TRUE_MIN`
410*99e0aae7SDavid Rees`FOPEN_MAX` `FP_FAST_FMA` `FP_FAST_FMAF` `FP_FAST_FMAL` `FP_ILOGB0`
411*99e0aae7SDavid Rees`FP_ILOGBNAN` `FP_INFINITE` `FP_NAN` `FP_NORMAL` `FP_SUBNORMAL` `FP_ZERO`
412*99e0aae7SDavid Rees`False` `HUGE_VAL` `HUGE_VALF` `HUGE_VALL` `INFINITY` `INT16_C` `INT16_MAX`
413*99e0aae7SDavid Rees`INT16_MIN` `INT32_C` `INT32_MAX` `INT32_MIN` `INT64_C` `INT64_MAX` `INT64_MIN`
414*99e0aae7SDavid Rees`INT8_C` `INT8_MAX` `INT8_MIN` `INTMAX_C` `INTMAX_MAX` `INTMAX_MIN` `INTPTR_MAX`
415*99e0aae7SDavid Rees`INTPTR_MIN` `INT_FAST16_MAX` `INT_FAST16_MIN` `INT_FAST32_MAX` `INT_FAST32_MIN`
416*99e0aae7SDavid Rees`INT_FAST64_MAX` `INT_FAST64_MIN` `INT_FAST8_MAX` `INT_FAST8_MIN`
417*99e0aae7SDavid Rees`INT_LEAST16_MAX` `INT_LEAST16_MIN` `INT_LEAST32_MAX` `INT_LEAST32_MIN`
418*99e0aae7SDavid Rees`INT_LEAST64_MAX` `INT_LEAST64_MIN` `INT_LEAST8_MAX` `INT_LEAST8_MIN` `INT_MAX`
419*99e0aae7SDavid Rees`INT_MIN` `LC_ALL` `LC_COLLATE` `LC_CTYPE` `LC_MONETARY` `LC_NUMERIC` `LC_TIME`
420*99e0aae7SDavid Rees`LDBL_DECIMAL_DIG` `LDBL_DIG` `LDBL_EPSILON` `LDBL_HAS_SUBNORM` `LDBL_MANT_DIG`
421*99e0aae7SDavid Rees`LDBL_MAX` `LDBL_MAX_10_EXP` `LDBL_MAX_EXP` `LDBL_MIN` `LDBL_MIN_10_EXP`
422*99e0aae7SDavid Rees`LDBL_MIN_EXP` `LDBL_TRUE_MIN` `LLONG_MAX` `LLONG_MIN` `LONG_MAX` `LONG_MIN`
423*99e0aae7SDavid Rees`MATH_ERREXCEPT` `MATH_ERRNO` `MAXFLOAT` `MB_CUR_MAX` `MB_LEN_MAX` `M_1_PI`
424*99e0aae7SDavid Rees`M_2_PI` `M_2_SQRTPI` `M_3PI_4` `M_E` `M_INVLN2` `M_IVLN10` `M_LN10` `M_LN2`
425*99e0aae7SDavid Rees`M_LN2HI` `M_LN2LO` `M_LOG10E` `M_LOG2E` `M_LOG2_E` `M_PI` `M_PI_2` `M_PI_4`
426*99e0aae7SDavid Rees`M_SQRT1_2` `M_SQRT2` `M_SQRT3` `M_SQRTPI` `M_TWOPI` `NAN` `NDEBUG` `NSInteger`
427*99e0aae7SDavid Rees`NSNumber` `NSObject` `NULL` `None` `ONCE_FLAG_INIT` `OVERFLOW` `PLOSS`
428*99e0aae7SDavid Rees`PTRDIFF_MAX` `PTRDIFF_MIN` `RAND_MAX` `SCHAR_MAX` `SCHAR_MIN` `SEEK_CUR`
429*99e0aae7SDavid Rees`SEEK_END` `SEEK_SET` `SHRT_MAX` `SHRT_MIN` `SIGABRT` `SIGFPE` `SIGILL` `SIGINT`
430*99e0aae7SDavid Rees`SIGSEGV` `SIGTERM` `SIG_ATOMIC_MAX` `SIG_ATOMIC_MIN` `SIG_DFL` `SIG_ERR`
431*99e0aae7SDavid Rees`SIG_IGN` `SING` `SIZE_MAX` `Self` `TIME_UTC` `TLOSS` `TMP_MAX` `TMP_MAX_S`
432*99e0aae7SDavid Rees`TSS_DTOR_ITERATIONS` `True` `UCHAR_MAX` `UINT16_C` `UINT16_MAX` `UINT32_C`
433*99e0aae7SDavid Rees`UINT32_MAX` `UINT64_C` `UINT64_MAX` `UINT8_C` `UINT8_MAX` `UINTMAX_C`
434*99e0aae7SDavid Rees`UINTMAX_MAX` `UINTPTR_MAX` `UINT_FAST16_MAX` `UINT_FAST32_MAX`
435*99e0aae7SDavid Rees`UINT_FAST64_MAX` `UINT_FAST8_MAX` `UINT_LEAST16_MAX` `UINT_LEAST32_MAX`
436*99e0aae7SDavid Rees`UINT_LEAST64_MAX` `UINT_LEAST8_MAX` `UINT_MAX` `ULLONG_MAX` `ULONG_MAX`
437*99e0aae7SDavid Rees`UNDERFLOW` `USHRT_MAX` `WCHAR_MAX` `WCHAR_MIN` `WEOF` `WINT_MAX` `WINT_MIN`
438*99e0aae7SDavid Rees`abstract` `acos` `acosh` `after` `alignas` `alignof` `and` `and_eq` `andalso`
439*99e0aae7SDavid Rees`asin` `asinh` `asm` `assert` `atan` `atan2` `atanh`
440*99e0aae7SDavid Rees`atomic_compare_exchange_strong` `atomic_compare_exchange_strong_explicit`
441*99e0aae7SDavid Rees`atomic_compare_exchange_weak` `atomic_compare_exchange_weak_explicit`
442*99e0aae7SDavid Rees`atomic_exchange` `atomic_exchange_explicit` `atomic_fetch_add`
443*99e0aae7SDavid Rees`atomic_fetch_add_explicit` `atomic_fetch_and` `atomic_fetch_and_explicit`
444*99e0aae7SDavid Rees`atomic_fetch_or` `atomic_fetch_or_explicit` `atomic_fetch_sub`
445*99e0aae7SDavid Rees`atomic_fetch_sub_explicit` `atomic_fetch_xor` `atomic_fetch_xor_explicit`
446*99e0aae7SDavid Rees`atomic_init` `atomic_is_lock_free` `atomic_load` `atomic_load_explicit`
447*99e0aae7SDavid Rees`atomic_store` `atomic_store_explicit` `auto` `band` `become` `begin` `bitand`
448*99e0aae7SDavid Rees`bitor` `bnot` `bool` `boolean` `bor` `box` `break` `bsl` `bsr` `bxor` `byte`
449*99e0aae7SDavid Rees`carg` `case` `catch` `cbrt` `ceil` `chan` `char` `char16_t` `char32_t` `cimag`
450*99e0aae7SDavid Rees`class` `classdef` `compl` `complex` `concept` `cond` `conj` `const`
451*99e0aae7SDavid Rees`const_cast` `constexpr` `continue` `copysign` `cos` `cosh` `cproj` `crate`
452*99e0aae7SDavid Rees`creal` `decltype` `def` `default` `defer` `del` `delete` `div` `do` `double`
453*99e0aae7SDavid Rees`dynamic_cast` `elif` `else` `elseif` `end` `erf` `erfc` `errno` `except` `exec`
454*99e0aae7SDavid Rees`exp` `exp2` `explicit` `expm1` `export` `extends` `extern` `fabs` `fallthrough`
455*99e0aae7SDavid Rees`fdim` `final` `finally` `float` `floor` `fma` `fmax` `fmin` `fmod` `fn` `for`
456*99e0aae7SDavid Rees`fortran` `fpclassify` `frexp` `friend` `from` `fun` `func` `function` `global`
457*99e0aae7SDavid Rees`go` `goto` `hypot` `ilogb` `imaginary` `impl` `implementation` `implements`
458*99e0aae7SDavid Rees`in` `inline` `instanceof` `int` `interface` `is` `isfinite` `isgreater`
459*99e0aae7SDavid Rees`isgreaterequal` `isinf` `isless` `islessequal` `islessgreater` `isnan`
460*99e0aae7SDavid Rees`isnormal` `isunordered` `kill_dependency` `lambda` `ldexp` `lgamma` `llrint`
461*99e0aae7SDavid Rees`llround` `log` `log10` `log1p` `log2` `logb` `long` `loop` `lrint` `lround`
462*99e0aae7SDavid Rees`macro` `map` `match` `math_errhandling` `mod` `move` `mut` `mutable`
463*99e0aae7SDavid Rees`namespace` `native` `nearbyint` `new` `nextafter` `nexttoward` `noexcept`
464*99e0aae7SDavid Rees`nonatomic` `nonlocal` `noreturn` `not` `not_eq` `null` `nullptr` `of`
465*99e0aae7SDavid Rees`offsetof` `operator` `or` `or_eq` `orelse` `otherwise` `override` `package`
466*99e0aae7SDavid Rees`parfor` `pass` `persistent` `pow` `print` `priv` `private` `proc` `property`
467*99e0aae7SDavid Rees`protected` `protocol` `pub` `public` `pure` `raise` `range` `readonly`
468*99e0aae7SDavid Rees`readwrite` `receive` `ref` `register` `reinterpret_cast` `rem` `remainder`
469*99e0aae7SDavid Rees`remquo` `requires` `restrict` `retain` `rethrow` `return` `rint` `round`
470*99e0aae7SDavid Rees`scalbln` `scalbn` `select` `self` `setjmp` `short` `signbit` `signed` `sin`
471*99e0aae7SDavid Rees`sinh` `sizeof` `spmd` `sqrt` `static` `static_assert` `static_cast` `stderr`
472*99e0aae7SDavid Rees`stdin` `stdout` `strictfp` `strong` `super` `switch` `synchronized` `tan`
473*99e0aae7SDavid Rees`tanh` `template` `tgamma` `this` `thread_local` `throw` `throws` `trait`
474*99e0aae7SDavid Rees`transient` `trunc` `try` `type` `typedef` `typeid` `typename` `typeof` `union`
475*99e0aae7SDavid Rees`unsafe` `unsafe_unretained` `unsigned` `unsized` `use` `using` `va_arg`
476*99e0aae7SDavid Rees`va_copy` `va_end` `va_start` `var` `virtual` `void` `volatile` `wchar_t` `weak`
477