IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Parser du c# en c#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti Avatar de M.Leroy
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 49
    Par défaut Parser du c# en c#
    Bonjour,

    Je souhaiterais parser du code c# , plus précisément le code généré par CodeDomDesignerLoader en bref le concepteur de fenêtre mais sous cette forme là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    //
    //     Changes to this file may cause incorrect behavior and will be lost if
    //     the code is regenerated.
    // </auto-generated>
    //------------------------------------------------------------------------------
     
    namespace DesignerHostSample
    {
        using System;
        using System.ComponentModel;
        using System.Windows.Forms;
     
     
        public class Form1 : System.Windows.Forms.Form
        {
     
            private System.Windows.Forms.Button button1;
     
            private System.Windows.Forms.TextBox textBox1;
     
            private System.Windows.Forms.CheckBox checkBox1;
     
            private System.Windows.Forms.Button button2;
     
            public Form1()
            {
                this.InitializeComponent();
            }
     
            [System.STAThreadAttribute()]
            public static void Main()
            {
                System.Windows.Forms.Application.Run(new Form1());
            }
     
            private void InitializeComponent()
            {
                this.button1 = new System.Windows.Forms.Button();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.checkBox1 = new System.Windows.Forms.CheckBox();
                this.button2 = new System.Windows.Forms.Button();
                this.SuspendLayout();
                // 
                // button1
                // 
                this.button1.Location = new System.Drawing.Point(237, 44);
                this.button1.Name = "button1";
                this.button1.Size = new System.Drawing.Size(75, 23);
                this.button1.TabIndex = 0;
                this.button1.Text = "button1";
                this.button1.UseVisualStyleBackColor = true;
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(78, 105);
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(100, 20);
                this.textBox1.TabIndex = 1;
                // 
                // checkBox1
                // 
                this.checkBox1.Location = new System.Drawing.Point(27, 77);
                this.checkBox1.Name = "checkBox1";
                this.checkBox1.Size = new System.Drawing.Size(104, 24);
                this.checkBox1.TabIndex = 2;
                this.checkBox1.Text = "checkBox1";
                this.checkBox1.UseVisualStyleBackColor = true;
                // 
                // button2
                // 
                this.button2.Location = new System.Drawing.Point(186, 15);
                this.button2.Name = "button2";
                this.button2.Size = new System.Drawing.Size(75, 23);
                this.button2.TabIndex = 3;
                this.button2.Text = "button2";
                this.button2.UseVisualStyleBackColor = true;
                // 
                // Form1
                // 
                this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
                this.ClientSize = new System.Drawing.Size(456, 261);
                this.Controls.Add(this.button2);
                this.Controls.Add(this.checkBox1);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.button1);
                this.Name = "Form1";
                this.ResumeLayout(false);
                this.PerformLayout();
            }
        }
    }
    dans le but de le convertir dans "mon" propre langage de programmation :
    Nom : cpcdosc.PNG
