K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]

新規投稿 | 開設者ホームページへ戻る | ヘルプ

[1513] lexicalanalyzer.c について
投稿者:yuya
2010/03/13 09:10:00

「プログラミング言語を作る」p.59の、 lexicalanalyzer.c の23~24行からの構造を見ると、 token->kind = BAD_TOKEN; while(st_line[st_line_pos] != '\0'){ /* メインの処理 */ } となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 現状だと'\0'が現れた時点でwhileを抜けてしまうので、 st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 実行時に無限ループに陥ります。 一度ご確認ください。 # ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 # 面白すぎて睡眠不足(笑)。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1514] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/14 21:49:17

>となっています。'\0'に出会ったら BAD_TOKEN として処理するという意図だと思いますが、 >現状だと'\0'が現れた時点でwhileを抜けてしまうので、 >st_line_pos がインクリメントされないまま再び get_token() が呼ばれてしまい、 >実行時に無限ループに陥ります。 BAD_TOKENが返ってきているのにまたget_token()を呼ぶほうが変なんじゃ、と 思って本に掲載されているソースのテストドライバを確認したのですが、 END_OF_LINE_TOKENのチェックはしていてもBAD_TOKENのチェックをしていないので、 たとえば改行で終わらないファイルをリダイレクトで食わせたときに、 確かに無限ループになりますね。 電卓のパーサと組み合わせる限りではそんなにおかしなことにはならないような 気もします。 バグかというと微妙ではないかと思いますが、補足を入れておきます。 ># ただいま「プログラミング言語を作る」を骨の髄までしゃぶる勢いで読んでます。 ># 面白すぎて睡眠不足(笑)。 ありがとうございます。また何かあればご指摘ください。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1515] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/14 22:22:06

ああそうか、レクサの問題というより、 テストドライバをそんなに厳密に書いていないというだけの話ですね。 ありがとうございました。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1516] Re:lexicalanalyzer.c について
投稿者:yuya
2010/03/15 05:27:03

さっそく正誤表で対応して頂き、ありがとうございます。 >改行なしの行を食わせるためにはファイルからリダイレクト等しなければならないので うぐぅ、私は単純に 「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 を想定しておりましたです。
[この投稿を含むスレッドを表示] [この投稿を削除]
[1518] Re:lexicalanalyzer.c について
投稿者:(ぱ)こと管理人
2010/03/16 00:48:08

>「入力が char_buf のサイズ(1024)を超えていて fgets がナル文字を付けた場合」 >を想定しておりましたです。 「1024文字もあるんだから普通はオーバーしません!」 とか言い切ってしまうとそれはそれで問題ありかとは思うのですが。 実際、こういう意見↓もあるのですが、 http://www.kijineko.co.jp/tech/superstitions/gets-can-be-replaced-with-fgets-simply.html この程度の用途のプログラムでどこまで想定するかは難しいところだと思います。 私の場合、たとえばポインタ完全制覇のp.79でも 「自分で使う程度のプログラムだったらまず大丈夫でしょう」 とかいって逃げてしまっています。
[この投稿を含むスレッドを表示] [この投稿を削除]