ルールの呼び出し

bjamのルール呼び出しと代入を区別するのに四苦八苦しています。
ふと思いつきで、次のbjamコードを試したところ、ECHOルールの呼び出しとして解釈されました。

hoge = ECHO ;
$(hoge) abc ; # 「abc」を出力

次のコードも同様です。

hoge = ECHO abc ;
$(hoge) def ; # 「abc def」を出力


一方、キーワードは変数に入れられません。

foo = "=" ;
bar $(foo) abc ; # エラー: ルールbarがない

foo = "default" ; # 「default =」は「?=」と同じ意味
bar $(foo) = abc ; # シンタックスエラー

実際に変数に入っているのは文字列なので、当然ではあります。


また、ルール展開もルール名とは認識されません。

rule echo_
{
    return ECHO ;
}
[ echo_ ] abc ; # シンタックスエラー


もろもろの調査の結果、

  • ルール展開で始まったら代入
  • トークンが1つだけならルール呼び出し
  • 2番目のトークンが「=」、「+=」、「?=」、「on」だったら代入
  • それ以外はルール呼び出し

といった感じのようです。
パーサーでは判定が難しいので、大まかにパースしておいてセマンティックアクション側で判定したほうがよさそうです。


ちなみにlocalの付いた代入文は通常の代入と似て非なるもので、

  • 「+=」、「?=」、「on」が使えない
  • 「=」以降がなくてもいい
  • 代入先の変数名が複数でもいい

といった違いがあります。