Affichages : 219
Taille : 13,2 Ko
    etc...
    Je vous remercie

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Bonjours,

    tu veux faire quoi présentement, interpréter et exécuter ton "language"

    ou juste en faire un fichier de configuration pour recharger les préférences ?

  3. #3
    Membre averti Avatar de M.Leroy
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 49
    Par défaut
    Citation Envoyé par panthere noire Voir le message
    Bonjours,

    tu veux faire quoi présentement, interpréter et exécuter ton "language"

    ou juste en faire un fichier de configuration pour recharger les préférences ?

    Je veux juste faire un travail de traduction, le concepteur de fenêtre génère du code c# et je veux traduire ce code dans le langage de la capture d'écran juste dans le but de le traduire. Il sera interprété plus tard par un OS différent de Windows.
    merci

    voici le code qui permet de créer le code c# avec le concepteur de fenêtre en utilisant la sérialisation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.ComponentModel.Design.Serialization;
    using System.Collections;
    using System.Diagnostics;
    using System.Globalization;
    using System.IO;
    using System.Reflection;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Text;
    using System.Windows.Forms;
    using System.CodeDom.Compiler;
    using System.CodeDom;
    using Microsoft.CSharp;
    using Microsoft.VisualBasic;
     
    namespace Loader
    {
    	/// <summary>
    	/// This is used by the CodeDomHostLoader to generate the CodeCompleUnit
    	/// </summary>
    	internal class CodeGen 
    	{
    		private CodeCompileUnit codeCompileUnit;
    		private CodeNamespace ns;
    		private CodeTypeDeclaration myDesignerClass = new CodeTypeDeclaration();
    		private CodeMemberMethod initializeComponent = new CodeMemberMethod();
    		private IDesignerHost host;
    		private IComponent root;
     
    		private static readonly Attribute[] propertyAttributes = new Attribute[] 
    		{
    			DesignOnlyAttribute.No
    		};
     
            /// <summary>
            /// This function generates the default CodeCompileUnit template
            /// </summary>
            public CodeCompileUnit GetCodeCompileUnit(IDesignerHost host)
    		{
                this.host = host;
                IDesignerHost idh = (IDesignerHost)this.host.GetService(typeof(IDesignerHost));
                root = idh.RootComponent;
                Hashtable nametable = new Hashtable(idh.Container.Components.Count);
     
                ns = new CodeNamespace("DesignerHostSample");
                myDesignerClass = new CodeTypeDeclaration();
                initializeComponent = new CodeMemberMethod();
     
                CodeCompileUnit code = new CodeCompileUnit();
     
                // Imports
                ns.Imports.Add(new CodeNamespaceImport("System"));
                ns.Imports.Add(new CodeNamespaceImport("System.ComponentModel"));
                ns.Imports.Add(new CodeNamespaceImport("System.Windows.Forms"));
                code.Namespaces.Add(ns);
                myDesignerClass = new CodeTypeDeclaration(root.Site.Name);
                myDesignerClass.BaseTypes.Add(typeof(Form).FullName);
     
                IDesignerSerializationManager manager = host.GetService(typeof(IDesignerSerializationManager)) as IDesignerSerializationManager;
     
                ns.Types.Add(myDesignerClass);
     
                // Constructor
                CodeConstructor con = new CodeConstructor();
     
                con.Attributes = MemberAttributes.Public;
                con.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), "InitializeComponent")));
                myDesignerClass.Members.Add(con);
     
                // Main
                CodeEntryPointMethod main = new CodeEntryPointMethod();
     
                main.Name = "Main";
                main.Attributes = MemberAttributes.Public | MemberAttributes.Static;
                main.CustomAttributes.Add(new CodeAttributeDeclaration("System.STAThreadAttribute"));
                main.Statements.Add(new CodeMethodInvokeExpression(new CodeMethodReferenceExpression(new CodeTypeReferenceExpression(typeof(System.Windows.Forms.Application)), "Run"), new CodeExpression[] {
    				new CodeObjectCreateExpression(new CodeTypeReference(root.Site.Name))
    			}));
                myDesignerClass.Members.Add(main);
     
                // InitializeComponent
                initializeComponent.Name = "InitializeComponent";
                initializeComponent.Attributes = MemberAttributes.Private;
                initializeComponent.ReturnType = new CodeTypeReference(typeof(void));
                myDesignerClass.Members.Add(initializeComponent);
                codeCompileUnit = code;
                return codeCompileUnit;
    		}
     
    	}// class
    } // namespace

  4. #4
    Membre averti Avatar de M.Leroy
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2019
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2019
    Messages : 49
    Par défaut
    Avec une sérialisation en Xml on ne peut pas copier,coller...
    Et avec C# on ne peut pas enregistrer la fenêtre.. Ils me font rire chez Microsoft
    designer.rar
    http://www.windows-tech.info/3/eb67e8dd83693a79.php
    peut être que la solution se trouve dans l'ouverture d'une assembly comme écrit sur cette page à la fin..
    il y a aussi la source de softwarezator qui est intéressante
    https://github.com/veler/SoftwareZator-2012
    Ou rester sur du XML (ou mon parser fonctionne déjà) en essayant d'implémenter les fonctions copier...coller Néanmoins supprimer et centrer sur le formulaire fonctionnent.
    comme ici https://www.codeproject.com/articles...-back-together
    Ou bien créer une extension sur Visual Studio qui permet de convertir le code c# généré mais là c'est encore autre chose..

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 412
    Par défaut
    Dison que c'est pas dans leur intérêt. non seulement coter finance, mai aussi coter ressource...

    Pour ton problème cela dépasse mes compétences je suis débutant en C#... je passe donc la main a quelqu'un d'autre.

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    Citation Envoyé par M.Leroy Voir le message
    Et avec C# on ne peut pas enregistrer la fenêtre.. Ils me font rire chez Microsoft
    Que veux-tu dire "avec c#" ? si c'est le loader CodeDomHostLoader.
    Alors là si de chez Microsoft ils te font rire "jaune" ,moi je me permets à mon tour de rire à tes depens.
    Le code .cs ou .vb genere par le Designer et affiché dans le RichTextBox peut etre sauvegardé à chaque modif en ModeDesign instantanement.

    Il suffit de "trapper" l'event TextChanged du RTB .
    L'exemple de code fourni necessite d'ajouter un handler dans le form MainShell dans le method SwitchToCode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
      private void SwitchToCode(string context)
            {
                if (CurrentActiveDocumentLoaderType == LoaderType.NoLoader)
                {
                    MessageBox.Show("Code view is not supported for document loaded without Loaders");
                    return;
                }
     
                if (context == Strings.Xml && CurrentActiveDocumentLoaderType != LoaderType.BasicDesignerLoader)
                {
                    MessageBox.Show("Xml code view is supported only for BasicDesignerLoader");
                    return;
                }
     
                if ((context == Strings.CS || context == Strings.VB || context == Strings.JS) && CurrentActiveDocumentLoaderType != LoaderType.CodeDomDesignerLoader)
                {
                    MessageBox.Show(context + " code view is supported only for CodeDomDesignerLoader");
                    return;
                }
     
                HostControl currentHostControl = CurrentDocumentsHostControl;
     
     
                RichTextBox codeEditor = CurrentDocumentsCodeEditor;
                // -----------------MODIF  PAR  ICI AVEC CE HANDLER
                codeEditor.TextChanged += new EventHandler(codeEditor_TextChanged);
                // -----------------FIN MODIF  
                if (CurrentActiveDocumentLoaderType == LoaderType.BasicDesignerLoader)
                    codeEditor.Text = ((BasicHostLoader)currentHostControl.HostSurface.Loader).GetCode();
                else if (CurrentActiveDocumentLoaderType == LoaderType.CodeDomDesignerLoader)
                    codeEditor.Text = ((CodeDomHostLoader)currentHostControl.HostSurface.Loader).GetCode(context);
     
                int index = CurrentDocumentsCodeIndex;
     
                if (this.tabControl1.SelectedIndex != index)
                {
                    _prevIndex = this.tabControl1.SelectedIndex;
                    this.tabControl1.SelectedIndex = index;
                    _curIndex = index;
                }
            }
            // -----------------LE HANDLER DU RTB
            void codeEditor_TextChanged(object sender, EventArgs e)
            {
                RichTextBox rtb =sender as RichTextBox ;
     
                string cleanup = rtb.Text; // obtient la version texte du RTB
                string fileName = Path.Combine(Application.StartupPath, "RTB.txt"); 
                StreamWriter file = new StreamWriter(fileName);
     
                file.Write(cleanup);
                file.Close();
            }
    Le fichier est enregistre dans le répertoire \bin\debug du projet Shell.

    Quant à parser le code c# généré il n' y a que le compilateur C# qui sait le faire .
    Ou un nouveau compilateur du CSharp de ton cru pour le faire.
    Parser veut dire vérifier la conformité de la syntaxe au langage C# ,en plus de nécessiter un "Scanner" dit Analyseur Lexical & un CodeGenerator dit Generateur de code cible (ton language cpc).
    C'est en bref l'écriture d'un compilateur (Parser +Scanner +CodeGenerator)qui n'est pas pas une tache triviale, je tiens à le répéter .
    Ce lien Microsoft (article de MSDN Magazine de February 2008) donne une idée de l'écriture d'un tel compilateur pour le C# & .....en C# !!!.

    https://docs.microsoft.com/en-us/arc...k-using-csharp

    le lien du code d'exemple de cet article n'est plus disponible sur le lien donné .
    Mais on peut le retrouver pour le mois donné (fevrier 2008) sur le site d'archive web suivant (pour les articles MSDN Magazine):

    https://web.archive.org/web/20080922.../cc188707.aspx

    bon code...

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Pour le cote purement technique : Roslyn est les compilo de c#, est open source ect, suffisais de chercher: https://github.com/dotnet/roslyn .
    Codedom est deprecie depuis longtemps et est une veritable plaie a utiliser.

    Ensuite, si tu veux 'traduire' du code c# vers autre chose, a toi de l'ecrire, bon courage.

Discussions similaires

  1. [JAXP] com.sun.xml.parser.ValidatingParser
    Par yolepro dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 05/11/2008, 15h36
  2. parser xml
    Par billout dans le forum C++Builder
    Réponses: 4
    Dernier message: 20/11/2003, 11h08
  3. [Servlet] parser la requete
    Par jaimepasteevy dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 15/10/2003, 16h43
  4. Parser XML
    Par miloux32 dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 18/07/2003, 03h17
  5. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 18h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo