作者: Bruce.
日時: 2008/3/02(21:11)
Bruce.です。


T.Watanabe さんは書きました:

>> awkを256倍…で
>>
>> if HOGE
>> {
>> …
>> }
>>
>> if HOGE{
>> …
>> }
>>
>> と挙動が違う、つー指摘は、ショックでした。
> 
>   これホントですか?  本の方を確認しないでスクリプトを書いてみました。
> 
> BEGIN {
>     LIMIT = 10
> 
>     i = 0
>     while ( i < 20 ) {
>         print "devided   --- " (devided( i ) ? i : " ")
>         print "same_line --- " (same_line( i ) ? i : " ")
>         i++
>     }
> }
> 
> function devided( num ) {
>     if ( num > LIMIT )
>     {
>         return 1
>     } else {
>         return 0
>     }
> }
> 
> function same_line( num ) {
>     if ( num > LIMIT ) {
>         return 1
>     } else {
>         return 0
>     }
> }
> 
>   MacOSX で
> 
> /usr/bin/awk   たぶんnawk
> /sw/bin/gawk   Finkで入れたgawk
> 
>   の両方で試しましたけどまったく同じ動作になるんですけど…。(11から数
> 字が表示される。)これが

ソースを見てみました :)
gawk 3.1.6 なんで、256倍のもの(たぶん2.11か2.15あたり)とは違いますが、


if_statement
	: LEX_IF '(' exp r_paren opt_nls statement


statement
	: semi opt_nls
		{ $$ = NULL; }


nls
	: NEWLINE
	| nls NEWLINE
	;

opt_nls
	: /* empty */
	| nls
	;

r_paren opt_nls statement のように、右カッコの直後に改行が来ても問題な
いように定義されています。
statementが空であることは許されていないので、右カッコに後続しているブ
ロックは
if の本体とみなされます。

256倍本でのバージョンのソースはすぐに出てこないのであとで。

言わずもがなですが

> パターン {
>   アクション
> }
> 
>   のことであれば別の行に分離しちゃダメだと思うんですけど。

こっちは

rule
	: pattern action

	| pattern statement_term


statement_term
	: nls
	| semi opt_nls
	;


なので、パターンの直後に改行が来ると、そこでルールが終わっているものと
解釈されます。




-- 
木村浩一/KIMURA Koichi
 I thought what I'd do was, I'd pretend I was one of those deaf-mutes or
shoud I?
 mail kbk at kt.rim.or.jp
 web  www.kt.rim.or.jp/~kbk/zakkicho/index.html