最も単純なスクリプトプログラミング言語をC#で記述します(パート1)

こんにちは、%ユーザー名%。 今日は、C#またはそのインタープリターでスクリプトプログラミング言語を記述します。



プロローグ



私は1年間C#を勉強していますが、適切に学ぶことができません。 少し考えて、もっと複雑なものを書く必要があり、その過程で経験を積む必要があることに気付きました。 Brainfuckインタープリターを作成することにしました。 約5分で書きましたが、サイクルなしで残されました。 それから私は自分の言語を発明し始め、多くの構文概念などを書きました。

むしろ、カットの下に!





バージョンv1.0


最初のバージョンは失敗しただけでなく、単に失敗しました。 あまり便利な構文ではなく、BASIC風のプログラミングトーンはあまりよくありませんでした(私の意見では)。 構文は次のとおりです。

#    VISIBLE , ! IF 5 < 10 VISIBLE 5    10
      
      







バージョンv2.0-現在


言語のこのバージョンについては今日になります。 現時点では、これが最も受け入れられるオプションです。 このバージョンの機能はバージョン1.0より劣りますが、はるかに便利です。



書く? 書いています!



さて、最後にコーディング。 最初に、言語の構文とその機能モデルを調べてみましょう。

機能の種類:

 NULL -- writeline(string); write(string); readline[type](variable); F -- ->read(string); ->show(); ->delete(string); ->create(string);
      
      







おそらく奇妙なFとNULLに気付いたでしょう。

FおよびNULL-関数の種類、F-ファイルシステムで動作する、NULL-親がありません。

つまり 構文は次のとおりです。



 #  F,     -> f->create(C:\15.txt); #  ,    writeline(%c !);
      
      







わかった? そう思う。

%cとは何ですか? これは、\ n、\ aなどと同等です。 (申し訳ありませんが、硬化症と呼ばれることを忘れていました)。



%c-コンマを入れます(以下を参照)

%n-改行



コーディングはもうすぐですか? はい、今すぐ!



そして、誰もが待っていたコーディング。

さて、main関数を書きましょう。ファイルを1行ずつ読み取り、その行をパーサーに渡します。



 using System; using System.IO; namespace lang { class MainClass { public static void Main (string[] args) { try { using (StreamReader sr = new StreamReader(args[0])) //     { string line; //    while ((line = sr.ReadLine()) != null) //    { Parse.PARSE(line); //  } } } catch (Exception ex) //    catch { Console.Write(" : "); Console.WriteLine(ex.Message); } } } }
      
      





ここではすべてがはっきりしていると思うので、さらに先に進みましょう。



パーサー



したがって、 Main.cs、funct.cs、Parse.csがあります 。 これらはすべて私たちのクラスです。



Main.csは上で書いたものです

Parse.cs-文字列パーサー

funct.cs-メソッド



パーサーを作成しています。

 using System; namespace lang { public class Parse { public Parse () { } public static void PARSE(string code) { if (code.IndexOf ('#') != 0) { if(code.EndsWith(";")) { int a = code.IndexOf('('); int b = code.IndexOf(')'); string func = code.Substring(0,a); string args = code.Substring(a+1,ba-1); string[] arg = args.Split(','); func = func.Replace(" ", ""); switch(func.ToLower()) {
      
      







これを実行することは価値がありません。行ごとに分析します。

public static void PARSE(string code)



-これは文字列を解析するためのメソッドです

if (code.IndexOf ('#') != 0) {



-コードが '#'で始まらない場合(これはコメントです)、parsim。

if(code.EndsWith(";")) {



-行が「;」で終わる場合、解析を続行します

少なくとももう少し必要ですが、ロジックが必要だからです。



文字列を関数と引数にトリミングするためのモデル:



  function(arg1,arg2); ^ ^ ab
      
      







このようにカットします。



string func = code.Substring(0,a);



-0文字から最初の「(」までトリミングを開始します。その結果、関数が取得されます

string args = code.Substring(a+1,ba-1);



-'('から ");"に続く最初の文字から引数を取得します (+1)

string[] arg = args.Split(',');



-引数を「、」で区切って配列を作成します

func = func.Replace(" ", "");



-スペースのエラーを回避するためにこれを行います。

  switch(func.ToLower()) { case "write": funct.write(arg); break; case "writeline": funct.writeline(arg); break; case "readline": funct.readln(arg[0]); break; }
      
      





書き込み、書き込み、読み取りの3つの基本的な機能があります。



機能



言語には3つの変数があり、



  public static string a; public static char b; public static int c;
      
      







あなたは彼らと仕事をすることができます、これは以前のバージョンと比較した言語の革新です。



機能コード:



 using System; namespace lang { public class funct { public static string a; public static char b; public static int c; public static void writeline (string[] args) { int z = 0; string s = ""; if(args[z] == "a") { // writeline(a);    a Console.WriteLine(a); } else if(args[z] == "b") { // writeline(b);    b Console.WriteLine(b); } else if(args[z] == "c") { // writeline(c);    c Console.WriteLine(c); } else { while(z < args.Length) { //         s += args[z] + " "; z++; } s = s.Replace("%n", Environment.NewLine); // %n    s = s.Replace("%c", ","); // %c   Console.WriteLine(s); //  } } public static void write (string[] args) // writeline { int z = 0; string s = ""; if(args[z] == "a") { Console.WriteLine(a); } else if(args[z] == "b") { Console.WriteLine(b); } else if(args[z] == "c") { Console.WriteLine(c); } else { while(z < args.Length) { s += args[z] + " "; z++; } s = s.Replace("%n", Environment.NewLine); s = s.Replace("%c", ","); Console.Write(s); } } public static void readln (string args) { if(args == "a") { //  == a,    a a = Console.ReadLine(); } else if(args == "b") { //, ,    Console.WriteLine("You can't use \"b\" variable as @STRING."); } else if(args == "c") { //  Console.WriteLine("You can't use \"c\" variable as @STRING."); } } } }
      
      





これで最初の部分が終了し、2番目の部分はファイルシステムに関するものになります。 じゃあね!



All Articles