2010-08-10 13 views
2

Je lis Le programmeur Pragmatique et de faire l'exercice suivant dans le monde .net (chapitre 3 - Code de générateurs)Code programmeur Pragmatique génération exercice

L'exercice

« Ecrire un générateur de code qui prend l'entrée dans le Listing 1, et génère une sortie dans les deux langues de votre choix Essayez de faciliter l'ajout de nouvelles langues. "

Liste 1
# Ajouter un produit
# à la 'sur ordre' Liste
M addProduct
F id                               int
F nom                     char [30]
F order_code   int
E

Comment voulez-vous mettre en œuvre la solution T4 ou quoi que ce soit d'autre dans le monde .net (CodeDOM est trop complexe) afin que nous puissions générer le code en C# et en un autre langage .net (visual basic ou IronRuby etc.)

Répondre

1

Je sais que vous dites que CodeDOM est trop complexe, mais je suggère d'utiliser CodeDOM =). Voici un petit exemple pour commencer: http://asp.dotnetheaven.com/howto/doc/listbuilder.aspx. Pour votre exemple, vous voudrez probablement ajouter un CodeMemberMethod aux membres de CodeTypeDeclaration - MSDN a quelques exemples.

T4 pourrait fonctionner, mais je ne pense pas que ce soit vraiment idéal pour cette situation.

1

Je ne pense pas que cela soit destiné à être un exercice de travail avec des générateurs de code existants. En fait, il y a beaucoup plus. Le but, je crois, est de construire votre propre générateur de code, un langage spécifique au domaine et de traiter des concepts tels que l'analyse syntaxique et l'extensibilité/pluggability. Peut-être que je lis trop dans l'exercice, mais c'est peut-être plus sur le développement des compétences de base des développeurs/connaissances que de se renseigner sur les outils existants.

+0

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. –

1

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)); 
    } 
} 
+0

La version ruby ​​http://devnetfx.blogspot.com/2010/10/code-generation-in-ruby.html – user198552