#ifndef _GRAMMAR_H_
#define _GRAMMAR_H_ 1

#include <wchar.h>

#ifndef TRUE
#define TRUE (0==0)
#endif

#ifndef FALSE
#define FALSE (0!=0)
#endif

typedef int (*parsefn)(void);

#define LARGEST_ALT 13 // Max number of phrases in any Alt: 0 (Reserved), 1:12

#define NEGATED_PHRASE     (1U<<24U)
#define GUARD_PHRASE       (1U<<25U)
#define WHITESPACE_ALLOWED (1U<<26U)
#define GRAMMAR_TYPE_SHIFT 27U
#define GRAMMAR_TYPE_MASK  31U
#define BIP_TYPE         (1U <<27U)
#define PHRASE_TYPE      (2U <<27U)
#define SEMANTIC_TYPE    (3U <<27U)
#define KEYWORD_TYPE     (4U <<27U)
#define CHAR_TYPE        (5U <<27U)
#define UTF32CHAR_TYPE   (6U <<27U)
#define STRING_TYPE      (7U <<27U)
#define UTF32STRING_TYPE (8U <<27U)
#define REGEXP_TYPE      (9U <<27U)
#define OPTION_TYPE      (10U <<27U)
#define COUNT_OF_ALTS    (11U <<27U)
#define COUNT_OF_PHRASES (12U <<27U)
#define ALT_NUMBER       (13U <<27U)
#define INDEX_MASK       0x7FFFFFU
// (We have room for types 1..31U)
#define PhraseType(idx)  ((((idx)>>27U)&31U))


#define BIP_BASE 0
#define PHRASE_BASE 2
#define SEMANTIC_BASE 192
#define AST_BASE 197

#define NUM_BIPS 2
#define NUM_SIMPLE_PHRASES 190
#define NUM_SEMANTIC_PHRASES 5
#define NUM_PHRASES (NUM_BIPS+NUM_SIMPLE_PHRASES+NUM_SEMANTIC_PHRASES)

#define NUM_KEYWORDS 55
#define NUM_REGEXPS 19
#define NUM_GRAMMAR 1470

#define B_EOF 0
#define B_NL 2
#define P_constant 2
#define P_U_opt 3
#define P_L_opt 4
#define P_UL_opt 5
#define P_integer_constant 6
#define P_decimal_constant 7
#define P_octal_constant 8
#define P_hexadecimal_constant 9
#define P_binary_constant 10
#define P_floating_constant 11
#define P_fractional_constant 12
#define P_exponent_part 13
#define P_exponent_part_opt 14
#define P_floating_suffix_opt 15
#define P_digit_sequence 16
#define P_digit_sequence_opt 17
#define P_decimal_floating_constant 18
#define P_hexadecimal_floating_constant 19
#define P_binary_floating_constant 20
#define P_hexadecimal_digit_sequence 21
#define P_hexadecimal_fractional_constant 22
#define P_binary_digit_sequence 23
#define P_binary_fractional_constant 24
#define P_binary_exponent_part 25
#define P_enumeration_constant 26
#define P_character_constant 27
#define P_sqchars 28
#define P_sqchar 29
#define P_escaped_char 30
#define P_longchartype_opt 31
#define P_unchecked_identifier 32
#define P_sq 33
#define P_dq 34
#define P_dqchar 35
#define P_dqstringchars 36
#define P_dqstring 37
#define P_dqstring_opt 38
#define P_not_preceded_by_alpha_and_is_not_keyword 39
#define P_tag 40
#define P_new_identifier 41
#define P_identifier 42
#define P_keyword 43
#define P_actual_keyword 44
#define P_SS 45
#define P_external_declaration_list 46
#define P_external_declaration_list_opt 47
#define P_external_declaration 48
#define P_struct_or_union_specifier 49
#define P_struct_or_union 50
#define P_struct_field_declarations 51
#define P_rest_of_struct_field_declarations 52
#define P_struct_field_declaration 53
#define P_possibly_initialised_scalar_or_array_decl 54
#define P_rest_of_scalar_or_array_decl 55
#define P_rest_of_scalar_or_array_decl_opt 56
#define P_scalar_init_opt 57
#define P_assignment_expression 58
#define P_rest_of_assignment_expression_opt 59
#define P_conditional_expression 60
#define P_rest_of_conditional_expression 61
#define P_expression 62
#define P_comma_statement 63
#define P_rest_of_comma_statement 64
#define P_logical_or_expression 65
#define P_rest_of_logical_or_expression 66
#define P_logical_and_expression 67
#define P_rest_of_logical_and_expression 68
#define P_inclusive_or_expression 69
#define P_rest_of_inclusive_or_expression 70
#define P_exclusive_or_expression 71
#define P_rest_of_exclusive_or_expression 72
#define P_bitwise_and_expression 73
#define P_rest_of_bitwise_and_expression 74
#define P_equality_expression 75
#define P_rest_of_equality_expression 76
#define P_relational_expression 77
#define P_rest_of_relational_expression 78
#define P_shift_expression 79
#define P_rest_of_shift_expression 80
#define P_additive_expression 81
#define P_rest_of_additive_expression 82
#define P_multiplicative_expression 83
#define P_rest_of_multiplicative_expression 84
#define P_unary_rvalue_expression 85
#define P_postfix_rvalue_expression 86
#define P_rest_of_postfix_rvalue_expression 87
#define P_post_increment_op 88
#define P_actual_param_list 89
#define P_rest_of_param_list 90
#define P_unary_lvalue_expression 91
#define P_postfix_lvalue_expression 92
#define P_rest_of_postfix_expression 93
#define P_non_empty_rest_of_postfix_expression 94
#define P_unary_address_expression 95
#define P_primary_expression 96
#define P_cast_opt 97
#define P_cast 98
#define P_indirection_decl_opt 99
#define P_indirection_unary_ops 100
#define P_indirection_unary_ops_opt 101
#define P_type_specifier 102
#define P_typedef_name 103
#define P_basic_type_specifier 104
#define P_enum_specifier 105
#define P_enumerator_list 106
#define P_rest_of_enumerator_list 107
#define P_enumerator 108
#define P_constant_expression 109
#define P_signed_inttype 110
#define P_int_opt 111
#define P_signed_opt 112
#define P_address_operator 113
#define P_pre_increment_op 114
#define P_bitwise_unary_ops 115
#define P_rest_of_bitwise_unary_ops 116
#define P_boolean_unary_ops 117
#define P_rest_of_boolean_unary_ops 118
#define P_arithmetic_unary_op 119
#define P_mulop 120
#define P_plusminus 121
#define P_shiftop 122
#define P_relop 123
#define P_eqop 124
#define P_eq 125
#define P_assignment_operator 126
#define P_lvalue_assign_opt 127
#define P_array_init_opt 128
#define P_constant_initializer_list 129
#define P_rest_of_constant_initializer_list 130
#define P_constant_initializer 131
#define P_HACK1 132
#define P_HACK2 133
#define P_array_bounds 134
#define P_array_bounds_opt 135
#define P_constant_expression_opt 136
#define P_type 137
#define P_const_or_volatile_type_qualifier_opt 138
#define P_const_or_volatile_type_qualifier 139
#define P_auto_reg_static_ext_opt 140
#define P_identifier_list 141
#define P_rest_of_identifier_list 142
#define P_more_forward_decls_or_actual_body 143
#define P_extern_proc_spec 144
#define P_basic_type_specifier_or_typedef_name_opt 145
#define P_identifier_or_function_pointer 146
#define P_extern_proc_name_and_params 147
#define P_extern_proc_name_and_params_list_opt 148
#define P_proc_fn_decl 149
#define P_compound_statement 150
#define P_statement_list 151
#define P_rest_of_statement_list 152
#define P_statement 153
#define P_in_proc_data_declaration 154
#define P_struct_decl 155
#define P_struct_member_list 156
#define P_struct_member_declaration 157
#define P_possibly_initialised_array_decl 158
#define P_possibly_initialised_scalar_decl 159
#define P_rest_of_scalar_decl 160
#define P_rest_of_scalar_decl_opt 161
#define P_new_structname 162
#define P_decl_list 163
#define P_rest_of_decl_list 164
#define P_decl 165
#define P_possibly_empty_array_bounds_list 166
#define P_optional_possibly_empty_array_bounds_list 167
#define P_jump_statement 168
#define P_expression_opt 169
#define P_label 170
#define P_iteration_statement 171
#define P_selection_statement 172
#define P_else_opt 173
#define P_missing_semicolon_after_label_at_end_of_block 174
#define P_labels_opt 175
#define P_param_list_opt 176
#define P_oldstyle_param_list_opt 177
#define P_oldstyle_param_list 178
#define P_rest_of_oldstyle_param_list_opt 179
#define P_oldstyle_formal_param 180
#define P_oldstyle_parameter_list 181
#define P_rest_of_oldstyle_parameter_list 182
#define P_whatever 183
#define P_rest_of_param_list_opt 184
#define P_formal_param 185
#define P_identifier_opt 186
#define P_procedure_as_parameter 187
#define P_basic_type_specifier_opt 188
#define P_typedef_declaration 189
#define P_maybe_indirect_typedef_name_list 190
#define P_rest_of_maybe_indirect_typedef_name_list 191
#define S_whitespace 0
#define S_C_line_reconstruction 1
#define S_preceded_by_alpha 2
#define S_followed_by_alpha 3
#define S_pp_directive 4

extern const int bip_map[NUM_BIPS];
extern const int sequential_phrase_no_to_grammar_index[NUM_SIMPLE_PHRASES];
extern const wchar_t *phrasename[NUM_BIPS+NUM_SIMPLE_PHRASES+NUM_SEMANTIC_PHRASES];

extern const wchar_t *semantic_phrasename[NUM_SEMANTIC_PHRASES];
extern const wchar_t *semantic_code[NUM_SEMANTIC_PHRASES];
extern const wchar_t *ast_code[NUM_SIMPLE_PHRASES];
extern const wchar_t *xcomment[NUM_PHRASES];
extern const wchar_t *keyword[NUM_KEYWORDS];
extern const wchar_t *regexps[NUM_REGEXPS];

extern const int gram[NUM_GRAMMAR];
#define G_constant 0
#define G_U_opt 13
#define G_L_opt 19
#define G_UL_opt 25
#define G_integer_constant 35
#define G_decimal_constant 48
#define G_octal_constant 51
#define G_hexadecimal_constant 54
#define G_binary_constant 57
#define G_floating_constant 60
#define G_fractional_constant 67
#define G_exponent_part 75
#define G_exponent_part_opt 78
#define G_floating_suffix_opt 82
#define G_digit_sequence 85
#define G_digit_sequence_opt 88
#define G_decimal_floating_constant 92
#define G_hexadecimal_floating_constant 101
#define G_binary_floating_constant 112
#define G_hexadecimal_digit_sequence 123
#define G_hexadecimal_fractional_constant 126
#define G_binary_digit_sequence 134
#define G_binary_fractional_constant 137
#define G_binary_exponent_part 145
#define G_enumeration_constant 148
#define G_character_constant 151
#define G_sqchars 157
#define G_sqchar 162
#define G_escaped_char 167
#define G_longchartype_opt 171
#define G_unchecked_identifier 175
#define G_sq 179
#define G_dq 182
#define G_dqchar 185
#define G_dqstringchars 192
#define G_dqstring 197
#define G_dqstring_opt 204
#define G_not_preceded_by_alpha_and_is_not_keyword 208
#define G_tag 212
#define G_new_identifier 215
#define G_identifier 218
#define G_keyword 222
#define G_actual_keyword 226
#define G_SS 293
#define G_external_declaration_list 298
#define G_external_declaration_list_opt 302
#define G_external_declaration 306
#define G_struct_or_union_specifier 323
#define G_struct_or_union 338
#define G_struct_field_declarations 343
#define G_rest_of_struct_field_declarations 347
#define G_struct_field_declaration 352
#define G_possibly_initialised_scalar_or_array_decl 359
#define G_rest_of_scalar_or_array_decl 365
#define G_rest_of_scalar_or_array_decl_opt 388
#define G_scalar_init_opt 393
#define G_assignment_expression 398
#define G_rest_of_assignment_expression_opt 403
#define G_conditional_expression 409
#define G_rest_of_conditional_expression 413
#define G_expression 420
#define G_comma_statement 423
#define G_rest_of_comma_statement 427
#define G_logical_or_expression 433
#define G_rest_of_logical_or_expression 437
#define G_logical_and_expression 443
#define G_rest_of_logical_and_expression 447
#define G_inclusive_or_expression 453
#define G_rest_of_inclusive_or_expression 457
#define G_exclusive_or_expression 463
#define G_rest_of_exclusive_or_expression 467
#define G_bitwise_and_expression 473
#define G_rest_of_bitwise_and_expression 477
#define G_equality_expression 483
#define G_rest_of_equality_expression 487
#define G_relational_expression 493
#define G_rest_of_relational_expression 497
#define G_shift_expression 503
#define G_rest_of_shift_expression 507
#define G_additive_expression 513
#define G_rest_of_additive_expression 517
#define G_multiplicative_expression 523
#define G_rest_of_multiplicative_expression 527
#define G_unary_rvalue_expression 533
#define G_postfix_rvalue_expression 571
#define G_rest_of_postfix_rvalue_expression 578
#define G_post_increment_op 603
#define G_actual_param_list 608
#define G_rest_of_param_list 613
#define G_unary_lvalue_expression 619
#define G_postfix_lvalue_expression 631
#define G_rest_of_postfix_expression 635
#define G_non_empty_rest_of_postfix_expression 660
#define G_unary_address_expression 684
#define G_primary_expression 689
#define G_cast_opt 729
#define G_cast 734
#define G_indirection_decl_opt 755
#define G_indirection_unary_ops 761
#define G_indirection_unary_ops_opt 766
#define G_type_specifier 771
#define G_typedef_name 776
#define G_basic_type_specifier 779
#define G_enum_specifier 798
#define G_enumerator_list 813
#define G_rest_of_enumerator_list 817
#define G_enumerator 825
#define G_constant_expression 832
#define G_signed_inttype 835
#define G_int_opt 856
#define G_signed_opt 860
#define G_address_operator 866
#define G_pre_increment_op 871
#define G_bitwise_unary_ops 876
#define G_rest_of_bitwise_unary_ops 880
#define G_boolean_unary_ops 885
#define G_rest_of_boolean_unary_ops 889
#define G_arithmetic_unary_op 894
#define G_mulop 899
#define G_plusminus 906
#define G_shiftop 911
#define G_relop 916
#define G_eqop 925
#define G_eq 930
#define G_assignment_operator 933
#define G_lvalue_assign_opt 957
#define G_array_init_opt 962
#define G_constant_initializer_list 972
#define G_rest_of_constant_initializer_list 976
#define G_constant_initializer 984
#define G_HACK1 991
#define G_HACK2 993
#define G_array_bounds 995
#define G_array_bounds_opt 1003
#define G_constant_expression_opt 1012
#define G_type 1016
#define G_const_or_volatile_type_qualifier_opt 1036
#define G_const_or_volatile_type_qualifier 1040
#define G_auto_reg_static_ext_opt 1045
#define G_identifier_list 1055
#define G_rest_of_identifier_list 1059
#define G_more_forward_decls_or_actual_body 1064
#define G_extern_proc_spec 1070
#define G_basic_type_specifier_or_typedef_name_opt 1075
#define G_identifier_or_function_pointer 1080
#define G_extern_proc_name_and_params 1088
#define G_extern_proc_name_and_params_list_opt 1095
#define G_proc_fn_decl 1101
#define G_compound_statement 1116
#define G_statement_list 1124
#define G_rest_of_statement_list 1129
#define G_statement 1135
#define G_in_proc_data_declaration 1157
#define G_struct_decl 1166
#define G_struct_member_list 1173
#define G_struct_member_declaration 1178
#define G_possibly_initialised_array_decl 1185
#define G_possibly_initialised_scalar_decl 1196
#define G_rest_of_scalar_decl 1202
#define G_rest_of_scalar_decl_opt 1209
#define G_new_structname 1217
#define G_decl_list 1220
#define G_rest_of_decl_list 1224
#define G_decl 1229
#define G_possibly_empty_array_bounds_list 1239
#define G_optional_possibly_empty_array_bounds_list 1247
#define G_jump_statement 1256
#define G_expression_opt 1272
#define G_label 1276
#define G_iteration_statement 1279
#define G_selection_statement 1304
#define G_else_opt 1318
#define G_missing_semicolon_after_label_at_end_of_block 1323
#define G_labels_opt 1326
#define G_param_list_opt 1344
#define G_oldstyle_param_list_opt 1351
#define G_oldstyle_param_list 1355
#define G_rest_of_oldstyle_param_list_opt 1361
#define G_oldstyle_formal_param 1366
#define G_oldstyle_parameter_list 1371
#define G_rest_of_oldstyle_parameter_list 1375
#define G_whatever 1380
#define G_rest_of_param_list_opt 1385
#define G_formal_param 1394
#define G_identifier_opt 1403
#define G_procedure_as_parameter 1407
#define G_basic_type_specifier_opt 1430
#define G_typedef_declaration 1434
#define G_maybe_indirect_typedef_name_list 1460
#define G_rest_of_maybe_indirect_typedef_name_list 1465

extern parsefn parsetime[NUM_SEMANTIC_PHRASES];
extern int parse_whitespace(void);
extern int parse_C_line_reconstruction(void);
extern int parse_preceded_by_alpha(void);
extern int parse_followed_by_alpha(void);
extern int parse_pp_directive(void);

