Prenant les conseils de Ben Griswold, je pense que c'est une bonne idée de l'implémenter moi-même. Et tout juste un peu dans la mise en œuvre générateur de code en C#, j'ai réalisé quelques petites choses -
1. Besoin langage de manipulation de texte comme Python, etc.
2. Nécessité d'apprendre des expressions régulières
Je ne l'intention de le mettre en œuvre en Ruby mais pour l'instant, je mis en œuvre en C# en -
static void Main(string[] args)
{
CodeGenerator gen = new CodeGenerator();
gen.ReadFile("Input.txt");
}
public class CodeGenerator
{
public void ReadFile(string filename)
{
StreamReader fs = new StreamReader(filename);
string line;
CSharpCode CG = new CSharpCode();
while ((line = fs.ReadLine()) != null)
{
line = line.TrimEnd('\n');
if (Regex.IsMatch(line, @"^\s*S"))
CG.BlankLine();
else if (Regex.IsMatch(line, @"^\#(.*)")) // match comments
CG.Comment(line.TrimStart('#'));
else if (Regex.IsMatch(line, @"^M\s*(.+)")) // start msg
CG.StartMsg(line.Split(' ')[1]);
else if (Regex.IsMatch(line, @"^E")) // end msg
CG.EndMsg();
else if (Regex.IsMatch(line, @"^F\s*(\w+)")) // simple type
CG.SimpleType(Regex.Split(line, @"^F\s*(\w+)")[1], Regex.Split(line, @"^F\s*(\w+)")[2]);
else
Console.WriteLine("Invalid line " + line);
}
}
}
// Code Generator for C#
public class CSharpCode
{
public void BlankLine() { Console.WriteLine(); }
public void Comment(string comment) { Console.WriteLine("//" + comment); }
public void StartMsg(string name) { Console.WriteLine("public struct " + name + "{"); }
public void EndMsg() { Console.WriteLine("}"); }
public void SimpleType(string name, string type)
{
if(type.Contains("char["))
type = "string";
Console.WriteLine(string.Format("\t{0} {1};", type.Trim(), name));
}
}
ici, vous allez: http://www.theserverside.com/news/1365073/The-Pragmatic-Code-Generator-Programmer. Cette écriture arrive à l'essence de l'exercice plutôt bien. Bonne chance. –