// compile: this is a skeleton that is built once from the final grammar, // and modified by the programmer to do whatever the program needs to do. // // The baseline is simply to re-output the initial input, but obviously // a real implementation would do something more complex, such as indentation // and formatting (e.g. like SOAP), or conversion into another language // such as C, or even to create a real compiler. // // If all you are doing is re-outputing the original source, this code is // way overkill. A 20-line version would do the same job. // // You would typically *not* re-create this file automatically in your Makefile... // Remember to edit this comment once you get to the stage where you are // maintaining this procedure manually... // void compile(int astp) { int i; // These offsets are a poor man's struct: // Offsets in the A record are different from offsets in the AST. // A record offsets: #define A_literal_offset 3 // AST offsets: #define AST_op_offset 1 #define AST_alt_offset 2 #define AST_count_offset 3 // Any new fixed fields (such as a pointer to the text) would be inserted here. // Please do not ever write code with absolute offsets! #define AST_child0_offset 4 if (astp < 0) { return; // -phrase denotes an optional item we don't want to print when reconstituting the source // Not an ideal mechanism. May change it later to add optional bits to 'op' field. } int astop = AST[astp+AST_op_offset]; int alt = AST[astp+AST_alt_offset]; int count = AST[astp+AST_count_offset]; int *A_child = &AST[astp+AST_child0_offset]; // An index into a child of the AREC, *not* a child of the AST. // Must use these macros for children of the AST, in case new fields are added. #define leftchild(p) AST[(p)+AST_child0_offset+(1-1)] #define rightchild(p) AST[(p)+AST_child0_offset+(2-1)] #define nthchild(p,i) AST[(p)+AST_child0_offset+((i)-1)] //\\ C<immediate> = { //\\ // WARNING: currently parse-time phrases are not being handled properly //\\ // by compile(). Are they set to -1 or skipped completely? //\\ extern int *A; // remove as much of this as possible as soon as things start working again... //\\ extern int cp; // code pointer. Has to be global state. //\\ extern int ap; // Analysis record pointer. //\\ int kw(int AST_op, int kw_idx, int ap) // kw(AST__KW, KW_void, A[ap+0]); //\\ //\\ { //\\ int data[3]; //\\ //\\ data[1] = kw_idx; //\\ //\\ data[2] = ap; //\\ //\\ return mktuple(B_keyword, 1, 2, data); //\\ //\\ } //\\ int check(int Aval, int *table); //\\ //\\ int is_in_array(char *word, char **array, int max) { //\\ int i; //\\ //\\ for (i = 0; i < max; i++) { //\\ if (strcmp(word, array[i]) == 0) return TRUE; //\\ //\\ } //\\ return FALSE; //\\ //\\ } //\\ // variables used in line_reconstruction() moved here so they are available to semantic code in grammar. //\\ int saved = TRUE; //\\ //\\ int at_startofline = TRUE; //\\ //\\ }; switch (astop) { case AST_char: //\\ B<char> = 0; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_internal_identifier: //\\ B<internal-identifier> = 1; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_integer_constant: //\\ B<integer-constant> = 2; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; //\\ # <character-constant> temporarily replaced by <sqstring> //\\ # and <string> temporarily replaced by <dqstring> //\\ # because parser.c TEMPORARILY assumes these exist in all parsers :-( case AST_sqstring: //\\ B<sqstring> = 3; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_floating_constant: //\\ B<floating-constant> = 4; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_dqstring: //\\ B<dqstring> = 5; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_keyword: //\\ B<keyword> = 6; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_pp: //\\ B<pp> = 7; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_mm: //\\ B<mm> = 8; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_andand: //\\ B<andand> = 9; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_oror: //\\ B<oror> = 10; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_eqeq: //\\ B<eqeq> = 11; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; //\\ # char, NL, and EOF are required by all parsers case AST_NL: //\\ B<NL> = 12; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST_EOF: //\\ B<EOF> = 13; RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; //\\ # top-level statement case AST_identifier: //\\ P<identifier> = if (alt == 0) { //\\ <!keyword-not-allowed-in-context-of-an-identifier> <internal-identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # want to use keyword[] array from parser.h, but this will have to do for now //\\ # until I can work out a clean mechanism using <immediate:...> case AST_keyword_not_allowed_in_context_of_an_identifier://\\ P<keyword-not-allowed-in-context-of-an-identifier> = if (alt == 0) { //\\ <immediate: return is_in_array(\"\", keyword, MAX_KEYWORD) ;>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_XXkeyword_not_allowed_in_context_of_an_identifier://\\ P<XXkeyword-not-allowed-in-context-of-an-identifier> = if (alt == 0) { //\\ "if", } else if (alt == 1) { //\\ "const", } else if (alt == 2) { //\\ "struct", } else if (alt == 3) { //\\ "union", } else if (alt == 4) { //\\ "sizeof", } else if (alt == 5) { //\\ "typeof", } else if (alt == 6) { //\\ "double", } else if (alt == 7) { //\\ "long", } else if (alt == 8) { //\\ "char", } else if (alt == 9) { //\\ "float", } else if (alt == 10) { //\\ "void", } else if (alt == 11) { //\\ "enum", } else if (alt == 12) { //\\ "short", } else if (alt == 13) { //\\ "int", } else if (alt == 14) { //\\ "signed", } else if (alt == 15) { //\\ "unsigned", } else if (alt == 16) { //\\ "volatile", } else if (alt == 17) { //\\ "auto", } else if (alt == 18) { //\\ "register", } else if (alt == 19) { //\\ "static", } else if (alt == 20) { //\\ "extern", } else if (alt == 21) { //\\ "goto", } else if (alt == 22) { //\\ "continue", } else if (alt == 23) { //\\ "break", } else if (alt == 24) { //\\ "return", } else if (alt == 25) { //\\ "while", } else if (alt == 26) { //\\ "do", } else if (alt == 27) { //\\ "for", } else if (alt == 28) { //\\ "switch", } else if (alt == 29) { //\\ "else", } else if (alt == 30) { //\\ "case", } else if (alt == 31) { //\\ "default", } else if (alt == 32) { //\\ "typedef"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_ignored: //\\ P<ignored> = if (alt == 0) { //\\ <immediate:return FALSE;> ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_SS: //\\ P<SS> = if (alt == 0) { //\\ <opt-external-declaration-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_external_declaration_list://\\ P<opt-external-declaration-list> = if (alt == 0) { //\\ <external-declaration> <opt-external-declaration-list>, } else if (alt == 1) { //\\ <EOF>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_external_declaration://\\ P<external-declaration> = if (alt == 0) { //\\ <typedef-declaration> ';', } else if (alt == 1) { //\\ <proc-fn-decl>, } else if (alt == 2) { //\\ <possibly-initialised-scalar-or-array-decl>, } else if (alt == 3) { //\\ <enum-specifier>, } else if (alt == 4) { //\\ <struct-or-union-specifier>, } else if (alt == 5) { //\\ ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # Oops - these can be initialised. Not yet done so. //\\ # case AST_struct_or_union_specifier://\\ P<struct-or-union-specifier> = if (alt == 0) { //\\ <struct-or-union> <identifier> '{' <struct-field-declarations> '}', } else if (alt == 1) { //\\ <struct-or-union> '{' <struct-field-declarations> '}', } else if (alt == 2) { //\\ <struct-or-union> <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_or_union: //\\ P<struct-or-union> = if (alt == 0) { //\\ "struct", } else if (alt == 1) { //\\ "union"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_field_declarations://\\ P<struct-field-declarations> = if (alt == 0) { //\\ <struct-field-declaration> <rest-of-struct-field-declarations>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_struct_field_declarations://\\ P<rest-of-struct-field-declarations> = if (alt == 0) { //\\ <struct-field-declaration> <rest-of-struct-field-declarations>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_field_declaration://\\ P<struct-field-declaration> = if (alt == 0) { //\\ <possibly-initialised-scalar-or-array-decl>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # I originally thought you could only initialise an array after a declaration //\\ # that had '[]' in it. But not the case - a typedef'd declaration may have //\\ # the array part in the typedef rather than the instance. Ugly language. //\\ # //\\ # Also we can have initialised structs :-/ //\\ # case AST_possibly_initialised_scalar_or_array_decl://\\ P<possibly-initialised-scalar-or-array-decl> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <type> <rest-of-scalar-or-array-decl> ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # The <opt-scalar-init> part of function pointers is usually going to be "= &procname"... any other type of scalar is dubious... case AST_rest_of_scalar_or_array_decl://\\ P<rest-of-scalar-or-array-decl> = if (alt == 0) { //\\ <opt-indirection-decl> <identifier> <array-bounds> <opt-array-init> <opt-rest-of-scalar-or-array-decl>, } else if (alt == 1) { //\\ <opt-indirection-decl> '(' <opt-indirection-decl> <identifier> ')' '(' <opt-param-list> ')' <opt-scalar-init> <opt-rest-of-scalar-or-array-decl>, } else if (alt == 2) { //\\ <opt-indirection-decl> <identifier> <opt-scalar-init> <opt-rest-of-scalar-or-array-decl>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_rest_of_scalar_or_array_decl://\\ P<opt-rest-of-scalar-or-array-decl> = if (alt == 0) { //\\ ',' <rest-of-scalar-or-array-decl>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_scalar_init: //\\ P<opt-scalar-init> = if (alt == 0) { //\\ '=' <assignment-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_assignment_expression://\\ P<assignment-expression> = if (alt == 0) { //\\ <opt-lvalue-assign> <conditional-expression> <opt-rest-of-assignment-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_rest_of_assignment_expression://\\ P<opt-rest-of-assignment-expression> = if (alt == 0) { //\\ <assignment-operator> <conditional-expression> <opt-rest-of-assignment-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_conditional_expression://\\ P<conditional-expression> = if (alt == 0) { //\\ <logical-or-expression> <rest-of-conditional-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_conditional_expression://\\ P<rest-of-conditional-expression> = if (alt == 0) { //\\ '?' <expression> ':' <conditional-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_expression: //\\ P<expression> = if (alt == 0) { //\\ <comma-statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_comma_statement: //\\ P<comma-statement> = if (alt == 0) { //\\ <assignment-expression> <rest-of-comma-statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_comma_statement://\\ P<rest-of-comma-statement> = if (alt == 0) { //\\ ',' <assignment-expression> <rest-of-comma-statement>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_logical_or_expression://\\ P<logical-or-expression> = if (alt == 0) { //\\ <logical-and-expression> <rest-of-logical-or-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_logical_or_expression://\\ P<rest-of-logical-or-expression> = if (alt == 0) { //\\ <oror> <logical-and-expression> <rest-of-logical-or-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_logical_and_expression://\\ P<logical-and-expression> = if (alt == 0) { //\\ <inclusive-or-expression> <rest-of-logical-and-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_logical_and_expression://\\ P<rest-of-logical-and-expression> = if (alt == 0) { //\\ <andand> <inclusive-or-expression> <rest-of-logical-and-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_inclusive_or_expression://\\ P<inclusive-or-expression> = if (alt == 0) { //\\ <exclusive-or-expression> <rest-of-inclusive-or-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_inclusive_or_expression://\\ P<rest-of-inclusive-or-expression> = if (alt == 0) { //\\ '|' <exclusive-or-expression> <rest-of-inclusive-or-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_exclusive_or_expression://\\ P<exclusive-or-expression> = if (alt == 0) { //\\ <bitwise-and-expression> <rest-of-exclusive-or-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_exclusive_or_expression://\\ P<rest-of-exclusive-or-expression> = if (alt == 0) { //\\ '^' <bitwise-and-expression> <rest-of-exclusive-or-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_bitwise_and_expression://\\ P<bitwise-and-expression> = if (alt == 0) { //\\ <equality-expression> <rest-of-bitwise-and-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_bitwise_and_expression://\\ P<rest-of-bitwise-and-expression> = if (alt == 0) { //\\ '&' <equality-expression> <rest-of-bitwise-and-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_equality_expression://\\ P<equality-expression> = if (alt == 0) { //\\ <relational-expression> <rest-of-equality-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_equality_expression://\\ P<rest-of-equality-expression> = if (alt == 0) { //\\ <eqop> <relational-expression> <rest-of-equality-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_relational_expression://\\ P<relational-expression> = if (alt == 0) { //\\ <shift-expression> <rest-of-relational-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_relational_expression://\\ P<rest-of-relational-expression> = if (alt == 0) { //\\ <relop> <shift-expression> <rest-of-relational-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_shift_expression: //\\ P<shift-expression> = if (alt == 0) { //\\ <additive-expression> <rest-of-shift-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_shift_expression://\\ P<rest-of-shift-expression> = if (alt == 0) { //\\ <shiftop> <additive-expression> <rest-of-shift-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_additive_expression://\\ P<additive-expression> = if (alt == 0) { //\\ <multiplicative-expression> <rest-of-additive-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_additive_expression://\\ P<rest-of-additive-expression> = if (alt == 0) { //\\ <plusminus> <multiplicative-expression> <rest-of-additive-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_multiplicative_expression://\\ P<multiplicative-expression> = if (alt == 0) { //\\ <unary-rvalue-expression> <rest-of-multiplicative-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_multiplicative_expression://\\ P<rest-of-multiplicative-expression> = if (alt == 0) { //\\ <mulop> <unary-rvalue-expression> <rest-of-multiplicative-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # my reading of the spec is that "sizeof" <type-specifier> is valid but "sizeof" '(' <type-specifier> ')' is not, //\\ # however the latter appears to be accepted by gcc. //\\ # Should we merge <type-specifier> with <opt-indirection-unary-ops>? Is <type-specifier> ever used without an optional '*' following? case AST_unary_rvalue_expression://\\ P<unary-rvalue-expression> = if (alt == 0) { //\\ <arithmetic-unary-op> <optionally-cast-unary-rvalue-expression>, } else if (alt == 1) { //\\ <boolean-unary-ops> <optionally-cast-unary-rvalue-expression>, } else if (alt == 2) { //\\ <bitwise-unary-ops> <optionally-cast-unary-rvalue-expression>, } else if (alt == 3) { //\\ <indirection-unary-ops> <unary-address-expression>, } else if (alt == 4) { //\\ "sizeof" <unary-rvalue-expression>, } else if (alt == 5) { //\\ "sizeof" <unary-lvalue-expression>, } else if (alt == 6) { //\\ "sizeof" <type-specifier> <opt-indirection-unary-ops>, } else if (alt == 7) { //\\ "sizeof" '(' <type-specifier> <opt-indirection-unary-ops> ')', } else if (alt == 8) { //\\ <optionally-cast-postfix-rvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_optionally_cast_postfix_rvalue_expression://\\ P<optionally-cast-postfix-rvalue-expression> = if (alt == 0) { //\\ <cast> <optionally-cast-postfix-rvalue-expression>, } else if (alt == 1) { //\\ <postfix-rvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_postfix_rvalue_expression://\\ P<postfix-rvalue-expression> = if (alt == 0) { //\\ <primary-expression> <rest-of-postfix-rvalue-expression>, } else if (alt == 1) { //\\ <unary-lvalue-expression> <rest-of-postfix-rvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_postfix_rvalue_expression://\\ P<rest-of-postfix-rvalue-expression> = if (alt == 0) { //\\ '[' <expression> ']' <rest-of-postfix-rvalue-expression>, } else if (alt == 1) { //\\ '(' <actual-param-list> ')' <rest-of-postfix-rvalue-expression>, } else if (alt == 2) { //\\ '.' <identifier> <rest-of-postfix-rvalue-expression>, } else if (alt == 3) { //\\ '-' '>' <identifier> <rest-of-postfix-rvalue-expression>, } else if (alt == 4) { //\\ <post-increment-op> <rest-of-postfix-rvalue-expression>, } else if (alt == 5) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_post_increment_op: //\\ P<post-increment-op> = if (alt == 0) { //\\ <pp>, } else if (alt == 1) { //\\ <mm>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_actual_param_list: //\\ P<actual-param-list> = if (alt == 0) { //\\ <assignment-expression> <rest-of-param-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_param_list: //\\ P<rest-of-param-list> = if (alt == 0) { //\\ ',' <assignment-expression> <rest-of-param-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_unary_lvalue_expression://\\ P<unary-lvalue-expression> = if (alt == 0) { //\\ <pre-increment-op> <unary-lvalue-expression>, } else if (alt == 1) { //\\ <indirection-unary-ops> <optionally-cast-unary-lvalue-expression>, } else if (alt == 2) { //\\ <unary-address-expression>, } else if (alt == 3) { //\\ <postfix-lvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_postfix_lvalue_expression://\\ P<postfix-lvalue-expression> = if (alt == 0) { //\\ <primary-expression> <rest-of-postfix-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_postfix_expression://\\ P<rest-of-postfix-expression> = if (alt == 0) { //\\ '[' <expression> ']' <rest-of-postfix-expression>, } else if (alt == 1) { //\\ '(' <actual-param-list> ')' <non-empty-rest-of-postfix-expression>, } else if (alt == 2) { //\\ '.' <identifier> <rest-of-postfix-expression>, } else if (alt == 3) { //\\ '-' '>' <identifier> <rest-of-postfix-expression>, } else if (alt == 4) { //\\ <post-increment-op> <rest-of-postfix-expression>, } else if (alt == 5) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_non_empty_rest_of_postfix_expression://\\ P<non-empty-rest-of-postfix-expression> = if (alt == 0) { //\\ '[' <expression> ']' <rest-of-postfix-expression>, } else if (alt == 1) { //\\ '(' <actual-param-list> ')' <non-empty-rest-of-postfix-expression>, } else if (alt == 2) { //\\ '.' <identifier> <rest-of-postfix-expression>, } else if (alt == 3) { //\\ '-' '>' <identifier> <rest-of-postfix-expression>, } else if (alt == 4) { //\\ <post-increment-op> <rest-of-postfix-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_primary_expression: //\\ P<primary-expression> = if (alt == 0) { //\\ <identifier>, } else if (alt == 1) { //\\ <constant>, } else if (alt == 2) { //\\ <dqstring>, } else if (alt == 3) { //\\ '(' <expression> ')'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_constant: //\\ P<constant> = if (alt == 0) { //\\ <integer-constant>, } else if (alt == 1) { //\\ <sqstring>, } else if (alt == 2) { //\\ <floating-constant>, } else if (alt == 3) { //\\ <enumeration-constant>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_enumeration_constant://\\ P<enumeration-constant> = if (alt == 0) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_unary_address_expression://\\ P<unary-address-expression> = if (alt == 0) { //\\ <address-operator> <optionally-cast-unary-lvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_optionally_cast_unary_lvalue_expression://\\ P<optionally-cast-unary-lvalue-expression> = if (alt == 0) { //\\ <cast> <optionally-cast-unary-lvalue-expression>, } else if (alt == 1) { //\\ <unary-lvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_cast: //\\ P<cast> = if (alt == 0) { //\\ '(' <type-specifier> <opt-indirection-unary-ops> ')', } else if (alt == 1) { //\\ '(' "typeof" '(' <unary-lvalue-expression> ')' ')', } else if (alt == 2) { //\\ '(' "typeof" '(' <type-specifier> <opt-indirection-unary-ops> ')' ')'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # <opt-indirection-decl> looks just like <opt-indirection-unary-ops> except that it only //\\ # happens in a declaration, not a data access. The significant difference is that the '*' //\\ # can be preceded by a "const" (and maybe "volatile") keyword, eg "int const *fred" which //\\ # is a constant pointer to an int. //\\ # case AST_opt_indirection_decl://\\ P<opt-indirection-decl> = if (alt == 0) { //\\ <opt-const-or-volatile-type-qualifier> '*' <opt-indirection-decl>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_indirection_unary_ops://\\ P<indirection-unary-ops> = if (alt == 0) { //\\ '*' <opt-indirection-unary-ops>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_indirection_unary_ops://\\ P<opt-indirection-unary-ops> = if (alt == 0) { //\\ '*' <opt-indirection-unary-ops>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_type_specifier: //\\ P<type-specifier> = if (alt == 0) { //\\ <basic-type-specifier>, } else if (alt == 1) { //\\ <typedef-name>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_typedef_name: //\\ P<typedef-name> = if (alt == 0) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # I think struct or union or enum specifier below can be an actual declaration using '{}'s //\\ # rather than just a struct or enum name. //\\ # case AST_basic_type_specifier://\\ P<basic-type-specifier> = if (alt == 0) { //\\ "double", } else if (alt == 1) { //\\ "long" "double", } else if (alt == 2) { //\\ <opt-signed> "char", } else if (alt == 3) { //\\ <opt-signed-inttype>, } else if (alt == 4) { //\\ "float", } else if (alt == 5) { //\\ <struct-or-union-specifier>, } else if (alt == 6) { //\\ <enum-specifier>, } else if (alt == 7) { //\\ "void"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_enum_specifier: //\\ P<enum-specifier> = if (alt == 0) { //\\ "enum" '{' <enumerator-list> '}', } else if (alt == 1) { //\\ "enum" <identifier> '{' <enumerator-list> '}', } else if (alt == 2) { //\\ "enum" <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_enumerator_list: //\\ P<enumerator-list> = if (alt == 0) { //\\ <enumerator> <rest-of-enumerator-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_enumerator_list://\\ P<rest-of-enumerator-list> = if (alt == 0) { //\\ ',' <enumerator> <rest-of-enumerator-list>, } else if (alt == 1) { //\\ ',', } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_enumerator: //\\ P<enumerator> = if (alt == 0) { //\\ <identifier> '=' <constant-expression>, } else if (alt == 1) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_constant_expression://\\ P<constant-expression> = if (alt == 0) { //\\ <conditional-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # does this omit "signed int"? - check, and add <opt-signed> "int" if needed... case AST_opt_signed_inttype: //\\ P<opt-signed-inttype> = if (alt == 0) { //\\ <opt-signed> "short" <opt-int>, } else if (alt == 1) { //\\ <opt-signed> "long" "long" <opt-int>, } else if (alt == 2) { //\\ <opt-signed> "long" <opt-int>, } else if (alt == 3) { //\\ <opt-signed> "int", } else if (alt == 4) { //\\ "signed", } else if (alt == 5) { //\\ "unsigned"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_int: //\\ P<opt-int> = if (alt == 0) { //\\ "int", } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_signed: //\\ P<opt-signed> = if (alt == 0) { //\\ "signed", } else if (alt == 1) { //\\ "unsigned", } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_address_operator: //\\ P<address-operator> = if (alt == 0) { //\\ '&'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_pre_increment_op: //\\ P<pre-increment-op> = if (alt == 0) { //\\ <pp>, } else if (alt == 1) { //\\ <mm>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_optionally_cast_unary_rvalue_expression://\\ P<optionally-cast-unary-rvalue-expression> = if (alt == 0) { //\\ <cast> <optionally-cast-unary-rvalue-expression>, } else if (alt == 1) { //\\ <unary-rvalue-expression>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_bitwise_unary_ops: //\\ P<bitwise-unary-ops> = if (alt == 0) { //\\ '~' <rest-of-bitwise-unary-ops>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_bitwise_unary_ops://\\ P<rest-of-bitwise-unary-ops> = if (alt == 0) { //\\ '~' <rest-of-bitwise-unary-ops>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_boolean_unary_ops: //\\ P<boolean-unary-ops> = if (alt == 0) { //\\ '!' <rest-of-boolean-unary-ops>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_boolean_unary_ops://\\ P<rest-of-boolean-unary-ops> = if (alt == 0) { //\\ '!' <rest-of-boolean-unary-ops>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_arithmetic_unary_op://\\ P<arithmetic-unary-op> = if (alt == 0) { //\\ '+', } else if (alt == 1) { //\\ '-'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_mulop: //\\ P<mulop> = if (alt == 0) { //\\ '*', } else if (alt == 1) { //\\ '/', } else if (alt == 2) { //\\ '%'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_plusminus: //\\ P<plusminus> = if (alt == 0) { //\\ '+', } else if (alt == 1) { //\\ '-'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_shiftop: //\\ P<shiftop> = if (alt == 0) { //\\ '<' '<', } else if (alt == 1) { //\\ '>' '>'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_relop: //\\ P<relop> = if (alt == 0) { //\\ '<' '=', } else if (alt == 1) { //\\ '<', } else if (alt == 2) { //\\ '>' '=', } else if (alt == 3) { //\\ '>'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_eqop: //\\ P<eqop> = if (alt == 0) { //\\ <eqeq>, } else if (alt == 1) { //\\ '!' '='; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_assignment_operator://\\ P<assignment-operator> = if (alt == 0) { //\\ '=', } else if (alt == 1) { //\\ '*' '=', } else if (alt == 2) { //\\ '/' '=', } else if (alt == 3) { //\\ '%' '=', } else if (alt == 4) { //\\ '+' '=', } else if (alt == 5) { //\\ '-' '=', } else if (alt == 6) { //\\ '<' '<' '=', } else if (alt == 7) { //\\ '>' '>' '=', } else if (alt == 8) { //\\ '&' '=', } else if (alt == 9) { //\\ '^' '=', } else if (alt == 10) { //\\ '|' '='; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_lvalue_assign: //\\ P<opt-lvalue-assign> = if (alt == 0) { //\\ <unary-lvalue-expression> <assignment-operator>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_array_init: //\\ P<opt-array-init> = if (alt == 0) { //\\ '=' '{' <constant-initializer-list> '}', } else if (alt == 1) { //\\ '=' <dqstring>, } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_constant_initializer_list://\\ P<constant-initializer-list> = if (alt == 0) { //\\ <constant-initializer> <rest-of-constant-initializer-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_constant_initializer_list://\\ P<rest-of-constant-initializer-list> = if (alt == 0) { //\\ ',' <constant-initializer> <rest-of-constant-initializer-list>, } else if (alt == 1) { //\\ ',', } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_constant_initializer://\\ P<constant-initializer> = if (alt == 0) { //\\ <constant-expression>, } else if (alt == 1) { //\\ '{' <constant-initializer-list> '}'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_array_bounds: //\\ P<array-bounds> = if (alt == 0) { //\\ '[' <opt-constant-expression> ']' <opt-array-bounds>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_array_bounds: //\\ P<opt-array-bounds> = if (alt == 0) { //\\ '[' <opt-constant-expression> ']' <opt-array-bounds>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_constant_expression://\\ P<opt-constant-expression> = if (alt == 0) { //\\ <constant-expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_type: //\\ P<type> = if (alt == 0) { //\\ <enum-specifier>, } else if (alt == 1) { //\\ <struct-or-union-specifier>, } else if (alt == 2) { //\\ "typeof" '(' <unary-lvalue-expression> ')', } else if (alt == 3) { //\\ "typeof" '(' <type-specifier> <opt-indirection-unary-ops> ')', } else if (alt == 4) { //\\ <basic-type-specifier>, } else if (alt == 5) { //\\ <typedef-name>, } else if (alt == 6) { //\\ "void"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_const_or_volatile_type_qualifier://\\ P<opt-const-or-volatile-type-qualifier> = if (alt == 0) { //\\ <const-or-volatile-type-qualifier>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_const_or_volatile_type_qualifier://\\ P<const-or-volatile-type-qualifier> = if (alt == 0) { //\\ "const", } else if (alt == 1) { //\\ "volatile"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_auto_reg_static_ext://\\ P<opt-auto-reg-static-ext> = if (alt == 0) { //\\ "auto", } else if (alt == 1) { //\\ "register", } else if (alt == 2) { //\\ "static", } else if (alt == 3) { //\\ "extern", } else if (alt == 4) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_identifier_list: //\\ P<identifier-list> = if (alt == 0) { //\\ <identifier> <rest-of-identifier-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_identifier_list://\\ P<rest-of-identifier-list> = if (alt == 0) { //\\ ',' <identifier-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_more_forward_decls_or_actual_body://\\ P<more-forward-decls-or-actual-body> = if (alt == 0) { //\\ <opt-extern-proc-name-and-params-list> ';', } else if (alt == 1) { //\\ <compound-statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_extern_proc_spec: //\\ P<extern-proc-spec> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <opt-basic-type-specifier-or-typedef-name>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_basic_type_specifier_or_typedef_name://\\ P<opt-basic-type-specifier-or-typedef-name> = if (alt == 0) { //\\ <opt-basic-type-specifier>, } else if (alt == 1) { //\\ <typedef-name>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_identifier_or_function_pointer://\\ P<identifier-or-function-pointer> = if (alt == 0) { //\\ '(' '*' <identifier> ')', } else if (alt == 1) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_extern_proc_name_and_params://\\ P<extern-proc-name-and-params> = if (alt == 0) { //\\ <opt-indirection-decl> <identifier-or-function-pointer> '(' <opt-param-list> ')'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_extern_proc_name_and_params_list://\\ P<opt-extern-proc-name-and-params-list> = if (alt == 0) { //\\ ',' <extern-proc-name-and-params> <opt-extern-proc-name-and-params-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_proc_fn_decl: //\\ P<proc-fn-decl> = if (alt == 0) { //\\ <extern-proc-spec> <extern-proc-name-and-params> <more-forward-decls-or-actual-body>, } else if (alt == 1) { //\\ <extern-proc-spec> <opt-indirection-decl> <identifier> '(' <identifier-list> ')' <opt-oldstyle-param-list> ';' <compound-statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_compound_statement: //\\ P<compound-statement> = if (alt == 0) { //\\ '{' '}', } else if (alt == 1) { //\\ '{' <statement-list> '}'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # Actually I don't think declarations inside a block are allowed //\\ # to be preceded by labels. //\\ # So the three lines below (which are in P<statement>) probably should //\\ # be separated out and put in <statement-list> below separately from the //\\ # options which can have <opt-labels> in front of them. //\\ # //\\ # <extern-proc-spec> <extern-proc-name-and-params> <more-forward-decls-or-actual-body>, //\\ # <in-proc-data-declaration>, //\\ # <opt-external-declaration-list>; //\\ # Also still to add are label declarations (inside blocks): //\\ # P<label-declaration> = //\\ # "__label__" <identifier-list> ';'; //\\ # (I'm not sure if "label" as a keyword is valid too, or does it have to be #define'd as __label__ ? case AST_statement_list: //\\ P<statement-list> = if (alt == 0) { //\\ <opt-labels> <statement> <rest-of-statement-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_statement_list://\\ P<rest-of-statement-list> = if (alt == 0) { //\\ <opt-labels> <statement> <rest-of-statement-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # added as a test: <extern-proc-spec> <extern-proc-name-and-params> <more-forward-decls-or-actual-body>, case AST_statement: //\\ P<statement> = if (alt == 0) { //\\ ';', } else if (alt == 1) { //\\ <compound-statement>, } else if (alt == 2) { //\\ <selection-statement>, } else if (alt == 3) { //\\ <iteration-statement>, } else if (alt == 4) { //\\ <jump-statement>, } else if (alt == 5) { //\\ <expression> ';', } else if (alt == 6) { //\\ <extern-proc-spec> <extern-proc-name-and-params> <more-forward-decls-or-actual-body>, } else if (alt == 7) { //\\ <in-proc-data-declaration>, } else if (alt == 8) { //\\ <opt-external-declaration-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_in_proc_data_declaration://\\ P<in-proc-data-declaration> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <type> <decl-list>, } else if (alt == 1) { //\\ <struct-decl>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_decl: //\\ P<struct-decl> = if (alt == 0) { //\\ "struct" <new-structname> '{' <struct-member-list> '}'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_member_list: //\\ P<struct-member-list> = if (alt == 0) { //\\ <struct-member-declaration> <struct-member-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_struct_member_declaration://\\ P<struct-member-declaration> = if (alt == 0) { //\\ <struct-decl>, } else if (alt == 1) { //\\ <possibly-initialised-scalar-decl>, } else if (alt == 2) { //\\ <possibly-initialised-array-decl>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_possibly_initialised_array_decl://\\ P<possibly-initialised-array-decl> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <type> <opt-indirection-decl> <identifier> <array-bounds> <opt-array-init> ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_possibly_initialised_scalar_decl://\\ P<possibly-initialised-scalar-decl> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <type> <rest-of-scalar-decl>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_scalar_decl://\\ P<rest-of-scalar-decl> = if (alt == 0) { //\\ <opt-indirection-decl> <identifier> <opt-scalar-init> <opt-rest-of-scalar-decl> ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_rest_of_scalar_decl://\\ P<opt-rest-of-scalar-decl> = if (alt == 0) { //\\ ',' <opt-indirection-decl> <identifier> <opt-scalar-init> <opt-rest-of-scalar-decl>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_new_structname: //\\ P<new-structname> = if (alt == 0) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_decl_list: //\\ P<decl-list> = if (alt == 0) { //\\ <decl> <rest-of-decl-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_decl_list: //\\ P<rest-of-decl-list> = if (alt == 0) { //\\ ',' <decl-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_decl: //\\ P<decl> = if (alt == 0) { //\\ <opt-indirection-decl> <identifier> <possibly-empty-array-bounds-list> <opt-array-init>, } else if (alt == 1) { //\\ <opt-indirection-decl> <identifier> <opt-scalar-init>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_possibly_empty_array_bounds_list://\\ P<possibly-empty-array-bounds-list> = if (alt == 0) { //\\ '[' <opt-constant-expression> ']' <optional-possibly-empty-array-bounds-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_optional_possibly_empty_array_bounds_list://\\ P<optional-possibly-empty-array-bounds-list> = if (alt == 0) { //\\ '[' <opt-constant-expression> ']' <optional-possibly-empty-array-bounds-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_jump_statement: //\\ P<jump-statement> = if (alt == 0) { //\\ "goto" <label> ';', } else if (alt == 1) { //\\ "continue" ';', } else if (alt == 2) { //\\ "break" ';', } else if (alt == 3) { //\\ "return" <opt-expression> ';'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_expression: //\\ P<opt-expression> = if (alt == 0) { //\\ <expression>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_label: //\\ P<label> = if (alt == 0) { //\\ <identifier>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_iteration_statement://\\ P<iteration-statement> = if (alt == 0) { //\\ "while" '(' <expression> ')' <statement>, } else if (alt == 1) { //\\ "do" <statement> "while" '(' <expression> ')' ';', } else if (alt == 2) { //\\ "for" '(' <opt-expression> ';' <opt-expression> ';' <opt-expression> ')' <statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_selection_statement://\\ P<selection-statement> = if (alt == 0) { //\\ "if" '(' <expression> ')' <statement> <opt-else>, } else if (alt == 1) { //\\ "switch" '(' <expression> ')' <statement>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_else: //\\ P<opt-else> = if (alt == 0) { //\\ "else" <statement>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # guard to give better error on "label: }" which should be "label: ; }" case AST_missing_semicolon_after_label_at_end_of_block://\\ P<missing-semicolon-after-label-at-end-of-block> = if (alt == 0) { //\\ '}'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_labels: //\\ P<opt-labels> = if (alt == 0) { //\\ <label> ':' <opt-labels> <!missing-semicolon-after-label-at-end-of-block>, } else if (alt == 1) { //\\ "case" <constant-expression> ':' <opt-labels> <!missing-semicolon-after-label-at-end-of-block>, } else if (alt == 2) { //\\ "default" ':' <opt-labels> <!missing-semicolon-after-label-at-end-of-block>, } else if (alt == 3) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # formal parameter list can also be just a list of types (but can still end in "...") //\\ # normal current style however is to have named parameters. //\\ # case AST_opt_param_list: //\\ P<opt-param-list> = if (alt == 0) { //\\ <formal-param> <opt-rest-of-param-list>, } else if (alt == 1) { //\\ "void", } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_oldstyle_param_list://\\ P<opt-oldstyle-param-list> = if (alt == 0) { //\\ <oldstyle-param-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_oldstyle_param_list://\\ P<oldstyle-param-list> = if (alt == 0) { //\\ <oldstyle-formal-param> <opt-rest-of-oldstyle-param-list>, } else if (alt == 1) { //\\ "void"; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_rest_of_oldstyle_param_list://\\ P<opt-rest-of-oldstyle-param-list> = if (alt == 0) { //\\ ';' <oldstyle-param-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_oldstyle_formal_param://\\ P<oldstyle-formal-param> = if (alt == 0) { //\\ <opt-const-or-volatile-type-qualifier> <type> <oldstyle-parameter-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_oldstyle_parameter_list://\\ P<oldstyle-parameter-list> = if (alt == 0) { //\\ <whatever> <rest-of-oldstyle-parameter-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_oldstyle_parameter_list://\\ P<rest-of-oldstyle-parameter-list> = if (alt == 0) { //\\ ',' <oldstyle-parameter-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_whatever: //\\ P<whatever> = if (alt == 0) { //\\ <opt-indirection-decl> <opt-identifier> <optional-possibly-empty-array-bounds-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_rest_of_param_list://\\ P<opt-rest-of-param-list> = if (alt == 0) { //\\ ',' '.' '.' '.', } else if (alt == 1) { //\\ ',' <formal-param> <opt-rest-of-param-list>, } else if (alt == 2) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_formal_param: //\\ P<formal-param> = if (alt == 0) { //\\ <procedure-as-parameter>, } else if (alt == 1) { //\\ <opt-const-or-volatile-type-qualifier> <type> <opt-indirection-decl> <opt-identifier> <optional-possibly-empty-array-bounds-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_identifier: //\\ P<opt-identifier> = if (alt == 0) { //\\ <identifier>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_procedure_as_parameter://\\ P<procedure-as-parameter> = if (alt == 0) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <opt-basic-type-specifier> '(' <opt-indirection-decl> <identifier> ')' '(' <opt-param-list> ')', } else if (alt == 1) { //\\ <opt-auto-reg-static-ext> <opt-const-or-volatile-type-qualifier> <typedef-name> '(' <opt-indirection-decl> <identifier> ')' '(' <opt-param-list> ')'; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_opt_basic_type_specifier://\\ P<opt-basic-type-specifier> = if (alt == 0) { //\\ <basic-type-specifier>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; //\\ # Wonder if this would do it? <opt-indirection-decl> '(' <opt-indirection-decl> <identifier> ')' '(' <opt-param-list> ')' <opt-scalar-init> <opt-rest-of-scalar-or-array-decl>, case AST_typedef_declaration://\\ P<typedef-declaration> = if (alt == 0) { //\\ "typedef" <type-specifier> <opt-indirection-decl> '(' <opt-indirection-decl> <identifier> ')' '(' <opt-param-list> ')', } else if (alt == 1) { //\\ "typedef" <struct-decl> <maybe-indirect-typedef-name-list>, } else if (alt == 2) { //\\ "typedef" <type-specifier> <maybe-indirect-typedef-name-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_maybe_indirect_typedef_name_list://\\ P<maybe-indirect-typedef-name-list> = if (alt == 0) { //\\ <opt-indirection-decl> <typedef-name> <rest-of-maybe-indirect-typedef-name-list>; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST_rest_of_maybe_indirect_typedef_name_list://\\ P<rest-of-maybe-indirect-typedef-name-list> = if (alt == 0) { //\\ ',' <maybe-indirect-typedef-name-list>, } else if (alt == 1) { //\\ ; } for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; case AST__LIT: RECONSTITUTE(A[A_child[1]+A_literal_offset], stdout); break; case AST__KW: for (i = A_child[1]; i < A_child[1]+A_child[2]; i++) { // fprintf(stdout, "%s", String(i)); RECONSTITUTE(i, stdout); } break; default: for (i = 1; i <= count; i++) compile(nthchild(astp,i)); break; } }