区切りのない(ように見える)文法

連日すみません。文法的な話が大好きな SiroKuro です。あいあむ文法らヴ。

今回は式の区切り無しの言語にしたんだけど。

return a + 1

これと

return
a + 1

これの区別がつかない。よく見なくても当たり前なんだけどね。

http://d.hatena.ne.jp/nagaShima/20090121/p1

対処方法その1:return が必ず式を取るようにする

id:nagaShima さんが考えてる案で、「 return void 」のように、何も値を返さない場合でも return の次には必ず何かが来るようにするという対処法。あえて区切り文字をオプショナルで付けられるようにして、その部分だけ「 return; 」のようにするという亜種も考えられる。
あと、return だけに限るならば、その後の式に制御がわたることは無いので、return 後に出現した式は無条件で return 文の一部だと解釈しても良いかもしれないです。

対処方法その2:実は改行が区切り文字です

Pnuts が採用している案。(\r\n|\r|\n) を区切り文字として式を区別する手法。これと似たようなことを Ruby もやってるんじゃなかったかな。
ただ、この場合は改行をトークンとしてパーサに渡すことになるので、区切り文字として使う場所のほかに「改行を入れても良いところ」を文法中いろんなところに書かなければならないという面倒なところがあったりする。

対処方法その3:式の構造自体を変える

C言語系の特徴的なところに代入を式として扱うという点が挙げられるが、これを文として扱うよう修正し、全ての式を代入文であるように文法を変えてしまえば上の例が解決できるという案がある。つまり

return a + 1

return
a + 1

は等しいが、

return
_ = a + 1

は等しくないように解釈できるようになる。(ここで _ は無名変数。無名変数にデータを格納することは出来ず、単に文法上の体裁を整えるために導入する特殊なトークンです)


こういう、文法上の細々とした話は、考えているとわくわくします。