]> git.saurik.com Git - bison.git/blobdiff - src/tables.h
Merge remote-tracking branch 'origin/maint'
[bison.git] / src / tables.h
index 27ff7b54faef73a32eb28e495a2d737dc9b1e456..8b5c1fa4c285d54c74879cf5b5db478913c0a845 100644 (file)
@@ -1,22 +1,21 @@
 /* Prepare the LALR and GLR parser tables.
 /* Prepare the LALR and GLR parser tables.
-   Copyright (C) 2002  Free Software Foundation, Inc.
+
+   Copyright (C) 2002, 2004, 2009-2012 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
-   Bison is free software; you can redistribute it and/or modify it
-   under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
-   any later version.
+   This program is free software: you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation, either version 3 of the License, or
+   (at your option) any later version.
 
 
-   Bison is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
 
    You should have received a copy of the GNU General Public License
-   along with Bison; see the file COPYING.  If not, write to the Free
-   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #ifndef TABLES_H_
 # define TABLES_H_
 
 #ifndef TABLES_H_
 # define TABLES_H_
 
    YYSTOS[S] = the symbol number of the symbol that leads to state S.
 
 
    YYSTOS[S] = the symbol number of the symbol that leads to state S.
 
-   YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE
-   doesn't specify something else to do.  Zero means the default is an
-   error.
+   YYFINAL = the state number of the termination state.
+
+   YYTABLE = a vector filled with portions for different uses, found
+   via YYPACT and YYPGOTO, described below.
+
+   YYLAST ( = high) the number of the last element of YYTABLE, i.e.,
+   sizeof (YYTABLE) - 1.
+
+   YYCHECK = a vector indexed in parallel with YYTABLE.  It indicates,
+   in a roundabout way, the bounds of the portion you are trying to
+   examine.
+
+   Suppose that the portion of YYTABLE starts at index P and the index
+   to be examined within the portion is I.  Then if YYCHECK[P+I] != I,
+   I is outside the bounds of what is actually allocated, and the
+   default (from YYDEFACT or YYDEFGOTO) should be used.  Otherwise,
+   YYTABLE[P+I] should be used.
+
+   YYDEFACT[S] = default reduction number in state s.  Performed when
+   YYTABLE doesn't specify something else to do.  Zero means the default
+   is an error.
 
    YYDEFGOTO[I] = default state to go to after a reduction of a rule
    that generates variable NTOKENS + I, except when YYTABLE specifies
    something else to do.
 
    YYPACT[S] = index in YYTABLE of the portion describing state S.
 
    YYDEFGOTO[I] = default state to go to after a reduction of a rule
    that generates variable NTOKENS + I, except when YYTABLE specifies
    something else to do.
 
    YYPACT[S] = index in YYTABLE of the portion describing state S.
-   The lookahead token's type is used to index that portion to find
-   out what to do.
+   The lookahead token's number, I, is used to index that portion of
+   YYTABLE to find out what action to perform.
+
+   If YYPACT[S] == YYPACT_NINF, if YYPACT[S] + I is outside the bounds
+   of YYTABLE (from 0 to YYLAST), or I is outside the bounds for portion
+   S (that is, YYCHECK[YYPACT[S] + I] != I), then the default action
+   (that is, YYDEFACT[S]) should be used instead of YYTABLE.  Otherwise,
+   the value YYTABLE[YYPACT[S] + I] should be used even if
+   YYPACT[S] < 0.
 
    If the value in YYTABLE is positive, we shift the token and go to
    that state.
 
    If the value is negative, it is minus a rule number to reduce by.
 
 
    If the value in YYTABLE is positive, we shift the token and go to
    that state.
 
    If the value is negative, it is minus a rule number to reduce by.
 
-   If the value is zero, the default action from YYDEFACT[S] is used.
+   If the value is YYTABLE_NINF, it's a syntax error.
 
    YYPGOTO[I] = the index in YYTABLE of the portion describing what to
    do after reducing a rule that derives variable I + NTOKENS.  This
    portion is indexed by the parser state number, S, as of before the
 
    YYPGOTO[I] = the index in YYTABLE of the portion describing what to
    do after reducing a rule that derives variable I + NTOKENS.  This
    portion is indexed by the parser state number, S, as of before the
-   text for this nonterminal was read.  The value from YYTABLE is the
-   state to go to if the corresponding value in YYCHECK is S.
-
-   YYTABLE = a vector filled with portions for different uses, found
-   via YYPACT and YYPGOTO.
-
-   YYCHECK = a vector indexed in parallel with YYTABLE.  It indicates,
-   in a roundabout way, the bounds of the portion you are trying to
-   examine.
-
-   Suppose that the portion of YYTABLE starts at index P and the index
-   to be examined within the portion is I.  Then if YYCHECK[P+I] != I,
-   I is outside the bounds of what is actually allocated, and the
-   default (from YYDEFACT or YYDEFGOTO) should be used.  Otherwise,
-   YYTABLE[P+I] should be used.
-
-   YYFINAL = the state number of the termination state.  YYFLAG = most
-   negative short int.  Used to flag ??  */
+   text for this nonterminal was read.
+
+   If YYPGOTO[I] + S is outside the bounds of YYTABLE (from 0 to YYLAST)
+   or if S is outside the bounds of the portion for I (that is,
+   YYCHECK[YYPGOTO[I] + S] != S), then the default state (that is,
+   YYDEFGOTO[I]) should be used instead of YYTABLE.  Otherwise,
+   YYTABLE[YYPGOTO[I] + S] is the state to go to even if YYPGOTO[I] < 0.
+
+   When the above YYPACT, YYPGOTO, and YYCHECK tests determine that a
+   value from YYTABLE should be used, that value is never zero, so it is
+   useless to check for zero.  When those tests indicate that the value
+   from YYDEFACT or YYDEFGOTO should be used instead, the value from
+   YYTABLE *might* be zero, which, as a consequence of the way in which
+   the tables are constructed, also happens to indicate that YYDEFACT or
+   YYDEFGOTO should be used.  However, the YYTABLE value cannot be
+   trusted when the YYDEFACT or YYDEFGOTO value should be used.  In
+   summary, forget about zero values in YYTABLE.
+*/
 
 extern int nvectors;
 
 
 extern int nvectors;
 
