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.

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

Posted at

自作言語のお時間です

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

また作りました

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

  • エラー機能/エラーも自作しました。自作しないとあんま愛着がわかないんですよね。
  • 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ファイルだけで言語作れんのってすごい。
次は関数定義も実装したいと思います。

0
0
0

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?