/usr/share/doc/bison-doc/html/Strings-are-Destroyed.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 | <!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: Strings are Destroyed</title>
<meta name="description" content="Bison 3.0.4: Strings are Destroyed">
<meta name="keywords" content="Bison 3.0.4: Strings are Destroyed">
<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="FAQ.html#FAQ" rel="up" title="FAQ">
<link href="Implementing-Gotos_002fLoops.html#Implementing-Gotos_002fLoops" rel="next" title="Implementing Gotos/Loops">
<link href="How-Can-I-Reset-the-Parser.html#How-Can-I-Reset-the-Parser" rel="prev" title="How Can I Reset the Parser">
<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="Strings-are-Destroyed"></a>
<div class="header">
<p>
Next: <a href="Implementing-Gotos_002fLoops.html#Implementing-Gotos_002fLoops" accesskey="n" rel="next">Implementing Gotos/Loops</a>, Previous: <a href="How-Can-I-Reset-the-Parser.html#How-Can-I-Reset-the-Parser" accesskey="p" rel="prev">How Can I Reset the Parser</a>, Up: <a href="FAQ.html#FAQ" accesskey="u" rel="up">FAQ</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="Strings-are-Destroyed-1"></a>
<h3 class="section">11.3 Strings are Destroyed</h3>
<blockquote>
<p>My parser seems to destroy old strings, or maybe it loses track of
them. Instead of reporting ‘<samp>"foo", "bar"</samp>’, it reports
‘<samp>"bar", "bar"</samp>’, or even ‘<samp>"foo\nbar", "bar"</samp>’.
</p></blockquote>
<p>This error is probably the single most frequent “bug report” sent to
Bison lists, but is only concerned with a misunderstanding of the role
of the scanner. Consider the following Lex code:
</p>
<div class="example">
<pre class="example">%{
#include <stdio.h>
char *yylval = NULL;
%}
</pre><pre class="example">%%
.* yylval = yytext; return 1;
\n /* IGNORE */
%%
</pre><pre class="example">int
main ()
{
/* Similar to using $1, $2 in a Bison action. */
char *fst = (yylex (), yylval);
char *snd = (yylex (), yylval);
printf ("\"%s\", \"%s\"\n", fst, snd);
return 0;
}
</pre></div>
<p>If you compile and run this code, you get:
</p>
<div class="example">
<pre class="example">$ <kbd>flex -osplit-lines.c split-lines.l</kbd>
$ <kbd>gcc -osplit-lines split-lines.c -ll</kbd>
$ <kbd>printf 'one\ntwo\n' | ./split-lines</kbd>
"one
two", "two"
</pre></div>
<p>this is because <code>yytext</code> is a buffer provided for <em>reading</em>
in the action, but if you want to keep it, you have to duplicate it
(e.g., using <code>strdup</code>). Note that the output may depend on how
your implementation of Lex handles <code>yytext</code>. For instance, when
given the Lex compatibility option <samp>-l</samp> (which triggers the
option ‘<samp>%array</samp>’) Flex generates a different behavior:
</p>
<div class="example">
<pre class="example">$ <kbd>flex -l -osplit-lines.c split-lines.l</kbd>
$ <kbd>gcc -osplit-lines split-lines.c -ll</kbd>
$ <kbd>printf 'one\ntwo\n' | ./split-lines</kbd>
"two", "two"
</pre></div>
</body>
</html>
|