
/*n3096*/
(6.4) token:
  keyword
  identifier
  constant
  string-literal
  punctuator

(6.4) preprocessing-token:
  header-name
  identifier
  pp-number
  character-constant
  string-literal
  punctuator
  /*each universal-character-name that cannot be one of the above
    each non-white-space character that cannot be one of the above*/

(6.4.1) keyword: one of

"alignas" "alignof" "auto" "bool"
"break" "case" "char"
"const" "constexpr" "continue"
"default" "do" "double" "else"
 "enum" "extern" "false" "float" "for"
"goto" "if"
 "inline" "int" "long" "nullptr" "register" "restrict" "return"
 "short" "signed" "sizeof" "static"
"static_assert" "struct" "switch"
"thread_local" "true"
"typedef"
"typeof"
"typeof_unqual" "union" "unsigned"
"void"
"volatile" "while"
"_Atomic"
"_BitInt"
"_Complex"
"_Decimal128"
"_Decimal32"
"_Decimal64" "
"_Generic"
"_Imaginary"
"_Noreturn"


(6.4.2.1) identifier:
  identifier-start
  identifier identifier-continue

(6.4.2.1) identifier-start:
  nondigit
  XID_Start character
  universal-character-name of class XID_Start

(6.4.2.1) identifier-continue:
 digit
 nondigit
 XID_Continue character
 universal-character-name of class XID_Continue

(6.4.2.1) nondigit: one of
_ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z

(6.4.2.1) digit: one of
  0 1 2 3 4 5 6 7 8 9

(6.4.3) universal-character-name:
  \u hex-quad
  \U hex-quad hex-quad

(6.4.3) hex-quad:
  hexadecimal-digit hexadecimal-digit hexadecimal-digit hexadecimal-digit


(6.4.4) constant:
  integer-constant
  floating-constant
  enumeration-constant
  character-constant
  predefined-constant

(6.4.4.1) integer-constant:
  decimal-constant
  integer-suffix opt
  octal-constant
  integer-suffix opt
  hexadecimal-constant
  integer-suffix opt
  binary-constant
  integer-suffix opt

(6.4.4.1) decimal-constant:
   nonzero-digit
  decimal-constant ' opt  digit

(6.4.4.1) octal-constant:
   0
   octal-constant ' opt  octal-digit

(6.4.4.1) hexadecimal-constant:
   hexadecimal-prefix hexadecimal-digit-sequence

(6.4.4.1) binary-constant:
  binary-prefix binary-digit
  binary-constant ' opt  binary-digit

(6.4.4.1) hexadecimal-prefix: one of
  0x 0X

(6.4.4.1) binary-prefix: one of
  0b 0B

(6.4.4.1) nonzero-digit: one of
  1 2 3 4 5 6 7 8 9

(6.4.4.1) octal-digit: one of
   0 1 2 3 4 5 6 7

hexadecimal-digit-sequence:
  hexadecimal-digit
  hexadecimal-digit-sequence ' opt  hexadecimal-digit


(6.4.4.1) hexadecimal-digit: one of
  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F

(6.4.4.1) binary-digit: one of
   0 1

(6.4.4.1) integer-suffix:
   unsigned-suffix long-suffix opt
   unsigned-suffix long-long-suffix
   unsigned-suffix bit-precise-int-suffix
   long-suffix unsigned-suffix opt
   long-long-suffix unsigned-suffix opt
   bit-precise-int-suffix unsigned-suffix opt

(6.4.4.1) bit-precise-int-suffix: one of
   wb WB

(6.4.4.1) unsigned-suffix: one of
  u U

(6.4.4.1) long-suffix: one of
  l L

(6.4.4.1) long-long-suffix: one of
  ll LL

(6.4.4.2) floating-constant:
  decimal-floating-constant
  hexadecimal-floating-constant

(6.4.4.2) decimal-floating-constant:
   fractional-constant exponent-part opt  floating-suffix opt
   digit-sequence exponent-part floating-suffix opt

(6.4.4.2) hexadecimal-floating-constant:
  hexadecimal-prefix hexadecimal-fractional-constant
                     binary-exponent-part floating-suffix opt
  hexadecimal-prefix hexadecimal-digit-sequence
                     binary-exponent-part floating-suffix opt

