crowbar ver.0.3.01

またマイナーバージョンアップ

掲示板の方でもいくつか不具合の御指摘がありましたので、 ver.0.3.01を上げます。

ver.0.3.01での修正点は以下の通りです。

2005/08/07追記:
if文のelse側が実行されないというバグを掲示板でご指摘いただきました。 このバグはあまりに致命的なので、ひとまず修正版の0.3.02を上げます。 毎度テストがぬるくてもうしわけありません(_o_)

GLOBALをかましたソースは こちらから参照可能です。

ダウンロードは、UNIX版がこちら、 Windows版がこちら

実装の修正点

各型を文字列に変換する部分を1個所にまとめたとか、 エラーメッセージ生成部分を移動させたとかバグを取ったとか、 +とかと+=とかの演算を1個所にまとめるために eval.c内の構造を変えたとか、ソースの修正は結構いろいろやってますが、 そのへんは単なるCのコーディングの話なのでパスします。

演算子を増やしたことで構文規則も修正していますが、 これも大部分は機械的に書き足しただけです。 多少毛色が違うのは、コンマ演算子くらいです。

コンマ演算子は、Cと同様、左→右の順序でオペランドを評価し、 右辺側の値を取ります。問題は、既にコンマは他の個所でも使われている、 ということです。

たとえば関数呼び出しの際には「foo(a, b)」のように書きますが、 このaとbの間のコンマがコンマ演算子と解釈されたら、 引数をひとつしか渡さないことになってしまいます。 配列リテラルの「{1, 2, 3}」のコンマも同様です。

そこで、今まで最低の優先順位を持つ演算子は =だったのですが、 これをassignment_expressionという非終端子とし、 関数の引数や配列リテラルの中身は、 expressionではなくassignment_experssionとしました。

/* assignment_expressionの導入 */
expression
        : assignment_expression
        | expression COMMA assignment_expression
        ;
assignment_expression
        : logical_or_expression
        | postfix_expression assignment_operator assignment_expression
        ;
…
/* 関数の引数 */
argument_list
        : assignment_expression
        | argument_list COMMA assignment_expression
        ;
…
/* 配列リテラルの中身 */
expression_list
        : /* empty */
        {
            $$ = NULL;
        }
        | assignment_expression
        {
            $$ = crb_create_expression_list($1);
        }
        | expression_list COMMA assignment_expression
        {
            $$ = crb_chain_expression_list($1, $3);
        }
        ;

もし関数の引数の中でコンマ演算子を使おうと思ったら、 以下のように括弧でくくる必要があります。

  foo((a, b));

また、コンマ演算子は代入式よりも優先順位が低いので、 代入の右辺でコンマ演算子を使う場合も、括弧を使用する必要があります。

  a = (b, c);

どちらもあまり使用機会があるとは思えませんが…

今後のこと

前回挙げた修正点のうち、 今回できたのは「演算子関連の整理」だけですね。

というわけでやることはまだまだ残っています。

それではまた気長にお待ちくださいませ。


前のページ | 次のページ | ひとつ上のページに戻る | トップページに戻る