-typedef int base_t;
-extern base_t *base;
+typedef int base_number;
+extern base_number *base;
 /* A distinguished value of BASE, negative infinite.  During the
 /* A distinguished value of BASE, negative infinite.  During the
-   computation equals to BASE_MIN, later mapped to BASE_NINF to
+   computation equals to BASE_MINIMUM, later mapped to BASE_NINF to
    keep parser tables small.  */
    keep parser tables small.  */
-extern base_t base_ninf;
+extern base_number base_ninf;
 
 extern unsigned int *conflict_table;
 extern unsigned int *conflict_list;
 extern int conflict_list_cnt;
 
 
 extern unsigned int *conflict_table;
 extern unsigned int *conflict_list;
 extern int conflict_list_cnt;
 
-extern base_t *table;
-extern base_t *check;
-/* The value used in TABLE to denote explicit parse errors
+extern base_number *table;
+extern base_number *check;
+/* The value used in TABLE to denote explicit syntax errors
    (%nonassoc), a negative infinite.  */
    (%nonassoc), a negative infinite.  */
-extern base_t table_ninf;
+extern base_number table_ninf;
 
 
-extern state_number_t *yydefgoto;
-extern rule_number_t *yydefact;
+extern state_number *yydefgoto;
+extern rule_number *yydefact;
 extern int high;
 
 extern int high;
 
-void tables_generate PARAMS ((void));
-void tables_free PARAMS ((void));
+void tables_generate (void);
+void tables_free (void);
 
 #endif /* !TABLES_H_ */
 
 #endif /* !TABLES_H_ */