言語を自作してみた(2)


自作言語のお時間です

最近寒すぎて凍死しそうです、、、、

また作りました

はい、アップデートしました。主な変更点としては、

  • エラー機能/エラーも自作しました。自作しないとあんま愛着がわかないんですよね。
  • class/なんちゃってですけど遂にクラスを実装しました。オブジェクト思考、万歳!
  • printしたときになぜか空白が出るのを何とかして無くしました。
  • ファイル数が格段に少なくなりました。
  • そのおかげで実行が軽くなりました!

そんなOmega-version0.1.0はこちらから(Github)
->https://github.com/pythonmaster1027/Omega-version0.1.0

とりまコード

ファイル階層

(任意のディレクトリ)
 ├ main.py
 └ Omega.bat

コードがめっちゃ少なくなりました。

main.py
import os
import sys

class Start:#startして欲しいので

    def __init__(self):#初期化
        try:
            self.f = open(sys.argv[1], "r", encoding="utf_8")

        except IndexError:
            print("ファイル名を指定して下さい")
            sys.exit()

        except FileNotFoundError:
            print("ファイルが見つかりません")
            print("解決するには:ファイルパスをフルパスにする")
            sys.exit()

        self.r = self.f.readlines()
        self.re = self.f.read()
        self.dic1 = {}

    def run(self):#runしてほしいので

        if "class Main{\n" in self.r:
            for line in self.r:
                line = line.replace("    ", "").replace(" ", "").split("//")[0]#line = self.fから一行ずつ読み込まれたプログラム

                #print
                if "print" and '"' in line:
                    pr = line.replace("print", "").replace("{", "").replace("}", "").replace('"', "")
                    print(pr)

                #変数の定義
                elif line.startswith("int") or line.startswith("str"):
                    self.var = line.replace('\n', "")
                    varname = self.var.split("=")[0]#変数名
                    if line.startswith("int"):
                        try:
                            self.ele = eval(self.var.split("=")[-1].replace("int", ""))#int型の要素
                        except NameError:
                            print("Err: NameErr")
                            self.ele = "Not int"
                    elif line.startswith("str"):
                        self.ele = self.var.split("=")[-1].replace("str", "")#int型の要素
                    self.dic1[varname] = self.ele

                #引数に変数を指定するprint
                elif "print" in line:
                    line = line.replace("print", "").replace("{", "").replace("}", "").replace("\n", "")
                    print(self.dic1[line])

                elif line in "\n":
                    pass
        else:
            print("Err: クラス[Main]が見つかりません")
            sys.exit()

#実行関数の定義
def main():
    s = Start()
    s.run()

#実行部
if __name__ == '__main__':
    main()

pythonコード、これだけです。たったの。次、Omega.bat.

Omega.bat
@echo off
main.py %1

まとめ

この言語、ファイル実質2ファイルだけで構成されてるんです。とゆーか2ファイルだけで言語作れんのってすごい。
次は関数定義も実装したいと思います。