/usr/share/doc/bison-doc/html/Semantic-Predicates.html is in bison-doc 1:3.0.4-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 | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!--
This manual (22 January 2015) is for GNU Bison (version
3.0.4), the GNU parser generator.
Copyright (C) 1988-1993, 1995, 1998-2015 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 6.0, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Bison 3.0.4: Semantic Predicates</title>
<meta name="description" content="Bison 3.0.4: Semantic Predicates">
<meta name="keywords" content="Bison 3.0.4: Semantic Predicates">
<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="GLR-Parsers.html#GLR-Parsers" rel="up" title="GLR Parsers">
<link href="Compiler-Requirements.html#Compiler-Requirements" rel="next" title="Compiler Requirements">
<link href="GLR-Semantic-Actions.html#GLR-Semantic-Actions" rel="prev" title="GLR Semantic Actions">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.indentedblock {margin-right: 0em}
blockquote.smallindentedblock {margin-right: 0em; font-size: smaller}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
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">
<a name="Semantic-Predicates"></a>
<div class="header">
<p>
Next: <a href="Compiler-Requirements.html#Compiler-Requirements" accesskey="n" rel="next">Compiler Requirements</a>, Previous: <a href="GLR-Semantic-Actions.html#GLR-Semantic-Actions" accesskey="p" rel="prev">GLR Semantic Actions</a>, Up: <a href="GLR-Parsers.html#GLR-Parsers" accesskey="u" rel="up">GLR Parsers</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="Controlling-a-Parse-with-Arbitrary-Predicates"></a>
<h4 class="subsection">1.5.4 Controlling a Parse with Arbitrary Predicates</h4>
<a name="index-_0025_003f"></a>
<a name="index-Semantic-predicates-in-GLR-parsers"></a>
<p>In addition to the <code>%dprec</code> and <code>%merge</code> directives,
GLR parsers
allow you to reject parses on the basis of arbitrary computations executed
in user code, without having Bison treat this rejection as an error
if there are alternative parses. (This feature is experimental and may
evolve. We welcome user feedback.) For example,
</p>
<div class="example">
<pre class="example">widget:
%?{ new_syntax } "widget" id new_args { $$ = f($3, $4); }
| %?{ !new_syntax } "widget" id old_args { $$ = f($3, $4); }
;
</pre></div>
<p>is one way to allow the same parser to handle two different syntaxes for
widgets. The clause preceded by <code>%?</code> is treated like an ordinary
action, except that its text is treated as an expression and is always
evaluated immediately (even when in nondeterministic mode). If the
expression yields 0 (false), the clause is treated as a syntax error,
which, in a nondeterministic parser, causes the stack in which it is reduced
to die. In a deterministic parser, it acts like YYERROR.
</p>
<p>As the example shows, predicates otherwise look like semantic actions, and
therefore you must be take them into account when determining the numbers
to use for denoting the semantic values of right-hand side symbols.
Predicate actions, however, have no defined value, and may not be given
labels.
</p>
<p>There is a subtle difference between semantic predicates and ordinary
actions in nondeterministic mode, since the latter are deferred.
For example, we could try to rewrite the previous example as
</p>
<div class="example">
<pre class="example">widget:
{ if (!new_syntax) YYERROR; }
"widget" id new_args { $$ = f($3, $4); }
| { if (new_syntax) YYERROR; }
"widget" id old_args { $$ = f($3, $4); }
;
</pre></div>
<p>(reversing the sense of the predicate tests to cause an error when they are
false). However, this
does <em>not</em> have the same effect if <code>new_args</code> and <code>old_args</code>
have overlapping syntax.
Since the mid-rule actions testing <code>new_syntax</code> are deferred,
a GLR parser first encounters the unresolved ambiguous reduction
for cases where <code>new_args</code> and <code>old_args</code> recognize the same string
<em>before</em> performing the tests of <code>new_syntax</code>. It therefore
reports an error.
</p>
<p>Finally, be careful in writing predicates: deferred actions have not been
evaluated, so that using them in a predicate will have undefined effects.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Compiler-Requirements.html#Compiler-Requirements" accesskey="n" rel="next">Compiler Requirements</a>, Previous: <a href="GLR-Semantic-Actions.html#GLR-Semantic-Actions" accesskey="p" rel="prev">GLR Semantic Actions</a>, Up: <a href="GLR-Parsers.html#GLR-Parsers" accesskey="u" rel="up">GLR Parsers</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>
|