(6.4.4.2) fractional-constant:
   digit-sequence opt  . digit-sequence
   digit-sequence .

(6.4.4.2) exponent-part:
    e sign opt  digit-sequence
    E sign opt  digit-sequence

(6.4.4.2) sign: one of
   + -

(6.4.4.2) digit-sequence:
  digit
  digit-sequence ' opt  digit

(6.4.4.2) hexadecimal-fractional-constant:
     hexadecimal-digit-sequence opt  . hexadecimal-digit-sequence
     hexadecimal-digit-sequence .

(6.4.4.2) binary-exponent-part:
      p sign opt  digit-sequence
      P sign opt  digit-sequence

(6.4.4.2) floating-suffix: one of
   f l F L df dd dl DF DD DL

(6.4.4.3) enumeration-constant:
  identifier

(6.4.4.4) character-constant:
  encoding-prefix opt  ' c-char-sequence '

(6.4.4.4) encoding-prefix: one of
	u8	u	U	L

(6.4.4.4) c-char-sequence:
   c-char
   c-char-sequence c-char

(6.4.4.4) c-char:
  /*any member of the source character set except the single-quote ', backslash \, or new-line character*/
    escape-sequence

(6.4.4.4) escape-sequence:
   simple-escape-sequence
   octal-escape-sequence
   hexadecimal-escape-sequence
   universal-character-name

(6.4.4.4) simple-escape-sequence: one of
   \' \" \? \\ \a \b \f \n \r \t \v

(6.4.4.4) octal-escape-sequence:
  \ octal-digit
  \ octal-digit octal-digit \ octal-digit octal-digit octal-digit

(6.4.4.4) hexadecimal-escape-sequence:
  \x hexadecimal-digit
  hexadecimal-escape-sequence hexadecimal-digit

(6.4.4.5) predefined-constant:
  "false"
  "true"
  "nullptr"

(6.4.5) string-literal:
   encoding-prefix opt  " s-char-sequence opt  "

(6.4.5) s-char-sequence:
  s-char
  s-char-sequence s-char

(6.4.5) s-char:
  /*any member of the source character set except the double-quote ", backslash \, or new-line character*/
  escape-sequence


(6.4.6) punctuator: one of
  [ ] ( ) { } .	->
  ++ -- & * + - ~ !
  / % << >> < > <= >= == != ^ | && || ? : :: ; ...
  = *= /= %= += -= <<= >>= &= ^= |=
  , # ##
  <:	:> <% %> %:	%:%:

(6.4.7) header-name:
  < h-char-sequence >
  " q-char-sequence "

(6.4.7) h-char-sequence:
   h-char
   h-char-sequence h-char

(6.4.7) h-char:
  /*any member of the source character set except
    the new-line character and >*/

(6.4.7) q-char-sequence:
  q-char
  q-char-sequence q-char

(6.4.7) q-char:
  /*any member of the source character set except
    the new-line character and "*/

(6.4.8) pp-number:
  digit
  . digit
  pp-number identifier-continue
  pp-number ' digit
  pp-number ' nondigit
  pp-number e sign
  pp-number E sign
  pp-number p sign
  pp-number P sign
  pp-number .


(6.5.1) primary-expression:
  identifier
  constant
  string-literal
 ( expression )
  generic-selection

(6.5.1.1) generic-selection:
  "_Generic" ( assignment-expression , generic-assoc-list )

(6.5.1.1) generic-assoc-list:
  generic-association
  generic-assoc-list , generic-association


(6.5.1.1) generic-association:
  type-name : assignment-expression
  "default" : assignment-expression

(6.5.2) postfix-expression:
  primary-expression
  postfix-expression [ expression ]
  postfix-expression ( argument-expression-list opt  )
  postfix-expression . identifier
  postfix-expression -> identifier
  postfix-expression ++
  postfix-expression --
  compound-literal

(6.5.2) argument-expression-list:
  assignment-expression
  argument-expression-list , assignment-expression

(6.5.2.5) compound-literal:
          ( storage-class-specifiers opt  type-name ) braced-initializer

