C# 创建一个;编译器";编辑字符串
你好,atm,我正在忙着创建一个编译器。这是我转换随机语言的尝试 输入:C# 创建一个;编译器";编辑字符串,c#,string,compiler-construction,C#,String,Compiler Construction,你好,atm,我正在忙着创建一个编译器。这是我转换随机语言的尝试 输入: import System; import System.Collections.Generic; import System.Linq; import System.Text; import System.IO; class Compiler BEGIN; private List : string Strings; function construct() BEGIN; S
import System;
import System.Collections.Generic;
import System.Linq;
import System.Text;
import System.IO;
class Compiler
BEGIN;
private List : string Strings;
function construct()
BEGIN;
Strings = new List : string();
END;
function void start ( a : int, b : int, c : int )
BEGIN;
END;
END;
输出:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
class Compiler
{
private List < string Strings;
{
Strings = new List < string();
}
private void start ( int a, int b, int c,
{
}
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.IO;
类编译器
{
私有列表<字符串;
{
Strings=新列表
正如你所看到的,将我的代码编译成c#是一种很有效的方法,除了列表之外,我只是通过编辑字符串来编译代码,我没有教程,只是为了好玩和尝试(请不要看我的编译代码,它只是用我在没有谷歌或任何东西的情况下知道的随机代码制作的),现在我在谷歌上搜索更好的独处,但我还没有找到任何东西
这是我的编译器代码:
public void Compile(String input, String output)
{
DirectoryCopy(input, output, true);
Console.WriteLine("Searching input directory for files.");
string[] filePaths = Directory.GetFiles(input, "*.upl",SearchOption.AllDirectories);
Console.WriteLine("Found " + filePaths.Count() + " file(s) In this directory and all sub directorys");
Console.WriteLine("Start compiling? (Y/N)");
if (Console.ReadLine().Equals("y"))
{
Console.WriteLine("Starting...");
for (int p = 0; p < filePaths.Length; p++ )
{
String[] lines = File.ReadAllLines(filePaths[p]);
for (int i = 0; i < lines.Length; i++)
{
lines[i] = lines[i].StartsWith("import ") ? lines[i].Replace("import", "using") : lines[i];
if (lines[i].Contains("function "))
{
lines[i] = lines[i].Replace("function", "private");
string[] split = lines[i].Split(' ');
for (int s = 0; s < split.Length; s++)
{
if (split[s].Contains(":"))
{
if (split[s - 1].Contains("("))
{
if (split[s + 1].Contains(","))
{
string[] split2 = split[s + 1].Split(',');
split[s - 1] = "( " + split2[0] + " " + split[s - 1][1] + ",";
split[s] = string.Empty;
split[s + 1] = split[s + 1].Split(',')[1];
}
else
{
split[s - 1] = "( " + split[s + 1] + " " + split[s - 1][1];
split[s] = string.Empty;
split[s + 1] = string.Empty;
}
}
else if (split[s + 1].Contains(")"))
{
split[s + 1] = split[s + 1].Replace(")", "");
split[s - 1] = split[s + 1] + " " + split[s - 1] + " )";
}
else
{
split[s - 1] = split[s + 1].Replace(",", "") + " " + split[s - 1] + ", ";
split[s] = string.Empty;
split[s + 1] = string.Empty;
}
}
}
split[split.Length - 1] = string.Empty;
split[split.Length - 2] = string.Empty;
lines[i] = String.Join(" ", split);
}
if (lines[i].Contains("if") || lines[i].Contains("foreach"))
{
bool insert = false;
for (int i2 = 2; i2 < lines[i].Length; i2++)
{
if (!char.IsLetter(lines[i][i2]))
{
if (insert == false)
{
char[] letters = lines[i].ToCharArray();
letters[i2] = '(';
lines[i] = String.Join("", letters);
insert = true;
}
}
}
lines[i] = !lines[i].EndsWith("BEGIN;") ? lines[i] + ")" : lines[i];
lines[i] = lines[i].Contains(":") ? lines[i].Replace(":", "in") : lines[i];
}
if (lines[i].Contains("Message"))
{
lines[i] = lines[i].Replace("Message", "MessageBox.Show(");
lines[i] = lines[i].Replace(";", " );");
}
if (lines[i].Contains("List") && lines[i].Contains(":"))
{
int spaces = 0;
char[] letters = lines[i].ToCharArray();
for (int c = 0; c < letters.Length; c++)
{
letters[c] = char.Equals(letters[c], ':') ? '<' : letters[c];
if (char.Equals(letters[c], '<'))
break;
spaces = char.IsWhiteSpace(letters[c]) ? spaces + 1 : spaces;
}
lines[i] = String.Join("", letters);
string[] spacesArr = lines[i].Split(' ');
}
lines[i] = lines[i].EndsWith("BEGIN;") || lines[i].StartsWith("BEGIN") ? lines[i].Replace("BEGIN;", "{") : lines[i];
lines[i] = lines[i].EndsWith("END;") || lines[i].Contains("END;") ? lines[i].Replace("END;", "}") : lines[i];
}
double completion = ((double)(p + 1) / (double)filePaths.Length) * 100;
Console.WriteLine("Compiled file " + (p + 1) + " of the total " + filePaths.Length + " file(s). (" + (int)completion + "%)");
int pathleng2 = output.Split('\\').Count();
string[] filepath = filePaths[p].Split('\\');
string subPath = String.Join("\\", filepath, pathleng2, (filePaths[p].Split('\\').Count() - input.Split('\\').Count()));
subPath = subPath.Replace("upl", "cs");
File.WriteAllLines(output + "\\" + subPath, lines);
}
}
}
public void编译(字符串输入,字符串输出)
{
DirectoryCopy(输入、输出、真);
WriteLine(“搜索输入目录中的文件”);
字符串[]filepath=Directory.GetFiles(输入“*.upl”,SearchOption.AllDirectories);
Console.WriteLine(“在此目录和所有子目录中找到“+filepath.Count()+”文件”);
Console.WriteLine(“开始编译?(Y/N)”);
if(Console.ReadLine().Equals(“y”))
{
Console.WriteLine(“开始…”);
for(int p=0;p