Java C# Ts GoのC系言語 Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定める(if..else if..else文)

# はじめに

Java C# Ts Goの新旧C系言語、Mind DNCLの日本語系言語の制御構文を比較して自作言語Re:Mindの構文を定めます、

自作言語Re:Mindの詳しい利用シーンのイメージは[こちらへ](https://qiita.com/mylifewithviolin/items/9d58db8a101807c19bde)

## この記事内容の作業目的
[日本語トランスコンパイラ言語 Re:Mind （自作言語）と他言語との構文比較（IF文）](https://qiita.com/mylifewithviolin/items/579e6c9b77dcd2adda0f)という記事で、もっともシンプルなif文について検討しましたので、今回は比較的複雑なelse ifとelseに加えて、さらに前半の間にif elseが入れ子になっている状態をモチーフとします。

## この記事内容の保証
※この記事には実装的な情報が含まれます。各言語で書かれた引用ソースの妥当性は保証されません。また、自作言語は開発中（というよりまだ企画段階）のため、本記事に開示された仕様は予告なく変更される場合があります。

# Java C# Ts Goの新旧C系言語の構文イメージ

なるべく長くならずイメージが比較しやすいよう、比較判定用の変数の宣言は割愛します。また、糖衣構文もとりあえず今回対象外です。

## Java
```java:Java
    if(i>0){
        if(j==0){
           //todo
        }else{
           //todo
        }
       //todo
    }else if(i<0){
        //todo
    }else{
        //todo
    }
```
## C#
```cs:C#
    if(i>0)
    {
        if(j==0)
        {
           //todo
        }
        else
        {
           //todo
        }
       //todo
    }
    else if(i<0)
    {
        //todo
    }
    else
    {
        //todo
    }
```
C#は構文仕様とは関係ないと思いますが、コードエディタの整形機能で、かっこのインデント位置を縦線で表現したいせいか、わりとこんな感じで改行を強制してくるイメージがあります。
## TypeScript
```ts:TypeScript
    if(i>0){
        if(j==0){
           //todo
        }else{
           //todo
        }
       //todo
    }else if(i<0){
        //todo
    }else{
        //todo
    }
```
## Go
```go:Go
    if i>0 {
        if j==0 {
           //todo
        }else{
           //todo
        }
       //todo
    }else if i<0 {
        //todo
    }else{
        //todo
    }
```
GoはC言語由来の言語で小かっこ「()」があるはずのところにないのは斬新な印象を受けます。

各言語のIF構文の間に挟まれているtodoは各言語のコメントアウト符号によるコメントです。なにか実行文が書けますの意。
## まとめ
C言語由来の各言語は伝統の中かっこ「{}」をうまく使って、構文の区切りをトークナイザが識別できるようにしている感じですね。

最初にifが出現したあと、次の条件は中かっこ閉じた後、ifではなくelseが出現するので、入れ子となったifを入れ子になっていると認識しやすそうな構造です。


# Mind DNCLの日本語系言語の構文イメージ
では、続いて日本語プログラミング言語のグループです。
VBAは日本語ではありませんが、中かっこ「{}」を使って区切ることはなく、構文の表現も自然言語の英語に近いので、こっちの方に寄せました。

## VBA（Excel用）
```vb:VisualBasic for Application
    If I>0 Then
        If J=0 Then
            'todo
        Else
            'todo
        End If
        'todo
    Else If I<0 Then
        'todo
    Else
        'todo
    End If
```
## Mind
```mind:Mind
    Iが　0より　大きい
        ならば
            Jが　0に　等しい
                ならば　※todo
                さもなければ　※todo
                つぎへ
                ※todo
        さもなければ
            Iが　0より　小さい
                ならば　※todo
                さもなければ　※todo
                つぎへ
        つぎへ
```
Mindはelse if構文はないような気がしました。ありましたら、ごめんなさい。訂正します。とりあえずelse ifなしの入れ子にしています。
2023/02/11追記　条件分岐パスが他言語と等価となるようelse側への入れ子を追加しました。
Mindでは「もし」を擬似語（ダミーの単語）として登録してあり、見た目が自然となる場合は記述することもできます。if構文の終端は「つぎへ」。

## DNCL
```mind:DNCL
    もし　I > 0　ならば
        もし　J ＝ 0　ならば
            //todo
        を実行し，そうでなければ
            //todo
        実行する
        //todo
    を実行し，そうでなくもし I < 0 ならば
        //todo
    を実行し，そうでなければ
        //todo
    実行する
```
DNCLでは「実行する」がif構文の終端、「を実行し、」がelseの役を担っている感じです。さすがに「を実行し，そうでなくもし」は冗長かな感あり。

# 自作言語の構文イメージ

## Re:Mind
```mind:Re:Mind
    ◇i > 0 の場合
        ◇j == 0 の場合
            //todo
        ◇他に
            //todo
        ◇ここまで
        //todo
    ◇他に i < 0 の場合
        //todo
    ◇他に
        //todo
    ◇ここまで
```

単純If構文で◇を初開示した際に、else ifの中に入れ子にされたらだいじょうぶかな的な心配があったのですが、今回書いてみていけそうな予感はしてきました。最初の◇IF条件行に続いて、入れ子の◇IF条件行が出現したとき、else if相当の◇IF条件行とどうやって区別させるかあたりがポイントです。直訳っていえば直訳ですがなるべく短く(笑)

# プロデル なでしこ 第2世代日本語系言語の構文イメージ（参考）
あまりと言いますかかなり詳しくはないのですが、参考にわたしの心の中での第2世代日本語プログラミング言語「プロデル」と「なでしこ」の制御構文も比較してみました。よくわかっていないので、間違っていたらごめんなさい。訂正します。
## プロデル
```mind:プロデル
    もし i ＞ 0 なら
        もし j ＝ 0 なら
        　　//todo
        そうでなければ
        　　//todo
        もし終わり
    　　//todo
    他でもし i ＜ 0 なら
    　　//todo
    そうでなければ
    　　//todo
    もし終わり
```

## なでしこ
```mind:なでしこ
    もし、I > ０　ならば
        もし、J ＝ ０ ならば
        　　 //todo
        違えば
        　　 //todo
        ここまで
    　　 //todo
    違えば、もし、I < ０ ならば
    　　 //todo
    違えば
    　　 //todo
    ここまで
```
2言語とも単行コメント文にはダブルスラッシュ可のようでした。
else文は、プロデルは「そうでなければ」、なでしこは「違えば」のようです。各言語作者の好みといいますか、このあたりのゆらぎは面白いですね。
なでしこの「ここまで」はオプショナルの模様。
# おわりに
システムエンジニアというとプログラミング得意なのではと業界外の人は思っていらっしゃるかと存じますが、特に業務システムのエンジニアはそうでもないのが実情です。分業が進んでいる環境ですと、実装工程は製造とかいってアウトソースしたり若手にまかせたりというシーンが少なくないように思われます。ただ、経験値的に、あるいは地頭的に複雑なロジックを組み立てることはできるので、若手のデベロッパーをそういう面から支援している場合は多くあります。

そこで、昨今のこまごまとしたフレームワークの細かい小技はわからないけど、きもとなるロジックはこれだ的なシーンで、年配エンジニアやマネージャ層でも記述できる言語として日本語トランスコンパイラ言語なるものがあったらいいなと考えたしだいでございます。

この企画を実現・設計・実装していくには、スキル上の課題や未獲得の知見など多数あることが予想されます。Qiita様の場をお借りして、獲得したスキルや知見の共有、いたらない点のご支援をいただければと考えています。

# 参考リンク

[Mind プログラミングマニュアル ３ 制御構文](http://www.scripts-lab.co.jp/mind/ver8/doc/03-Control-syntax.html#naraba)

[共通テスト手順記述標準言語 (DNCL) の説明](https://www.dnc.ac.jp/albums/abm.php?d=88&f=abm00001247.pdf&n=%E4%BB%A4%E5%92%8C%EF%BC%93%E5%B9%B4%E5%BA%A6%E8%A9%A6%E9%A8%93%E5%85%B1%E9%80%9A%E3%83%86%E3%82%B9%E3%83%88%E6%89%8B%E9%A0%86%E8%A8%98%E8%BF%B0%E6%A8%99%E6%BA%96%E8%A8%80%E8%AA%9E%EF%BC%88DNCL%EF%BC%89%E3%81%AE%E8%AA%AC%E6%98%8E.pdf)


[目次－プロデルで始める日本語プログラミング言語入門](https://wp.utopiat.net/produirefirststep/)

[日本語プログラミング言語「なでしこ」 制御構文](https://nadesi.com/doc/reference/syntax/1-6-koubun.htm)

https://qiita.com/mylifewithviolin/items/9d58db8a101807c19bde

https://qiita.com/mylifewithviolin/items/ebb406bf5ea7a4eea24c

https://qiita.com/Kuniwak/items/7e0e3f1cb6f3ae822215

https://qiita.com/jpl_produire/items/50c979d38541b6d9a84d

https://qiita.com/oza-jv/items/432c9415a8c926960ecc

https://qiita.com/44x1carbon/items/7a8ff44c3d7a4f7a349d