summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel E. Denny <jdenny@clemson.edu>2009-08-25 01:12:37 -0400
committerJoel E. Denny <jdenny@clemson.edu>2009-08-25 02:56:46 -0400
commit87412882128fc3ae807f47db23884552f5841e74 (patch)
treee79b031a31974ad29bc4e664bc3e224202d746ad
parente6c849d82a95be8a595c254cc3046cfae725f064 (diff)
downloadbison-87412882128fc3ae807f47db23884552f5841e74.tar.gz
Some code and documentation improvements.
* data/c.m4 (b4_table_value_equals): New macro to capture some repeated code. * data/glr.c (yyis_pact_ninf): Use it here. (yyis_table_ninf): Likewise. (yyreportSyntaxError): Improve internal comments. * data/yacc.c (yyis_pact_ninf): New macro copied from glr.c. Use it everywhere possible. (yyis_table_ninf): Likewise. (yysyntax_error): Improve internal comments. * data/lalr1.cc (yysyntax_error_): Likewise. * data/lalr1.java (yysyntax_error): Likewise. * src/tables.h: Improve comments about yypact, yytable, etc.
-rw-r--r--ChangeLog16
-rw-r--r--data/c.m410
-rw-r--r--data/glr.c11
-rw-r--r--data/lalr1.cc3
-rw-r--r--data/lalr1.java3
-rw-r--r--data/yacc.c15
-rw-r--r--src/tables.h13
7 files changed, 56 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index b831d116..dc11d517 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2009-08-25 Joel E. Denny <jdenny@clemson.edu>
+
+ Some code and documentation improvements.
+ * data/c.m4 (b4_table_value_equals): New macro to capture
+ some repeated code.
+ * data/glr.c (yyis_pact_ninf): Use it here.
+ (yyis_table_ninf): Likewise.
+ (yyreportSyntaxError): Improve internal comments.
+ * data/yacc.c (yyis_pact_ninf): New macro copied from glr.c.
+ Use it everywhere possible.
+ (yyis_table_ninf): Likewise.
+ (yysyntax_error): Improve internal comments.
+ * data/lalr1.cc (yysyntax_error_): Likewise.
+ * data/lalr1.java (yysyntax_error): Likewise.
+ * src/tables.h: Improve comments about yypact, yytable, etc.
+
2009-08-21 Joel E. Denny <jdenny@clemson.edu>
Use locale when quoting.
diff --git a/data/c.m4 b/data/c.m4
index 33a4186c..3ba48db5 100644
--- a/data/c.m4
+++ b/data/c.m4
@@ -157,6 +157,16 @@ m4_define([b4_int_type_for],
[b4_int_type($1_min, $1_max)])
+# b4_table_value_equals(TABLE, VALUE, LITERAL)
+# --------------------------------------------
+# Without inducing a comparison warning from the compiler, check if the
+# literal value LITERAL equals VALUE from table TABLE, which must have
+# TABLE_min and TABLE_max defined.
+m4_define([b4_table_value_equals],
+[m4_if(m4_eval($3 < m4_indir([b4_]$1[_min])
+ || m4_indir([b4_]$1[_max]) < $3), [1],
+ [[YYID (0)]],
+ [[((]$2[) == (]$3[))]])])
## ---------##
## Values. ##
diff --git a/data/glr.c b/data/glr.c
index a4b921f1..b0ad1003 100644
--- a/data/glr.c
+++ b/data/glr.c
@@ -954,9 +954,7 @@ yylhsNonterm (yyRuleNum yyrule)
}
#define yyis_pact_ninf(yystate) \
- ]m4_if(m4_eval(b4_pact_ninf < b4_pact_min), [1],
- [0],
- [((yystate) == YYPACT_NINF)])[
+ ]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[
/** True iff LR state STATE has only a default reduction (regardless
* of token). */
@@ -974,9 +972,7 @@ yydefaultAction (yyStateNum yystate)
}
#define yyis_table_ninf(yytable_value) \
- ]m4_if(m4_eval(b4_table_ninf < b4_table_min), [1],
- [YYID (0)],
- [((yytable_value) == YYTABLE_NINF)])[
+ ]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[
/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN.
* Result R means
@@ -2048,7 +2044,8 @@ yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
/* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
+ YYCHECK. In other words, skip the first -YYN actions for this
+ state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
diff --git a/data/lalr1.cc b/data/lalr1.cc
index 2a9316de..5ce0b47b 100644
--- a/data/lalr1.cc
+++ b/data/lalr1.cc
@@ -954,7 +954,8 @@ b4_error_verbose_if([state_type yystate, int yytoken],
if (yypact_ninf_ < yyn && yyn <= yylast_)
{
/* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
+ YYCHECK. In other words, skip the first -YYN actions for this
+ state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
diff --git a/data/lalr1.java b/data/lalr1.java
index e68650d9..7e274d64 100644
--- a/data/lalr1.java
+++ b/data/lalr1.java
@@ -735,7 +735,8 @@ m4_popdef([b4_at_dollar])])dnl
StringBuffer res;
/* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
+ YYCHECK. In other words, skip the first -YYN actions for this
+ state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
diff --git a/data/yacc.c b/data/yacc.c
index fa14cc54..96892231 100644
--- a/data/yacc.c
+++ b/data/yacc.c
@@ -525,8 +525,14 @@ static const ]b4_int_type_for([b4_toknum])[ yytoknum[] =
#define YYPACT_NINF ]b4_pact_ninf[
+#define yyis_pact_ninf(yystate) \
+ ]b4_table_value_equals([[pact]], [[yystate]], [b4_pact_ninf])[
+
#define YYTABLE_NINF ]b4_table_ninf[
+#define yyis_table_ninf(yytable_value) \
+ ]b4_table_value_equals([[table]], [[yytable_value]], [b4_table_ninf])[
+
]b4_parser_tables_define[
#define yyerrok (yyerrstatus = 0)
@@ -848,7 +854,8 @@ yysyntax_error (char *yyresult, int yystate, int yytoken)
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
/* Start YYX at -YYN if negative to avoid negative indexes in
- YYCHECK. */
+ YYCHECK. In other words, skip the first -YYN actions for this
+ state because they are default actions. */
int yyxbegin = yyn < 0 ? -yyn : 0;
/* Stay within bounds of both yycheck and yytname. */
@@ -1271,7 +1278,7 @@ yybackup:
/* First try to decide what to do without reference to lookahead token. */
yyn = yypact[yystate];
- if (yyn == YYPACT_NINF)
+ if (yyis_pact_ninf (yyn))
goto yydefault;
/* Not known => get a lookahead token if don't already have one. */
@@ -1321,7 +1328,7 @@ yyread_pushed_token:]])[
yyn = yytable[yyn];
if (yyn <= 0)
{
- if (yyn == 0 || yyn == YYTABLE_NINF)
+ if (yyn == 0 || yyis_table_ninf (yyn))
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
@@ -1505,7 +1512,7 @@ yyerrlab1:
for (;;)
{
yyn = yypact[yystate];
- if (yyn != YYPACT_NINF)
+ if (!yyis_pact_ninf (yyn))
{
yyn += YYTERROR;
if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
diff --git a/src/tables.h b/src/tables.h
index a44cdb86..b21fa7b0 100644
--- a/src/tables.h
+++ b/src/tables.h
@@ -54,8 +54,15 @@
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 if YYCHECK indicates that I is
+ outside the bounds of the portion for S, then the default action
+ (from YYDEFACT and YYDEFGOTO) 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.
@@ -64,6 +71,8 @@
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