#ifndef SUPPRESS_DATA
const wchar_t *phrasename[NUM_BIPS+NUM_SIMPLE_PHRASES+NUM_SEMANTIC_PHRASES] = {
  /*0+0*/   L"EOF" /*0*/,
  /*0+1*/   L"NL" /*2*/,
  /*2+0*/   L"constant",
  /*2+1*/   L"U_opt",
  /*2+2*/   L"L_opt",
  /*2+3*/   L"UL_opt",
  /*2+4*/   L"integer-constant",
  /*2+5*/   L"decimal-constant",
  /*2+6*/   L"octal-constant",
  /*2+7*/   L"hexadecimal-constant",
  /*2+8*/   L"binary-constant",
  /*2+9*/   L"floating-constant",
  /*2+10*/   L"fractional-constant",
  /*2+11*/   L"exponent-part",
  /*2+12*/   L"exponent-part_opt",
  /*2+13*/   L"floating-suffix_opt",
  /*2+14*/   L"digit-sequence",
  /*2+15*/   L"digit-sequence_opt",
  /*2+16*/   L"decimal-floating-constant",
  /*2+17*/   L"hexadecimal-floating-constant",
  /*2+18*/   L"binary-floating-constant",
  /*2+19*/   L"hexadecimal-digit-sequence",
  /*2+20*/   L"hexadecimal-fractional-constant",
  /*2+21*/   L"binary-digit-sequence",
  /*2+22*/   L"binary-fractional-constant",
  /*2+23*/   L"binary-exponent-part",
  /*2+24*/   L"enumeration-constant",
  /*2+25*/   L"character-constant",
  /*2+26*/   L"sqchars",
  /*2+27*/   L"sqchar",
  /*2+28*/   L"escaped-char",
  /*2+29*/   L"longchartype_opt",
  /*2+30*/   L"unchecked-identifier",
  /*2+31*/   L"sq",
  /*2+32*/   L"dq",
  /*2+33*/   L"dqchar",
  /*2+34*/   L"dqstringchars",
  /*2+35*/   L"dqstring",
  /*2+36*/   L"dqstring_opt",
  /*2+37*/   L"not-preceded-by-alpha_and_is-not-keyword",
  /*2+38*/   L"tag",
  /*2+39*/   L"new-identifier",
  /*2+40*/   L"identifier",
  /*2+41*/   L"keyword",
  /*2+42*/   L"actual-keyword",
  /*2+43*/   L"SS",
  /*2+44*/   L"external-declaration-list",
  /*2+45*/   L"external-declaration-list_opt",
  /*2+46*/   L"external-declaration",
  /*2+47*/   L"struct-or-union-specifier",
  /*2+48*/   L"struct-or-union",
  /*2+49*/   L"struct-field-declarations",
  /*2+50*/   L"rest-of-struct-field-declarations",
  /*2+51*/   L"struct-field-declaration",
  /*2+52*/   L"possibly-initialised-scalar-or-array-decl",
  /*2+53*/   L"rest-of-scalar-or-array-decl",
  /*2+54*/   L"rest-of-scalar-or-array-decl_opt",
  /*2+55*/   L"scalar-init_opt",
  /*2+56*/   L"assignment-expression",
  /*2+57*/   L"rest-of-assignment-expression_opt",
  /*2+58*/   L"conditional-expression",
  /*2+59*/   L"rest-of-conditional-expression",
  /*2+60*/   L"expression",
  /*2+61*/   L"comma-statement",
  /*2+62*/   L"rest-of-comma-statement",
  /*2+63*/   L"logical-or-expression",
  /*2+64*/   L"rest-of-logical-or-expression",
  /*2+65*/   L"logical-and-expression",
  /*2+66*/   L"rest-of-logical-and-expression",
  /*2+67*/   L"inclusive-or-expression",
  /*2+68*/   L"rest-of-inclusive-or-expression",
  /*2+69*/   L"exclusive-or-expression",
  /*2+70*/   L"rest-of-exclusive-or-expression",
  /*2+71*/   L"bitwise-and-expression",
  /*2+72*/   L"rest-of-bitwise-and-expression",
  /*2+73*/   L"equality-expression",
  /*2+74*/   L"rest-of-equality-expression",
  /*2+75*/   L"relational-expression",
  /*2+76*/   L"rest-of-relational-expression",
  /*2+77*/   L"shift-expression",
  /*2+78*/   L"rest-of-shift-expression",
  /*2+79*/   L"additive-expression",
  /*2+80*/   L"rest-of-additive-expression",
  /*2+81*/   L"multiplicative-expression",
  /*2+82*/   L"rest-of-multiplicative-expression",
  /*2+83*/   L"unary-rvalue-expression",
  /*2+84*/   L"postfix-rvalue-expression",
  /*2+85*/   L"rest-of-postfix-rvalue-expression",
  /*2+86*/   L"post-increment-op",
  /*2+87*/   L"actual-param-list",
  /*2+88*/   L"rest-of-param-list",
  /*2+89*/   L"unary-lvalue-expression",
  /*2+90*/   L"postfix-lvalue-expression",
  /*2+91*/   L"rest-of-postfix-expression",
  /*2+92*/   L"non-empty-rest-of-postfix-expression",
  /*2+93*/   L"unary-address-expression",
  /*2+94*/   L"primary-expression",
  /*2+95*/   L"cast_opt",
  /*2+96*/   L"cast",
  /*2+97*/   L"indirection-decl_opt",
  /*2+98*/   L"indirection-unary-ops",
  /*2+99*/   L"indirection-unary-ops_opt",
  /*2+100*/   L"type-specifier",
  /*2+101*/   L"typedef-name",
  /*2+102*/   L"basic-type-specifier",
  /*2+103*/   L"enum-specifier",
  /*2+104*/   L"enumerator-list",
  /*2+105*/   L"rest-of-enumerator-list",
  /*2+106*/   L"enumerator",
  /*2+107*/   L"constant-expression",
  /*2+108*/   L"signed-inttype",
  /*2+109*/   L"int_opt",
  /*2+110*/   L"signed_opt",
  /*2+111*/   L"address-operator",
  /*2+112*/   L"pre-increment-op",
  /*2+113*/   L"bitwise-unary-ops",
  /*2+114*/   L"rest-of-bitwise-unary-ops",
  /*2+115*/   L"boolean-unary-ops",
  /*2+116*/   L"rest-of-boolean-unary-ops",
  /*2+117*/   L"arithmetic-unary-op",
  /*2+118*/   L"mulop",
  /*2+119*/   L"plusminus",
  /*2+120*/   L"shiftop",
  /*2+121*/   L"relop",
  /*2+122*/   L"eqop",
  /*2+123*/   L"eq",
  /*2+124*/   L"assignment-operator",
  /*2+125*/   L"lvalue-assign_opt",
  /*2+126*/   L"array-init_opt",
  /*2+127*/   L"constant-initializer-list",
  /*2+128*/   L"rest-of-constant-initializer-list",
  /*2+129*/   L"constant-initializer",
  /*2+130*/   L"HACK1",
  /*2+131*/   L"HACK2",
  /*2+132*/   L"array-bounds",
  /*2+133*/   L"array-bounds_opt",
  /*2+134*/   L"constant-expression_opt",
  /*2+135*/   L"type",
  /*2+136*/   L"const-or-volatile-type-qualifier_opt",
  /*2+137*/   L"const-or-volatile-type-qualifier",
  /*2+138*/   L"auto-reg-static-ext_opt",
  /*2+139*/   L"identifier-list",
  /*2+140*/   L"rest-of-identifier-list",
  /*2+141*/   L"more-forward-decls-or-actual-body",
  /*2+142*/   L"extern-proc-spec",
  /*2+143*/   L"basic-type-specifier-or-typedef-name_opt",
  /*2+144*/   L"identifier-or-function-pointer",
  /*2+145*/   L"extern-proc-name-and-params",
  /*2+146*/   L"extern-proc-name-and-params-list_opt",
  /*2+147*/   L"proc-fn-decl",
  /*2+148*/   L"compound-statement",
  /*2+149*/   L"statement-list",
  /*2+150*/   L"rest-of-statement-list",
  /*2+151*/   L"statement",
  /*2+152*/   L"in-proc-data-declaration",
  /*2+153*/   L"struct-decl",
  /*2+154*/   L"struct-member-list",
  /*2+155*/   L"struct-member-declaration",
  /*2+156*/   L"possibly-initialised-array-decl",
  /*2+157*/   L"possibly-initialised-scalar-decl",
  /*2+158*/   L"rest-of-scalar-decl",
  /*2+159*/   L"rest-of-scalar-decl_opt",
  /*2+160*/   L"new-structname",
  /*2+161*/   L"decl-list",
  /*2+162*/   L"rest-of-decl-list",
  /*2+163*/   L"decl",
  /*2+164*/   L"possibly-empty-array-bounds-list",
  /*2+165*/   L"optional-possibly-empty-array-bounds-list",
  /*2+166*/   L"jump-statement",
  /*2+167*/   L"expression_opt",
  /*2+168*/   L"label",
  /*2+169*/   L"iteration-statement",
  /*2+170*/   L"selection-statement",
  /*2+171*/   L"else_opt",
  /*2+172*/   L"missing-semicolon-after-label-at-end-of-block",
  /*2+173*/   L"labels_opt",
  /*2+174*/   L"param-list_opt",
  /*2+175*/   L"oldstyle-param-list_opt",
  /*2+176*/   L"oldstyle-param-list",
  /*2+177*/   L"rest-of-oldstyle-param-list_opt",
  /*2+178*/   L"oldstyle-formal-param",
  /*2+179*/   L"oldstyle-parameter-list",
  /*2+180*/   L"rest-of-oldstyle-parameter-list",
  /*2+181*/   L"whatever",
  /*2+182*/   L"rest-of-param-list_opt",
  /*2+183*/   L"formal-param",
  /*2+184*/   L"identifier_opt",
  /*2+185*/   L"procedure-as-parameter",
  /*2+186*/   L"basic-type-specifier_opt",
  /*2+187*/   L"typedef-declaration",
  /*2+188*/   L"maybe-indirect-typedef-name-list",
  /*2+189*/   L"rest-of-maybe-indirect-typedef-name-list",
  /*192+0*/   L"whitespace",
  /*192+1*/   L"C_line_reconstruction",
  /*192+2*/   L"preceded-by-alpha",
  /*192+3*/   L"followed-by-alpha",
  /*192+4*/   L"pp_directive",
};
const wchar_t *phrasename_c[NUM_BIPS+NUM_SIMPLE_PHRASES+NUM_SEMANTIC_PHRASES] = {
  /*0+0*/   L"EOF" /*0*/,
  /*0+1*/   L"NL" /*2*/,
  /*2+0*/   L"constant",
  /*2+1*/   L"U_opt",
  /*2+2*/   L"L_opt",
  /*2+3*/   L"UL_opt",
  /*2+4*/   L"integer_constant",
  /*2+5*/   L"decimal_constant",
  /*2+6*/   L"octal_constant",
  /*2+7*/   L"hexadecimal_constant",
  /*2+8*/   L"binary_constant",
  /*2+9*/   L"floating_constant",
  /*2+10*/   L"fractional_constant",
  /*2+11*/   L"exponent_part",
  /*2+12*/   L"exponent_part_opt",
  /*2+13*/   L"floating_suffix_opt",
  /*2+14*/   L"digit_sequence",
  /*2+15*/   L"digit_sequence_opt",
  /*2+16*/   L"decimal_floating_constant",
  /*2+17*/   L"hexadecimal_floating_constant",
  /*2+18*/   L"binary_floating_constant",
  /*2+19*/   L"hexadecimal_digit_sequence",
  /*2+20*/   L"hexadecimal_fractional_constant",
  /*2+21*/   L"binary_digit_sequence",
  /*2+22*/   L"binary_fractional_constant",
  /*2+23*/   L"binary_exponent_part",
  /*2+24*/   L"enumeration_constant",
  /*2+25*/   L"character_constant",
  /*2+26*/   L"sqchars",
  /*2+27*/   L"sqchar",
  /*2+28*/   L"escaped_char",
  /*2+29*/   L"longchartype_opt",
  /*2+30*/   L"unchecked_identifier",
  /*2+31*/   L"sq",
  /*2+32*/   L"dq",
  /*2+33*/   L"dqchar",
  /*2+34*/   L"dqstringchars",
  /*2+35*/   L"dqstring",
  /*2+36*/   L"dqstring_opt",
  /*2+37*/   L"not_preceded_by_alpha_and_is_not_keyword",
  /*2+38*/   L"tag",
  /*2+39*/   L"new_identifier",
  /*2+40*/   L"identifier",
  /*2+41*/   L"keyword",
  /*2+42*/   L"actual_keyword",
  /*2+43*/   L"SS",
  /*2+44*/   L"external_declaration_list",
  /*2+45*/   L"external_declaration_list_opt",
  /*2+46*/   L"external_declaration",
  /*2+47*/   L"struct_or_union_specifier",
  /*2+48*/   L"struct_or_union",
  /*2+49*/   L"struct_field_declarations",
  /*2+50*/   L"rest_of_struct_field_declarations",
  /*2+51*/   L"struct_field_declaration",
  /*2+52*/   L"possibly_initialised_scalar_or_array_decl",
  /*2+53*/   L"rest_of_scalar_or_array_decl",
  /*2+54*/   L"rest_of_scalar_or_array_decl_opt",
  /*2+55*/   L"scalar_init_opt",
  /*2+56*/   L"assignment_expression",
  /*2+57*/   L"rest_of_assignment_expression_opt",
  /*2+58*/   L"conditional_expression",
  /*2+59*/   L"rest_of_conditional_expression",
  /*2+60*/   L"expression",
  /*2+61*/   L"comma_statement",
  /*2+62*/   L"rest_of_comma_statement",
  /*2+63*/   L"logical_or_expression",
  /*2+64*/   L"rest_of_logical_or_expression",
  /*2+65*/   L"logical_and_expression",
  /*2+66*/   L"rest_of_logical_and_expression",
  /*2+67*/   L"inclusive_or_expression",
  /*2+68*/   L"rest_of_inclusive_or_expression",
  /*2+69*/   L"exclusive_or_expression",
  /*2+70*/   L"rest_of_exclusive_or_expression",
  /*2+71*/   L"bitwise_and_expression",
  /*2+72*/   L"rest_of_bitwise_and_expression",
  /*2+73*/   L"equality_expression",
  /*2+74*/   L"rest_of_equality_expression",
  /*2+75*/   L"relational_expression",
  /*2+76*/   L"rest_of_relational_expression",
  /*2+77*/   L"shift_expression",
  /*2+78*/   L"rest_of_shift_expression",
  /*2+79*/   L"additive_expression",
  /*2+80*/   L"rest_of_additive_expression",
  /*2+81*/   L"multiplicative_expression",
  /*2+82*/   L"rest_of_multiplicative_expression",
  /*2+83*/   L"unary_rvalue_expression",
  /*2+84*/   L"postfix_rvalue_expression",
  /*2+85*/   L"rest_of_postfix_rvalue_expression",
  /*2+86*/   L"post_increment_op",
  /*2+87*/   L"actual_param_list",
  /*2+88*/   L"rest_of_param_list",
  /*2+89*/   L"unary_lvalue_expression",
  /*2+90*/   L"postfix_lvalue_expression",
  /*2+91*/   L"rest_of_postfix_expression",
  /*2+92*/   L"non_empty_rest_of_postfix_expression",
  /*2+93*/   L"unary_address_expression",
  /*2+94*/   L"primary_expression",
  /*2+95*/   L"cast_opt",
  /*2+96*/   L"cast",
  /*2+97*/   L"indirection_decl_opt",
  /*2+98*/   L"indirection_unary_ops",
  /*2+99*/   L"indirection_unary_ops_opt",
  /*2+100*/   L"type_specifier",
  /*2+101*/   L"typedef_name",
  /*2+102*/   L"basic_type_specifier",
  /*2+103*/   L"enum_specifier",
  /*2+104*/   L"enumerator_list",
  /*2+105*/   L"rest_of_enumerator_list",
  /*2+106*/   L"enumerator",
  /*2+107*/   L"constant_expression",
  /*2+108*/   L"signed_inttype",
  /*2+109*/   L"int_opt",
  /*2+110*/   L"signed_opt",
  /*2+111*/   L"address_operator",
  /*2+112*/   L"pre_increment_op",
  /*2+113*/   L"bitwise_unary_ops",
  /*2+114*/   L"rest_of_bitwise_unary_ops",
  /*2+115*/   L"boolean_unary_ops",
  /*2+116*/   L"rest_of_boolean_unary_ops",
  /*2+117*/   L"arithmetic_unary_op",
  /*2+118*/   L"mulop",
  /*2+119*/   L"plusminus",
  /*2+120*/   L"shiftop",
  /*2+121*/   L"relop",
  /*2+122*/   L"eqop",
  /*2+123*/   L"eq",
  /*2+124*/   L"assignment_operator",
  /*2+125*/   L"lvalue_assign_opt",
  /*2+126*/   L"array_init_opt",
  /*2+127*/   L"constant_initializer_list",
  /*2+128*/   L"rest_of_constant_initializer_list",
  /*2+129*/   L"constant_initializer",
  /*2+130*/   L"HACK1",
  /*2+131*/   L"HACK2",
  /*2+132*/   L"array_bounds",
  /*2+133*/   L"array_bounds_opt",
  /*2+134*/   L"constant_expression_opt",
  /*2+135*/   L"type",
  /*2+136*/   L"const_or_volatile_type_qualifier_opt",
  /*2+137*/   L"const_or_volatile_type_qualifier",
  /*2+138*/   L"auto_reg_static_ext_opt",
  /*2+139*/   L"identifier_list",
  /*2+140*/   L"rest_of_identifier_list",
  /*2+141*/   L"more_forward_decls_or_actual_body",
  /*2+142*/   L"extern_proc_spec",
  /*2+143*/   L"basic_type_specifier_or_typedef_name_opt",
  /*2+144*/   L"identifier_or_function_pointer",
  /*2+145*/   L"extern_proc_name_and_params",
  /*2+146*/   L"extern_proc_name_and_params_list_opt",
  /*2+147*/   L"proc_fn_decl",
  /*2+148*/   L"compound_statement",
  /*2+149*/   L"statement_list",
  /*2+150*/   L"rest_of_statement_list",
  /*2+151*/   L"statement",
  /*2+152*/   L"in_proc_data_declaration",
  /*2+153*/   L"struct_decl",
  /*2+154*/   L"struct_member_list",
  /*2+155*/   L"struct_member_declaration",
  /*2+156*/   L"possibly_initialised_array_decl",
  /*2+157*/   L"possibly_initialised_scalar_decl",
  /*2+158*/   L"rest_of_scalar_decl",
  /*2+159*/   L"rest_of_scalar_decl_opt",
  /*2+160*/   L"new_structname",
  /*2+161*/   L"decl_list",
  /*2+162*/   L"rest_of_decl_list",
  /*2+163*/   L"decl",
  /*2+164*/   L"possibly_empty_array_bounds_list",
  /*2+165*/   L"optional_possibly_empty_array_bounds_list",
  /*2+166*/   L"jump_statement",
  /*2+167*/   L"expression_opt",
  /*2+168*/   L"label",
  /*2+169*/   L"iteration_statement",
  /*2+170*/   L"selection_statement",
  /*2+171*/   L"else_opt",
  /*2+172*/   L"missing_semicolon_after_label_at_end_of_block",
  /*2+173*/   L"labels_opt",
  /*2+174*/   L"param_list_opt",
  /*2+175*/   L"oldstyle_param_list_opt",
  /*2+176*/   L"oldstyle_param_list",
  /*2+177*/   L"rest_of_oldstyle_param_list_opt",
  /*2+178*/   L"oldstyle_formal_param",
  /*2+179*/   L"oldstyle_parameter_list",
  /*2+180*/   L"rest_of_oldstyle_parameter_list",
  /*2+181*/   L"whatever",
  /*2+182*/   L"rest_of_param_list_opt",
  /*2+183*/   L"formal_param",
  /*2+184*/   L"identifier_opt",
  /*2+185*/   L"procedure_as_parameter",
  /*2+186*/   L"basic_type_specifier_opt",
  /*2+187*/   L"typedef_declaration",
  /*2+188*/   L"maybe_indirect_typedef_name_list",
  /*2+189*/   L"rest_of_maybe_indirect_typedef_name_list",
  /*192+0*/   L"whitespace",
  /*192+1*/   L"C_line_reconstruction",
  /*192+2*/   L"preceded_by_alpha",
  /*192+3*/   L"followed_by_alpha",
  /*192+4*/   L"pp_directive",
};
const int bip_map[NUM_BIPS] = {
  /*0*/   0,
  /*1*/   2,
};
const int sequential_phrase_no_to_grammar_index[NUM_SIMPLE_PHRASES] = {
  G_constant,  /*0*/
  G_U_opt,  /*13*/
  G_L_opt,  /*19*/
  G_UL_opt,  /*25*/
  G_integer_constant,  /*35*/
  G_decimal_constant,  /*48*/
  G_octal_constant,  /*51*/
  G_hexadecimal_constant,  /*54*/
  G_binary_constant,  /*57*/
  G_floating_constant,  /*60*/
  G_fractional_constant,  /*67*/
  G_exponent_part,  /*75*/
  G_exponent_part_opt,  /*78*/
  G_floating_suffix_opt,  /*82*/
  G_digit_sequence,  /*85*/
  G_digit_sequence_opt,  /*88*/
  G_decimal_floating_constant,  /*92*/
  G_hexadecimal_floating_constant,  /*101*/
  G_binary_floating_constant,  /*112*/
  G_hexadecimal_digit_sequence,  /*123*/
  G_hexadecimal_fractional_constant,  /*126*/
  G_binary_digit_sequence,  /*134*/
  G_binary_fractional_constant,  /*137*/
  G_binary_exponent_part,  /*145*/
  G_enumeration_constant,  /*148*/
  G_character_constant,  /*151*/
  G_sqchars,  /*157*/
  G_sqchar,  /*162*/
  G_escaped_char,  /*167*/
  G_longchartype_opt,  /*171*/
  G_unchecked_identifier,  /*175*/
  G_sq,  /*179*/
  G_dq,  /*182*/
  G_dqchar,  /*185*/
  G_dqstringchars,  /*192*/
  G_dqstring,  /*197*/
  G_dqstring_opt,  /*204*/
  G_not_preceded_by_alpha_and_is_not_keyword,  /*208*/
  G_tag,  /*212*/
  G_new_identifier,  /*215*/
  G_identifier,  /*218*/
  G_keyword,  /*222*/
  G_actual_keyword,  /*226*/
  G_SS,  /*293*/
  G_external_declaration_list,  /*298*/
  G_external_declaration_list_opt,  /*302*/
  G_external_declaration,  /*306*/
  G_struct_or_union_specifier,  /*323*/
  G_struct_or_union,  /*338*/
  G_struct_field_declarations,  /*343*/
  G_rest_of_struct_field_declarations,  /*347*/
  G_struct_field_declaration,  /*352*/
  G_possibly_initialised_scalar_or_array_decl,  /*359*/
  G_rest_of_scalar_or_array_decl,  /*365*/
  G_rest_of_scalar_or_array_decl_opt,  /*388*/
  G_scalar_init_opt,  /*393*/
  G_assignment_expression,  /*398*/
  G_rest_of_assignment_expression_opt,  /*403*/
  G_conditional_expression,  /*409*/
  G_rest_of_conditional_expression,  /*413*/
  G_expression,  /*420*/
  G_comma_statement,  /*423*/
  G_rest_of_comma_statement,  /*427*/
  G_logical_or_expression,  /*433*/
  G_rest_of_logical_or_expression,  /*437*/
  G_logical_and_expression,  /*443*/
  G_rest_of_logical_and_expression,  /*447*/
  G_inclusive_or_expression,  /*453*/
  G_rest_of_inclusive_or_expression,  /*457*/
  G_exclusive_or_expression,  /*463*/
  G_rest_of_exclusive_or_expression,  /*467*/
  G_bitwise_and_expression,  /*473*/
  G_rest_of_bitwise_and_expression,  /*477*/
  G_equality_expression,  /*483*/
  G_rest_of_equality_expression,  /*487*/
  G_relational_expression,  /*493*/
  G_rest_of_relational_expression,  /*497*/
  G_shift_expression,  /*503*/
  G_rest_of_shift_expression,  /*507*/
  G_additive_expression,  /*513*/
  G_rest_of_additive_expression,  /*517*/
  G_multiplicative_expression,  /*523*/
  G_rest_of_multiplicative_expression,  /*527*/
  G_unary_rvalue_expression,  /*533*/
  G_postfix_rvalue_expression,  /*571*/
  G_rest_of_postfix_rvalue_expression,  /*578*/
  G_post_increment_op,  /*603*/
  G_actual_param_list,  /*608*/
  G_rest_of_param_list,  /*613*/
  G_unary_lvalue_expression,  /*619*/
  G_postfix_lvalue_expression,  /*631*/
  G_rest_of_postfix_expression,  /*635*/
  G_non_empty_rest_of_postfix_expression,  /*660*/
  G_unary_address_expression,  /*684*/
  G_primary_expression,  /*689*/
  G_cast_opt,  /*729*/
  G_cast,  /*734*/
  G_indirection_decl_opt,  /*755*/
  G_indirection_unary_ops,  /*761*/
  G_indirection_unary_ops_opt,  /*766*/
  G_type_specifier,  /*771*/
  G_typedef_name,  /*776*/
  G_basic_type_specifier,  /*779*/
  G_enum_specifier,  /*798*/
  G_enumerator_list,  /*813*/
  G_rest_of_enumerator_list,  /*817*/
  G_enumerator,  /*825*/
  G_constant_expression,  /*832*/
  G_signed_inttype,  /*835*/
  G_int_opt,  /*856*/
  G_signed_opt,  /*860*/
  G_address_operator,  /*866*/
  G_pre_increment_op,  /*871*/
  G_bitwise_unary_ops,  /*876*/
  G_rest_of_bitwise_unary_ops,  /*880*/
  G_boolean_unary_ops,  /*885*/
  G_rest_of_boolean_unary_ops,  /*889*/
  G_arithmetic_unary_op,  /*894*/
  G_mulop,  /*899*/
  G_plusminus,  /*906*/
  G_shiftop,  /*911*/
  G_relop,  /*916*/
  G_eqop,  /*925*/
  G_eq,  /*930*/
  G_assignment_operator,  /*933*/
  G_lvalue_assign_opt,  /*957*/
  G_array_init_opt,  /*962*/
  G_constant_initializer_list,  /*972*/
  G_rest_of_constant_initializer_list,  /*976*/
  G_constant_initializer,  /*984*/
  G_HACK1,  /*991*/
  G_HACK2,  /*993*/
  G_array_bounds,  /*995*/
  G_array_bounds_opt,  /*1003*/
  G_constant_expression_opt,  /*1012*/
  G_type,  /*1016*/
  G_const_or_volatile_type_qualifier_opt,  /*1036*/
  G_const_or_volatile_type_qualifier,  /*1040*/
  G_auto_reg_static_ext_opt,  /*1045*/
  G_identifier_list,  /*1055*/
  G_rest_of_identifier_list,  /*1059*/
  G_more_forward_decls_or_actual_body,  /*1064*/
  G_extern_proc_spec,  /*1070*/
  G_basic_type_specifier_or_typedef_name_opt,  /*1075*/
  G_identifier_or_function_pointer,  /*1080*/
  G_extern_proc_name_and_params,  /*1088*/
  G_extern_proc_name_and_params_list_opt,  /*1095*/
  G_proc_fn_decl,  /*1101*/
  G_compound_statement,  /*1116*/
  G_statement_list,  /*1124*/
  G_rest_of_statement_list,  /*1129*/
  G_statement,  /*1135*/
  G_in_proc_data_declaration,  /*1157*/
  G_struct_decl,  /*1166*/
  G_struct_member_list,  /*1173*/
  G_struct_member_declaration,  /*1178*/
  G_possibly_initialised_array_decl,  /*1185*/
  G_possibly_initialised_scalar_decl,  /*1196*/
  G_rest_of_scalar_decl,  /*1202*/
  G_rest_of_scalar_decl_opt,  /*1209*/
  G_new_structname,  /*1217*/
  G_decl_list,  /*1220*/
  G_rest_of_decl_list,  /*1224*/
  G_decl,  /*1229*/
  G_possibly_empty_array_bounds_list,  /*1239*/
  G_optional_possibly_empty_array_bounds_list,  /*1247*/
  G_jump_statement,  /*1256*/
  G_expression_opt,  /*1272*/
  G_label,  /*1276*/
  G_iteration_statement,  /*1279*/
  G_selection_statement,  /*1304*/
  G_else_opt,  /*1318*/
  G_missing_semicolon_after_label_at_end_of_block,  /*1323*/
  G_labels_opt,  /*1326*/
  G_param_list_opt,  /*1344*/
  G_oldstyle_param_list_opt,  /*1351*/
  G_oldstyle_param_list,  /*1355*/
  G_rest_of_oldstyle_param_list_opt,  /*1361*/
  G_oldstyle_formal_param,  /*1366*/
  G_oldstyle_parameter_list,  /*1371*/
  G_rest_of_oldstyle_parameter_list,  /*1375*/
  G_whatever,  /*1380*/
  G_rest_of_param_list_opt,  /*1385*/
  G_formal_param,  /*1394*/
  G_identifier_opt,  /*1403*/
  G_procedure_as_parameter,  /*1407*/
  G_basic_type_specifier_opt,  /*1430*/
  G_typedef_declaration,  /*1434*/
  G_maybe_indirect_typedef_name_list,  /*1460*/
  G_rest_of_maybe_indirect_typedef_name_list,  /*1465*/
};