(6.5.2.5) storage-class-specifiers:
  storage-class-specifier
  storage-class-specifiers storage-class-specifier

(6.5.3) unary-expression:
  postfix-expression
  ++ unary-expression
  -- unary-expression
  unary-operator cast-expression
  sizeof unary-expression
  sizeof ( type-name )
  alignof ( type-name )

(6.5.3) unary-operator: one of
   & * + - ~ !

(6.5.4) cast-expression:
   unary-expression
   ( type-name ) cast-expression

(6.5.5) multiplicative-expression:
  cast-expression
  multiplicative-expression * cast-expression
  multiplicative-expression / cast-expression
  multiplicative-expression % cast-expression

(6.5.6) additive-expression:
  multiplicative-expression
  additive-expression + multiplicative-expression
  additive-expression - multiplicative-expression

(6.5.7) shift-expression:
  additive-expression
  shift-expression << additive-expression
  shift-expression >> additive-expression

(6.5.8) relational-expression:
  shift-expression
  relational-expression < shift-expression
  relational-expression > shift-expression
  relational-expression <= shift-expression
  relational-expression >= shift-expression

(6.5.9) equality-expression:
  relational-expression
  equality-expression == relational-expression
  equality-expression != relational-expression

(6.5.10) AND-expression:
   equality-expression
   AND-expression & equality-expression

(6.5.11) exclusive-OR-expression:
   AND-expression
   exclusive-OR-expression ^ AND-expression

(6.5.12) inclusive-OR-expression:
  exclusive-OR-expression
  inclusive-OR-expression | exclusive-OR-expression

(6.5.13) logical-AND-expression:
  inclusive-OR-expression
  logical-AND-expression && inclusive-OR-expression

(6.5.14) logical-OR-expression:
  logical-AND-expression
  logical-OR-expression || logical-AND-expression

(6.5.15) conditional-expression:
  logical-OR-expression
  logical-OR-expression ? expression : conditional-expression

(6.5.16) assignment-expression:
  conditional-expression
  unary-expression assignment-operator assignment-expression

(6.5.16) assignment-operator: one of
   = *= /= %= += -= <<= >>= &= ^= |=

(6.5.17) expression:
   assignment-expression
   expression , assignment-expression

(6.6) constant-expression:
   conditional-expression


(6.7) declaration:
   declaration-specifiers init-declarator-list opt  ;
   attribute-specifier-sequence declaration-specifiers init-declarator-list ;
   static_assert-declaration
   attribute-declaration

(6.7) declaration-specifiers:
    declaration-specifier attribute-specifier-sequence opt
    declaration-specifier declaration-specifiers

(6.7) declaration-specifier:
  storage-class-specifier
  type-specifier-qualifier
  function-specifier

(6.7) init-declarator-list:
  init-declarator
  init-declarator-list , init-declarator

(6.7) init-declarator:
  declarator declarator = initializer

(6.7) attribute-declaration:
  attribute-specifier-sequence ;

(6.7.1) storage-class-specifier:
  "auto"
  "constexpr"
  "extern"
  "register"
  "static"
  "thread_local"
  "typedef"

(6.7.2) type-specifier:
  "void"
 "char"
 "short"
 "int"
 "long"
 "float"
 "double"
 "signed"
 "unsigned"
 "_BitInt" ( constant-expression )
 "bool"
 "_Complex"
 "_Decimal32"
 "_Decimal64"
 "_Decimal128"
 atomic-type-specifier
 struct-or-union-specifier
 enum-specifier
 typedef-name
 typeof-specifier

(6.7.2.1) struct-or-union-specifier:
   struct-or-union attribute-specifier-sequence opt  identifier opt  { member-declaration-list }
   struct-or-union attribute-specifier-sequence opt  identifier

(6.7.2.1) struct-or-union:
  "struct"
  "union"

(6.7.2.1) member-declaration-list:
   member-declaration
   member-declaration-list member-declaration

(6.7.2.1) member-declaration:
  attribute-specifier-sequence opt  specifier-qualifier-list member-declarator-list opt  ;
  static_assert-declaration

