プロローグ
私は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番目の部分はファイルシステムに関するものになります。 じゃあね!