const wchar_t *semantic_phrasename[NUM_SEMANTIC_PHRASES] = {
  /*0*/   L"whitespace",
  /*1*/   L"C_line_reconstruction",
  /*2*/   L"preceded-by-alpha",
  /*3*/   L"followed-by-alpha",
  /*4*/   L"pp_directive",
};

const wchar_t *semantic_code[NUM_SEMANTIC_PHRASES] = {
  /*0*/   L"\n"
             "#ifdef IN_PARSER\n"
             "  while (source(TP).ch==' ' || source(TP).ch=='\\n' || source(TP).ch=='\\t' || source(TP).ch=='\\f') {\n"
             "    TP += 1;\n"
             "  }\n"
             "#endif\n"
             "  return TRUE;\n",
  /*1*/   L"\n"
             "#ifdef IN_PARSER\n"
             "  int debug_stropping = 0;\n"
             "\n"
             "  // The 'C' line reconstruction was thrown together in a couple of minutes and without\n"
             "  // any consideration to the subtleties of C's lexing.  So expect major problems in this\n"
             "  // area until it is looked at properly and actually designed.  Current testing\n"
             "  // environment strips out all lines starting with '#', and all comments too. So\n"
             "  // the comment stripping here hasn't even been tested yet.\n"
             "\n"
             "  // Note that line reconstruction in C is unlike in Imp and even unlike lexing in\n"
             "  // a yacc/lex C compiler.  It is *only* here to remove multiple leading spaces and\n"
             "  // comments before non-space characters (not *tokens*), however care must be taken\n"
             "  // in parsing to skip spaces where spaces must be skipped, while checking that there\n"
             "  // are no spaces in multi-character tokens whose characters must not have spaces\n"
             "  // between them.  This will require some assistance from the grammar, it cannot\n"
             "  // all be done in the line reconstruction phase.\n"
             "\n"
             "  // So far the only concession to C's lexing conventions are that we check that keywords\n"
             "  // are not followed by an extension of the keyword, so \"intx\" is not confused with \"int x\".\n"
             "  // Otherwise, spaces are pretty much skipped.  I suspect that something like \"constint\"\n"
             "  // would currently be accepted for \"const int\".  I either have to modify uparse.c to\n"
             "  // handle whitespace differently, or add explicit whitespace to the grammar.\n"
             "\n"
             "\n"
             "  // The source file has already been read trivially into source().\n"
             "  \n"
             "  // We will copy from source() into temp(), then perform line reconstruction\n"
             "  // on temp(), writing back to source().  The parser will then parse source()\n"
             "  // into atoms according to the grammar.  Initially it will only store the\n"
             "  // reconstructed characters into the atoms, but once it is working, I will\n"
             "  // modify it to also store the unreconstructed source for use in source-to-source\n"
             "  // translations, where whitespace, embedded comments, and indentation is\n"
             "  // desired in the translation, in order to mirror the original file.\n"
             "\n"
             "  // All arrays are flex and the upper bound is a limit, not a minimum.\n"
             "\n"
             "  // TODO: free SYM at the end of this procedure using FREE_FLEX(SYM).\n"
             "#define MAX_SYM 128000000\n"
             "  DECLARE(SYM, reconstructed, MAX_SYM);  // was 600000\n"
             "#define _SYM(x) WRITE(x,SYM,reconstructed)\n"
             "#define  SYM(x)  READ(x,SYM,reconstructed)\n"
             "\n"
             "  int LASTP, P = 0;\n"
             "  _SYM(0).start = 0;\n"
             "  while (source(P).ch != 0 /* WEOF */) {\n"
             "    _SYM(P).ch = source(P).ch;\n"
             "    if (P > 0) _SYM(P).start = SYM(P-1).end;\n"
             "    _SYM(P).end = P+1;\n"
             "    P += 1;\n"
             "  }\n"
             "  _SYM(P).ch = 0 /* WEOF */;\n"
             "  if (P > 0) _SYM(P).start = SYM(P-1).end; _SYM(P).end = P; // no chars for EOF\n"
             "  LASTP = P;\n"
             "  \n"
             "  if (debug_stropping) {\n"
             "    int I;\n"
             "    fprintf(stderr, \"source() moved to SYM(0:%d) = \\\"\", LASTP);\n"
             "    for (I = 0; I < LASTP; I++) {\n"
             "      fprintf(stderr, \"%lc\", SYM(I).ch);\n"
             "    }\n"
             "    if (SYM(LASTP).ch != 0) fprintf(stderr, \"[%d]\", SYM(LASTP).ch);\n"
             "    fprintf(stderr, \"\\\";\\n\");\n"
             "  };\n"
             "\n"
             "  int FP = 0, PP = 0; // Fetch Pointer, Put Pointer.\n"
             "\n"
             "#define DONE() \\\n"
             "        do {                                                                        \\\n"
             "            FP -= 1; /* the terminating 0*/                                         \\\n"
             "            _source(PP).ch = 0;                                                     \\\n"
             "            if (PP > 0) _source(PP).start = SYM(PP-1).end;                          \\\n"
             "            _source(PP).end = SYM(FP).end;                                          \\\n"
             "            if (debug_stropping) {                                                  \\\n"
             "              int I;                                                                \\\n"
             "              fprintf(stderr, \"SYM(0:%d) moved back to source(0:%d) = \\\"\", FP, PP); \\\n"
             "              for (I = 0; I < PP; I++) {                                            \\\n"
             "                fprintf(stderr, \"%lc\", source(I).ch);                               \\\n"
             "              }                                                                     \\\n"
             "              if (source(PP).ch != 0) fprintf(stderr, \"[%d]\", source(PP).ch);       \\\n"
             "              fprintf(stderr, \"\\\";\\n\");                                             \\\n"
             "            }                                                                       \\\n"
             "            TP = 0; FREE_FLEX(SYM); return TRUE;                                    \\\n"
             "        } while (0)\n"
             "\n"
             "  wint_t WC, Peek;\n"
             "\n"
             "  // uparse.c had been modified so that its implicit whitespace skipping no longer skipped '\\n'.\n"
             "  // (The algol60 parser in contrast treats all \\n's the same as spaces, as we are now doing here)\n"
             "  \n"
             "#define CHECK_EOF(x) do if ((x) == 0) DONE(); else { if (PP > 0) _source(PP).start = source(PP-1).end; if (FP > 0) _source(PP).end = SYM(FP-1).end; } while (0)\n"
             "\n"
             "  // PP is the 'current' slot we are writing into.\n"
             "  _source(PP).start = SYM(FP).start;\n"
             "\n"
             "  for (;;) {\n"
             "\n"
             "    if (PP > 0) _source(PP).start = source(PP-1).end; // Keep updated.\n"
             "    _source(PP).end = SYM(FP).end; // Keep updated.\n"
             "    WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "\n"
             "    if ((WC == '/') && (Peek == '*')) {\n"
             "\n"
             "      // TODO: fold multiple spaces and comments into one.\n"
             "      //       Instead of using the saved WC to provide spacing and newlines in the output, we\n"
             "      //       should use the saved comment text, while saving only a ' ' rather then \\n \\t \\f as ch.\n"
             "\n"
             "      // TODO: remember that fred/*...*/jim generates two tokens, so a comment\n"
             "      //       that is not surrounded by spaces still must be treated as a space.\n"
             "      //       Matters for C such as (when b = 2, c = 3):\n"
             "      \n"
             "      //          b- --c    = 0\n"
             "      //          b-- -c    = -1\n"
             "      //          b---c     = -1\n"
             "      //          b-/**/--c = 0\n"
             "      //          b--/**/-c = -1\n"
             "      \n"
             "      // (and this is before we get into token pasting in the preprocessor!)\n"
             "      \n"
             "      for (;;) {\n"
             "        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "        if ((WC == '*') && (Peek == '/')) {\n"
             "          WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "          break; // but still looking.\n"
             "        }\n"
             "      }\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "    else if ((WC == '/') && (Peek == '/')) {\n"
             "\n"
             "      // Note: C's '//' comments are not quite the same as Imp's '!' comments,\n"
             "      // as the Imp ones are a statement that must come at the start of a boundary\n"
             "      // whereas the C ones can be appended to any line.  They are more like\n"
             "      // the Imp '{' but without a matching '}' before the end of the line.\n"
             "      // Whereas C's /* ... */ comments are *not* like Imp { ... } comments\n"
             "      // because those are single-line only.  Translating comments from Imp to C\n"
             "      // is going to be ugly.  Fortunately this program doesn't care :-)\n"
             "      \n"
             "      for (;;) {\n"
             "        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "        if (WC == '\\n') {\n"
             "          break; // but still looking.\n"
             "        }\n"
             "      }\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "    else if (WC == '\\'') {\n"
             "      _source(PP++).ch = WC;\n"
             "      for (;;) {\n"
             "        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "        if (WC == '\\'') {\n"
             "          _source(PP).ch = WC;\n"
             "          if (PP > 0) _source(PP).start = source(PP-1).end; // Leave Peek for later.\n"
             "          if (FP > 0) _source(PP).end = SYM(FP-1).end; // Leave Peek for later.\n"
             "          PP++;\n"
             "          break;\n"
             "        } else if (WC == '\\\\') {\n"
             "          _source(PP++).ch = WC;\n"
             "          _source(PP++).ch = Peek;\n"
             "          FP++;\n"
             "        } else {\n"
             "          _source(PP++).ch = WC;\n"
             "        }\n"
             "      }\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "    else if (WC == '\"') {\n"
             "      _source(PP++).ch = WC;\n"
             "      for (;;) {\n"
             "        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);\n"
             "        if (WC == '\"') {\n"
             "          _source(PP).ch = WC;\n"
             "          if (PP > 0) _source(PP).start = source(PP-1).end; // Leave Peek for later.\n"
             "          if (FP > 0) _source(PP).end = SYM(FP-1).end; // Leave Peek for later.\n"
             "          PP++;\n"
             "          break;\n"
             "        } else if (WC == '\\\\') {\n"
             "          _source(PP++).ch = WC;\n"
             "          _source(PP++).ch = Peek;\n"
             "          FP++;\n"
             "        } else {\n"
             "          _source(PP++).ch = WC;\n"
             "        }\n"
             "      }\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "    else if (WC == ' ' || WC == '\\n' || WC == '\\t' || WC == '\\f') {  // use iswblank(WC) instead?\n"
             "      // TODO: fold multiple spaces and comments into one.\n"
             "      //       Instead of using the saved WC to provide spacing and newlines in the output, we\n"
             "      //       should use the saved comment text, while saving only a ' ' rather then \\n \\t \\f as ch.\n"
             "      _source(PP++).ch = WC;\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "    else {\n"
             "      // everything else just returns one significant non-space character.\n"
             "\n"
             "      _source(PP++).ch = WC;\n"
             "      continue;\n"
             "    }\n"
             "\n"
             "\n"
             "    // Still skipping whitespace ...\n"
             "\n"
             "  }\n"
             "\n"
             "  DONE();\n"
             "  P = 0;\n"
             "  while (source(P).ch != 0) {\n"
             "    if (debug_stropping) fprintf(stderr, \"%d: ch='%lc'  start=%d:end=%d\\n\", P, source(P).ch, source(P).start, source(P).end);\n"
             "    P++;\n"
             "  }\n"
             "\n"
             "  TP = 0;\n"
             "  //for (;;) {\n"
             "  //  fprintf(stderr, \"TP = %d  start = %d  end = %d  ch = '%c'\\n\", TP, source(TP).start, source(TP).end, source(TP).ch);\n"
             "  //                                                  // should show comment text etc too.\n"
             "  //  TP += 1;\n"
             "  //  if (source(TP).ch == 0) break;\n"
             "  //}\n"
             "  //exit(0);\n"
             "  //TP = 0;\n"
             "\n"
             "  FREE_FLEX(SYM);\n"
             "  \n"
             "#undef DONE\n"
             "#endif\n"
             "\n"
             "  return TRUE;\n",
  /*2*/   L"\n"
             "#ifdef IN_PARSER\n"
             "  int SAVE = TP;\n"
             "  parse_whitespace();\n"
             "  if (TP != SAVE) return 0;\n"
             "  if (TP == 0) return 0;\n"
             "  if ((source(TP-1).ch >= 'a' && source(TP-1).ch <= 'z')\n"
             "          || (source(TP-1).ch >= 'A' && source(TP-1).ch <= 'Z')\n"
             "          || (source(TP-1).ch >= '0' && source(TP-1).ch <= '9')\n"
             "          ||  source(TP-1).ch == '_') {\n"
             "    TP = SAVE;\n"
             "    return 1;\n"
             "  }\n"
             "  TP = SAVE;\n"
             "#endif\n"
             "  return 0;\n",
  /*3*/   L"\n"
             "#ifdef IN_PARSER\n"
             "  // Is a boolean return what is needed here?\n"
             "  return     ((source(TP).ch >= 'a') && (source(TP).ch <= 'z'))\n"
             "          || ((source(TP).ch >= 'A') && (source(TP).ch <= 'Z'))\n"
             "          || ((source(TP).ch >= '0') && (source(TP).ch <= '9'))\n"
             "          ||  (source(TP).ch == '_');\n"
             "#else\n"
             "  return 0;\n"
             "#endif\n",
  /*4*/   L"\n"
             "#ifdef IN_PARSER\n"
             "  int WP = TP;  // Pick up start of white space\n"
             "  parse_whitespace();\n"
             "  if (source(TP).ch == '#') {\n"
             "  \n"
             "    // Although we currently read from a '#' at the start of a *statement*,\n"
             "    // C requires us to accept preprocessor directives only from the start\n"
             "    // of a *line* (modulo leading spaces) so (TODO) we need to keep a\n"
             "    // 'start of line' flag as well, and test that when checking for a\n"
             "    // preprocessor directive.\n"
             "\n"
             "    // Actually even this scheme isn't proper C because a preprocessor\n"
             "    // directive can be at the start of a line yet in the middle of\n"
             "    // a statement.  I think this means it *must* be handled during\n"
             "    // line reconstruction, which means (if we are going to handle\n"
             "    // #define as well as #pragma not to mention #include), that all\n"
             "    // of cpp needs to be built in to the line reconstruction and\n"
             "    // a special mechanism (hack) has to be added to pass #pragma\n"
             "    // instructions through to the compiler part.\n"
             "\n"
             "    _source(TP).start = WP;\n"
             "    TP += 1;\n"
             "    while (source(TP).ch != '\\n') TP += 1 /* skip */;\n"
             "    // maybe should include the \\n for a # directive?\n"
             "    if (TP > 0) _source(TP).start = source(TP-1).end;\n"
             "    _source(TP).end = TP;\n"
             "    return 1;\n"
             "  } else\n"
             "#endif\n"
             "  return 0;\n",
};

parsefn parsetime[NUM_SEMANTIC_PHRASES] = {
  /*0*/   &parse_whitespace,
  /*1*/   &parse_C_line_reconstruction,
  /*2*/   &parse_preceded_by_alpha,
  /*3*/   &parse_followed_by_alpha,
  /*4*/   &parse_pp_directive,
};

// Comments are stored so that they can be re-inserted, should
// we need to regenerate a grammar.g file from this header file.
const wchar_t *xcomment[NUM_PHRASES] = {
  /*  0*/   NULL,
  /*  1*/   NULL,
  /*  2*/   NULL,
  /*  3*/   NULL,
  /*  4*/   NULL,
  /*  5*/   NULL,
  /*  6*/   NULL,
  /*  7*/   NULL,
  /*  8*/   NULL,
  /*  9*/   NULL,
  /* 10*/   NULL,
  /* 11*/   NULL,
  /* 12*/   NULL,
  /* 13*/   NULL,
  /* 14*/   NULL,
  /* 15*/   NULL,
  /* 16*/   NULL,
  /* 17*/   NULL,
  /* 18*/   NULL,
  /* 19*/   NULL,
  /* 20*/   NULL,
  /* 21*/   NULL,
  /* 22*/   NULL,
  /* 23*/   NULL,
  /* 24*/   NULL,
  /* 25*/   NULL,
  /* 26*/   NULL,
  /* 27*/   NULL,
  /* 28*/   NULL,
  /* 29*/   NULL,
  /* 30*/   NULL,
  /* 31*/   NULL,
  /* 32*/   NULL,
  /* 33*/   NULL,
  /* 34*/   NULL,
  /* 35*/   NULL,
  /* 36*/   NULL,
  /* 37*/   NULL,
  /* 38*/   NULL,
  /* 39*/   NULL,
  /* 40*/   NULL,
  /* 41*/   NULL,
  /* 42*/   NULL,
  /* 43*/   NULL,
  /* 44*/   NULL,
  /* 45*/   NULL,
  /* 46*/   NULL,
  /* 47*/   NULL,
  /* 48*/   NULL,
  /* 49*/   NULL,
  /* 50*/   NULL,
  /* 51*/   NULL,
  /* 52*/   NULL,
  /* 53*/   NULL,
  /* 54*/   NULL,
  /* 55*/   NULL,
  /* 56*/   NULL,
  /* 57*/   NULL,
  /* 58*/   NULL,
  /* 59*/   NULL,
  /* 60*/   NULL,
  /* 61*/   NULL,
  /* 62*/   NULL,
  /* 63*/   NULL,
  /* 64*/   NULL,
  /* 65*/   NULL,
  /* 66*/   NULL,
  /* 67*/   NULL,
  /* 68*/   NULL,
  /* 69*/   NULL,
  /* 70*/   NULL,
  /* 71*/   NULL,
  /* 72*/   NULL,
  /* 73*/   NULL,
  /* 74*/   NULL,
  /* 75*/   NULL,
  /* 76*/   NULL,
  /* 77*/   NULL,
  /* 78*/   NULL,
  /* 79*/   NULL,
  /* 80*/   NULL,
  /* 81*/   NULL,
  /* 82*/   NULL,
  /* 83*/   NULL,
  /* 84*/   NULL,
  /* 85*/   NULL,
  /* 86*/   NULL,
  /* 87*/   NULL,
  /* 88*/   NULL,
  /* 89*/   NULL,
  /* 90*/   NULL,
  /* 91*/   NULL,
  /* 92*/   NULL,
  /* 93*/   NULL,
  /* 94*/   NULL,
  /* 95*/   NULL,
  /* 96*/   NULL,
  /* 97*/   NULL,
  /* 98*/   NULL,
  /* 99*/   NULL,
  /*100*/   NULL,
  /*101*/   NULL,
  /*102*/   NULL,
  /*103*/   NULL,
  /*104*/   NULL,
  /*105*/   NULL,
  /*106*/   NULL,
  /*107*/   NULL,
  /*108*/   NULL,
  /*109*/   NULL,
  /*110*/   NULL,
  /*111*/   NULL,
  /*112*/   NULL,
  /*113*/   NULL,
  /*114*/   NULL,
  /*115*/   NULL,
  /*116*/   NULL,
  /*117*/   NULL,
  /*118*/   NULL,
  /*119*/   NULL,
  /*120*/   NULL,
  /*121*/   NULL,
  /*122*/   NULL,
  /*123*/   NULL,
  /*124*/   NULL,
  /*125*/   NULL,
  /*126*/   NULL,
  /*127*/   NULL,
  /*128*/   NULL,
  /*129*/   NULL,
  /*130*/   NULL,
  /*131*/   NULL,
  /*132*/   NULL,
  /*133*/   NULL,
  /*134*/   NULL,
  /*135*/   NULL,
  /*136*/   NULL,
  /*137*/   NULL,
  /*138*/   NULL,
  /*139*/   NULL,
  /*140*/   NULL,
  /*141*/   NULL,
  /*142*/   NULL,
  /*143*/   NULL,
  /*144*/   NULL,
  /*145*/   NULL,
  /*146*/   NULL,
  /*147*/   NULL,
  /*148*/   NULL,
  /*149*/   NULL,
  /*150*/   NULL,
  /*151*/   NULL,
  /*152*/   NULL,
  /*153*/   NULL,
  /*154*/   NULL,
  /*155*/   NULL,
  /*156*/   NULL,
  /*157*/   NULL,
  /*158*/   NULL,
  /*159*/   NULL,
  /*160*/   NULL,
  /*161*/   NULL,
  /*162*/   NULL,
  /*163*/   NULL,
  /*164*/   NULL,
  /*165*/   NULL,
  /*166*/   NULL,
  /*167*/   NULL,
  /*168*/   NULL,
  /*169*/   NULL,
  /*170*/   NULL,
  /*171*/   NULL,
  /*172*/   NULL,
  /*173*/   NULL,
  /*174*/   NULL,
  /*175*/   NULL,
  /*176*/   NULL,
  /*177*/   NULL,
  /*178*/   NULL,
  /*179*/   NULL,
  /*180*/   NULL,
  /*181*/   NULL,
  /*182*/   NULL,
  /*183*/   NULL,
  /*184*/   NULL,
  /*185*/   NULL,
  /*186*/   NULL,
  /*187*/   NULL,
  /*188*/   NULL,
  /*189*/   NULL,
  /*190*/   NULL,
  /*191*/   NULL,
  /*192*/   NULL,
  /*193*/   NULL,
  /*194*/   NULL,
  /*195*/   NULL,
  /*196*/   NULL,
};
const wchar_t *ast_code[NUM_SIMPLE_PHRASES] = {
  /*constant*/   L"",
  /*U_opt*/   L"",
  /*L_opt*/   L"",
  /*UL_opt*/   L"",
  /*integer_constant*/   L"",
  /*decimal_constant*/   L"",
  /*octal_constant*/   L"",
  /*hexadecimal_constant*/   L"",
  /*binary_constant*/   L"",
  /*floating_constant*/   L"",
  /*fractional_constant*/   L"",
  /*exponent_part*/   L"",
  /*exponent_part_opt*/   L"",
  /*floating_suffix_opt*/   L"",
  /*digit_sequence*/   L"",
  /*digit_sequence_opt*/   L"",
  /*decimal_floating_constant*/   L"",
  /*hexadecimal_floating_constant*/   L"",
  /*binary_floating_constant*/   L"",
  /*hexadecimal_digit_sequence*/   L"",
  /*hexadecimal_fractional_constant*/   L"",
  /*binary_digit_sequence*/   L"",
  /*binary_fractional_constant*/   L"",
  /*binary_exponent_part*/   L"",
  /*enumeration_constant*/   L"",
  /*character_constant*/   L"",
  /*sqchars*/   L"",
  /*sqchar*/   L"",
  /*escaped_char*/   L"",
  /*longchartype_opt*/   L"",
  /*unchecked_identifier*/   L"",
  /*sq*/   L"",
  /*dq*/   L"",
  /*dqchar*/   L"",
  /*dqstringchars*/   L"",
  /*dqstring*/   L"",
  /*dqstring_opt*/   L"",
  /*not_preceded_by_alpha_and_is_not_keyword*/   L"",
  /*tag*/   L"",
  /*new_identifier*/   L"",
  /*identifier*/   L"",
  /*keyword*/   L"",
  /*actual_keyword*/   L"",
  /*SS*/   L"",
  /*external_declaration_list*/   L"",
  /*external_declaration_list_opt*/   L"",
  /*external_declaration*/   L"",
  /*struct_or_union_specifier*/   L"",
  /*struct_or_union*/   L"",
  /*struct_field_declarations*/   L"",
  /*rest_of_struct_field_declarations*/   L"",
  /*struct_field_declaration*/   L"",
  /*possibly_initialised_scalar_or_array_decl*/   L"",
  /*rest_of_scalar_or_array_decl*/   L"",
  /*rest_of_scalar_or_array_decl_opt*/   L"",
  /*scalar_init_opt*/   L"",
  /*assignment_expression*/   L"",
  /*rest_of_assignment_expression_opt*/   L"",
  /*conditional_expression*/   L"",
  /*rest_of_conditional_expression*/   L"",
  /*expression*/   L"",
  /*comma_statement*/   L"",
  /*rest_of_comma_statement*/   L"",
  /*logical_or_expression*/   L"",
  /*rest_of_logical_or_expression*/   L"",
  /*logical_and_expression*/   L"",
  /*rest_of_logical_and_expression*/   L"",
  /*inclusive_or_expression*/   L"",
  /*rest_of_inclusive_or_expression*/   L"",
  /*exclusive_or_expression*/   L"",
  /*rest_of_exclusive_or_expression*/   L"",
  /*bitwise_and_expression*/   L"",
  /*rest_of_bitwise_and_expression*/   L"",
  /*equality_expression*/   L"",
  /*rest_of_equality_expression*/   L"",
  /*relational_expression*/   L"",
  /*rest_of_relational_expression*/   L"",
  /*shift_expression*/   L"",
  /*rest_of_shift_expression*/   L"",
  /*additive_expression*/   L"",
  /*rest_of_additive_expression*/   L"",
  /*multiplicative_expression*/   L"",
  /*rest_of_multiplicative_expression*/   L"",
  /*unary_rvalue_expression*/   L"",
  /*postfix_rvalue_expression*/   L"",
  /*rest_of_postfix_rvalue_expression*/   L"",
  /*post_increment_op*/   L"",
  /*actual_param_list*/   L"",
  /*rest_of_param_list*/   L"",
  /*unary_lvalue_expression*/   L"",
  /*postfix_lvalue_expression*/   L"",
  /*rest_of_postfix_expression*/   L"",
  /*non_empty_rest_of_postfix_expression*/   L"",
  /*unary_address_expression*/   L"",
  /*primary_expression*/   L"",
  /*cast_opt*/   L"",
  /*cast*/   L"",
  /*indirection_decl_opt*/   L"",
  /*indirection_unary_ops*/   L"",
  /*indirection_unary_ops_opt*/   L"",
  /*type_specifier*/   L"",
  /*typedef_name*/   L"",
  /*basic_type_specifier*/   L"",
  /*enum_specifier*/   L"",
  /*enumerator_list*/   L"",
  /*rest_of_enumerator_list*/   L"",
  /*enumerator*/   L"",
  /*constant_expression*/   L"",
  /*signed_inttype*/   L"",
  /*int_opt*/   L"",
  /*signed_opt*/   L"",
  /*address_operator*/   L"",
  /*pre_increment_op*/   L"",
  /*bitwise_unary_ops*/   L"",
  /*rest_of_bitwise_unary_ops*/   L"",
  /*boolean_unary_ops*/   L"",
  /*rest_of_boolean_unary_ops*/   L"",
  /*arithmetic_unary_op*/   L"",
  /*mulop*/   L"",
  /*plusminus*/   L"",
  /*shiftop*/   L"",
  /*relop*/   L"",
  /*eqop*/   L"",
  /*eq*/   L"",
  /*assignment_operator*/   L"",
  /*lvalue_assign_opt*/   L"",
  /*array_init_opt*/   L"",
  /*constant_initializer_list*/   L"",
  /*rest_of_constant_initializer_list*/   L"",
  /*constant_initializer*/   L"",
  /*HACK1*/   L"\n"
             "   //fprintf(stdout, \"/*hack1*/\");\n",
  /*HACK2*/   L"\n"
             "   //fprintf(stdout, \"/*hack2*/\");\n",
  /*array_bounds*/   L"",
  /*array_bounds_opt*/   L"",
  /*constant_expression_opt*/   L"",
  /*type*/   L"",
  /*const_or_volatile_type_qualifier_opt*/   L"",
  /*const_or_volatile_type_qualifier*/   L"",
  /*auto_reg_static_ext_opt*/   L"",
  /*identifier_list*/   L"",
  /*rest_of_identifier_list*/   L"",
  /*more_forward_decls_or_actual_body*/   L"",
  /*extern_proc_spec*/   L"",
  /*basic_type_specifier_or_typedef_name_opt*/   L"",
  /*identifier_or_function_pointer*/   L"",
  /*extern_proc_name_and_params*/   L"",
  /*extern_proc_name_and_params_list_opt*/   L"",
  /*proc_fn_decl*/   L"",
  /*compound_statement*/   L"\n"
             "   //fprintf(stdout, \"\\n\");\n",
  /*statement_list*/   L"",
  /*rest_of_statement_list*/   L"",
  /*statement*/   L"",
  /*in_proc_data_declaration*/   L"",
  /*struct_decl*/   L"",
  /*struct_member_list*/   L"",
  /*struct_member_declaration*/   L"",
  /*possibly_initialised_array_decl*/   L"",
  /*possibly_initialised_scalar_decl*/   L"",
  /*rest_of_scalar_decl*/   L"",
  /*rest_of_scalar_decl_opt*/   L"",
  /*new_structname*/   L"",
  /*decl_list*/   L"",
  /*rest_of_decl_list*/   L"",
  /*decl*/   L"",
  /*possibly_empty_array_bounds_list*/   L"",
  /*optional_possibly_empty_array_bounds_list*/   L"",
  /*jump_statement*/   L"",
  /*expression_opt*/   L"",
  /*label*/   L"",
  /*iteration_statement*/   L"",
  /*selection_statement*/   L"",
  /*else_opt*/   L"",
  /*missing_semicolon_after_label_at_end_of_block*/   L"",
  /*labels_opt*/   L"",
  /*param_list_opt*/   L"",
  /*oldstyle_param_list_opt*/   L"",
  /*oldstyle_param_list*/   L"",
  /*rest_of_oldstyle_param_list_opt*/   L"",
  /*oldstyle_formal_param*/   L"",
  /*oldstyle_parameter_list*/   L"",
  /*rest_of_oldstyle_parameter_list*/   L"",
  /*whatever*/   L"",
  /*rest_of_param_list_opt*/   L"",
  /*formal_param*/   L"",
  /*identifier_opt*/   L"",
  /*procedure_as_parameter*/   L"",
  /*basic_type_specifier_opt*/   L"",
  /*typedef_declaration*/   L"",
  /*maybe_indirect_typedef_name_list*/   L"",
  /*rest_of_maybe_indirect_typedef_name_list*/   L"",
};

const wchar_t *keyword[NUM_KEYWORDS] = {
  /*  0*/   L"if",
  /*  1*/   L"const",
  /*  2*/   L"struct",
  /*  3*/   L"union",
  /*  4*/   L"sizeof",
  /*  5*/   L"typeof",
  /*  6*/   L"double",
  /*  7*/   L"long",
  /*  8*/   L"char",
  /*  9*/   L"float",
  /* 10*/   L"void",
  /* 11*/   L"enum",
  /* 12*/   L"short",
  /* 13*/   L"int",
  /* 14*/   L"signed",
  /* 15*/   L"unsigned",
  /* 16*/   L"volatile",
  /* 17*/   L"auto",
  /* 18*/   L"register",
  /* 19*/   L"static",
  /* 20*/   L"extern",
  /* 21*/   L"goto",
  /* 22*/   L"continue",
  /* 23*/   L"break",
  /* 24*/   L"return",
  /* 25*/   L"while",
  /* 26*/   L"do",
  /* 27*/   L"for",
  /* 28*/   L"switch",
  /* 29*/   L"else",
  /* 30*/   L"case",
  /* 31*/   L"default",
  /* 32*/   L"typedef",
  /* 33*/   L"||",
  /* 34*/   L"&&",
  /* 35*/   L"->",
  /* 36*/   L"++",
  /* 37*/   L"--",
  /* 38*/   L"<<",
  /* 39*/   L">>",
  /* 40*/   L"<=",
  /* 41*/   L">=",
  /* 42*/   L"==",
  /* 43*/   L"!=",
  /* 44*/   L"*=",
  /* 45*/   L"/=",
  /* 46*/   L"%=",
  /* 47*/   L"+=",
  /* 48*/   L"-=",
  /* 49*/   L"<<=",
  /* 50*/   L">>=",
  /* 51*/   L"&=",
  /* 52*/   L"^=",
  /* 53*/   L"|=",
  /* 54*/   L"...",
};
const wchar_t *regexps[NUM_REGEXPS] = {
  /*0*/   L"^[1-9][0-9]*",
  /*1*/   L"^0[0-7]*",
  /*2*/   L"^0[xX][0-9a-fA-F]+",
  /*3*/   L"^0[bB][0-1]+",
  /*4*/   L"^[eE][+-]?[0-9]*",
  /*5*/   L"^[flFL]?",
  /*6*/   L"^[0-9]+",
  /*7*/   L"^0[xX]",
  /*8*/   L"^0[bB]",
  /*9*/   L"^[A-Fa-f0-9]+",
  /*10*/   L"^[A-Fa-f0-9]*",
  /*11*/   L"^[0-1]+",
  /*12*/   L"^[0-1]*",
  /*13*/   L"^[pP][+-]?[0-9]+",
  /*14*/   L"^'",
  /*15*/   L"^[^'\\]",
  /*16*/   L"^[\\\"'?abfnrtvx0-9]",
  /*17*/   L"^[A-Za-z_][A-Za-z0-9_]*",
  /*18*/   L"^.",
};
const int gram[NUM_GRAMMAR /* 1470 */] = {

// P<constant> = ...;
  /*  0*/ COUNT_OF_ALTS    | 0x000004,
  /*  1*/ COUNT_OF_PHRASES | 0x000002,
  /*  2*/ PHRASE_TYPE      | G_cast_opt,
  /*  3*/ PHRASE_TYPE      | G_floating_constant,
  /*  4*/ COUNT_OF_PHRASES | 0x000002,
  /*  5*/ PHRASE_TYPE      | G_cast_opt,
  /*  6*/ PHRASE_TYPE      | G_integer_constant,
  /*  7*/ COUNT_OF_PHRASES | 0x000002,
  /*  8*/ PHRASE_TYPE      | G_cast_opt,
  /*  9*/ PHRASE_TYPE      | G_character_constant,
  /* 10*/ COUNT_OF_PHRASES | 0x000002,
  /* 11*/ PHRASE_TYPE      | G_cast_opt,
  /* 12*/ PHRASE_TYPE      | G_enumeration_constant,

// P<U_opt> = ...;
  /* 13*/ COUNT_OF_ALTS    | 0x000003,
  /* 14*/ COUNT_OF_PHRASES | 0x000001,
  /* 15*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000055,  /* 'U' */
  /* 16*/ COUNT_OF_PHRASES | 0x000001,
  /* 17*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000075,  /* 'u' */
  /* 18*/ COUNT_OF_PHRASES | 0x000000,

// P<L_opt> = ...;
  /* 19*/ COUNT_OF_ALTS    | 0x000003,
  /* 20*/ COUNT_OF_PHRASES | 0x000001,
  /* 21*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00004c,  /* 'L' */
  /* 22*/ COUNT_OF_PHRASES | 0x000001,
  /* 23*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00006c,  /* 'l' */
  /* 24*/ COUNT_OF_PHRASES | 0x000000,

// P<UL_opt> = ...;
  /* 25*/ COUNT_OF_ALTS    | 0x000003,
  /* 26*/ COUNT_OF_PHRASES | 0x000003,
  /* 27*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000055,  /* 'U' */
  /* 28*/ PHRASE_TYPE      | G_L_opt,
  /* 29*/ PHRASE_TYPE      | G_L_opt,
  /* 30*/ COUNT_OF_PHRASES | 0x000003,
  /* 31*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00004c,  /* 'L' */
  /* 32*/ PHRASE_TYPE      | G_L_opt,
  /* 33*/ PHRASE_TYPE      | G_U_opt,
  /* 34*/ COUNT_OF_PHRASES | 0x000000,

// P<integer-constant> = ...;
  /* 35*/ COUNT_OF_ALTS    | 0x000004,
  /* 36*/ COUNT_OF_PHRASES | 0x000002,
  /* 37*/ PHRASE_TYPE      | G_hexadecimal_constant,
  /* 38*/ PHRASE_TYPE      | G_UL_opt,
  /* 39*/ COUNT_OF_PHRASES | 0x000002,
  /* 40*/ PHRASE_TYPE      | G_binary_constant,
  /* 41*/ PHRASE_TYPE      | G_UL_opt,
  /* 42*/ COUNT_OF_PHRASES | 0x000002,
  /* 43*/ PHRASE_TYPE      | G_octal_constant,
  /* 44*/ PHRASE_TYPE      | G_UL_opt,
  /* 45*/ COUNT_OF_PHRASES | 0x000002,
  /* 46*/ PHRASE_TYPE      | G_decimal_constant,
  /* 47*/ PHRASE_TYPE      | G_UL_opt,

// P<decimal-constant> = ...;
  /* 48*/ COUNT_OF_ALTS    | 0x000001,
  /* 49*/ COUNT_OF_PHRASES | 0x000001,
  /* 50*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000000,  /* ^[1-9][0-9]* */

// P<octal-constant> = ...;
  /* 51*/ COUNT_OF_ALTS    | 0x000001,
  /* 52*/ COUNT_OF_PHRASES | 0x000001,
  /* 53*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000001,  /* ^0[0-7]* */

// P<hexadecimal-constant> = ...;
  /* 54*/ COUNT_OF_ALTS    | 0x000001,
  /* 55*/ COUNT_OF_PHRASES | 0x000001,
  /* 56*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000002,  /* ^0[xX][0-9a-fA-F]+ */

// P<binary-constant> = ...;
  /* 57*/ COUNT_OF_ALTS    | 0x000001,
  /* 58*/ COUNT_OF_PHRASES | 0x000001,
  /* 59*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000003,  /* ^0[bB][0-1]+ */

// P<floating-constant> = ...;
  /* 60*/ COUNT_OF_ALTS    | 0x000003,
  /* 61*/ COUNT_OF_PHRASES | 0x000001,
  /* 62*/ PHRASE_TYPE      | G_decimal_floating_constant,
  /* 63*/ COUNT_OF_PHRASES | 0x000001,
  /* 64*/ PHRASE_TYPE      | G_hexadecimal_floating_constant,
  /* 65*/ COUNT_OF_PHRASES | 0x000001,
  /* 66*/ PHRASE_TYPE      | G_binary_floating_constant,

// P<fractional-constant> = ...;
  /* 67*/ COUNT_OF_ALTS    | 0x000002,
  /* 68*/ COUNT_OF_PHRASES | 0x000003,
  /* 69*/ PHRASE_TYPE      | G_digit_sequence_opt,
  /* 70*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /* 71*/ PHRASE_TYPE      | G_digit_sequence,
  /* 72*/ COUNT_OF_PHRASES | 0x000002,
  /* 73*/ PHRASE_TYPE      | G_digit_sequence,
  /* 74*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */

// P<exponent-part> = ...;
  /* 75*/ COUNT_OF_ALTS    | 0x000001,
  /* 76*/ COUNT_OF_PHRASES | 0x000001,
  /* 77*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000004,  /* ^[eE][+-]?[0-9]* */

// P<exponent-part_opt> = ...;
  /* 78*/ COUNT_OF_ALTS    | 0x000002,
  /* 79*/ COUNT_OF_PHRASES | 0x000001,
  /* 80*/ PHRASE_TYPE      | G_exponent_part,
  /* 81*/ COUNT_OF_PHRASES | 0x000000,

// P<floating-suffix_opt> = ...;
  /* 82*/ COUNT_OF_ALTS    | 0x000001,
  /* 83*/ COUNT_OF_PHRASES | 0x000001,
  /* 84*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000005,  /* ^[flFL]? */

// P<digit-sequence> = ...;
  /* 85*/ COUNT_OF_ALTS    | 0x000001,
  /* 86*/ COUNT_OF_PHRASES | 0x000001,
  /* 87*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000006,  /* ^[0-9]+ */

// P<digit-sequence_opt> = ...;
  /* 88*/ COUNT_OF_ALTS    | 0x000002,
  /* 89*/ COUNT_OF_PHRASES | 0x000001,
  /* 90*/ PHRASE_TYPE      | G_digit_sequence,
  /* 91*/ COUNT_OF_PHRASES | 0x000000,

// P<decimal-floating-constant> = ...;
  /* 92*/ COUNT_OF_ALTS    | 0x000002,
  /* 93*/ COUNT_OF_PHRASES | 0x000003,
  /* 94*/ PHRASE_TYPE      | G_fractional_constant,
  /* 95*/ PHRASE_TYPE      | G_exponent_part_opt,
  /* 96*/ PHRASE_TYPE      | G_floating_suffix_opt,
  /* 97*/ COUNT_OF_PHRASES | 0x000003,
  /* 98*/ PHRASE_TYPE      | G_digit_sequence,
  /* 99*/ PHRASE_TYPE      | G_exponent_part,
  /*100*/ PHRASE_TYPE      | G_floating_suffix_opt,

// P<hexadecimal-floating-constant> = ...;
  /*101*/ COUNT_OF_ALTS    | 0x000002,
  /*102*/ COUNT_OF_PHRASES | 0x000004,
  /*103*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000007,  /* ^0[xX] */
  /*104*/ PHRASE_TYPE      | G_hexadecimal_fractional_constant,
  /*105*/ PHRASE_TYPE      | G_binary_exponent_part,
  /*106*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000005,  /* ^[flFL]? */
  /*107*/ COUNT_OF_PHRASES | 0x000004,
  /*108*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000007,  /* ^0[xX] */
  /*109*/ PHRASE_TYPE      | G_hexadecimal_digit_sequence,
  /*110*/ PHRASE_TYPE      | G_binary_exponent_part,
  /*111*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000005,  /* ^[flFL]? */

// P<binary-floating-constant> = ...;
  /*112*/ COUNT_OF_ALTS    | 0x000002,
  /*113*/ COUNT_OF_PHRASES | 0x000004,
  /*114*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000008,  /* ^0[bB] */
  /*115*/ PHRASE_TYPE      | G_binary_fractional_constant,
  /*116*/ PHRASE_TYPE      | G_binary_exponent_part,
  /*117*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000005,  /* ^[flFL]? */
  /*118*/ COUNT_OF_PHRASES | 0x000004,
  /*119*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000008,  /* ^0[bB] */
  /*120*/ PHRASE_TYPE      | G_binary_digit_sequence,
  /*121*/ PHRASE_TYPE      | G_binary_exponent_part,
  /*122*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000005,  /* ^[flFL]? */

// P<hexadecimal-digit-sequence> = ...;
  /*123*/ COUNT_OF_ALTS    | 0x000001,
  /*124*/ COUNT_OF_PHRASES | 0x000001,
  /*125*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000009,  /* ^[A-Fa-f0-9]+ */

// P<hexadecimal-fractional-constant> = ...;
  /*126*/ COUNT_OF_ALTS    | 0x000002,
  /*127*/ COUNT_OF_PHRASES | 0x000003,
  /*128*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000a,  /* ^[A-Fa-f0-9]* */
  /*129*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /*130*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000009,  /* ^[A-Fa-f0-9]+ */
  /*131*/ COUNT_OF_PHRASES | 0x000002,
  /*132*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000009,  /* ^[A-Fa-f0-9]+ */
  /*133*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */

// P<binary-digit-sequence> = ...;
  /*134*/ COUNT_OF_ALTS    | 0x000001,
  /*135*/ COUNT_OF_PHRASES | 0x000001,
  /*136*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000b,  /* ^[0-1]+ */

// P<binary-fractional-constant> = ...;
  /*137*/ COUNT_OF_ALTS    | 0x000002,
  /*138*/ COUNT_OF_PHRASES | 0x000003,
  /*139*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000c,  /* ^[0-1]* */
  /*140*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /*141*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000b,  /* ^[0-1]+ */
  /*142*/ COUNT_OF_PHRASES | 0x000002,
  /*143*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000b,  /* ^[0-1]+ */
  /*144*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */

// P<binary-exponent-part> = ...;
  /*145*/ COUNT_OF_ALTS    | 0x000001,
  /*146*/ COUNT_OF_PHRASES | 0x000001,
  /*147*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000d,  /* ^[pP][+-]?[0-9]+ */

// P<enumeration-constant> = ...;
  /*148*/ COUNT_OF_ALTS    | 0x000001,
  /*149*/ COUNT_OF_PHRASES | 0x000001,
  /*150*/ PHRASE_TYPE      | G_identifier,

// P<character-constant> = ...;
  /*151*/ COUNT_OF_ALTS    | 0x000001,
  /*152*/ COUNT_OF_PHRASES | 0x000004,
  /*153*/ PHRASE_TYPE      | G_longchartype_opt,
  /*154*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000e,  /* ^' */
  /*155*/ PHRASE_TYPE      | G_sqchars,
  /*156*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000e,  /* ^' */

// P<sqchars> = ...;
  /*157*/ COUNT_OF_ALTS    | 0x000002,
  /*158*/ COUNT_OF_PHRASES | 0x000002,
  /*159*/ PHRASE_TYPE      | G_sqchar,
  /*160*/ PHRASE_TYPE      | G_sqchars,
  /*161*/ COUNT_OF_PHRASES | 0x000000,

// P<sqchar> = ...;
  /*162*/ COUNT_OF_ALTS    | 0x000002,
  /*163*/ COUNT_OF_PHRASES | 0x000001,
  /*164*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000f,  /* ^[^'\\] */
  /*165*/ COUNT_OF_PHRASES | 0x000001,
  /*166*/ PHRASE_TYPE      | G_escaped_char,

// P<escaped-char> = ...;
  /*167*/ COUNT_OF_ALTS    | 0x000001,
  /*168*/ COUNT_OF_PHRASES | 0x000002,
  /*169*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005c,  /* '\' */
  /*170*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000010,  /* ^[\\\"'?abfnrtvx0-9] */

// P<longchartype_opt> = ...;
  /*171*/ COUNT_OF_ALTS    | 0x000002,
  /*172*/ COUNT_OF_PHRASES | 0x000001,
  /*173*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00004c,  /* 'L' */
  /*174*/ COUNT_OF_PHRASES | 0x000000,

// P<unchecked-identifier> = ...;
  /*175*/ COUNT_OF_ALTS    | 0x000001,
  /*176*/ COUNT_OF_PHRASES | 0x000002,
  /*177*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000011,  /* ^[A-Za-z_][A-Za-z0-9_]* */
  /*178*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_sq,

// P<sq> = ...;
  /*179*/ COUNT_OF_ALTS    | 0x000001,
  /*180*/ COUNT_OF_PHRASES | 0x000001,
  /*181*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x00000e,  /* ^' */

// P<dq> = ...;
  /*182*/ COUNT_OF_ALTS    | 0x000001,
  /*183*/ COUNT_OF_PHRASES | 0x000001,
  /*184*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000022,  /* '"' */

// P<dqchar> = ...;
  /*185*/ COUNT_OF_ALTS    | 0x000002,
  /*186*/ COUNT_OF_PHRASES | 0x000002,
  /*187*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005c,  /* '\' */
  /*188*/ PHRASE_TYPE      | G_dq,
  /*189*/ COUNT_OF_PHRASES | 0x000002,
  /*190*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_dq,
  /*191*/ REGEXP_TYPE      | WHITESPACE_ALLOWED | 0x000012,  /* ^. */

// P<dqstringchars> = ...;
  /*192*/ COUNT_OF_ALTS    | 0x000002,
  /*193*/ COUNT_OF_PHRASES | 0x000002,
  /*194*/ PHRASE_TYPE      | G_dqchar,
  /*195*/ PHRASE_TYPE      | G_dqstringchars,
  /*196*/ COUNT_OF_PHRASES | 0x000000,

// P<dqstring> = ...;
  /*197*/ COUNT_OF_ALTS    | 0x000001,
  /*198*/ COUNT_OF_PHRASES | 0x000005,
  /*199*/ PHRASE_TYPE      | G_longchartype_opt,
  /*200*/ PHRASE_TYPE      | G_dq,
  /*201*/ PHRASE_TYPE      | G_dqstringchars,
  /*202*/ PHRASE_TYPE      | G_dq,
  /*203*/ PHRASE_TYPE      | G_dqstring_opt,

// P<dqstring_opt> = ...;
  /*204*/ COUNT_OF_ALTS    | 0x000002,
  /*205*/ COUNT_OF_PHRASES | 0x000001,
  /*206*/ PHRASE_TYPE      | G_dqstring,
  /*207*/ COUNT_OF_PHRASES | 0x000000,

// P<not-preceded-by-alpha_and_is-not-keyword> = ...;
  /*208*/ COUNT_OF_ALTS    | 0x000001,
  /*209*/ COUNT_OF_PHRASES | 0x000002,
  /*210*/ SEMANTIC_TYPE    | NEGATED_PHRASE     | S_preceded_by_alpha,
  /*211*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_keyword,

// P<tag> = ...;
  /*212*/ COUNT_OF_ALTS    | 0x000001,
  /*213*/ COUNT_OF_PHRASES | 0x000001,
  /*214*/ PHRASE_TYPE      | G_identifier,

// P<new-identifier> = ...;
  /*215*/ COUNT_OF_ALTS    | 0x000001,
  /*216*/ COUNT_OF_PHRASES | 0x000001,
  /*217*/ PHRASE_TYPE      | G_identifier,

// P<identifier> = ...;
  /*218*/ COUNT_OF_ALTS    | 0x000001,
  /*219*/ COUNT_OF_PHRASES | 0x000002,
  /*220*/ PHRASE_TYPE      | GUARD_PHRASE       | G_not_preceded_by_alpha_and_is_not_keyword,
  /*221*/ PHRASE_TYPE      | G_unchecked_identifier,

// P<keyword> = ...;
  /*222*/ COUNT_OF_ALTS    | 0x000001,
  /*223*/ COUNT_OF_PHRASES | 0x000002,
  /*224*/ PHRASE_TYPE      | G_actual_keyword,
  /*225*/ SEMANTIC_TYPE    | NEGATED_PHRASE     | S_followed_by_alpha,

// P<actual-keyword> = ...;
  /*226*/ COUNT_OF_ALTS    | 0x000021,
  /*227*/ COUNT_OF_PHRASES | 0x000001,
  /*228*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000000,  /* if */
  /*229*/ COUNT_OF_PHRASES | 0x000001,
  /*230*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000001,  /* const */
  /*231*/ COUNT_OF_PHRASES | 0x000001,
  /*232*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000002,  /* struct */
  /*233*/ COUNT_OF_PHRASES | 0x000001,
  /*234*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000003,  /* union */
  /*235*/ COUNT_OF_PHRASES | 0x000001,
  /*236*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000004,  /* sizeof */
  /*237*/ COUNT_OF_PHRASES | 0x000001,
  /*238*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000005,  /* typeof */
  /*239*/ COUNT_OF_PHRASES | 0x000001,
  /*240*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000006,  /* double */
  /*241*/ COUNT_OF_PHRASES | 0x000001,
  /*242*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000007,  /* long */
  /*243*/ COUNT_OF_PHRASES | 0x000001,
  /*244*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000008,  /* char */
  /*245*/ COUNT_OF_PHRASES | 0x000001,
  /*246*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000009,  /* float */
  /*247*/ COUNT_OF_PHRASES | 0x000001,
  /*248*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000a,  /* void */
  /*249*/ COUNT_OF_PHRASES | 0x000001,
  /*250*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000b,  /* enum */
  /*251*/ COUNT_OF_PHRASES | 0x000001,
  /*252*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000c,  /* short */
  /*253*/ COUNT_OF_PHRASES | 0x000001,
  /*254*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000d,  /* int */
  /*255*/ COUNT_OF_PHRASES | 0x000001,
  /*256*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000e,  /* signed */
  /*257*/ COUNT_OF_PHRASES | 0x000001,
  /*258*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000f,  /* unsigned */
  /*259*/ COUNT_OF_PHRASES | 0x000001,
  /*260*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000010,  /* volatile */
  /*261*/ COUNT_OF_PHRASES | 0x000001,
  /*262*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000011,  /* auto */
  /*263*/ COUNT_OF_PHRASES | 0x000001,
  /*264*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000012,  /* register */
  /*265*/ COUNT_OF_PHRASES | 0x000001,
  /*266*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000013,  /* static */
  /*267*/ COUNT_OF_PHRASES | 0x000001,
  /*268*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000014,  /* extern */
  /*269*/ COUNT_OF_PHRASES | 0x000001,
  /*270*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000015,  /* goto */
  /*271*/ COUNT_OF_PHRASES | 0x000001,
  /*272*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000016,  /* continue */
  /*273*/ COUNT_OF_PHRASES | 0x000001,
  /*274*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000017,  /* break */
  /*275*/ COUNT_OF_PHRASES | 0x000001,
  /*276*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000018,  /* return */
  /*277*/ COUNT_OF_PHRASES | 0x000001,
  /*278*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000019,  /* while */
  /*279*/ COUNT_OF_PHRASES | 0x000001,
  /*280*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001a,  /* do */
  /*281*/ COUNT_OF_PHRASES | 0x000001,
  /*282*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001b,  /* for */
  /*283*/ COUNT_OF_PHRASES | 0x000001,
  /*284*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001c,  /* switch */
  /*285*/ COUNT_OF_PHRASES | 0x000001,
  /*286*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001d,  /* else */
  /*287*/ COUNT_OF_PHRASES | 0x000001,
  /*288*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001e,  /* case */
  /*289*/ COUNT_OF_PHRASES | 0x000001,
  /*290*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001f,  /* default */
  /*291*/ COUNT_OF_PHRASES | 0x000001,
  /*292*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000020,  /* typedef */

// P<SS> = ...;
  /*293*/ COUNT_OF_ALTS    | 0x000001,
  /*294*/ COUNT_OF_PHRASES | 0x000003,
  /*295*/ SEMANTIC_TYPE    | S_C_line_reconstruction,
  /*296*/ PHRASE_TYPE      | G_external_declaration_list_opt,
  /*297*/ BIP_TYPE         | WHITESPACE_ALLOWED | B_EOF,

// P<external-declaration-list> = ...;
  /*298*/ COUNT_OF_ALTS    | 0x000001,
  /*299*/ COUNT_OF_PHRASES | 0x000002,
  /*300*/ PHRASE_TYPE      | G_external_declaration,
  /*301*/ PHRASE_TYPE      | G_external_declaration_list_opt,

// P<external-declaration-list_opt> = ...;
  /*302*/ COUNT_OF_ALTS    | 0x000002,
  /*303*/ COUNT_OF_PHRASES | 0x000001,
  /*304*/ PHRASE_TYPE      | G_external_declaration_list,
  /*305*/ COUNT_OF_PHRASES | 0x000000,

// P<external-declaration> = ...;
  /*306*/ COUNT_OF_ALTS    | 0x000007,
  /*307*/ COUNT_OF_PHRASES | 0x000001,
  /*308*/ SEMANTIC_TYPE    | S_pp_directive,
  /*309*/ COUNT_OF_PHRASES | 0x000002,
  /*310*/ PHRASE_TYPE      | G_typedef_declaration,
  /*311*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*312*/ COUNT_OF_PHRASES | 0x000001,
  /*313*/ PHRASE_TYPE      | G_proc_fn_decl,
  /*314*/ COUNT_OF_PHRASES | 0x000002,
  /*315*/ PHRASE_TYPE      | G_possibly_initialised_scalar_or_array_decl,
  /*316*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*317*/ COUNT_OF_PHRASES | 0x000001,
  /*318*/ PHRASE_TYPE      | G_enum_specifier,
  /*319*/ COUNT_OF_PHRASES | 0x000001,
  /*320*/ PHRASE_TYPE      | G_struct_or_union_specifier,
  /*321*/ COUNT_OF_PHRASES | 0x000001,
  /*322*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */

// P<struct-or-union-specifier> = ...;
  /*323*/ COUNT_OF_ALTS    | 0x000003,
  /*324*/ COUNT_OF_PHRASES | 0x000005,
  /*325*/ PHRASE_TYPE      | G_struct_or_union,
  /*326*/ PHRASE_TYPE      | G_identifier,
  /*327*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*328*/ PHRASE_TYPE      | G_struct_field_declarations,
  /*329*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*330*/ COUNT_OF_PHRASES | 0x000004,
  /*331*/ PHRASE_TYPE      | G_struct_or_union,
  /*332*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*333*/ PHRASE_TYPE      | G_struct_field_declarations,
  /*334*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*335*/ COUNT_OF_PHRASES | 0x000002,
  /*336*/ PHRASE_TYPE      | G_struct_or_union,
  /*337*/ PHRASE_TYPE      | G_identifier,

// P<struct-or-union> = ...;
  /*338*/ COUNT_OF_ALTS    | 0x000002,
  /*339*/ COUNT_OF_PHRASES | 0x000001,
  /*340*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000002,  /* struct */
  /*341*/ COUNT_OF_PHRASES | 0x000001,
  /*342*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000003,  /* union */

// P<struct-field-declarations> = ...;
  /*343*/ COUNT_OF_ALTS    | 0x000001,
  /*344*/ COUNT_OF_PHRASES | 0x000002,
  /*345*/ PHRASE_TYPE      | G_struct_field_declaration,
  /*346*/ PHRASE_TYPE      | G_rest_of_struct_field_declarations,

// P<rest-of-struct-field-declarations> = ...;
  /*347*/ COUNT_OF_ALTS    | 0x000002,
  /*348*/ COUNT_OF_PHRASES | 0x000002,
  /*349*/ PHRASE_TYPE      | G_struct_field_declaration,
  /*350*/ PHRASE_TYPE      | G_rest_of_struct_field_declarations,
  /*351*/ COUNT_OF_PHRASES | 0x000000,

// P<struct-field-declaration> = ...;
  /*352*/ COUNT_OF_ALTS    | 0x000002,
  /*353*/ COUNT_OF_PHRASES | 0x000002,
  /*354*/ PHRASE_TYPE      | G_possibly_initialised_scalar_or_array_decl,
  /*355*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*356*/ COUNT_OF_PHRASES | 0x000002,
  /*357*/ PHRASE_TYPE      | G_struct_or_union_specifier,
  /*358*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */

// P<possibly-initialised-scalar-or-array-decl> = ...;
  /*359*/ COUNT_OF_ALTS    | 0x000001,
  /*360*/ COUNT_OF_PHRASES | 0x000004,
  /*361*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*362*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*363*/ PHRASE_TYPE      | G_type,
  /*364*/ PHRASE_TYPE      | G_rest_of_scalar_or_array_decl,

// P<rest-of-scalar-or-array-decl> = ...;
  /*365*/ COUNT_OF_ALTS    | 0x000003,
  /*366*/ COUNT_OF_PHRASES | 0x000005,
  /*367*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*368*/ PHRASE_TYPE      | G_new_identifier,
  /*369*/ PHRASE_TYPE      | G_array_bounds,
  /*370*/ PHRASE_TYPE      | G_array_init_opt,
  /*371*/ PHRASE_TYPE      | G_rest_of_scalar_or_array_decl_opt,
  /*372*/ COUNT_OF_PHRASES | 0x00000a,
  /*373*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*374*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*375*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*376*/ PHRASE_TYPE      | G_new_identifier,
  /*377*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*378*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*379*/ PHRASE_TYPE      | G_param_list_opt,
  /*380*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*381*/ PHRASE_TYPE      | G_scalar_init_opt,
  /*382*/ PHRASE_TYPE      | G_rest_of_scalar_or_array_decl_opt,
  /*383*/ COUNT_OF_PHRASES | 0x000004,
  /*384*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*385*/ PHRASE_TYPE      | G_new_identifier,
  /*386*/ PHRASE_TYPE      | G_scalar_init_opt,
  /*387*/ PHRASE_TYPE      | G_rest_of_scalar_or_array_decl_opt,

// P<rest-of-scalar-or-array-decl_opt> = ...;
  /*388*/ COUNT_OF_ALTS    | 0x000002,
  /*389*/ COUNT_OF_PHRASES | 0x000002,
  /*390*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*391*/ PHRASE_TYPE      | G_rest_of_scalar_or_array_decl,
  /*392*/ COUNT_OF_PHRASES | 0x000000,

// P<scalar-init_opt> = ...;
  /*393*/ COUNT_OF_ALTS    | 0x000002,
  /*394*/ COUNT_OF_PHRASES | 0x000002,
  /*395*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */
  /*396*/ PHRASE_TYPE      | G_assignment_expression,
  /*397*/ COUNT_OF_PHRASES | 0x000000,

// P<assignment-expression> = ...;
  /*398*/ COUNT_OF_ALTS    | 0x000001,
  /*399*/ COUNT_OF_PHRASES | 0x000003,
  /*400*/ PHRASE_TYPE      | G_lvalue_assign_opt,
  /*401*/ PHRASE_TYPE      | G_conditional_expression,
  /*402*/ PHRASE_TYPE      | G_rest_of_assignment_expression_opt,

// P<rest-of-assignment-expression_opt> = ...;
  /*403*/ COUNT_OF_ALTS    | 0x000002,
  /*404*/ COUNT_OF_PHRASES | 0x000003,
  /*405*/ PHRASE_TYPE      | G_assignment_operator,
  /*406*/ PHRASE_TYPE      | G_conditional_expression,
  /*407*/ PHRASE_TYPE      | G_rest_of_assignment_expression_opt,
  /*408*/ COUNT_OF_PHRASES | 0x000000,

// P<conditional-expression> = ...;
  /*409*/ COUNT_OF_ALTS    | 0x000001,
  /*410*/ COUNT_OF_PHRASES | 0x000002,
  /*411*/ PHRASE_TYPE      | G_logical_or_expression,
  /*412*/ PHRASE_TYPE      | G_rest_of_conditional_expression,

// P<rest-of-conditional-expression> = ...;
  /*413*/ COUNT_OF_ALTS    | 0x000002,
  /*414*/ COUNT_OF_PHRASES | 0x000004,
  /*415*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003f,  /* '?' */
  /*416*/ PHRASE_TYPE      | G_expression,
  /*417*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003a,  /* ':' */
  /*418*/ PHRASE_TYPE      | G_conditional_expression,
  /*419*/ COUNT_OF_PHRASES | 0x000000,

// P<expression> = ...;
  /*420*/ COUNT_OF_ALTS    | 0x000001,
  /*421*/ COUNT_OF_PHRASES | 0x000001,
  /*422*/ PHRASE_TYPE      | G_comma_statement,

// P<comma-statement> = ...;
  /*423*/ COUNT_OF_ALTS    | 0x000001,
  /*424*/ COUNT_OF_PHRASES | 0x000002,
  /*425*/ PHRASE_TYPE      | G_assignment_expression,
  /*426*/ PHRASE_TYPE      | G_rest_of_comma_statement,

// P<rest-of-comma-statement> = ...;
  /*427*/ COUNT_OF_ALTS    | 0x000002,
  /*428*/ COUNT_OF_PHRASES | 0x000003,
  /*429*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*430*/ PHRASE_TYPE      | G_assignment_expression,
  /*431*/ PHRASE_TYPE      | G_rest_of_comma_statement,
  /*432*/ COUNT_OF_PHRASES | 0x000000,

// P<logical-or-expression> = ...;
  /*433*/ COUNT_OF_ALTS    | 0x000001,
  /*434*/ COUNT_OF_PHRASES | 0x000002,
  /*435*/ PHRASE_TYPE      | G_logical_and_expression,
  /*436*/ PHRASE_TYPE      | G_rest_of_logical_or_expression,

// P<rest-of-logical-or-expression> = ...;
  /*437*/ COUNT_OF_ALTS    | 0x000002,
  /*438*/ COUNT_OF_PHRASES | 0x000003,
  /*439*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000021,  /* || */
  /*440*/ PHRASE_TYPE      | G_logical_and_expression,
  /*441*/ PHRASE_TYPE      | G_rest_of_logical_or_expression,
  /*442*/ COUNT_OF_PHRASES | 0x000000,

// P<logical-and-expression> = ...;
  /*443*/ COUNT_OF_ALTS    | 0x000001,
  /*444*/ COUNT_OF_PHRASES | 0x000002,
  /*445*/ PHRASE_TYPE      | G_inclusive_or_expression,
  /*446*/ PHRASE_TYPE      | G_rest_of_logical_and_expression,

// P<rest-of-logical-and-expression> = ...;
  /*447*/ COUNT_OF_ALTS    | 0x000002,
  /*448*/ COUNT_OF_PHRASES | 0x000003,
  /*449*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000022,  /* && */
  /*450*/ PHRASE_TYPE      | G_inclusive_or_expression,
  /*451*/ PHRASE_TYPE      | G_rest_of_logical_and_expression,
  /*452*/ COUNT_OF_PHRASES | 0x000000,

// P<inclusive-or-expression> = ...;
  /*453*/ COUNT_OF_ALTS    | 0x000001,
  /*454*/ COUNT_OF_PHRASES | 0x000002,
  /*455*/ PHRASE_TYPE      | G_exclusive_or_expression,
  /*456*/ PHRASE_TYPE      | G_rest_of_inclusive_or_expression,

// P<rest-of-inclusive-or-expression> = ...;
  /*457*/ COUNT_OF_ALTS    | 0x000002,
  /*458*/ COUNT_OF_PHRASES | 0x000003,
  /*459*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007c,  /* '|' */
  /*460*/ PHRASE_TYPE      | G_exclusive_or_expression,
  /*461*/ PHRASE_TYPE      | G_rest_of_inclusive_or_expression,
  /*462*/ COUNT_OF_PHRASES | 0x000000,

// P<exclusive-or-expression> = ...;
  /*463*/ COUNT_OF_ALTS    | 0x000001,
  /*464*/ COUNT_OF_PHRASES | 0x000002,
  /*465*/ PHRASE_TYPE      | G_bitwise_and_expression,
  /*466*/ PHRASE_TYPE      | G_rest_of_exclusive_or_expression,

// P<rest-of-exclusive-or-expression> = ...;
  /*467*/ COUNT_OF_ALTS    | 0x000002,
  /*468*/ COUNT_OF_PHRASES | 0x000003,
  /*469*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005e,  /* '^' */
  /*470*/ PHRASE_TYPE      | G_bitwise_and_expression,
  /*471*/ PHRASE_TYPE      | G_rest_of_exclusive_or_expression,
  /*472*/ COUNT_OF_PHRASES | 0x000000,

// P<bitwise-and-expression> = ...;
  /*473*/ COUNT_OF_ALTS    | 0x000001,
  /*474*/ COUNT_OF_PHRASES | 0x000002,
  /*475*/ PHRASE_TYPE      | G_equality_expression,
  /*476*/ PHRASE_TYPE      | G_rest_of_bitwise_and_expression,

// P<rest-of-bitwise-and-expression> = ...;
  /*477*/ COUNT_OF_ALTS    | 0x000002,
  /*478*/ COUNT_OF_PHRASES | 0x000003,
  /*479*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000026,  /* '&' */
  /*480*/ PHRASE_TYPE      | G_equality_expression,
  /*481*/ PHRASE_TYPE      | G_rest_of_bitwise_and_expression,
  /*482*/ COUNT_OF_PHRASES | 0x000000,

// P<equality-expression> = ...;
  /*483*/ COUNT_OF_ALTS    | 0x000001,
  /*484*/ COUNT_OF_PHRASES | 0x000002,
  /*485*/ PHRASE_TYPE      | G_relational_expression,
  /*486*/ PHRASE_TYPE      | G_rest_of_equality_expression,

// P<rest-of-equality-expression> = ...;
  /*487*/ COUNT_OF_ALTS    | 0x000002,
  /*488*/ COUNT_OF_PHRASES | 0x000003,
  /*489*/ PHRASE_TYPE      | G_eqop,
  /*490*/ PHRASE_TYPE      | G_relational_expression,
  /*491*/ PHRASE_TYPE      | G_rest_of_equality_expression,
  /*492*/ COUNT_OF_PHRASES | 0x000000,

// P<relational-expression> = ...;
  /*493*/ COUNT_OF_ALTS    | 0x000001,
  /*494*/ COUNT_OF_PHRASES | 0x000002,
  /*495*/ PHRASE_TYPE      | G_shift_expression,
  /*496*/ PHRASE_TYPE      | G_rest_of_relational_expression,

// P<rest-of-relational-expression> = ...;
  /*497*/ COUNT_OF_ALTS    | 0x000002,
  /*498*/ COUNT_OF_PHRASES | 0x000003,
  /*499*/ PHRASE_TYPE      | G_relop,
  /*500*/ PHRASE_TYPE      | G_shift_expression,
  /*501*/ PHRASE_TYPE      | G_rest_of_relational_expression,
  /*502*/ COUNT_OF_PHRASES | 0x000000,

// P<shift-expression> = ...;
  /*503*/ COUNT_OF_ALTS    | 0x000001,
  /*504*/ COUNT_OF_PHRASES | 0x000002,
  /*505*/ PHRASE_TYPE      | G_additive_expression,
  /*506*/ PHRASE_TYPE      | G_rest_of_shift_expression,

// P<rest-of-shift-expression> = ...;
  /*507*/ COUNT_OF_ALTS    | 0x000002,
  /*508*/ COUNT_OF_PHRASES | 0x000003,
  /*509*/ PHRASE_TYPE      | G_shiftop,
  /*510*/ PHRASE_TYPE      | G_additive_expression,
  /*511*/ PHRASE_TYPE      | G_rest_of_shift_expression,
  /*512*/ COUNT_OF_PHRASES | 0x000000,

// P<additive-expression> = ...;
  /*513*/ COUNT_OF_ALTS    | 0x000001,
  /*514*/ COUNT_OF_PHRASES | 0x000002,
  /*515*/ PHRASE_TYPE      | G_multiplicative_expression,
  /*516*/ PHRASE_TYPE      | G_rest_of_additive_expression,

// P<rest-of-additive-expression> = ...;
  /*517*/ COUNT_OF_ALTS    | 0x000002,
  /*518*/ COUNT_OF_PHRASES | 0x000003,
  /*519*/ PHRASE_TYPE      | G_plusminus,
  /*520*/ PHRASE_TYPE      | G_multiplicative_expression,
  /*521*/ PHRASE_TYPE      | G_rest_of_additive_expression,
  /*522*/ COUNT_OF_PHRASES | 0x000000,

// P<multiplicative-expression> = ...;
  /*523*/ COUNT_OF_ALTS    | 0x000001,
  /*524*/ COUNT_OF_PHRASES | 0x000002,
  /*525*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*526*/ PHRASE_TYPE      | G_rest_of_multiplicative_expression,

// P<rest-of-multiplicative-expression> = ...;
  /*527*/ COUNT_OF_ALTS    | 0x000002,
  /*528*/ COUNT_OF_PHRASES | 0x000003,
  /*529*/ PHRASE_TYPE      | G_mulop,
  /*530*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*531*/ PHRASE_TYPE      | G_rest_of_multiplicative_expression,
  /*532*/ COUNT_OF_PHRASES | 0x000000,

// P<unary-rvalue-expression> = ...;
  /*533*/ COUNT_OF_ALTS    | 0x000009,
  /*534*/ COUNT_OF_PHRASES | 0x000003,
  /*535*/ PHRASE_TYPE      | G_cast_opt,
  /*536*/ PHRASE_TYPE      | G_arithmetic_unary_op,
  /*537*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*538*/ COUNT_OF_PHRASES | 0x000003,
  /*539*/ PHRASE_TYPE      | G_cast_opt,
  /*540*/ PHRASE_TYPE      | G_boolean_unary_ops,
  /*541*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*542*/ COUNT_OF_PHRASES | 0x000003,
  /*543*/ PHRASE_TYPE      | G_cast_opt,
  /*544*/ PHRASE_TYPE      | G_bitwise_unary_ops,
  /*545*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*546*/ COUNT_OF_PHRASES | 0x000002,
  /*547*/ PHRASE_TYPE      | G_indirection_unary_ops,
  /*548*/ PHRASE_TYPE      | G_unary_address_expression,
  /*549*/ COUNT_OF_PHRASES | 0x000003,
  /*550*/ PHRASE_TYPE      | G_cast_opt,
  /*551*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000004,  /* sizeof */
  /*552*/ PHRASE_TYPE      | G_unary_rvalue_expression,
  /*553*/ COUNT_OF_PHRASES | 0x000003,
  /*554*/ PHRASE_TYPE      | G_cast_opt,
  /*555*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000004,  /* sizeof */
  /*556*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*557*/ COUNT_OF_PHRASES | 0x000004,
  /*558*/ PHRASE_TYPE      | G_cast_opt,
  /*559*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000004,  /* sizeof */
  /*560*/ PHRASE_TYPE      | G_type_specifier,
  /*561*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*562*/ COUNT_OF_PHRASES | 0x000006,
  /*563*/ PHRASE_TYPE      | G_cast_opt,
  /*564*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000004,  /* sizeof */
  /*565*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*566*/ PHRASE_TYPE      | G_type_specifier,
  /*567*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*568*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*569*/ COUNT_OF_PHRASES | 0x000001,
  /*570*/ PHRASE_TYPE      | G_postfix_rvalue_expression,

// P<postfix-rvalue-expression> = ...;
  /*571*/ COUNT_OF_ALTS    | 0x000002,
  /*572*/ COUNT_OF_PHRASES | 0x000002,
  /*573*/ PHRASE_TYPE      | G_primary_expression,
  /*574*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*575*/ COUNT_OF_PHRASES | 0x000002,
  /*576*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*577*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,

// P<rest-of-postfix-rvalue-expression> = ...;
  /*578*/ COUNT_OF_ALTS    | 0x000006,
  /*579*/ COUNT_OF_PHRASES | 0x000006,
  /*580*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*581*/ PHRASE_TYPE      | G_HACK1,
  /*582*/ PHRASE_TYPE      | G_expression,
  /*583*/ PHRASE_TYPE      | G_HACK2,
  /*584*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*585*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*586*/ COUNT_OF_PHRASES | 0x000004,
  /*587*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*588*/ PHRASE_TYPE      | G_actual_param_list,
  /*589*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*590*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*591*/ COUNT_OF_PHRASES | 0x000003,
  /*592*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /*593*/ PHRASE_TYPE      | G_tag,
  /*594*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*595*/ COUNT_OF_PHRASES | 0x000003,
  /*596*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000023,  /* -> */
  /*597*/ PHRASE_TYPE      | G_tag,
  /*598*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*599*/ COUNT_OF_PHRASES | 0x000002,
  /*600*/ PHRASE_TYPE      | G_post_increment_op,
  /*601*/ PHRASE_TYPE      | G_rest_of_postfix_rvalue_expression,
  /*602*/ COUNT_OF_PHRASES | 0x000000,

// P<post-increment-op> = ...;
  /*603*/ COUNT_OF_ALTS    | 0x000002,
  /*604*/ COUNT_OF_PHRASES | 0x000001,
  /*605*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000024,  /* ++ */
  /*606*/ COUNT_OF_PHRASES | 0x000001,
  /*607*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000025,  /* -- */

// P<actual-param-list> = ...;
  /*608*/ COUNT_OF_ALTS    | 0x000002,
  /*609*/ COUNT_OF_PHRASES | 0x000002,
  /*610*/ PHRASE_TYPE      | G_assignment_expression,
  /*611*/ PHRASE_TYPE      | G_rest_of_param_list,
  /*612*/ COUNT_OF_PHRASES | 0x000000,

// P<rest-of-param-list> = ...;
  /*613*/ COUNT_OF_ALTS    | 0x000002,
  /*614*/ COUNT_OF_PHRASES | 0x000003,
  /*615*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*616*/ PHRASE_TYPE      | G_assignment_expression,
  /*617*/ PHRASE_TYPE      | G_rest_of_param_list,
  /*618*/ COUNT_OF_PHRASES | 0x000000,

// P<unary-lvalue-expression> = ...;
  /*619*/ COUNT_OF_ALTS    | 0x000004,
  /*620*/ COUNT_OF_PHRASES | 0x000003,
  /*621*/ PHRASE_TYPE      | G_cast_opt,
  /*622*/ PHRASE_TYPE      | G_pre_increment_op,
  /*623*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*624*/ COUNT_OF_PHRASES | 0x000002,
  /*625*/ PHRASE_TYPE      | G_indirection_unary_ops,
  /*626*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*627*/ COUNT_OF_PHRASES | 0x000001,
  /*628*/ PHRASE_TYPE      | G_unary_address_expression,
  /*629*/ COUNT_OF_PHRASES | 0x000001,
  /*630*/ PHRASE_TYPE      | G_postfix_lvalue_expression,

// P<postfix-lvalue-expression> = ...;
  /*631*/ COUNT_OF_ALTS    | 0x000001,
  /*632*/ COUNT_OF_PHRASES | 0x000002,
  /*633*/ PHRASE_TYPE      | G_primary_expression,
  /*634*/ PHRASE_TYPE      | G_rest_of_postfix_expression,

// P<rest-of-postfix-expression> = ...;
  /*635*/ COUNT_OF_ALTS    | 0x000006,
  /*636*/ COUNT_OF_PHRASES | 0x000006,
  /*637*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*638*/ PHRASE_TYPE      | G_HACK1,
  /*639*/ PHRASE_TYPE      | G_expression,
  /*640*/ PHRASE_TYPE      | G_HACK2,
  /*641*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*642*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*643*/ COUNT_OF_PHRASES | 0x000004,
  /*644*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*645*/ PHRASE_TYPE      | G_actual_param_list,
  /*646*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*647*/ PHRASE_TYPE      | G_non_empty_rest_of_postfix_expression,
  /*648*/ COUNT_OF_PHRASES | 0x000003,
  /*649*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /*650*/ PHRASE_TYPE      | G_tag,
  /*651*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*652*/ COUNT_OF_PHRASES | 0x000003,
  /*653*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000023,  /* -> */
  /*654*/ PHRASE_TYPE      | G_tag,
  /*655*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*656*/ COUNT_OF_PHRASES | 0x000002,
  /*657*/ PHRASE_TYPE      | G_post_increment_op,
  /*658*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*659*/ COUNT_OF_PHRASES | 0x000000,

// P<non-empty-rest-of-postfix-expression> = ...;
  /*660*/ COUNT_OF_ALTS    | 0x000005,
  /*661*/ COUNT_OF_PHRASES | 0x000006,
  /*662*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*663*/ PHRASE_TYPE      | G_HACK1,
  /*664*/ PHRASE_TYPE      | G_expression,
  /*665*/ PHRASE_TYPE      | G_HACK2,
  /*666*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*667*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*668*/ COUNT_OF_PHRASES | 0x000004,
  /*669*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*670*/ PHRASE_TYPE      | G_actual_param_list,
  /*671*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*672*/ PHRASE_TYPE      | G_non_empty_rest_of_postfix_expression,
  /*673*/ COUNT_OF_PHRASES | 0x000003,
  /*674*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002e,  /* '.' */
  /*675*/ PHRASE_TYPE      | G_tag,
  /*676*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*677*/ COUNT_OF_PHRASES | 0x000003,
  /*678*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000023,  /* -> */
  /*679*/ PHRASE_TYPE      | G_tag,
  /*680*/ PHRASE_TYPE      | G_rest_of_postfix_expression,
  /*681*/ COUNT_OF_PHRASES | 0x000002,
  /*682*/ PHRASE_TYPE      | G_post_increment_op,
  /*683*/ PHRASE_TYPE      | G_rest_of_postfix_expression,

// P<unary-address-expression> = ...;
  /*684*/ COUNT_OF_ALTS    | 0x000001,
  /*685*/ COUNT_OF_PHRASES | 0x000003,
  /*686*/ PHRASE_TYPE      | G_cast_opt,
  /*687*/ PHRASE_TYPE      | G_address_operator,
  /*688*/ PHRASE_TYPE      | G_unary_lvalue_expression,

// P<primary-expression> = ...;
  /*689*/ COUNT_OF_ALTS    | 0x000008,
  /*690*/ COUNT_OF_PHRASES | 0x000002,
  /*691*/ PHRASE_TYPE      | G_cast_opt,
  /*692*/ PHRASE_TYPE      | G_identifier,
  /*693*/ COUNT_OF_PHRASES | 0x000002,
  /*694*/ PHRASE_TYPE      | G_cast_opt,
  /*695*/ PHRASE_TYPE      | G_constant,
  /*696*/ COUNT_OF_PHRASES | 0x000002,
  /*697*/ PHRASE_TYPE      | G_cast_opt,
  /*698*/ PHRASE_TYPE      | G_dqstring,
  /*699*/ COUNT_OF_PHRASES | 0x000003,
  /*700*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*701*/ PHRASE_TYPE      | G_expression,
  /*702*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*703*/ COUNT_OF_PHRASES | 0x000004,
  /*704*/ PHRASE_TYPE      | G_cast,
  /*705*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*706*/ PHRASE_TYPE      | G_expression,
  /*707*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*708*/ COUNT_OF_PHRASES | 0x000005,
  /*709*/ PHRASE_TYPE      | G_cast,
  /*710*/ PHRASE_TYPE      | G_cast,
  /*711*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*712*/ PHRASE_TYPE      | G_expression,
  /*713*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*714*/ COUNT_OF_PHRASES | 0x000006,
  /*715*/ PHRASE_TYPE      | G_cast,
  /*716*/ PHRASE_TYPE      | G_cast,
  /*717*/ PHRASE_TYPE      | G_cast,
  /*718*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*719*/ PHRASE_TYPE      | G_expression,
  /*720*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*721*/ COUNT_OF_PHRASES | 0x000007,
  /*722*/ PHRASE_TYPE      | G_cast,
  /*723*/ PHRASE_TYPE      | G_cast,
  /*724*/ PHRASE_TYPE      | G_cast,
  /*725*/ PHRASE_TYPE      | G_cast,
  /*726*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*727*/ PHRASE_TYPE      | G_expression,
  /*728*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */

// P<cast_opt> = ...;
  /*729*/ COUNT_OF_ALTS    | 0x000002,
  /*730*/ COUNT_OF_PHRASES | 0x000002,
  /*731*/ PHRASE_TYPE      | G_cast,
  /*732*/ PHRASE_TYPE      | G_cast_opt,
  /*733*/ COUNT_OF_PHRASES | 0x000000,

// P<cast> = ...;
  /*734*/ COUNT_OF_ALTS    | 0x000003,
  /*735*/ COUNT_OF_PHRASES | 0x000004,
  /*736*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*737*/ PHRASE_TYPE      | G_type_specifier,
  /*738*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*739*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*740*/ COUNT_OF_PHRASES | 0x000006,
  /*741*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*742*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000005,  /* typeof */
  /*743*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*744*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*745*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*746*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*747*/ COUNT_OF_PHRASES | 0x000007,
  /*748*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*749*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000005,  /* typeof */
  /*750*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*751*/ PHRASE_TYPE      | G_type_specifier,
  /*752*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*753*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*754*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */

// P<indirection-decl_opt> = ...;
  /*755*/ COUNT_OF_ALTS    | 0x000002,
  /*756*/ COUNT_OF_PHRASES | 0x000003,
  /*757*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*758*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002a,  /* '*' */
  /*759*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*760*/ COUNT_OF_PHRASES | 0x000000,

// P<indirection-unary-ops> = ...;
  /*761*/ COUNT_OF_ALTS    | 0x000001,
  /*762*/ COUNT_OF_PHRASES | 0x000003,
  /*763*/ PHRASE_TYPE      | G_cast_opt,
  /*764*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002a,  /* '*' */
  /*765*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,

// P<indirection-unary-ops_opt> = ...;
  /*766*/ COUNT_OF_ALTS    | 0x000002,
  /*767*/ COUNT_OF_PHRASES | 0x000002,
  /*768*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002a,  /* '*' */
  /*769*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*770*/ COUNT_OF_PHRASES | 0x000000,

// P<type-specifier> = ...;
  /*771*/ COUNT_OF_ALTS    | 0x000002,
  /*772*/ COUNT_OF_PHRASES | 0x000001,
  /*773*/ PHRASE_TYPE      | G_basic_type_specifier,
  /*774*/ COUNT_OF_PHRASES | 0x000001,
  /*775*/ PHRASE_TYPE      | G_typedef_name,

// P<typedef-name> = ...;
  /*776*/ COUNT_OF_ALTS    | 0x000001,
  /*777*/ COUNT_OF_PHRASES | 0x000001,
  /*778*/ PHRASE_TYPE      | G_identifier,

// P<basic-type-specifier> = ...;
  /*779*/ COUNT_OF_ALTS    | 0x000008,
  /*780*/ COUNT_OF_PHRASES | 0x000001,
  /*781*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000a,  /* void */
  /*782*/ COUNT_OF_PHRASES | 0x000001,
  /*783*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000006,  /* double */
  /*784*/ COUNT_OF_PHRASES | 0x000002,
  /*785*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000007,  /* long */
  /*786*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000006,  /* double */
  /*787*/ COUNT_OF_PHRASES | 0x000001,
  /*788*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000009,  /* float */
  /*789*/ COUNT_OF_PHRASES | 0x000002,
  /*790*/ PHRASE_TYPE      | G_signed_opt,
  /*791*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000008,  /* char */
  /*792*/ COUNT_OF_PHRASES | 0x000001,
  /*793*/ PHRASE_TYPE      | G_signed_inttype,
  /*794*/ COUNT_OF_PHRASES | 0x000001,
  /*795*/ PHRASE_TYPE      | G_struct_or_union_specifier,
  /*796*/ COUNT_OF_PHRASES | 0x000001,
  /*797*/ PHRASE_TYPE      | G_enum_specifier,

// P<enum-specifier> = ...;
  /*798*/ COUNT_OF_ALTS    | 0x000003,
  /*799*/ COUNT_OF_PHRASES | 0x000004,
  /*800*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000b,  /* enum */
  /*801*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*802*/ PHRASE_TYPE      | G_enumerator_list,
  /*803*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*804*/ COUNT_OF_PHRASES | 0x000005,
  /*805*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000b,  /* enum */
  /*806*/ PHRASE_TYPE      | G_identifier,
  /*807*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*808*/ PHRASE_TYPE      | G_enumerator_list,
  /*809*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*810*/ COUNT_OF_PHRASES | 0x000002,
  /*811*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000b,  /* enum */
  /*812*/ PHRASE_TYPE      | G_identifier,

// P<enumerator-list> = ...;
  /*813*/ COUNT_OF_ALTS    | 0x000001,
  /*814*/ COUNT_OF_PHRASES | 0x000002,
  /*815*/ PHRASE_TYPE      | G_enumerator,
  /*816*/ PHRASE_TYPE      | G_rest_of_enumerator_list,

// P<rest-of-enumerator-list> = ...;
  /*817*/ COUNT_OF_ALTS    | 0x000003,
  /*818*/ COUNT_OF_PHRASES | 0x000003,
  /*819*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*820*/ PHRASE_TYPE      | G_enumerator,
  /*821*/ PHRASE_TYPE      | G_rest_of_enumerator_list,
  /*822*/ COUNT_OF_PHRASES | 0x000001,
  /*823*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*824*/ COUNT_OF_PHRASES | 0x000000,

// P<enumerator> = ...;
  /*825*/ COUNT_OF_ALTS    | 0x000002,
  /*826*/ COUNT_OF_PHRASES | 0x000003,
  /*827*/ PHRASE_TYPE      | G_identifier,
  /*828*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */
  /*829*/ PHRASE_TYPE      | G_constant_expression,
  /*830*/ COUNT_OF_PHRASES | 0x000001,
  /*831*/ PHRASE_TYPE      | G_identifier,

// P<constant-expression> = ...;
  /*832*/ COUNT_OF_ALTS    | 0x000001,
  /*833*/ COUNT_OF_PHRASES | 0x000001,
  /*834*/ PHRASE_TYPE      | G_conditional_expression,

// P<signed-inttype> = ...;
  /*835*/ COUNT_OF_ALTS    | 0x000006,
  /*836*/ COUNT_OF_PHRASES | 0x000003,
  /*837*/ PHRASE_TYPE      | G_signed_opt,
  /*838*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000c,  /* short */
  /*839*/ PHRASE_TYPE      | G_int_opt,
  /*840*/ COUNT_OF_PHRASES | 0x000004,
  /*841*/ PHRASE_TYPE      | G_signed_opt,
  /*842*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000007,  /* long */
  /*843*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000007,  /* long */
  /*844*/ PHRASE_TYPE      | G_int_opt,
  /*845*/ COUNT_OF_PHRASES | 0x000003,
  /*846*/ PHRASE_TYPE      | G_signed_opt,
  /*847*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000007,  /* long */
  /*848*/ PHRASE_TYPE      | G_int_opt,
  /*849*/ COUNT_OF_PHRASES | 0x000002,
  /*850*/ PHRASE_TYPE      | G_signed_opt,
  /*851*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000d,  /* int */
  /*852*/ COUNT_OF_PHRASES | 0x000001,
  /*853*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000e,  /* signed */
  /*854*/ COUNT_OF_PHRASES | 0x000001,
  /*855*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000f,  /* unsigned */

// P<int_opt> = ...;
  /*856*/ COUNT_OF_ALTS    | 0x000002,
  /*857*/ COUNT_OF_PHRASES | 0x000001,
  /*858*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000d,  /* int */
  /*859*/ COUNT_OF_PHRASES | 0x000000,

// P<signed_opt> = ...;
  /*860*/ COUNT_OF_ALTS    | 0x000003,
  /*861*/ COUNT_OF_PHRASES | 0x000001,
  /*862*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000e,  /* signed */
  /*863*/ COUNT_OF_PHRASES | 0x000001,
  /*864*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000f,  /* unsigned */
  /*865*/ COUNT_OF_PHRASES | 0x000000,

// P<address-operator> = ...;
  /*866*/ COUNT_OF_ALTS    | 0x000002,
  /*867*/ COUNT_OF_PHRASES | 0x000001,
  /*868*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000022,  /* && */
  /*869*/ COUNT_OF_PHRASES | 0x000001,
  /*870*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000026,  /* '&' */

// P<pre-increment-op> = ...;
  /*871*/ COUNT_OF_ALTS    | 0x000002,
  /*872*/ COUNT_OF_PHRASES | 0x000001,
  /*873*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000024,  /* ++ */
  /*874*/ COUNT_OF_PHRASES | 0x000001,
  /*875*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000025,  /* -- */

// P<bitwise-unary-ops> = ...;
  /*876*/ COUNT_OF_ALTS    | 0x000001,
  /*877*/ COUNT_OF_PHRASES | 0x000002,
  /*878*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007e,  /* '~' */
  /*879*/ PHRASE_TYPE      | G_rest_of_bitwise_unary_ops,

// P<rest-of-bitwise-unary-ops> = ...;
  /*880*/ COUNT_OF_ALTS    | 0x000002,
  /*881*/ COUNT_OF_PHRASES | 0x000002,
  /*882*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007e,  /* '~' */
  /*883*/ PHRASE_TYPE      | G_rest_of_bitwise_unary_ops,
  /*884*/ COUNT_OF_PHRASES | 0x000000,

// P<boolean-unary-ops> = ...;
  /*885*/ COUNT_OF_ALTS    | 0x000001,
  /*886*/ COUNT_OF_PHRASES | 0x000002,
  /*887*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000021,  /* '!' */
  /*888*/ PHRASE_TYPE      | G_rest_of_boolean_unary_ops,

// P<rest-of-boolean-unary-ops> = ...;
  /*889*/ COUNT_OF_ALTS    | 0x000002,
  /*890*/ COUNT_OF_PHRASES | 0x000002,
  /*891*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000021,  /* '!' */
  /*892*/ PHRASE_TYPE      | G_rest_of_boolean_unary_ops,
  /*893*/ COUNT_OF_PHRASES | 0x000000,

// P<arithmetic-unary-op> = ...;
  /*894*/ COUNT_OF_ALTS    | 0x000002,
  /*895*/ COUNT_OF_PHRASES | 0x000001,
  /*896*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002b,  /* '+' */
  /*897*/ COUNT_OF_PHRASES | 0x000001,
  /*898*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002d,  /* '-' */

// P<mulop> = ...;
  /*899*/ COUNT_OF_ALTS    | 0x000003,
  /*900*/ COUNT_OF_PHRASES | 0x000001,
  /*901*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002a,  /* '*' */
  /*902*/ COUNT_OF_PHRASES | 0x000001,
  /*903*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002f,  /* '/' */
  /*904*/ COUNT_OF_PHRASES | 0x000001,
  /*905*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000025,  /* '%' */

// P<plusminus> = ...;
  /*906*/ COUNT_OF_ALTS    | 0x000002,
  /*907*/ COUNT_OF_PHRASES | 0x000001,
  /*908*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002b,  /* '+' */
  /*909*/ COUNT_OF_PHRASES | 0x000001,
  /*910*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002d,  /* '-' */

// P<shiftop> = ...;
  /*911*/ COUNT_OF_ALTS    | 0x000002,
  /*912*/ COUNT_OF_PHRASES | 0x000001,
  /*913*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000026,  /* << */
  /*914*/ COUNT_OF_PHRASES | 0x000001,
  /*915*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000027,  /* >> */

// P<relop> = ...;
  /*916*/ COUNT_OF_ALTS    | 0x000004,
  /*917*/ COUNT_OF_PHRASES | 0x000001,
  /*918*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000028,  /* <= */
  /*919*/ COUNT_OF_PHRASES | 0x000001,
  /*920*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003c,  /* '<' */
  /*921*/ COUNT_OF_PHRASES | 0x000001,
  /*922*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000029,  /* >= */
  /*923*/ COUNT_OF_PHRASES | 0x000001,
  /*924*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003e,  /* '>' */

// P<eqop> = ...;
  /*925*/ COUNT_OF_ALTS    | 0x000002,
  /*926*/ COUNT_OF_PHRASES | 0x000001,
  /*927*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002a,  /* == */
  /*928*/ COUNT_OF_PHRASES | 0x000001,
  /*929*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002b,  /* != */

// P<eq> = ...;
  /*930*/ COUNT_OF_ALTS    | 0x000001,
  /*931*/ COUNT_OF_PHRASES | 0x000001,
  /*932*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */

// P<assignment-operator> = ...;
  /*933*/ COUNT_OF_ALTS    | 0x00000b,
  /*934*/ COUNT_OF_PHRASES | 0x000002,
  /*935*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */
  /*936*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_eq,
  /*937*/ COUNT_OF_PHRASES | 0x000001,
  /*938*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002c,  /* *= */
  /*939*/ COUNT_OF_PHRASES | 0x000001,
  /*940*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002d,  /* /= */
  /*941*/ COUNT_OF_PHRASES | 0x000001,
  /*942*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002e,  /* %= */
  /*943*/ COUNT_OF_PHRASES | 0x000001,
  /*944*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00002f,  /* += */
  /*945*/ COUNT_OF_PHRASES | 0x000001,
  /*946*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000030,  /* -= */
  /*947*/ COUNT_OF_PHRASES | 0x000001,
  /*948*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000031,  /* <<= */
  /*949*/ COUNT_OF_PHRASES | 0x000001,
  /*950*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000032,  /* >>= */
  /*951*/ COUNT_OF_PHRASES | 0x000001,
  /*952*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000033,  /* &= */
  /*953*/ COUNT_OF_PHRASES | 0x000001,
  /*954*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000034,  /* ^= */
  /*955*/ COUNT_OF_PHRASES | 0x000001,
  /*956*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000035,  /* |= */

// P<lvalue-assign_opt> = ...;
  /*957*/ COUNT_OF_ALTS    | 0x000002,
  /*958*/ COUNT_OF_PHRASES | 0x000002,
  /*959*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*960*/ PHRASE_TYPE      | G_assignment_operator,
  /*961*/ COUNT_OF_PHRASES | 0x000000,

// P<array-init_opt> = ...;
  /*962*/ COUNT_OF_ALTS    | 0x000003,
  /*963*/ COUNT_OF_PHRASES | 0x000004,
  /*964*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */
  /*965*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*966*/ PHRASE_TYPE      | G_constant_initializer_list,
  /*967*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*968*/ COUNT_OF_PHRASES | 0x000002,
  /*969*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003d,  /* '=' */
  /*970*/ PHRASE_TYPE      | G_dqstring,
  /*971*/ COUNT_OF_PHRASES | 0x000000,

// P<constant-initializer-list> = ...;
  /*972*/ COUNT_OF_ALTS    | 0x000001,
  /*973*/ COUNT_OF_PHRASES | 0x000002,
  /*974*/ PHRASE_TYPE      | G_constant_initializer,
  /*975*/ PHRASE_TYPE      | G_rest_of_constant_initializer_list,

// P<rest-of-constant-initializer-list> = ...;
  /*976*/ COUNT_OF_ALTS    | 0x000003,
  /*977*/ COUNT_OF_PHRASES | 0x000003,
  /*978*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*979*/ PHRASE_TYPE      | G_constant_initializer,
  /*980*/ PHRASE_TYPE      | G_rest_of_constant_initializer_list,
  /*981*/ COUNT_OF_PHRASES | 0x000001,
  /*982*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*983*/ COUNT_OF_PHRASES | 0x000000,

// P<constant-initializer> = ...;
  /*984*/ COUNT_OF_ALTS    | 0x000002,
  /*985*/ COUNT_OF_PHRASES | 0x000001,
  /*986*/ PHRASE_TYPE      | G_constant_expression,
  /*987*/ COUNT_OF_PHRASES | 0x000003,
  /*988*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*989*/ PHRASE_TYPE      | G_constant_initializer_list,
  /*990*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */

// P<HACK1> = ...;
  /*991*/ COUNT_OF_ALTS    | 0x000001,
  /*992*/ COUNT_OF_PHRASES | 0x000000,

// P<HACK2> = ...;
  /*993*/ COUNT_OF_ALTS    | 0x000001,
  /*994*/ COUNT_OF_PHRASES | 0x000000,

// P<array-bounds> = ...;
  /*995*/ COUNT_OF_ALTS    | 0x000001,
  /*996*/ COUNT_OF_PHRASES | 0x000006,
  /*997*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*998*/ PHRASE_TYPE      | G_HACK1,
  /*999*/ PHRASE_TYPE      | G_constant_expression_opt,
  /*1000*/ PHRASE_TYPE      | G_HACK2,
  /*1001*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*1002*/ PHRASE_TYPE      | G_array_bounds_opt,

// P<array-bounds_opt> = ...;
  /*1003*/ COUNT_OF_ALTS    | 0x000002,
  /*1004*/ COUNT_OF_PHRASES | 0x000006,
  /*1005*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*1006*/ PHRASE_TYPE      | G_HACK1,
  /*1007*/ PHRASE_TYPE      | G_constant_expression_opt,
  /*1008*/ PHRASE_TYPE      | G_HACK2,
  /*1009*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*1010*/ PHRASE_TYPE      | G_array_bounds_opt,
  /*1011*/ COUNT_OF_PHRASES | 0x000000,

// P<constant-expression_opt> = ...;
  /*1012*/ COUNT_OF_ALTS    | 0x000002,
  /*1013*/ COUNT_OF_PHRASES | 0x000001,
  /*1014*/ PHRASE_TYPE      | G_constant_expression,
  /*1015*/ COUNT_OF_PHRASES | 0x000000,

// P<type> = ...;
  /*1016*/ COUNT_OF_ALTS    | 0x000006,
  /*1017*/ COUNT_OF_PHRASES | 0x000001,
  /*1018*/ PHRASE_TYPE      | G_type_specifier,
  /*1019*/ COUNT_OF_PHRASES | 0x000001,
  /*1020*/ PHRASE_TYPE      | G_enum_specifier,
  /*1021*/ COUNT_OF_PHRASES | 0x000001,
  /*1022*/ PHRASE_TYPE      | G_struct_or_union_specifier,
  /*1023*/ COUNT_OF_PHRASES | 0x000004,
  /*1024*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000005,  /* typeof */
  /*1025*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1026*/ PHRASE_TYPE      | G_unary_lvalue_expression,
  /*1027*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1028*/ COUNT_OF_PHRASES | 0x000005,
  /*1029*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000005,  /* typeof */
  /*1030*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1031*/ PHRASE_TYPE      | G_type_specifier,
  /*1032*/ PHRASE_TYPE      | G_indirection_unary_ops_opt,
  /*1033*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1034*/ COUNT_OF_PHRASES | 0x000001,
  /*1035*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000a,  /* void */

// P<const-or-volatile-type-qualifier_opt> = ...;
  /*1036*/ COUNT_OF_ALTS    | 0x000002,
  /*1037*/ COUNT_OF_PHRASES | 0x000001,
  /*1038*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier,
  /*1039*/ COUNT_OF_PHRASES | 0x000000,

// P<const-or-volatile-type-qualifier> = ...;
  /*1040*/ COUNT_OF_ALTS    | 0x000002,
  /*1041*/ COUNT_OF_PHRASES | 0x000001,
  /*1042*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000001,  /* const */
  /*1043*/ COUNT_OF_PHRASES | 0x000001,
  /*1044*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000010,  /* volatile */

// P<auto-reg-static-ext_opt> = ...;
  /*1045*/ COUNT_OF_ALTS    | 0x000005,
  /*1046*/ COUNT_OF_PHRASES | 0x000001,
  /*1047*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000011,  /* auto */
  /*1048*/ COUNT_OF_PHRASES | 0x000001,
  /*1049*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000012,  /* register */
  /*1050*/ COUNT_OF_PHRASES | 0x000001,
  /*1051*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000013,  /* static */
  /*1052*/ COUNT_OF_PHRASES | 0x000001,
  /*1053*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000014,  /* extern */
  /*1054*/ COUNT_OF_PHRASES | 0x000000,

// P<identifier-list> = ...;
  /*1055*/ COUNT_OF_ALTS    | 0x000001,
  /*1056*/ COUNT_OF_PHRASES | 0x000002,
  /*1057*/ PHRASE_TYPE      | G_new_identifier,
  /*1058*/ PHRASE_TYPE      | G_rest_of_identifier_list,

// P<rest-of-identifier-list> = ...;
  /*1059*/ COUNT_OF_ALTS    | 0x000002,
  /*1060*/ COUNT_OF_PHRASES | 0x000002,
  /*1061*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1062*/ PHRASE_TYPE      | G_identifier_list,
  /*1063*/ COUNT_OF_PHRASES | 0x000000,

// P<more-forward-decls-or-actual-body> = ...;
  /*1064*/ COUNT_OF_ALTS    | 0x000002,
  /*1065*/ COUNT_OF_PHRASES | 0x000002,
  /*1066*/ PHRASE_TYPE      | G_extern_proc_name_and_params_list_opt,
  /*1067*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1068*/ COUNT_OF_PHRASES | 0x000001,
  /*1069*/ PHRASE_TYPE      | G_compound_statement,

// P<extern-proc-spec> = ...;
  /*1070*/ COUNT_OF_ALTS    | 0x000001,
  /*1071*/ COUNT_OF_PHRASES | 0x000003,
  /*1072*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1073*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1074*/ PHRASE_TYPE      | G_basic_type_specifier_or_typedef_name_opt,

// P<basic-type-specifier-or-typedef-name_opt> = ...;
  /*1075*/ COUNT_OF_ALTS    | 0x000002,
  /*1076*/ COUNT_OF_PHRASES | 0x000001,
  /*1077*/ PHRASE_TYPE      | G_typedef_name,
  /*1078*/ COUNT_OF_PHRASES | 0x000001,
  /*1079*/ PHRASE_TYPE      | G_basic_type_specifier_opt,

// P<identifier-or-function-pointer> = ...;
  /*1080*/ COUNT_OF_ALTS    | 0x000002,
  /*1081*/ COUNT_OF_PHRASES | 0x000004,
  /*1082*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1083*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002a,  /* '*' */
  /*1084*/ PHRASE_TYPE      | G_new_identifier,
  /*1085*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1086*/ COUNT_OF_PHRASES | 0x000001,
  /*1087*/ PHRASE_TYPE      | G_new_identifier,

// P<extern-proc-name-and-params> = ...;
  /*1088*/ COUNT_OF_ALTS    | 0x000001,
  /*1089*/ COUNT_OF_PHRASES | 0x000005,
  /*1090*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1091*/ PHRASE_TYPE      | G_identifier_or_function_pointer,
  /*1092*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1093*/ PHRASE_TYPE      | G_param_list_opt,
  /*1094*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */

// P<extern-proc-name-and-params-list_opt> = ...;
  /*1095*/ COUNT_OF_ALTS    | 0x000002,
  /*1096*/ COUNT_OF_PHRASES | 0x000003,
  /*1097*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1098*/ PHRASE_TYPE      | G_extern_proc_name_and_params,
  /*1099*/ PHRASE_TYPE      | G_extern_proc_name_and_params_list_opt,
  /*1100*/ COUNT_OF_PHRASES | 0x000000,

// P<proc-fn-decl> = ...;
  /*1101*/ COUNT_OF_ALTS    | 0x000002,
  /*1102*/ COUNT_OF_PHRASES | 0x000003,
  /*1103*/ PHRASE_TYPE      | G_extern_proc_spec,
  /*1104*/ PHRASE_TYPE      | G_extern_proc_name_and_params,
  /*1105*/ PHRASE_TYPE      | G_more_forward_decls_or_actual_body,
  /*1106*/ COUNT_OF_PHRASES | 0x000009,
  /*1107*/ PHRASE_TYPE      | G_extern_proc_spec,
  /*1108*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1109*/ PHRASE_TYPE      | G_new_identifier,
  /*1110*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1111*/ PHRASE_TYPE      | G_identifier_list,
  /*1112*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1113*/ PHRASE_TYPE      | G_oldstyle_param_list_opt,
  /*1114*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1115*/ PHRASE_TYPE      | G_compound_statement,

// P<compound-statement> = ...;
  /*1116*/ COUNT_OF_ALTS    | 0x000002,
  /*1117*/ COUNT_OF_PHRASES | 0x000002,
  /*1118*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*1119*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */
  /*1120*/ COUNT_OF_PHRASES | 0x000003,
  /*1121*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*1122*/ PHRASE_TYPE      | G_statement_list,
  /*1123*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */

// P<statement-list> = ...;
  /*1124*/ COUNT_OF_ALTS    | 0x000001,
  /*1125*/ COUNT_OF_PHRASES | 0x000003,
  /*1126*/ PHRASE_TYPE      | G_labels_opt,
  /*1127*/ PHRASE_TYPE      | G_statement,
  /*1128*/ PHRASE_TYPE      | G_rest_of_statement_list,

// P<rest-of-statement-list> = ...;
  /*1129*/ COUNT_OF_ALTS    | 0x000002,
  /*1130*/ COUNT_OF_PHRASES | 0x000003,
  /*1131*/ PHRASE_TYPE      | G_labels_opt,
  /*1132*/ PHRASE_TYPE      | G_statement,
  /*1133*/ PHRASE_TYPE      | G_rest_of_statement_list,
  /*1134*/ COUNT_OF_PHRASES | 0x000000,

// P<statement> = ...;
  /*1135*/ COUNT_OF_ALTS    | 0x000009,
  /*1136*/ COUNT_OF_PHRASES | 0x000001,
  /*1137*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1138*/ COUNT_OF_PHRASES | 0x000001,
  /*1139*/ PHRASE_TYPE      | G_compound_statement,
  /*1140*/ COUNT_OF_PHRASES | 0x000001,
  /*1141*/ PHRASE_TYPE      | G_selection_statement,
  /*1142*/ COUNT_OF_PHRASES | 0x000001,
  /*1143*/ PHRASE_TYPE      | G_iteration_statement,
  /*1144*/ COUNT_OF_PHRASES | 0x000001,
  /*1145*/ PHRASE_TYPE      | G_jump_statement,
  /*1146*/ COUNT_OF_PHRASES | 0x000002,
  /*1147*/ PHRASE_TYPE      | G_expression,
  /*1148*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1149*/ COUNT_OF_PHRASES | 0x000003,
  /*1150*/ PHRASE_TYPE      | G_extern_proc_spec,
  /*1151*/ PHRASE_TYPE      | G_extern_proc_name_and_params,
  /*1152*/ PHRASE_TYPE      | G_more_forward_decls_or_actual_body,
  /*1153*/ COUNT_OF_PHRASES | 0x000001,
  /*1154*/ PHRASE_TYPE      | G_in_proc_data_declaration,
  /*1155*/ COUNT_OF_PHRASES | 0x000001,
  /*1156*/ PHRASE_TYPE      | G_external_declaration_list,

// P<in-proc-data-declaration> = ...;
  /*1157*/ COUNT_OF_ALTS    | 0x000002,
  /*1158*/ COUNT_OF_PHRASES | 0x000005,
  /*1159*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1160*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1161*/ PHRASE_TYPE      | G_type,
  /*1162*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1163*/ PHRASE_TYPE      | G_decl_list,
  /*1164*/ COUNT_OF_PHRASES | 0x000001,
  /*1165*/ PHRASE_TYPE      | G_struct_decl,

// P<struct-decl> = ...;
  /*1166*/ COUNT_OF_ALTS    | 0x000001,
  /*1167*/ COUNT_OF_PHRASES | 0x000005,
  /*1168*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000002,  /* struct */
  /*1169*/ PHRASE_TYPE      | G_new_structname,
  /*1170*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007b,  /* '{' */
  /*1171*/ PHRASE_TYPE      | G_struct_member_list,
  /*1172*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */

// P<struct-member-list> = ...;
  /*1173*/ COUNT_OF_ALTS    | 0x000002,
  /*1174*/ COUNT_OF_PHRASES | 0x000002,
  /*1175*/ PHRASE_TYPE      | G_struct_member_declaration,
  /*1176*/ PHRASE_TYPE      | G_struct_member_list,
  /*1177*/ COUNT_OF_PHRASES | 0x000000,

// P<struct-member-declaration> = ...;
  /*1178*/ COUNT_OF_ALTS    | 0x000003,
  /*1179*/ COUNT_OF_PHRASES | 0x000001,
  /*1180*/ PHRASE_TYPE      | G_struct_decl,
  /*1181*/ COUNT_OF_PHRASES | 0x000001,
  /*1182*/ PHRASE_TYPE      | G_possibly_initialised_scalar_decl,
  /*1183*/ COUNT_OF_PHRASES | 0x000001,
  /*1184*/ PHRASE_TYPE      | G_possibly_initialised_array_decl,

// P<possibly-initialised-array-decl> = ...;
  /*1185*/ COUNT_OF_ALTS    | 0x000001,
  /*1186*/ COUNT_OF_PHRASES | 0x000009,
  /*1187*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1188*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1189*/ PHRASE_TYPE      | G_type,
  /*1190*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1191*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1192*/ PHRASE_TYPE      | G_new_identifier,
  /*1193*/ PHRASE_TYPE      | G_array_bounds,
  /*1194*/ PHRASE_TYPE      | G_array_init_opt,
  /*1195*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */

// P<possibly-initialised-scalar-decl> = ...;
  /*1196*/ COUNT_OF_ALTS    | 0x000001,
  /*1197*/ COUNT_OF_PHRASES | 0x000004,
  /*1198*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1199*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1200*/ PHRASE_TYPE      | G_type,
  /*1201*/ PHRASE_TYPE      | G_rest_of_scalar_decl,

// P<rest-of-scalar-decl> = ...;
  /*1202*/ COUNT_OF_ALTS    | 0x000001,
  /*1203*/ COUNT_OF_PHRASES | 0x000005,
  /*1204*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1205*/ PHRASE_TYPE      | G_new_identifier,
  /*1206*/ PHRASE_TYPE      | G_scalar_init_opt,
  /*1207*/ PHRASE_TYPE      | G_rest_of_scalar_decl_opt,
  /*1208*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */

// P<rest-of-scalar-decl_opt> = ...;
  /*1209*/ COUNT_OF_ALTS    | 0x000002,
  /*1210*/ COUNT_OF_PHRASES | 0x000005,
  /*1211*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1212*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1213*/ PHRASE_TYPE      | G_new_identifier,
  /*1214*/ PHRASE_TYPE      | G_scalar_init_opt,
  /*1215*/ PHRASE_TYPE      | G_rest_of_scalar_decl_opt,
  /*1216*/ COUNT_OF_PHRASES | 0x000000,

// P<new-structname> = ...;
  /*1217*/ COUNT_OF_ALTS    | 0x000001,
  /*1218*/ COUNT_OF_PHRASES | 0x000001,
  /*1219*/ PHRASE_TYPE      | G_new_identifier,

// P<decl-list> = ...;
  /*1220*/ COUNT_OF_ALTS    | 0x000001,
  /*1221*/ COUNT_OF_PHRASES | 0x000002,
  /*1222*/ PHRASE_TYPE      | G_decl,
  /*1223*/ PHRASE_TYPE      | G_rest_of_decl_list,

// P<rest-of-decl-list> = ...;
  /*1224*/ COUNT_OF_ALTS    | 0x000002,
  /*1225*/ COUNT_OF_PHRASES | 0x000002,
  /*1226*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1227*/ PHRASE_TYPE      | G_decl_list,
  /*1228*/ COUNT_OF_PHRASES | 0x000000,

// P<decl> = ...;
  /*1229*/ COUNT_OF_ALTS    | 0x000002,
  /*1230*/ COUNT_OF_PHRASES | 0x000004,
  /*1231*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1232*/ PHRASE_TYPE      | G_new_identifier,
  /*1233*/ PHRASE_TYPE      | G_possibly_empty_array_bounds_list,
  /*1234*/ PHRASE_TYPE      | G_array_init_opt,
  /*1235*/ COUNT_OF_PHRASES | 0x000003,
  /*1236*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1237*/ PHRASE_TYPE      | G_new_identifier,
  /*1238*/ PHRASE_TYPE      | G_scalar_init_opt,

// P<possibly-empty-array-bounds-list> = ...;
  /*1239*/ COUNT_OF_ALTS    | 0x000001,
  /*1240*/ COUNT_OF_PHRASES | 0x000006,
  /*1241*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*1242*/ PHRASE_TYPE      | G_HACK1,
  /*1243*/ PHRASE_TYPE      | G_constant_expression_opt,
  /*1244*/ PHRASE_TYPE      | G_HACK2,
  /*1245*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*1246*/ PHRASE_TYPE      | G_optional_possibly_empty_array_bounds_list,

// P<optional-possibly-empty-array-bounds-list> = ...;
  /*1247*/ COUNT_OF_ALTS    | 0x000002,
  /*1248*/ COUNT_OF_PHRASES | 0x000006,
  /*1249*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005b,  /* '[' */
  /*1250*/ PHRASE_TYPE      | G_HACK1,
  /*1251*/ PHRASE_TYPE      | G_constant_expression_opt,
  /*1252*/ PHRASE_TYPE      | G_HACK2,
  /*1253*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00005d,  /* ']' */
  /*1254*/ PHRASE_TYPE      | G_optional_possibly_empty_array_bounds_list,
  /*1255*/ COUNT_OF_PHRASES | 0x000000,

// P<jump-statement> = ...;
  /*1256*/ COUNT_OF_ALTS    | 0x000004,
  /*1257*/ COUNT_OF_PHRASES | 0x000003,
  /*1258*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000015,  /* goto */
  /*1259*/ PHRASE_TYPE      | G_label,
  /*1260*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1261*/ COUNT_OF_PHRASES | 0x000002,
  /*1262*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000016,  /* continue */
  /*1263*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1264*/ COUNT_OF_PHRASES | 0x000002,
  /*1265*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000017,  /* break */
  /*1266*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1267*/ COUNT_OF_PHRASES | 0x000004,
  /*1268*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000018,  /* return */
  /*1269*/ SEMANTIC_TYPE    | NEGATED_PHRASE     | S_followed_by_alpha,
  /*1270*/ PHRASE_TYPE      | G_expression_opt,
  /*1271*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */

// P<expression_opt> = ...;
  /*1272*/ COUNT_OF_ALTS    | 0x000002,
  /*1273*/ COUNT_OF_PHRASES | 0x000001,
  /*1274*/ PHRASE_TYPE      | G_expression,
  /*1275*/ COUNT_OF_PHRASES | 0x000000,

// P<label> = ...;
  /*1276*/ COUNT_OF_ALTS    | 0x000001,
  /*1277*/ COUNT_OF_PHRASES | 0x000001,
  /*1278*/ PHRASE_TYPE      | G_identifier,

// P<iteration-statement> = ...;
  /*1279*/ COUNT_OF_ALTS    | 0x000003,
  /*1280*/ COUNT_OF_PHRASES | 0x000005,
  /*1281*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000019,  /* while */
  /*1282*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1283*/ PHRASE_TYPE      | G_expression,
  /*1284*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1285*/ PHRASE_TYPE      | G_statement,
  /*1286*/ COUNT_OF_PHRASES | 0x000007,
  /*1287*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001a,  /* do */
  /*1288*/ PHRASE_TYPE      | G_statement,
  /*1289*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000019,  /* while */
  /*1290*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1291*/ PHRASE_TYPE      | G_expression,
  /*1292*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1293*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1294*/ COUNT_OF_PHRASES | 0x000009,
  /*1295*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001b,  /* for */
  /*1296*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1297*/ PHRASE_TYPE      | G_expression_opt,
  /*1298*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1299*/ PHRASE_TYPE      | G_expression_opt,
  /*1300*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1301*/ PHRASE_TYPE      | G_expression_opt,
  /*1302*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1303*/ PHRASE_TYPE      | G_statement,

// P<selection-statement> = ...;
  /*1304*/ COUNT_OF_ALTS    | 0x000002,
  /*1305*/ COUNT_OF_PHRASES | 0x000006,
  /*1306*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000000,  /* if */
  /*1307*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1308*/ PHRASE_TYPE      | G_expression,
  /*1309*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1310*/ PHRASE_TYPE      | G_statement,
  /*1311*/ PHRASE_TYPE      | G_else_opt,
  /*1312*/ COUNT_OF_PHRASES | 0x000005,
  /*1313*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001c,  /* switch */
  /*1314*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1315*/ PHRASE_TYPE      | G_expression,
  /*1316*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1317*/ PHRASE_TYPE      | G_statement,

// P<else_opt> = ...;
  /*1318*/ COUNT_OF_ALTS    | 0x000002,
  /*1319*/ COUNT_OF_PHRASES | 0x000002,
  /*1320*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001d,  /* else */
  /*1321*/ PHRASE_TYPE      | G_statement,
  /*1322*/ COUNT_OF_PHRASES | 0x000000,

// P<missing-semicolon-after-label-at-end-of-block> = ...;
  /*1323*/ COUNT_OF_ALTS    | 0x000001,
  /*1324*/ COUNT_OF_PHRASES | 0x000001,
  /*1325*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00007d,  /* '}' */

// P<labels_opt> = ...;
  /*1326*/ COUNT_OF_ALTS    | 0x000004,
  /*1327*/ COUNT_OF_PHRASES | 0x000004,
  /*1328*/ PHRASE_TYPE      | G_label,
  /*1329*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003a,  /* ':' */
  /*1330*/ PHRASE_TYPE      | G_labels_opt,
  /*1331*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_missing_semicolon_after_label_at_end_of_block,
  /*1332*/ COUNT_OF_PHRASES | 0x000005,
  /*1333*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001e,  /* case */
  /*1334*/ PHRASE_TYPE      | G_constant_expression,
  /*1335*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003a,  /* ':' */
  /*1336*/ PHRASE_TYPE      | G_labels_opt,
  /*1337*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_missing_semicolon_after_label_at_end_of_block,
  /*1338*/ COUNT_OF_PHRASES | 0x000004,
  /*1339*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00001f,  /* default */
  /*1340*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003a,  /* ':' */
  /*1341*/ PHRASE_TYPE      | G_labels_opt,
  /*1342*/ PHRASE_TYPE      | NEGATED_PHRASE     | G_missing_semicolon_after_label_at_end_of_block,
  /*1343*/ COUNT_OF_PHRASES | 0x000000,

// P<param-list_opt> = ...;
  /*1344*/ COUNT_OF_ALTS    | 0x000003,
  /*1345*/ COUNT_OF_PHRASES | 0x000002,
  /*1346*/ PHRASE_TYPE      | G_formal_param,
  /*1347*/ PHRASE_TYPE      | G_rest_of_param_list_opt,
  /*1348*/ COUNT_OF_PHRASES | 0x000001,
  /*1349*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000a,  /* void */
  /*1350*/ COUNT_OF_PHRASES | 0x000000,

// P<oldstyle-param-list_opt> = ...;
  /*1351*/ COUNT_OF_ALTS    | 0x000002,
  /*1352*/ COUNT_OF_PHRASES | 0x000001,
  /*1353*/ PHRASE_TYPE      | G_oldstyle_param_list,
  /*1354*/ COUNT_OF_PHRASES | 0x000000,

// P<oldstyle-param-list> = ...;
  /*1355*/ COUNT_OF_ALTS    | 0x000002,
  /*1356*/ COUNT_OF_PHRASES | 0x000002,
  /*1357*/ PHRASE_TYPE      | G_oldstyle_formal_param,
  /*1358*/ PHRASE_TYPE      | G_rest_of_oldstyle_param_list_opt,
  /*1359*/ COUNT_OF_PHRASES | 0x000001,
  /*1360*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x00000a,  /* void */

// P<rest-of-oldstyle-param-list_opt> = ...;
  /*1361*/ COUNT_OF_ALTS    | 0x000002,
  /*1362*/ COUNT_OF_PHRASES | 0x000002,
  /*1363*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00003b,  /* ';' */
  /*1364*/ PHRASE_TYPE      | G_oldstyle_param_list,
  /*1365*/ COUNT_OF_PHRASES | 0x000000,

// P<oldstyle-formal-param> = ...;
  /*1366*/ COUNT_OF_ALTS    | 0x000001,
  /*1367*/ COUNT_OF_PHRASES | 0x000003,
  /*1368*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1369*/ PHRASE_TYPE      | G_type,
  /*1370*/ PHRASE_TYPE      | G_oldstyle_parameter_list,

// P<oldstyle-parameter-list> = ...;
  /*1371*/ COUNT_OF_ALTS    | 0x000001,
  /*1372*/ COUNT_OF_PHRASES | 0x000002,
  /*1373*/ PHRASE_TYPE      | G_whatever,
  /*1374*/ PHRASE_TYPE      | G_rest_of_oldstyle_parameter_list,

// P<rest-of-oldstyle-parameter-list> = ...;
  /*1375*/ COUNT_OF_ALTS    | 0x000002,
  /*1376*/ COUNT_OF_PHRASES | 0x000002,
  /*1377*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1378*/ PHRASE_TYPE      | G_oldstyle_parameter_list,
  /*1379*/ COUNT_OF_PHRASES | 0x000000,

// P<whatever> = ...;
  /*1380*/ COUNT_OF_ALTS    | 0x000001,
  /*1381*/ COUNT_OF_PHRASES | 0x000003,
  /*1382*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1383*/ PHRASE_TYPE      | G_identifier_opt,
  /*1384*/ PHRASE_TYPE      | G_optional_possibly_empty_array_bounds_list,

// P<rest-of-param-list_opt> = ...;
  /*1385*/ COUNT_OF_ALTS    | 0x000003,
  /*1386*/ COUNT_OF_PHRASES | 0x000002,
  /*1387*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1388*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000036,  /* ... */
  /*1389*/ COUNT_OF_PHRASES | 0x000003,
  /*1390*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1391*/ PHRASE_TYPE      | G_formal_param,
  /*1392*/ PHRASE_TYPE      | G_rest_of_param_list_opt,
  /*1393*/ COUNT_OF_PHRASES | 0x000000,

// P<formal-param> = ...;
  /*1394*/ COUNT_OF_ALTS    | 0x000002,
  /*1395*/ COUNT_OF_PHRASES | 0x000001,
  /*1396*/ PHRASE_TYPE      | G_procedure_as_parameter,
  /*1397*/ COUNT_OF_PHRASES | 0x000005,
  /*1398*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1399*/ PHRASE_TYPE      | G_type,
  /*1400*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1401*/ PHRASE_TYPE      | G_identifier_opt,
  /*1402*/ PHRASE_TYPE      | G_optional_possibly_empty_array_bounds_list,

// P<identifier_opt> = ...;
  /*1403*/ COUNT_OF_ALTS    | 0x000002,
  /*1404*/ COUNT_OF_PHRASES | 0x000001,
  /*1405*/ PHRASE_TYPE      | G_identifier,
  /*1406*/ COUNT_OF_PHRASES | 0x000000,

// P<procedure-as-parameter> = ...;
  /*1407*/ COUNT_OF_ALTS    | 0x000002,
  /*1408*/ COUNT_OF_PHRASES | 0x00000a,
  /*1409*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1410*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1411*/ PHRASE_TYPE      | G_basic_type_specifier_opt,
  /*1412*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1413*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1414*/ PHRASE_TYPE      | G_new_identifier,
  /*1415*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1416*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1417*/ PHRASE_TYPE      | G_param_list_opt,
  /*1418*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1419*/ COUNT_OF_PHRASES | 0x00000a,
  /*1420*/ PHRASE_TYPE      | G_auto_reg_static_ext_opt,
  /*1421*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1422*/ PHRASE_TYPE      | G_typedef_name,
  /*1423*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1424*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1425*/ PHRASE_TYPE      | G_new_identifier,
  /*1426*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1427*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1428*/ PHRASE_TYPE      | G_param_list_opt,
  /*1429*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */

// P<basic-type-specifier_opt> = ...;
  /*1430*/ COUNT_OF_ALTS    | 0x000002,
  /*1431*/ COUNT_OF_PHRASES | 0x000001,
  /*1432*/ PHRASE_TYPE      | G_basic_type_specifier,
  /*1433*/ COUNT_OF_PHRASES | 0x000000,

// P<typedef-declaration> = ...;
  /*1434*/ COUNT_OF_ALTS    | 0x000004,
  /*1435*/ COUNT_OF_PHRASES | 0x00000a,
  /*1436*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000020,  /* typedef */
  /*1437*/ PHRASE_TYPE      | G_type_specifier,
  /*1438*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1439*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1440*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1441*/ PHRASE_TYPE      | G_new_identifier,
  /*1442*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1443*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000028,  /* '(' */
  /*1444*/ PHRASE_TYPE      | G_param_list_opt,
  /*1445*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x000029,  /* ')' */
  /*1446*/ COUNT_OF_PHRASES | 0x000005,
  /*1447*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000020,  /* typedef */
  /*1448*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1449*/ PHRASE_TYPE      | G_type_specifier,
  /*1450*/ PHRASE_TYPE      | G_const_or_volatile_type_qualifier_opt,
  /*1451*/ PHRASE_TYPE      | G_decl_list,
  /*1452*/ COUNT_OF_PHRASES | 0x000003,
  /*1453*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000020,  /* typedef */
  /*1454*/ PHRASE_TYPE      | G_struct_decl,
  /*1455*/ PHRASE_TYPE      | G_maybe_indirect_typedef_name_list,
  /*1456*/ COUNT_OF_PHRASES | 0x000003,
  /*1457*/ KEYWORD_TYPE     | WHITESPACE_ALLOWED | 0x000020,  /* typedef */
  /*1458*/ PHRASE_TYPE      | G_type_specifier,
  /*1459*/ PHRASE_TYPE      | G_maybe_indirect_typedef_name_list,

// P<maybe-indirect-typedef-name-list> = ...;
  /*1460*/ COUNT_OF_ALTS    | 0x000001,
  /*1461*/ COUNT_OF_PHRASES | 0x000003,
  /*1462*/ PHRASE_TYPE      | G_indirection_decl_opt,
  /*1463*/ PHRASE_TYPE      | G_typedef_name,
  /*1464*/ PHRASE_TYPE      | G_rest_of_maybe_indirect_typedef_name_list,

// P<rest-of-maybe-indirect-typedef-name-list> = ...;
  /*1465*/ COUNT_OF_ALTS    | 0x000002,
  /*1466*/ COUNT_OF_PHRASES | 0x000002,
  /*1467*/ CHAR_TYPE        | WHITESPACE_ALLOWED | 0x00002c,  /* ',' */
  /*1468*/ PHRASE_TYPE      | G_maybe_indirect_typedef_name_list,
  /*1469*/ COUNT_OF_PHRASES | 0x000000,
};

#ifdef INITCODE

  static char *TypeName[32] = {
    // CST
    "*ERROR(0)*", "CST:BIP_TYPE", "CST:PHRASE_TYPE", "CST:SEMANTIC_TYPE", "CST:KEYWORD_TYPE",
    "CST:CHAR_TYPE", "CST:UTF32CHAR_TYPE", "CST:STRING_TYPE", "CST:UTF32STRING_TYPE",
    "CST:REGEXP_TYPE", "CST:OPTION_TYPE", "CST:COUNT_OF_ALTS", "CST:COUNT_OF_PHRASES",
    "CST:ALT_NUMBER", "*ERROR(14)*", "*ERROR(15)*",
    // AST
    "AST:BIP", "AST:PHRASE", "AST:ATOMLIT", "AST:POOLLIT",
    "*ERROR(20)*", "*ERROR(21)*", "*ERROR(22)*", "*ERROR(23)*",
    "*ERROR(24)*", "*ERROR(25)*", "*ERROR(26)*", "*ERROR(27)*",
    "*ERROR(28)*", "*ERROR(29)*", "*ERROR(30)*", "*ERROR(31)*",
  };

  wchar_t *Decode(int Ph) { // Until Diagnose is padded out a bit...
    static wchar_t tmp[512];
    swprintf(tmp, 511, L"%s", TypeName[(Ph>>AST_type_shift)&AST_type_mask]);
    return tmp;
  }

  wchar_t *pooltowstr_inner(StrpoolIDX p, const char *file, const int line) {
    if (p == -1) {
      fprintf(stderr, "* Error: pooltowstr passed -1 (uninitialised string) from %s, line %d\n", file, line);
    } else if (P_AST_type(p) == 0) {
      fprintf(stderr, "* Error: pooltowstr passed an untagged index from %s, line %d\n", file, line);
    } else if (P_AST_type(p) == STRING_TYPE) {
      fprintf(stderr, "* Error: pooltowstr passed a STRING_TYPE rather than an AST_POOL_LIT from %s, line %d\n", file, line);
    } else if (P_AST_type(p) == AST_ATOM_LIT) {
      fprintf(stderr, "* Error: pooltowstr passed a AST_ATOM_LIT rather than an AST_POOL_LIT from %s, line %d\n", file, line);
    } else if (P_AST_type(p) != AST_POOL_LIT) {
      fprintf(stderr, "* Error: pooltowstr passed an unexpected tag type %d:", P_AST_type(p) >> AST_type_shift);
      fprintf(stderr, " %ls from %s, line %d\n", Decode(p), file, line);
    }
    p = p & AST_idx_mask;
    return &Stringpool(p);
  }

#endif //INITCODE
int parse_whitespace(void)
{
#ifdef IN_PARSER
  while (source(TP).ch==' ' || source(TP).ch=='\n' || source(TP).ch=='\t' || source(TP).ch=='\f') {
    TP += 1;
  }
#endif
  return TRUE;
}
int parse_C_line_reconstruction(void)
{
#ifdef IN_PARSER
  int debug_stropping = 0;

  // The 'C' line reconstruction was thrown together in a couple of minutes and without
  // any consideration to the subtleties of C's lexing.  So expect major problems in this
  // area until it is looked at properly and actually designed.  Current testing
  // environment strips out all lines starting with '#', and all comments too. So
  // the comment stripping here hasn't even been tested yet.

  // Note that line reconstruction in C is unlike in Imp and even unlike lexing in
  // a yacc/lex C compiler.  It is *only* here to remove multiple leading spaces and
  // comments before non-space characters (not *tokens*), however care must be taken
  // in parsing to skip spaces where spaces must be skipped, while checking that there
  // are no spaces in multi-character tokens whose characters must not have spaces
  // between them.  This will require some assistance from the grammar, it cannot
  // all be done in the line reconstruction phase.

  // So far the only concession to C's lexing conventions are that we check that keywords
  // are not followed by an extension of the keyword, so "intx" is not confused with "int x".
  // Otherwise, spaces are pretty much skipped.  I suspect that something like "constint"
  // would currently be accepted for "const int".  I either have to modify uparse.c to
  // handle whitespace differently, or add explicit whitespace to the grammar.


  // The source file has already been read trivially into source().
  
  // We will copy from source() into temp(), then perform line reconstruction
  // on temp(), writing back to source().  The parser will then parse source()
  // into atoms according to the grammar.  Initially it will only store the
  // reconstructed characters into the atoms, but once it is working, I will
  // modify it to also store the unreconstructed source for use in source-to-source
  // translations, where whitespace, embedded comments, and indentation is
  // desired in the translation, in order to mirror the original file.

  // All arrays are flex and the upper bound is a limit, not a minimum.

  // TODO: free SYM at the end of this procedure using FREE_FLEX(SYM).
#define MAX_SYM 128000000
  DECLARE(SYM, reconstructed, MAX_SYM);  // was 600000
#define _SYM(x) WRITE(x,SYM,reconstructed)
#define  SYM(x)  READ(x,SYM,reconstructed)

  int LASTP, P = 0;
  _SYM(0).start = 0;
  while (source(P).ch != 0 /* WEOF */) {
    _SYM(P).ch = source(P).ch;
    if (P > 0) _SYM(P).start = SYM(P-1).end;
    _SYM(P).end = P+1;
    P += 1;
  }
  _SYM(P).ch = 0 /* WEOF */;
  if (P > 0) _SYM(P).start = SYM(P-1).end; _SYM(P).end = P; // no chars for EOF
  LASTP = P;
  
  if (debug_stropping) {
    int I;
    fprintf(stderr, "source() moved to SYM(0:%d) = \"", LASTP);
    for (I = 0; I < LASTP; I++) {
      fprintf(stderr, "%lc", SYM(I).ch);
    }
    if (SYM(LASTP).ch != 0) fprintf(stderr, "[%d]", SYM(LASTP).ch);
    fprintf(stderr, "\";\n");
  };

  int FP = 0, PP = 0; // Fetch Pointer, Put Pointer.

#define DONE() \
        do {                                                                        \
            FP -= 1; /* the terminating 0*/                                         \
            _source(PP).ch = 0;                                                     \
            if (PP > 0) _source(PP).start = SYM(PP-1).end;                          \
            _source(PP).end = SYM(FP).end;                                          \
            if (debug_stropping) {                                                  \
              int I;                                                                \
              fprintf(stderr, "SYM(0:%d) moved back to source(0:%d) = \"", FP, PP); \
              for (I = 0; I < PP; I++) {                                            \
                fprintf(stderr, "%lc", source(I).ch);                               \
              }                                                                     \
              if (source(PP).ch != 0) fprintf(stderr, "[%d]", source(PP).ch);       \
              fprintf(stderr, "\";\n");                                             \
            }                                                                       \
            TP = 0; FREE_FLEX(SYM); return TRUE;                                    \
        } while (0)

  wint_t WC, Peek;

  // uparse.c had been modified so that its implicit whitespace skipping no longer skipped '\n'.
  // (The algol60 parser in contrast treats all \n's the same as spaces, as we are now doing here)
  
#define CHECK_EOF(x) do if ((x) == 0) DONE(); else { if (PP > 0) _source(PP).start = source(PP-1).end; if (FP > 0) _source(PP).end = SYM(FP-1).end; } while (0)

  // PP is the 'current' slot we are writing into.
  _source(PP).start = SYM(FP).start;

  for (;;) {

    if (PP > 0) _source(PP).start = source(PP-1).end; // Keep updated.
    _source(PP).end = SYM(FP).end; // Keep updated.
    WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);

    if ((WC == '/') && (Peek == '*')) {

      // TODO: fold multiple spaces and comments into one.
      //       Instead of using the saved WC to provide spacing and newlines in the output, we
      //       should use the saved comment text, while saving only a ' ' rather then \n \t \f as ch.

      // TODO: remember that fred/*...*/jim generates two tokens, so a comment
      //       that is not surrounded by spaces still must be treated as a space.
      //       Matters for C such as (when b = 2, c = 3):
      
      //          b- --c    = 0
      //          b-- -c    = -1
      //          b---c     = -1
      //          b-/**/--c = 0
      //          b--/**/-c = -1
      
      // (and this is before we get into token pasting in the preprocessor!)
      
      for (;;) {
        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);
        if ((WC == '*') && (Peek == '/')) {
          WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);
          break; // but still looking.
        }
      }
      continue;
    }

    else if ((WC == '/') && (Peek == '/')) {

      // Note: C's '//' comments are not quite the same as Imp's '!' comments,
      // as the Imp ones are a statement that must come at the start of a boundary
      // whereas the C ones can be appended to any line.  They are more like
      // the Imp '{' but without a matching '}' before the end of the line.
      // Whereas C's /* ... */ comments are *not* like Imp { ... } comments
      // because those are single-line only.  Translating comments from Imp to C
      // is going to be ugly.  Fortunately this program doesn't care :-)
      
      for (;;) {
        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);
        if (WC == '\n') {
          break; // but still looking.
        }
      }
      continue;
    }

    else if (WC == '\'') {
      _source(PP++).ch = WC;
      for (;;) {
        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);
        if (WC == '\'') {
          _source(PP).ch = WC;
          if (PP > 0) _source(PP).start = source(PP-1).end; // Leave Peek for later.
          if (FP > 0) _source(PP).end = SYM(FP-1).end; // Leave Peek for later.
          PP++;
          break;
        } else if (WC == '\\') {
          _source(PP++).ch = WC;
          _source(PP++).ch = Peek;
          FP++;
        } else {
          _source(PP++).ch = WC;
        }
      }
      continue;
    }

    else if (WC == '"') {
      _source(PP++).ch = WC;
      for (;;) {
        WC = SYM(FP++).ch; CHECK_EOF(WC); Peek = SYM(FP).ch; //CHECK_EOF(Peek);
        if (WC == '"') {
          _source(PP).ch = WC;
          if (PP > 0) _source(PP).start = source(PP-1).end; // Leave Peek for later.
          if (FP > 0) _source(PP).end = SYM(FP-1).end; // Leave Peek for later.
          PP++;
          break;
        } else if (WC == '\\') {
          _source(PP++).ch = WC;
          _source(PP++).ch = Peek;
          FP++;
        } else {
          _source(PP++).ch = WC;
        }
      }
      continue;
    }

    else if (WC == ' ' || WC == '\n' || WC == '\t' || WC == '\f') {  // use iswblank(WC) instead?
      // TODO: fold multiple spaces and comments into one.
      //       Instead of using the saved WC to provide spacing and newlines in the output, we
      //       should use the saved comment text, while saving only a ' ' rather then \n \t \f as ch.
      _source(PP++).ch = WC;
      continue;
    }

    else {
      // everything else just returns one significant non-space character.

      _source(PP++).ch = WC;
      continue;
    }


    // Still skipping whitespace ...

  }

  DONE();
  P = 0;
  while (source(P).ch != 0) {
    if (debug_stropping) fprintf(stderr, "%d: ch='%lc'  start=%d:end=%d\n", P, source(P).ch, source(P).start, source(P).end);
    P++;
  }

  TP = 0;
  //for (;;) {
  //  fprintf(stderr, "TP = %d  start = %d  end = %d  ch = '%c'\n", TP, source(TP).start, source(TP).end, source(TP).ch);
  //                                                  // should show comment text etc too.
  //  TP += 1;
  //  if (source(TP).ch == 0) break;
  //}
  //exit(0);
  //TP = 0;

  FREE_FLEX(SYM);
  
#undef DONE
#endif

  return TRUE;
}
int parse_preceded_by_alpha(void)
{
#ifdef IN_PARSER
  int SAVE = TP;
  parse_whitespace();
  if (TP != SAVE) return 0;
  if (TP == 0) return 0;
  if ((source(TP-1).ch >= 'a' && source(TP-1).ch <= 'z')
          || (source(TP-1).ch >= 'A' && source(TP-1).ch <= 'Z')
          || (source(TP-1).ch >= '0' && source(TP-1).ch <= '9')
          ||  source(TP-1).ch == '_') {
    TP = SAVE;
    return 1;
  }
  TP = SAVE;
#endif
  return 0;
}
int parse_followed_by_alpha(void)
{
#ifdef IN_PARSER
  // Is a boolean return what is needed here?
  return     ((source(TP).ch >= 'a') && (source(TP).ch <= 'z'))
          || ((source(TP).ch >= 'A') && (source(TP).ch <= 'Z'))
          || ((source(TP).ch >= '0') && (source(TP).ch <= '9'))
          ||  (source(TP).ch == '_');
#else
  return 0;
#endif
}
int parse_pp_directive(void)
{
#ifdef IN_PARSER
  int WP = TP;  // Pick up start of white space
  parse_whitespace();
  if (source(TP).ch == '#') {
  
    // Although we currently read from a '#' at the start of a *statement*,
    // C requires us to accept preprocessor directives only from the start
    // of a *line* (modulo leading spaces) so (TODO) we need to keep a
    // 'start of line' flag as well, and test that when checking for a
    // preprocessor directive.

    // Actually even this scheme isn't proper C because a preprocessor
    // directive can be at the start of a line yet in the middle of
    // a statement.  I think this means it *must* be handled during
    // line reconstruction, which means (if we are going to handle
    // #define as well as #pragma not to mention #include), that all
    // of cpp needs to be built in to the line reconstruction and
    // a special mechanism (hack) has to be added to pass #pragma
    // instructions through to the compiler part.

    _source(TP).start = WP;
    TP += 1;
    while (source(TP).ch != '\n') TP += 1 /* skip */;
    // maybe should include the \n for a # directive?
    if (TP > 0) _source(TP).start = source(TP-1).end;
    _source(TP).end = TP;
    return 1;
  } else
#endif
  return 0;
}

// B<EOF> = 0;

// B<NL> = 2;

// E
#endif  // SUPPRESS_DATA
#endif  // _GRAMMAR_H_