(6.7.2.1) specifier-qualifier-list:
   type-specifier-qualifier attribute-specifier-sequence opt
   type-specifier-qualifier specifier-qualifier-list

(6.7.2.1) type-specifier-qualifier:
  type-specifier
  type-qualifier
  alignment-specifier

(6.7.2.1) member-declarator-list:
  member-declarator
  member-declarator-list , member-declarator

(6.7.2.1) member-declarator:
  declarator
  declarator opt  : constant-expression

(6.7.2.2) enum-specifier:
   enum attribute-specifier-sequence opt  identifier opt  enum-type-specifier opt  { enumerator-list }
   enum attribute-specifier-sequence opt  identifier opt  enum-type-specifier opt  { enumerator-list , }
  enum identifier enum-type-specifier opt

(6.7.2.2) enumerator-list:
  enumerator
  enumerator-list , enumerator

(6.7.2.2) enumerator:
  enumeration-constant attribute-specifier-sequence opt
  enumeration-constant attribute-specifier-sequence opt  = constant-expression

(6.7.2.2) enum-type-specifier:
   : specifier-qualifier-list

(6.7.2.4) atomic-type-specifier:
  "_Atomic" ( type-name )

(6.7.2.5) typeof-specifier:
  "typeof" ( typeof-specifier-argument )
  "typeof_unqual" ( typeof-specifier-argument )

(6.7.2.5) typeof-specifier-argument:
  expression
  type-name

(6.7.3) type-qualifier:
  "const"
 "restrict"
 "volatile"
 "_Atomic"

(6.7.4) function-specifier:
 "inline"
 "_Noreturn"

(6.7.5) alignment-specifier:
  "alignas" ( type-name )
  "alignas" ( constant-expression )

(6.7.6) declarator:
  pointer opt  direct-declarator

(6.7.6) direct-declarator:
   identifier attribute-specifier-sequence opt
   ( declarator )
   array-declarator attribute-specifier-sequence opt
   function-declarator attribute-specifier-sequence opt

(6.7.6) array-declarator:
   direct-declarator [ type-qualifier-list opt  assignment-expression opt  ]
   direct-declarator [ static type-qualifier-list opt  assignment-expression ]
   direct-declarator [ type-qualifier-list static assignment-expression ]
   direct-declarator [ type-qualifier-list opt  * ]

(6.7.6) function-declarator:
  direct-declarator ( parameter-type-list opt  )

(6.7.6) pointer:
   * attribute-specifier-sequence opt  type-qualifier-list opt
   * attribute-specifier-sequence opt  type-qualifier-list opt  pointer

(6.7.6) type-qualifier-list:
  type-qualifier
  type-qualifier-list type-qualifier

(6.7.6) parameter-type-list:
   parameter-list
   parameter-list , ...
   ...

(6.7.6) parameter-list:
  parameter-declaration
  parameter-list , parameter-declaration

(6.7.6) parameter-declaration:
  attribute-specifier-sequence opt  declaration-specifiers declarator
  attribute-specifier-sequence opt  declaration-specifiers abstract-declarator opt

(6.7.7) type-name:
  specifier-qualifier-list abstract-declarator opt

(6.7.7) abstract-declarator:
  pointer
  pointer opt  direct-abstract-declarator

(6.7.7) direct-abstract-declarator:
  ( abstract-declarator )
  array-abstract-declarator attribute-specifier-sequence opt
  function-abstract-declarator attribute-specifier-sequence opt

(6.7.7) array-abstract-declarator:
   direct-abstract-declarator opt  [ type-qualifier-list opt  assignment-expression opt  ]
   direct-abstract-declarator opt  [ static type-qualifier-list opt  assignment-expression ]
   direct-abstract-declarator opt  [ type-qualifier-list static assignment-expression ]
   direct-abstract-declarator opt  [ * ]

(6.7.7) function-abstract-declarator:
   direct-abstract-declarator opt  ( parameter-type-list opt  )

(6.7.8) typedef-name:
  identifier

(6.7.10) braced-initializer:
    { }
    { initializer-list }
    { initializer-list , }

(6.7.10) initializer:
   assignment-expression
   braced-initializer

(6.7.10) initializer-list:
   designation opt  initializer
   initializer-list , designation opt  initializer

