掲示板の方でもいくつか不具合の御指摘がありましたので、 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);
どちらもあまり使用機会があるとは思えませんが…
前回挙げた修正点のうち、 今回できたのは「演算子関連の整理」だけですね。
というわけでやることはまだまだ残っています。
それではまた気長にお待ちくださいませ。