「プログラミング言語を作る」正誤表
このページは、拙著「プログラミング言語を作る」技術評論社 ISBN978-4-7741-3895-4 の正誤表です。
p.43〜44下から3行目から
「もし、演算子の優先順位(掛け算は足し算よりも先にやる)を考慮しなくてよいのなら、上記の構文規則は以下のようになります」とありますが、ここにある構文規則だとyaccがshift/reduce conflictを出し、かつ、結合規則が右から順になります。よって、「1-2-3-4」の結果は、-8ではなく-2になります。
この規則は、「優先順位を考えるとtermとかを導入しなければいけなくて難しいので、ひとまず考えなければこう書ける」というサンプルなのですが、結合規則まで考慮しないとは書いていないこと、yaccが警告を出すのはそれ自体いかがなものかと思いますので、ここで補足します。
以下の掲示板の議論も参照してください。
http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1509
p.58lexicalanalyzer.c
このレキシカルアナライザは、改行なしで行が終わってしまうと 「BAD_TOKEN」というトークンを返すのですが、末尾のテストドライバは BAD_TOKENを解釈しないので、再度get_token()を呼び出して 無限ループに入ります。
改行なしの行を食わせるためにはファイルからリダイレクト等しなければ ならないのでまず問題にはならないと思うのですが、補足しておきます。
p.106上の囲みリストの下3行目
誤)
アクションにて、crb_crete_binary_expression()…
正)
アクションにて、crb_create_binary_expression()…
「a」が抜けていました。
p.186下のリスト
誤)
/* ソースがShift-JISで、その1文字目を食ったのであれば、
SHIFT_JIS_2ND_CHARに遷移する */
if (enc == SHIFT_JIS_ENCODING
&& ((unsigned char*)yytext)[0] >= 0x81
&& ((unsigned char*)yytext)[0] <= 0x9e) {
正)
/* ソースがShift-JISで、その1文字目を食ったのであれば、
SHIFT_JIS_2ND_CHARに遷移する */
if (enc == SHIFT_JIS_ENCODING
&& ((((unsigned char*)yytext)[0] >= 0x81
&& ((unsigned char*)yytext)[0] <= 0x9e)
|| (((unsigned char*)yytext)[0] >= 0xe0
&& ((unsigned char*)yytext)[0] <= 0xef))) {
本文中にもあるとおり、Shift-JISの文字コードは
と定められていますが、2バイト目の範囲の後半部分が抜けていました。
p.189下から6行目
誤)
それに対し、CSIだと(N-1)必要になります。
正)
それに対し、CSIだとN(N-1)必要になります。
p.206ふたつめのカコミのリスト
誤)
$$ = dkc_close_block($<block>2, $3);
正)
$<block>$ = dkc_close_block($<block>2, $3);
代入される側の$$も型指定をしないと、 環境によりエラーが出るようです。 掲示板の以下の投稿も参照してください。
http://kmaebashi.com/bbs/list.php?boardid=kmaebashibbs&thread=1430
私のところでは$$の型指定をしなくても (なぜか)動いているようですが、これは指定するのが正しいと思います。
p.303補足の2行目
誤)
具体的には、オブジェクト消滅のタイミングで、Javaならデストラクタ、 C++やC#ならデストラクタというメソッドが呼び出されます。
正)
具体的には、オブジェクト消滅のタイミングで、Javaならファイナライザ、 C++やC#ならデストラクタというメソッドが呼び出されます。
p.417下から3行目
誤)
ラルフ・ジョンション
正)
ラルフ・ジョンソン
書籍情報のページに戻る | 著者のWebページトップはこちら
ご意見、ご質問、不具合連絡等は掲示板にお願いいたします。