(6.7.10) designation:
  designator-list =

(6.7.10) designator-list:
  designator
  designator-list designator

(6.7.10) designator:
   [ constant-expression ]
   . identifier

(6.7.11) static_assert-declaration:
  "static_assert" ( constant-expression , string-literal ) ;
  "static_assert" ( constant-expression ) ;

(6.7.12.1) attribute-specifier-sequence:
  attribute-specifier-sequence opt  attribute-specifier

(6.7.12.1) attribute-specifier:
   [ [ attribute-list ] ]

(6.7.12.1) attribute-list:
  attribute opt
  attribute-list , attribute opt

(6.7.12.1) attribute:
  attribute-token attribute-argument-clause opt

(6.7.12.1) attribute-token:
  standard-attribute
  attribute-prefixed-token

(6.7.12.1) standard-attribute:
  identifier

(6.7.12.1) attribute-prefixed-token:
   attribute-prefix :: identifier

(6.7.12.1) attribute-prefix:
  identifier

(6.7.12.1) attribute-argument-clause:
  ( balanced-token-sequence opt  )

(6.7.12.1) balanced-token-sequence:
  balanced-token
  balanced-token-sequence balanced-token

(6.7.12.1) balanced-token:
  ( balanced-token-sequence opt  )
  [ balanced-token-sequence opt  ]
  { balanced-token-sequence opt  }
  /*any token other than a parenthesis, a bracket, or a brace*/

(6.8) statement:
  labeled-statement
  unlabeled-statement

(6.8) unlabeled-statement:
   expression-statement
   attribute-specifier-sequence opt  primary-block
   attribute-specifier-sequence opt  jump-statement

(6.8) primary-block:
   compound-statement
   selection-statement
   iteration-statement

(6.8) secondary-block:
   statement

(6.8.1) label:
  attribute-specifier-sequence opt  identifier :
  attribute-specifier-sequence opt  "case" constant-expression :
  attribute-specifier-sequence opt  "default" :

(6.8.1) labeled-statement:
  label statement

(6.8.2) compound-statement:
  { block-item-list opt  }

(6.8.2) block-item-list:
   block-item
   block-item-list block-item

(6.8.2) block-item:
  declaration
  unlabeled-statement
  label

(6.8.3) expression-statement:
         expression opt  ;
         attribute-specifier-sequence expression ;

(6.8.4) selection-statement:
  "if" ( expression ) secondary-block
  "if" ( expression ) secondary-block else secondary-block
  "switch" ( expression ) secondary-block

(6.8.5) iteration-statement:
  "while" ( expression ) secondary-block
  "do" secondary-block "while" ( expression ) ;
  "for" ( expression opt  ; expression opt  ; expression opt  ) secondary-block
  "for" ( declaration expression opt  ; expression opt  ) secondary-block

(6.8.6) jump-statement:
  "goto" identifier ;
  "continue" ;
  "break" ;
  "return" expression opt  ;


(6.9) translation-unit:
  external-declaration
  translation-unit external-declaration

(6.9) external-declaration:
   function-definition
   declaration

(6.9.1) function-definition:
   attribute-specifier-sequence opt  declaration-specifiers declarator function-body

(6.9.1) function-body:
   compound-statement

(6.10) preprocessing-file:
   group opt

(6.10) group:
  group-part
  group group-part

(6.10) group-part:
  if-section
  control-line
  text-line
  # non-directive

(6.10) if-section:
  if-group elif-groups opt  else-group opt  endif-line

(6.10) if-group:
  # "if" constant-expression new-line group opt
  # "ifdef" identifier new-line group opt  # ifndef identifier new-line group opt

(6.10) elif-groups:
  elif-group
  elif-groups elif-group

(6.10) elif-group:
  # "elif" constant-expression new-line group opt
  # "elifdef" identifier new-line group opt
  # "elifndef" identifier new-line group opt

(6.10) else-group:
  # "else" new-line group opt

(6.10) endif-line:
  # "endif" new-line

