[#44431] コンストラクタの引数について&インスタンス変数の持ち方について — Akira Hayakawa <ruby@...>

度々オブジェクト指向についての質問ですいません。

17 messages 2008/01/04
[#44433] Re: コンストラクタの引数について&インスタンス変数の持ち方について — Yukihiro Matsumoto <matz@...> 2008/01/04

まつもと ゆきひろです

[#44469] pdf 作成 ライブラリ — "Luiz Aoki" <luizruby@...>

はじめまして、青木ルイスと申します、

14 messages 2008/01/12
[#44479] ファイル出力時のprintについて — m-hatake@... 2008/01/16

畠山と申します。

[#44483] format %g の丸めについて — 山崎雄介 <y-yamasaki@...>

山崎(ゆ)です。

14 messages 2008/01/16

[ruby-list:44504] Re: モジュールのメソッドを呼び出し時の引数について

From: KIMURA Koichi <kimura.koichi@...>
Date: 2008-01-17 03:24:11 UTC
List: ruby-list #44504
木村です。

On Thu, 17 Jan 2008 09:59:08 +0900
KURODA Hiraku <hiraku@sapporo.email.ne.jp> wrote:

> ・・・と思ったのですが、関数形式か否かの場合分けだと、[ruby-list:44482]
> で書いた ブロックの中の関数呼び出しでsyntax error の説明がつきません(汗
> しかも、メソッドの中だと同じ書き方でもerrorにはならないし。
> 
> # もしかして、原因が2種類あるとか?

情報をまとめている時間がないので概略だけ説明します。

--yydebug というオプションをつけて実行すると、どのように構文解析されたか
の情報を出力してくれます。


ruby --ydebug -e 'puts "hello"'
Starting parse
Entering state 0
Reducing stack by rule 1 (line 346):
-> $$ = nterm @1 ()
Stack now 0
Entering state 2
Reading a token: Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 34
Reading a token: Next token is token tSTRING_BEG ()
Reducing stack by rule 477 (line 2438):
   $1 = token tIDENTIFIER ()
-> $$ = nterm operation ()
Stack now 0 2
Entering state 94
Next token is token tSTRING_BEG ()
Reducing stack by rule 253 (line 1392):
-> $$ = nterm @8 ()
Stack now 0 2 94
Entering state 246

こんな感じに。

簡単なところで
ruby --yydebug -e 'Kernel.print (rand*100).truncate, "\n"'
と
ruby --yydebug -e 'print (rand*100).truncate, "\n"'
の解析結果を比較すると、


OK
Starting parse
Entering state 0
Reducing stack by rule 1 (line 346):
-> $$ = nterm @1 ()
Stack now 0
Entering state 2
Reading a token: Next token is token tIDENTIFIER ()
Shifting token tIDENTIFIER ()
Entering state 34
Reading a token: Next token is token tLPAREN_ARG ()
Reducing stack by rule 477 (line 2438):
   $1 = token tIDENTIFIER ()
-> $$ = nterm operation ()
Stack now 0 2
Entering state 94
Next token is token tLPAREN_ARG ()
Reducing stack by rule 253 (line 1392):

NG

Starting parse
Entering state 0
Reducing stack by rule 1 (line 346):
-> $$ = nterm @1 ()
Stack now 0
Entering state 2
Reading a token: Next token is token tCONSTANT ()
Shifting token tCONSTANT ()
Entering state 38
Reading a token: Next token is token '.' ()
Reducing stack by rule 422 (line 2190):
   $1 = token tCONSTANT ()
-> $$ = nterm variable ()
Stack now 0 2
Entering state 90
Next token is token '.' ()
Reducing stack by rule 430 (line 2200):
   $1 = nterm variable ()
-> $$ = nterm var_ref ()
Stack now 0 2
Entering state 91
Reducing stack by rule 274 (line 1460):
   $1 = nterm var_ref ()
-> $$ = nterm primary ()
Stack now 0 2
Entering state 75
Next token is token '.' ()
Reducing stack by rule 326 (line 1728):
   $1 = nterm primary ()
-> $$ = nterm primary_value ()

のようにだいぶ違った様相です。

Kernel.print というのは上記の解析では、

'Kernel.print' でひとかたまりの識別子ではなく、
'Kernel' という constant と、 'print' という identifier を
'.' という operator でくっつけた「式」です。

一方 print は単なる identiferですので、その後ろに同じもの
(rand*100).truncate, "\n"  が続いていても違う解析結果になっているという
わけです。

ブロックの中と外ではこれとは違いますが、中と外とで解析結果が異なるという
点は同じです。

-- 
木村浩一


In This Thread