0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

自作言語で数当てゲームを作ろう!

Posted at

自作言語のお時間です!

友達と集まる予定だったのが某ウイルスのせいでキャンセルになり落ち込んでるdangomushiです。
某ウイルス許すまじ。

またまたまた作りました。

今回は完成度高いと思ってます。
個人的には今年一番の出来です。
苦労したのは、関数とかで一連の処理をまとめるところかな。とにかく悩みました。でもゆーて一週間ぐらいでできた
あ、そういえばついった始めました。なんか記事のミスとか「もっとこうしたらいいんじゃないの」とか「この処理はこうしたほうがいいだろ」とかゆうのは遠慮なくコメントかついったで教えてください。
URLはマイページにあると思います。
コードはこちらー>https://github.com/pythonmaster1027/Omega-version0.2.3/tree/main

開発の一連の流れ

何気に皆さん説明したりしてなかったりしてるんですよね。(筆者の都合により、pythonで開発することを前提としております。ただし、もしあなたの主言語がpythonでなくても「できるかもしれん」とか「やってやらぁ」とかやる気があればぜひ挑戦するべきだと思います。)

0、予程決め。:絶対に抜かしてはいけません。私は、言語開発に限らずなんにでも予定を決めるよう心がけております。なぜなら、途中で「あれ?俺何するべきだ?」とかなるのは時間の無駄でしかないからです。あと、モチベがあるうちにぱっぱと作っちゃうほうが、開発が続くと思うからです。

1、仮想機械を作る。:読者の皆様は、おいおい初っ端からどうした、気でも違ったか、と思いでしょう。
しかし、できるんですよ。ま、仮想機械といっても僕の場合は四則演算をするだけですけどもね。それ以外は、言語の機能の拡張に伴って、そのまま載せてます。詳しくは、Githubのmain.py[Vmクラス]を見ていただければわかるでしょう。

2、文法決め。:一番大切だったりします。大切なのは、「書いてて楽しいかどうか」。可読性は、、、あとで何とかします。

3、字句解析器を作る。:お望みの文法に沿って字句解析器を作ります。実行速度は遅くなりますが、正規表現を使うことがベターと思われます。ただし私はすべて「置き換え」(replace)で乗り切りました。Tokenクラスで処理。

4、構文解析器を作る。:ここら辺から挫折者が大量発生すると思われます。でも私のコードを見ればわかる通り(Githubのリンクでとべるかと。)あんまりがちがちに「構文を解析するぜ!」的なもではないです。並べ替えただけです。ただ、自分の仮想マシンが理解できればそれでいいのです。そのために、先に仮想機械を作ったのですから。じつはTokenクラスで処理。

5、トランスパイル。:仮想機械の四則演算言語と構文解析した言語を、構文解析した後の「中間言語」とトランスパイルする。これのせいでreplaceを使う羽目になり、おかげで完成した言語は激遅です。python製だからか?~~子は親に似るんですね。~~この遅さは読者の皆さんの課題ということで。(←おい)これもTokenクラスで処理を行ってます。

文法

例えば、この処理はOmega言語(自作した言語の名前)で実行することが可能です(やっと本題)。
この処理は、一般に「数当てゲーム」といわれるものです。

main.om
def :main():
    input">"inp;
    if inp == dango = {test()};
    println_残念!;
    end;

def :test():
    println_正解!!;
    println_ゲームを続けるならy、やめるならnを入力してください。;
    input">"ans;
    if ans == y = {start()};
    exit;

def :start():
    while_True = {main()};
    end;

start();

  • 戻り値とか引数の辺りはまだ実装できてないです。次回への課題ですね。
  • pythonでのprintに当たるのは、「println」です。printlnの後「_」(ハイフン)をつけて出力を行います。
  • 基本的に、if / whileの中身は関数呼び出しとなります。これは、筆者の趣味で「厳格な関数型言語」にしたかったためです。ここら辺は応用ということで、気に食わなければ改造してください。
  • あとは、inputの部分ですね。inputを使うよー>inputの時の字ー>格納する変数
  • また、変数を初期化したりするときは「let」を使います。
  • 文字列の時は、「str」を使います。
  • 例として、文字列型の変数「word」を定義したいときは「str word = dangomushi;」とします。

まとめ

今回は、「自作言語の作り方」を解説しました。感想としては、やはり言語の自作は楽しいですね(笑)。皆さんもぜひ言語自作に挑戦してみてください!!あと、前述のついったの件ですが"フォロワーを増やす方法が思いつかない"ばかりか、"そもそも同じ趣味の人と交流できない"ので、読者の皆さん、もし疑問があったり「この方がいいだろ」などご意見がありましたらぜひコメ欄かDMのほう来ちゃってください!!(ちゃっかり宣伝)
それでは、また次の記事でお会いしましょう!
さようなら!!

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?