(6.10) control-line:
 # "include" pp-tokens new-line
 # "embed" pp-tokens new-line
 # "define" identifier replacement-list new-line
 # "define" identifier lparen identifier-list opt  ) replacement-list new-line
 # "define" identifier lparen ... ) replacement-list new-line
 # "define" identifier lparen identifier-list , ... ) replacement-list new-line
 # "undef" identifier new-line
 # "line" pp-tokens new-line
 # "error" pp-tokens opt  new-line
 # "warning" pp-tokens opt  new-line
 # "pragma" pp-tokens opt  new-line
 # new-line

(6.10) text-line:
  pp-tokens opt  new-line

(6.10) non-directive:
  pp-tokens new-line

(6.10) lparen:
  /*a ( character not immediately preceded by white space*/

(6.10) replacement-list:
  pp-tokens opt

(6.10) pp-tokens:
  preprocessing-token
  pp-tokens preprocessing-token

(6.10) new-line:
  /*the new-line character*/

(6.10) identifier-list:
  identifier
  identifier-list , identifier

(6.10) pp-parameter:
  pp-parameter-name pp-parameter-clause opt

(6.10) pp-parameter-name:
  pp-standard-parameter
  pp-prefixed-parameter

(6.10) pp-standard-parameter:
   identifier

(6.10) pp-prefixed-parameter:
  identifier :: identifier

(6.10) pp-parameter-clause:
  ( pp-balanced-token-sequence opt  )

(6.10) pp-balanced-token-sequence:
  pp-balanced-token
  pp-balanced-token-sequence pp-balanced-token

(6.10) pp-balanced-token:
  ( pp-balanced-token-sequence opt  )
  [ pp-balanced-token-sequence opt  ]
  { pp-balanced-token-sequence opt  }
  /*any pp-token other than a parenthesis, a bracket, or a brace*/

(6.10) embed-parameter-sequence:
  pp-parameter
  embed-parameter-sequence pp-parameter

defined-macro-expression:
 "defined" identifier
 "defined" ( identifier )

h-preprocessing-token:
  /*any preprocessing-token other than >*/

h-pp-tokens:
  h-preprocessing-token
  h-pp-tokens h-preprocessing-token

header-name-tokens:
  string-literal
  < h-pp-tokens >

has-include-expression:
  "__has_include" ( header-name )
  "__has_include" ( header-name-tokens )

has-embed-expression:
  "__has_embed" ( header-name embed-parameter-sequence opt  )
  "__has_embed" ( header-name-tokens pp-balanced-token-sequence opt  )

has-c-attribute-express:
  "__has_c_attribute" ( pp-tokens )

va-opt-replacement:
 "__VA_OPT__" ( pp-tokens opt  )

(6.10.7) standard-pragma:
 # "pragma" "STDC" "FP_CONTRACT" on-off-switch
# "pragma" "STDC" "FENV_ACCESS on-off-switch
# "pragma" "STDC" "FENV_DEC_ROUND dec-direction
# "pragma" "STDC" "FENV_ROUND direction
# "pragma" "STDC" "CX_LIMITED_RANGE on-off-switch

(6.10.7) on-off-switch: one of
	"ON"	"OFF"	"DEFAULT"

(6.10.7) direction: one of
  "FE_DOWNWARD" "FE_TONEAREST" "FE_TONEARESTFROMZERO"
  "FE_TOWARDZERO" "FE_UPWARD" "FE_DYNAMIC"

(6.10.7) dec-direction: one of
  "FE_DEC_DOWNWARD" "FE_DEC_TONEAREST" "FE_DEC_TONEARESTFROMZERO"
  "FE_DEC_TOWARDZERO" "FE_DEC_UPWARD" "FE_DEC_DYNAMIC"


(7.24.1.5) n-char-sequence:
  digit
  nondigit
  n-char-sequence digit
  n-char-sequence nondigit


(7.31.4.1.2) n-wchar-sequence:
   digit
   nondigit
   n-wchar-sequence digit
   n-wchar-sequence nondigit


(7.24.1.6) d-char-sequence:
   digit
   nondigit
   d-char-sequence digit
   d-char-sequence nondigit

(7.31.4.1.3) d-wchar-sequence:
   digit
   nondigit
   d-wchar-sequence digit
   d-wchar-sequence nondigit













