/usr/share/doc/bison-doc/html/Default-Reductions.html is in bison-doc 1:3.0.2-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
This manual (23 October 2013) is for GNU Bison (version
3.0.2), the GNU parser generator.
Copyright (C) 1988-1993, 1995, 1998-2013 Free Software
Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License,
Version 1.3 or any later version published by the Free Software
Foundation; with no Invariant Sections, with the Front-Cover texts
being "A GNU Manual," and with the Back-Cover Texts as in
(a) below. A copy of the license is included in the section entitled
"GNU Free Documentation License."
(a) The FSF's Back-Cover Text is: "You have the freedom to copy and
modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software
freedom." -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Bison 3.0.2: Default Reductions</title>
<meta name="description" content="Bison 3.0.2: Default Reductions">
<meta name="keywords" content="Bison 3.0.2: Default Reductions">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Index-of-Terms.html#Index-of-Terms" rel="index" title="Index of Terms">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Tuning-LR.html#Tuning-LR" rel="up" title="Tuning LR">
<link href="LAC.html#LAC" rel="next" title="LAC">
<link href="LR-Table-Construction.html#LR-Table-Construction" rel="prev" title="LR Table Construction">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Default-Reductions"></a>
<div class="header">
<p>
Next: <a href="LAC.html#LAC" accesskey="n" rel="next">LAC</a>, Previous: <a href="LR-Table-Construction.html#LR-Table-Construction" accesskey="p" rel="prev">LR Table Construction</a>, Up: <a href="Tuning-LR.html#Tuning-LR" accesskey="u" rel="up">Tuning LR</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Terms.html#Index-of-Terms" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Default-Reductions-1"></a>
<h4 class="subsection">5.8.2 Default Reductions</h4>
<a name="index-default-reductions"></a>
<a name="index-_0025define-lr_002edefault_002dreduction-1"></a>
<a name="index-_0025nonassoc-3"></a>
<p>After parser table construction, Bison identifies the reduction with the
largest lookahead set in each parser state. To reduce the size of the
parser state, traditional Bison behavior is to remove that lookahead set and
to assign that reduction to be the default parser action. Such a reduction
is known as a <em>default reduction</em>.
</p>
<p>Default reductions affect more than the size of the parser tables. They
also affect the behavior of the parser:
</p>
<ul>
<li> Delayed <code>yylex</code> invocations.
<a name="index-delayed-yylex-invocations"></a>
<a name="index-consistent-states"></a>
<a name="index-defaulted-states"></a>
<p>A <em>consistent state</em> is a state that has only one possible parser
action. If that action is a reduction and is encoded as a default
reduction, then that consistent state is called a <em>defaulted state</em>.
Upon reaching a defaulted state, a Bison-generated parser does not bother to
invoke <code>yylex</code> to fetch the next token before performing the reduction.
In other words, whether default reductions are enabled in consistent states
determines how soon a Bison-generated parser invokes <code>yylex</code> for a
token: immediately when it <em>reaches</em> that token in the input or when it
eventually <em>needs</em> that token as a lookahead to determine the next
parser action. Traditionally, default reductions are enabled, and so the
parser exhibits the latter behavior.
</p>
<p>The presence of defaulted states is an important consideration when
designing <code>yylex</code> and the grammar file. That is, if the behavior of
<code>yylex</code> can influence or be influenced by the semantic actions
associated with the reductions in defaulted states, then the delay of the
next <code>yylex</code> invocation until after those reductions is significant.
For example, the semantic actions might pop a scope stack that <code>yylex</code>
uses to determine what token to return. Thus, the delay might be necessary
to ensure that <code>yylex</code> does not look up the next token in a scope that
should already be considered closed.
</p>
</li><li> Delayed syntax error detection.
<a name="index-delayed-syntax-error-detection-1"></a>
<p>When the parser fetches a new token by invoking <code>yylex</code>, it checks
whether there is an action for that token in the current parser state. The
parser detects a syntax error if and only if either (1) there is no action
for that token or (2) the action for that token is the error action (due to
the use of <code>%nonassoc</code>). However, if there is a default reduction in
that state (which might or might not be a defaulted state), then it is
impossible for condition 1 to exist. That is, all tokens have an action.
Thus, the parser sometimes fails to detect the syntax error until it reaches
a later state.
</p>
<a name="index-LAC-1"></a>
<p>While default reductions never cause the parser to accept syntactically
incorrect sentences, the delay of syntax error detection can have unexpected
effects on the behavior of the parser. However, the delay can be caused
anyway by parser state merging and the use of <code>%nonassoc</code>, and it can
be fixed by another Bison feature, LAC. We discuss the effects of delayed
syntax error detection and LAC more in the next section (see <a href="LAC.html#LAC">LAC</a>).
</p></li></ul>
<p>For canonical LR, the only default reduction that Bison enables by default
is the accept action, which appears only in the accepting state, which has
no other action and is thus a defaulted state. However, the default accept
action does not delay any <code>yylex</code> invocation or syntax error detection
because the accept action ends the parse.
</p>
<p>For LALR and IELR, Bison enables default reductions in nearly all states by
default. There are only two exceptions. First, states that have a shift
action on the <code>error</code> token do not have default reductions because
delayed syntax error detection could then prevent the <code>error</code> token
from ever being shifted in that state. However, parser state merging can
cause the same effect anyway, and LAC fixes it in both cases, so future
versions of Bison might drop this exception when LAC is activated. Second,
GLR parsers do not record the default reduction as the action on a lookahead
token for which there is a conflict. The correct action in this case is to
split the parse instead.
</p>
<p>To adjust which states have default reductions enabled, use the
<code>%define lr.default-reduction</code> directive.
</p>
<dl>
<dt><a name="index-_0025define-lr_002edefault_002dreduction-2"></a>Directive: <strong>%define lr.default-reduction</strong> <em><var>where</var></em></dt>
<dd><p>Specify the kind of states that are permitted to contain default reductions.
The accepted values of <var>where</var> are:
</p><ul>
<li> <code>most</code> (default for LALR and IELR)
</li><li> <code>consistent</code>
</li><li> <code>accepting</code> (default for canonical LR)
</li></ul>
<p>(The ability to specify where default reductions are permitted is
experimental. More user feedback will help to stabilize it.)
</p></dd></dl>
<hr>
<div class="header">
<p>
Next: <a href="LAC.html#LAC" accesskey="n" rel="next">LAC</a>, Previous: <a href="LR-Table-Construction.html#LR-Table-Construction" accesskey="p" rel="prev">LR Table Construction</a>, Up: <a href="Tuning-LR.html#Tuning-LR" accesskey="u" rel="up">Tuning LR</a> [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Index-of-Terms.html#Index-of-Terms" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>
|