The errata list is a list of errors and their corrections that were found after the product was released.
The following errata were submitted by our customers and have not yet been approved or disproved by the author or editor. They solely represent the opinion of the customer.
Version |
Location |
Description |
Submitted by |
Date submitted |
Printed |
Page xx
4th paragraph, last sentence |
Abraxas' version 9781565920002 and yacc
should be:
Abraxas' version of 9781565920002 and yacc
|
Anonymous |
|
|
?
Example 5-3. The first SQL lexer |
void
yyerror(char *s)
{
printf("%d: %s at %s\n", lineno, s, yytext);
{
should be
void
yyerror(char *s)
{
printf("%d: %s at %s\n", lineno, s, yytext);
}
the final brace is wrong.
|
Anonymous |
Jul 10, 2008 |
Printed |
Page 8
third printf statement on page |
below is listed twice in the list of adverb patterns:
... |
below |
between |
below {printf ("%s: is a preposition
", yytext);}
|
Anonymous |
|
Printed |
Page 17
Example 1-7 |
I'm using AIX 4.3 version of 9781565920002 and yacc.
The example doesn't work properly if I don't put return statement
in sentence rule.
sentence: subject VERB object { printf("Sentence is valid.
"); return 0; }
(occurs under FreeBSD, too)
|
Anonymous |
|
Other Digital Version |
17
17, code |
For the code ch1-05.l, we need to add memory free function and call this function to free memory used by look-up table.
...
18 \.\n { state = LOOKUP;
ClearLookupTable();
19 return 0; /* end of sentence */
20 }
...
void ClearLookupTable()
{
...
}
|
Wang Hao |
Jan 22, 2013 |
Printed |
Page 23
code Example 1-9 |
The C code does not have the same behavior as the 9781565920002 code in Example 1-10,
as claimed. In particular, try the following two test cases as input:
.123.456
"Here is an unclosed literal text string
The 9781565920002 code treats the first example as two NUMBERs: .123 and .456, while
the C code has improper control flow and treats it as a single number. By
the time the C code gets to the second decimal point, it has no memory of
whether it started with .123 or just 123 without a leading decimal point.
The 9781565920002 code correctly detects that the second example does not fit any of
its patterns except the default, so it outputs the double quote and then
continues. The remaining words are then categorized as COMMANDs. The C code
makes the erroneous decision that this must be TEXT on the basis of the
double-quote character, even though the quote might never be closed later.
The C code could really stand to be cleaned up quite a bit. The indentation
in the NUMBER case does not match the nesting level, making it quite hard
to read, and the "early K&R hacker" style of the beginning of the code is
obsolete (e.g. use "int main(int argc, ..)"
instead of the "void main(argc, argv)" K&R style shown.)
|
Anonymous |
|
Printed |
Page 30-31
varies |
The regular expression used to match decimal numbers does not handle the
following case: 2.
Now admittedly, one could argue that one should not put a decimal point
without a subsequent number, but the above will compile as valid 'C' and
will be correctly read into a scanf() or sscanf() call.
The problem is that the leading digits -or- trailing digits are optional,
but not both. At least leading digits or trailing digits are required.
The following regular expression is more complete:
-?(([0-9]+.?)|([0-9]*.[0-9]+))
^^^
and will match the following:
1
1.
1.0
.01
-1
-1.
-1.0
-.01
This issue seems to be repeated whenever you are matching a number.
|
Anonymous |
|
Printed |
Page 31
3rd line from bottom |
I believe the regular expression for matching a quoted string which doesn't
go over one line, which is listed as this
"[^"
]*["
]
should be
"[^"
]*"
The expression in the book incorrectly matches a string with no terminating
" on the same line as a string, eg
"this is not a string
would match because
is allowed to terminate the pattern. My version prevents
newlines in strings, but properly fails if the string is not terminated before
line end.
|
Anonymous |
|
Printed |
Page 44
line 6 of Example 2-7 |
The following line:
.+ ECHO;
has been left out. This will prevent matching of other strings when not in the
MAGIC start state.
|
Anonymous |
|
Printed |
Page 45
4th paragraph from bottom - 3rd chunk of example code (out of 4 chunks), 2nd |
line of code;
The code reads:
^[ ]*
/* whitespace lines matched by previous rule */
. /* anything else */
I think the comment on line two should instead read:
/* whitespace lines NOT matched by previous rule */
|
Anonymous |
|
Printed |
Page 47
Example 2-9 |
The result of running example 2-9 to:
some code /* comment */ /*
tricky
*/
results in
code: 3, comments 0, white space 0
while it should be
code: 1, comments 2, white space 0
The problems are with the expressions and actions:
.+"/*".*"*/".*
{ code++; }
and
.*"/*".*"*/".+
{ code++; }
because they can inadvertently eat an opening comment /* just before the new line,
without switching to the COMMENT state.
|
Anonymous |
|
Printed |
Page 58-65
code ch3-01.y, ch3-02.y, ch3-03.y |
Yacc codes ch3-01.y, ch3-02.y, ch3-03.y, all miss "main()" function so that nobody
calls yyparse(), eventually none of the examples runs correctly.
I tried to add following codes in yacc codes:
%%
main()
{
yyparse();
}
After that all examples are running correctly.
|
Anonymous |
|
Printed |
Page 58-59
example ch3-01.* code and compile and output instructions on both pages |
Example ch3-01 does NOT work. I have tried this on a Win PC, SCO Unix, Redhat 7.2
Linux and Suse7.3 Linux. Using both hand-typed code, as well as using the examples
from the ftp site, at NO time does the { printf("= %d
",%1);} ever display on the
screen as it is supposed to.
<safari section 5.3.1> Print page 117, Example 5-3. The first SQL lexer;
void
yyerror(char *s)
{
printf("%d: %s at %s
", lineno, s, yytext);
{
should be
void
yyerror(char *s)
{
printf("%d: %s at %s
", lineno, s, yytext);
}
the final brace is wrong.
|
Anonymous |
|
PDF |
Page 59
bottom |
Example ch3-01.y should be:
%{
#include<stdio.h>
%}
%token NAME NUMBER
%%
statement: NAME '=' expression
| expression { printf("= %d\n", $1); }
;
expression: expression '+' NUMBER { $$ = $1 + $3; }
| expression '-' NUMBER { $$ = $1 - $3; }
| NUMBER { $$ = $1; }
;
%%
extern FILE *yyin;
main()
{
yyparse();
}
To build it:
yacc -d ch3-01.y
lex ch3-01.l
gcc -o ch3-01 lex.yy.c y.tab.c -ll -ly -lfl
|
vrcats |
Sep 09, 2010 |
PDF |
Page 63
United States |
For the chapter 3 programs(source code) there is need to add the yyerror function for the compilation to be successful.
Also as pointed in the previous errata we need to add the main function with yyparse().
Here is the complete code that leads to a successful compilation
%{
#include<stdio.h>
%}
%token NAME NUMBER
%%
statement: NAME '=' expression
| expression { printf("= %d\n", $1); }
;
expression: expression '+' NUMBER { $$ = $1 + $3; }
| expression '-' NUMBER { $$ = $1 - $3; }
| NUMBER { $$ = $1; }
;
%%
//extern FILE *yyin;
main()
{
yyparse();
}
int yyerror()
{
printf("Invalid expression");
return 1;
}
int yywrap()
{
return 1;
}
---statements issued for compilation
yacc -d ch3-01.y
lex ch3-01.l
cc lex.yy.c y.tab.c -o ch3-01
|
Varunkumar Manohar |
Oct 17, 2012 |
Printed |
Page 116
Last line |
missing pattern at bottom of page 116.
before " int c = input();"
insert:
'[^'\n]*' {
|
Anonymous |
Feb 13, 2011 |
Printed |
Page 132
Example 5-17 |
scalar_exp_commalist is listed twice. The second one can be omitted.
|
Anonymous |
|
Printed |
Page 136
top of page |
The production for search_condition allows for an empty production. The bar
(|) before "search_condition OR search condition" should be removed.
The same error appears on page 316 in the appendix and in the electronic code
file.
|
Anonymous |
|
Printed |
Page 204
Last line of the second examle |
I think that the line:
{ yyval.opval = ..............
should be read:
{ yylval.opval = ..............
"yylval" instead of "yyval"
|
Anonymous |
|
Printed |
Page 234
235 |
On page 234 of the second edition, I think
IF expr stmt ELSE stmt
should be
IF expr THEN stmt ELSE stmt
This error occurs twice on that page
|
Anonymous |
Feb 12, 2009 |
Printed |
Page 246
2nd code example |
The trick to save the input line at a time:
.* {
strcpy(linebuf,yytext+1);
lineno++;
yyless(1);
}
fails to save the first input line of the yyin buffer.
|
Anonymous |
|
Printed |
Page 286
in the middle |
In the example "E-1: F9781565920002 specification to parse a command line ape-05.l" in
page 285, at the end of the example we can see the following part of code:
if (targv[0][offset+copylen] == ' |