Accueil > > > ANALYSEUR LEXICAL ET SYNTAXIQUE DES FORMULES PROPOSITIONNELLES [LOGIQUE MATHÉMATIQUE]
ANALYSEUR LEXICAL ET SYNTAXIQUE DES FORMULES PROPOSITIONNELLES [LOGIQUE MATHÉMATIQUE]
Information sur la source
Description
C'est un petit source développé dans les séances de tps du module Logique mathématique. Il s'agit d'un analyseur lexical et syntaxique des formules propositionnelles (logique propositionnelle). L'analyseur lexical utilisé est un analyseur ascendant type LR sans précédence d'opérateurs (utilisant une pile pour la synthèse de l'arbre de l'analyse syntaxique (RF Compilation)). La grammaire utilisée pour l'analyseur syntaxique est tres simple: S -> F F -> (F) | F & F | F => F | F <=> F | ~F | F|F En ce qui concerne l'analyse lexicale, tout est basé sur les automates et la classe Regex En plus, il permet de calculer la profondeur, la longueur et la complexité de la formule propositionnelle.
Source
- using System;
- using System.Collections.Generic;
- using System.Text.RegularExpressions;
- using System.Windows.Forms;
-
- /**********************************************************************************
- * Analyseur lexical & syntaxique de formules propositionnelles (logique propositionnelle)
- * Développé dans les tps du module Logique mathématique (en coop avec Compil)
- * Boutemine Oualid (L3)
- * Guetteche Ali (M1)
- * *********************************
- * Last code modification 19/01/2009
- **********************************************************************************/
- // Chaine de teste: A & B | ~( C => (B <=> ~D)) => A
- namespace tpLM
- {
- public partial class frmMain : Form
- {
-
- #region Automates
- private string symbols = "()~|=><=>&"; // les symboles
- // Automate des connecteurs logiques.
- Regex logicalConnectors = new Regex (@"^\||~|&|=\>|\<=\>$");
- // automate de recherche d'identificateurs.
- Regex identifier = new Regex ("^[a-zA-Z_][a-zA-Z0-9_]*$");
- // automates des parentheses.
- Regex parentheses = new Regex (@"^\(|\)$");
- // automates des unités lexicales. [BUG FIXED:\<=\> must appear befor =\> to identify equivalance before implication]
- Regex lexicalUnits = new Regex (@"[a-zA-Z0-9_]+|\(|\)|\||~|&|\<=\>|=\>");
- // automates des caracteres illegaux.
- Regex illegalChars = new Regex (@"[^a-zA-Z0-9()|~&=><_ ]");
- #endregion
-
-
- /// <summary>
- /// Retourne la profondeur de l'arbre d'analyse.
- /// </summary>
- /// <param name="root">Le sommet de l'arbre d'analyse.</param>
- /// <returns>La profondeur de l'arbre.</returns>
-
- public int GetDepth (TreeNode root)
- {
- int depth = 0;
- // Appels recursives.
- switch (root.Nodes.Count)
- {
- case (0):
- {
- depth = 0;
- break;
- }
- case (1):
- {
- depth += GetDepth (root.Nodes [0]) + 1;
- break;
- }
- case (2):
- {
- depth += Math.Max (GetDepth (root.Nodes [0]), GetDepth (root.Nodes [1])) + 1;
- break;
- }
- }
- return depth;
- }
-
- /// <summary>
- /// Retourne la longueur de la formule
- /// </summary>
- /// <param name="input">La chaine a comparer.</param>
- /// <returns>Longueur</returns>
- public int GetLength (string input)
- {
- // Nombre parentheses + Variables propositionnelles + connecteurs logiques
- return GetParenthesis (input) + GetIdentifiers (input) + GetLogicalConnectors (input);
- }
-
- /// <summary>
- /// Retourne le nombre de parentheses dans la chaine.
- /// </summary>
- /// <param name="input">Chaine a comparer.</param>
- /// <returns>Nombre de parentheses.</returns>
- public int GetParenthesis (string input)
- {
- int counter = 0;
- MatchCollection wordsResult = lexicalUnits.Matches (input);
- // pour chaque mot dans la formule.
- foreach (Match word in wordsResult)
- {
- if (parentheses.IsMatch (word.Value))
- counter++;
- }
- return counter;
- }
-
- /// <summary>
- /// Retourne le nombre d'identificateurs.
- /// </summary>
- /// <param name="input">La chaine a comparer</param>
- /// <returns>Le nombre d'identificateur.</returns>
- public int GetIdentifiers (string input)
- {
- int counter = 0;
- MatchCollection wordsResult = lexicalUnits.Matches (input);
- // pour chaque mot dans la formule.
- foreach (Match word in wordsResult)
- {
- // si c'est un identificateur valide, alors compte le.
- if (identifier.IsMatch (word.Value))
- counter++;
- }
- return counter;
- }
-
- /// <summary>
- /// Routine de récupération sur les erreurs lexicales
- /// </summary>
- /// <param name="input">La formule propositionnelle</param>
- /// <returns>Dictionnaire d'erreurs.</returns>
- public Dictionary<int, string> GetLexicalErrors (string input)
- {
- Dictionary<int, string> errors = new Dictionary<int, string> ();
- // Recherche des caracteres speciaux non reconnues.
- MatchCollection illegalchars = illegalChars.Matches (input);
- foreach (Match illegalchar in illegalchars)
- errors.Add (illegalchar.Index, illegalchar.Value);
- // Unités lexicales
- MatchCollection tookens = lexicalUnits.Matches (input);
- // Pour chaque mot dans la formule
- foreach (Match tooken in tookens)
- {
- // s'il n'est pas un identificateur ou un connecteur ou une parenthese.
- if (!identifier.IsMatch (tooken.Value) &&
- !parentheses.IsMatch (tooken.Value) &&
- !logicalConnectors.IsMatch (tooken.Value))
- errors.Add (tooken.Index, tooken.Value);
- }
- return errors;
- }
-
- /// <summary>
- /// Retourne le nombre d'operateurs logiques.
- /// </summary>
- /// <param name="input">la formule propositionnelle.</param>
- /// <returns>Le nombre d'operateur</returns>
- public int GetLogicalConnectors (string input)
- {
- int counter = 0;
- MatchCollection wordsResults = lexicalUnits.Matches (input);
- lblDepth.Text = wordsResults.Count.ToString ();
- // Pour chaque mots dans la formule
- foreach (Match word in wordsResults)
- {
- // si le mot est un connecteur logique alors.
- if (logicalConnectors.IsMatch (word.Value))
- counter++;
- }
- return counter;
- }
-
- /// <summary>
- /// Retourne la complexité de la chaine (Nombre de connecteurs).
- /// </summary>
- /// <param name="input">La chaine a comparer.</param>
- /// <returns>La complexité.</returns>
- public int GetComplexity (string input)
- {
- return GetLogicalConnectors (input);
- }
-
- /// <summary>
- /// Représente une production (Regle) dans la grammaire de l'analyseur syntaxique.
- /// </summary>
- public struct GrammarRule
- {
- /// <summary>
- /// Créer une nouvelle loie pour la grammaire.
- /// </summary>
- /// <param name="value">
- /// Regle.
- /// </param>
- /// <param name="Operator">
- /// Operateur.
- /// </param>
- /// <param name="operandsCount">
- /// Nombre d'operandes.
- /// </param>
- public GrammarRule (string value, string Operator, int operandsCount)
- {
- this.Operator = Operator;
- this.Value = value;
- this.OperandsCount = operandsCount;
- }
- /// <summary>
- /// Operateur.
- /// </summary>
- public string Operator;
- /// <summary>
- /// Regle.
- /// </summary>
- public string Value;
- /// <summary>
- /// Nombre d'operandes.
- /// </summary>
- public int OperandsCount;
- }
- /// <summary>
- /// Productions de la grammaire
- /// </summary>
- private List<GrammarRule> grammarRules = new List<GrammarRule> ();
- /// <summary>
- /// Pile des opérations de synthèse d'arbre (Synthese ascendante).
- /// </summary>
- private Stack<TreeNode> nodeStack = new Stack<TreeNode> ();
- /// <summary>
- /// Vérifie si la formule est syntaxiquement correcte.
- /// </summary>
- /// <param name="input">La forume a vérifier</param>
- /// <returns>Retourne le resultat de la vérification.</returns>
- private bool ContainsSyntaxicErrors (string input)
- {
- bool error = false;
- // Pile d'analyse de la chaine
- string buffer = string.Empty;
- // Jetons par l'analyseur lexicale.
- MatchCollection tookensResult = lexicalUnits.Matches (input);
- /******* Analyseur Syntaxique Ascendant LR********
- * sans précédence d'opérateurs
- *******/
- foreach (Match tooken in tookensResult)
- {
- // Etape 1: vérifie le type du jeton: (soit symbole (Connecteur ou parenthese) ou variable propositionnelle.
- // Si c'est un symbole, l'empiler.
- if (symbols.Contains (tooken.Value))
- buffer += tooken.Value;
- else
- {
- // Si c'est une variable propositionnelle (Identificateur).
- buffer += "F";
- // Creer un noeud (Nom = Unité Lexicale)
- TreeNode node = new TreeNode (tooken.Value);
- // Empiler le noeud.
- nodeStack.Push (node);
- }
- repeat: // Etape 2: Substitions sur la pile d'entrée.
- foreach (GrammarRule rule in grammarRules)
- {
- if (buffer.Contains (rule.Value))
- {
- // substition en F
- buffer = buffer.Replace (rule.Value, "F");
- // donner pour nom du node l'operateur
- TreeNode parentNode = new TreeNode (rule.Operator);
- switch (rule.OperandsCount)
- {
- case (1):
- {
- // dépiler le noeud en somment de la pile
- TreeNode node1 = nodeStack.Pop ();
- // Mettre le noeud dans les sous-noeuds du parent.
- parentNode.Nodes.Add (node1);
- // Empiler le parent
- nodeStack.Push (parentNode);
- break;
- }
- case (2):
- {
- // dépiler le noeud en somment de la pile
- TreeNode node1 = nodeStack.Pop ();
- TreeNode node2 = nodeStack.Pop ();
- // Mettre le noeud dans les sous-noeuds du parent.
- parentNode.Nodes.Add (node2);
- parentNode.Nodes.Add (node1);
- // Empiler le parent
- nodeStack.Push (parentNode);
- break;
- }
- }
- // Répete l'analyse pour le nouveau buffer.
- goto repeat;
- }
- }
- }
- // analyse syntaxique correcte.
- error = (buffer != "F");
- if (!error)
- {
- // Affichage de l'arbre.
- trvSyntaxicTree.Nodes.Clear ();
- trvSyntaxicTree.Nodes.Add (nodeStack.Pop ());
- }
- return error;
- }
-
- public frmMain ()
- {
- InitializeComponent ();
- // Initialization du dictionnaire des productions de la grammaire.
- grammarRules.Add (new GrammarRule ("F&F", "&", 2));
- grammarRules.Add (new GrammarRule ("F|F", "|", 2));
- grammarRules.Add (new GrammarRule ("F=>F", "=>", 2));
- grammarRules.Add (new GrammarRule ("F<=>F", "<=>", 2));
- grammarRules.Add (new GrammarRule ("(F)", "", 0));
- grammarRules.Add (new GrammarRule ("~F", "~", 1));
- }
-
- private void btnCalculer_Click (object sender, EventArgs e)
- {
- // netoyage de la liste d'erreurs lexicales.
- lstLexicalErrors.Items.Clear ();
- // Traitement d'erreurs lexicales.
- Dictionary<int, string> errors = GetLexicalErrors (txtFormule.Text);
- // S'il existe des erreurs lexicales, on les affiche et on sort
- if (errors.Count != 0)
- {
- // affichage des erreurs : lexicales.
- foreach (KeyValuePair<int, string> error in errors)
- lstLexicalErrors.Items.Add ("Position " + error.Key.ToString () + ": " + error.Value.ToString ());
- // sort.
- return;
- }
-
- // Traitement des erreurs syntaxiques.
- if (ContainsSyntaxicErrors (txtFormule.Text))
- {
- lblSyntaxicErrors.Text = "La chaine est syntaxiquement incorrecte";
- return;
- }
-
- /*** Affichage des resultats. ***/
- // longueur.
- lblLenght.Text = GetLength (txtFormule.Text).ToString ();
- // Complexité.
- lblComplexity.Text = GetComplexity (txtFormule.Text).ToString ();
- // Profondeur.
- lblDepth.Text = GetDepth (trvSyntaxicTree.Nodes [0]).ToString ();
- }
- }
- }
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Windows.Forms;
/**********************************************************************************
* Analyseur lexical & syntaxique de formules propositionnelles (logique propositionnelle)
* Développé dans les tps du module Logique mathématique (en coop avec Compil)
* Boutemine Oualid (L3)
* Guetteche Ali (M1)
* *********************************
* Last code modification 19/01/2009
**********************************************************************************/
// Chaine de teste: A & B | ~( C => (B <=> ~D)) => A
namespace tpLM
{
public partial class frmMain : Form
{
#region Automates
private string symbols = "()~|=><=>&"; // les symboles
// Automate des connecteurs logiques.
Regex logicalConnectors = new Regex (@"^\||~|&|=\>|\<=\>$");
// automate de recherche d'identificateurs.
Regex identifier = new Regex ("^[a-zA-Z_][a-zA-Z0-9_]*$");
// automates des parentheses.
Regex parentheses = new Regex (@"^\(|\)$");
// automates des unités lexicales. [BUG FIXED:\<=\> must appear befor =\> to identify equivalance before implication]
Regex lexicalUnits = new Regex (@"[a-zA-Z0-9_]+|\(|\)|\||~|&|\<=\>|=\>");
// automates des caracteres illegaux.
Regex illegalChars = new Regex (@"[^a-zA-Z0-9()|~&=><_ ]");
#endregion
/// <summary>
/// Retourne la profondeur de l'arbre d'analyse.
/// </summary>
/// <param name="root">Le sommet de l'arbre d'analyse.</param>
/// <returns>La profondeur de l'arbre.</returns>
public int GetDepth (TreeNode root)
{
int depth = 0;
// Appels recursives.
switch (root.Nodes.Count)
{
case (0):
{
depth = 0;
break;
}
case (1):
{
depth += GetDepth (root.Nodes [0]) + 1;
break;
}
case (2):
{
depth += Math.Max (GetDepth (root.Nodes [0]), GetDepth (root.Nodes [1])) + 1;
break;
}
}
return depth;
}
/// <summary>
/// Retourne la longueur de la formule
/// </summary>
/// <param name="input">La chaine a comparer.</param>
/// <returns>Longueur</returns>
public int GetLength (string input)
{
// Nombre parentheses + Variables propositionnelles + connecteurs logiques
return GetParenthesis (input) + GetIdentifiers (input) + GetLogicalConnectors (input);
}
/// <summary>
/// Retourne le nombre de parentheses dans la chaine.
/// </summary>
/// <param name="input">Chaine a comparer.</param>
/// <returns>Nombre de parentheses.</returns>
public int GetParenthesis (string input)
{
int counter = 0;
MatchCollection wordsResult = lexicalUnits.Matches (input);
// pour chaque mot dans la formule.
foreach (Match word in wordsResult)
{
if (parentheses.IsMatch (word.Value))
counter++;
}
return counter;
}
/// <summary>
/// Retourne le nombre d'identificateurs.
/// </summary>
/// <param name="input">La chaine a comparer</param>
/// <returns>Le nombre d'identificateur.</returns>
public int GetIdentifiers (string input)
{
int counter = 0;
MatchCollection wordsResult = lexicalUnits.Matches (input);
// pour chaque mot dans la formule.
foreach (Match word in wordsResult)
{
// si c'est un identificateur valide, alors compte le.
if (identifier.IsMatch (word.Value))
counter++;
}
return counter;
}
/// <summary>
/// Routine de récupération sur les erreurs lexicales
/// </summary>
/// <param name="input">La formule propositionnelle</param>
/// <returns>Dictionnaire d'erreurs.</returns>
public Dictionary<int, string> GetLexicalErrors (string input)
{
Dictionary<int, string> errors = new Dictionary<int, string> ();
// Recherche des caracteres speciaux non reconnues.
MatchCollection illegalchars = illegalChars.Matches (input);
foreach (Match illegalchar in illegalchars)
errors.Add (illegalchar.Index, illegalchar.Value);
// Unités lexicales
MatchCollection tookens = lexicalUnits.Matches (input);
// Pour chaque mot dans la formule
foreach (Match tooken in tookens)
{
// s'il n'est pas un identificateur ou un connecteur ou une parenthese.
if (!identifier.IsMatch (tooken.Value) &&
!parentheses.IsMatch (tooken.Value) &&
!logicalConnectors.IsMatch (tooken.Value))
errors.Add (tooken.Index, tooken.Value);
}
return errors;
}
/// <summary>
/// Retourne le nombre d'operateurs logiques.
/// </summary>
/// <param name="input">la formule propositionnelle.</param>
/// <returns>Le nombre d'operateur</returns>
public int GetLogicalConnectors (string input)
{
int counter = 0;
MatchCollection wordsResults = lexicalUnits.Matches (input);
lblDepth.Text = wordsResults.Count.ToString ();
// Pour chaque mots dans la formule
foreach (Match word in wordsResults)
{
// si le mot est un connecteur logique alors.
if (logicalConnectors.IsMatch (word.Value))
counter++;
}
return counter;
}
/// <summary>
/// Retourne la complexité de la chaine (Nombre de connecteurs).
/// </summary>
/// <param name="input">La chaine a comparer.</param>
/// <returns>La complexité.</returns>
public int GetComplexity (string input)
{
return GetLogicalConnectors (input);
}
/// <summary>
/// Représente une production (Regle) dans la grammaire de l'analyseur syntaxique.
/// </summary>
public struct GrammarRule
{
/// <summary>
/// Créer une nouvelle loie pour la grammaire.
/// </summary>
/// <param name="value">
/// Regle.
/// </param>
/// <param name="Operator">
/// Operateur.
/// </param>
/// <param name="operandsCount">
/// Nombre d'operandes.
/// </param>
public GrammarRule (string value, string Operator, int operandsCount)
{
this.Operator = Operator;
this.Value = value;
this.OperandsCount = operandsCount;
}
/// <summary>
/// Operateur.
/// </summary>
public string Operator;
/// <summary>
/// Regle.
/// </summary>
public string Value;
/// <summary>
/// Nombre d'operandes.
/// </summary>
public int OperandsCount;
}
/// <summary>
/// Productions de la grammaire
/// </summary>
private List<GrammarRule> grammarRules = new List<GrammarRule> ();
/// <summary>
/// Pile des opérations de synthèse d'arbre (Synthese ascendante).
/// </summary>
private Stack<TreeNode> nodeStack = new Stack<TreeNode> ();
/// <summary>
/// Vérifie si la formule est syntaxiquement correcte.
/// </summary>
/// <param name="input">La forume a vérifier</param>
/// <returns>Retourne le resultat de la vérification.</returns>
private bool ContainsSyntaxicErrors (string input)
{
bool error = false;
// Pile d'analyse de la chaine
string buffer = string.Empty;
// Jetons par l'analyseur lexicale.
MatchCollection tookensResult = lexicalUnits.Matches (input);
/******* Analyseur Syntaxique Ascendant LR********
* sans précédence d'opérateurs
*******/
foreach (Match tooken in tookensResult)
{
// Etape 1: vérifie le type du jeton: (soit symbole (Connecteur ou parenthese) ou variable propositionnelle.
// Si c'est un symbole, l'empiler.
if (symbols.Contains (tooken.Value))
buffer += tooken.Value;
else
{
// Si c'est une variable propositionnelle (Identificateur).
buffer += "F";
// Creer un noeud (Nom = Unité Lexicale)
TreeNode node = new TreeNode (tooken.Value);
// Empiler le noeud.
nodeStack.Push (node);
}
repeat: // Etape 2: Substitions sur la pile d'entrée.
foreach (GrammarRule rule in grammarRules)
{
if (buffer.Contains (rule.Value))
{
// substition en F
buffer = buffer.Replace (rule.Value, "F");
// donner pour nom du node l'operateur
TreeNode parentNode = new TreeNode (rule.Operator);
switch (rule.OperandsCount)
{
case (1):
{
// dépiler le noeud en somment de la pile
TreeNode node1 = nodeStack.Pop ();
// Mettre le noeud dans les sous-noeuds du parent.
parentNode.Nodes.Add (node1);
// Empiler le parent
nodeStack.Push (parentNode);
break;
}
case (2):
{
// dépiler le noeud en somment de la pile
TreeNode node1 = nodeStack.Pop ();
TreeNode node2 = nodeStack.Pop ();
// Mettre le noeud dans les sous-noeuds du parent.
parentNode.Nodes.Add (node2);
parentNode.Nodes.Add (node1);
// Empiler le parent
nodeStack.Push (parentNode);
break;
}
}
// Répete l'analyse pour le nouveau buffer.
goto repeat;
}
}
}
// analyse syntaxique correcte.
error = (buffer != "F");
if (!error)
{
// Affichage de l'arbre.
trvSyntaxicTree.Nodes.Clear ();
trvSyntaxicTree.Nodes.Add (nodeStack.Pop ());
}
return error;
}
public frmMain ()
{
InitializeComponent ();
// Initialization du dictionnaire des productions de la grammaire.
grammarRules.Add (new GrammarRule ("F&F", "&", 2));
grammarRules.Add (new GrammarRule ("F|F", "|", 2));
grammarRules.Add (new GrammarRule ("F=>F", "=>", 2));
grammarRules.Add (new GrammarRule ("F<=>F", "<=>", 2));
grammarRules.Add (new GrammarRule ("(F)", "", 0));
grammarRules.Add (new GrammarRule ("~F", "~", 1));
}
private void btnCalculer_Click (object sender, EventArgs e)
{
// netoyage de la liste d'erreurs lexicales.
lstLexicalErrors.Items.Clear ();
// Traitement d'erreurs lexicales.
Dictionary<int, string> errors = GetLexicalErrors (txtFormule.Text);
// S'il existe des erreurs lexicales, on les affiche et on sort
if (errors.Count != 0)
{
// affichage des erreurs : lexicales.
foreach (KeyValuePair<int, string> error in errors)
lstLexicalErrors.Items.Add ("Position " + error.Key.ToString () + ": " + error.Value.ToString ());
// sort.
return;
}
// Traitement des erreurs syntaxiques.
if (ContainsSyntaxicErrors (txtFormule.Text))
{
lblSyntaxicErrors.Text = "La chaine est syntaxiquement incorrecte";
return;
}
/*** Affichage des resultats. ***/
// longueur.
lblLenght.Text = GetLength (txtFormule.Text).ToString ();
// Complexité.
lblComplexity.Text = GetComplexity (txtFormule.Text).ToString ();
// Profondeur.
lblDepth.Text = GetDepth (trvSyntaxicTree.Nodes [0]).ToString ();
}
}
}
Conclusion
C'est un tres bon exemple pour l'implementation d'une grammaire d'une calculatrice ou d'un traceur de courbes.
Bon prog
Fichier Zip
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
ListView et analyse syntaxique automatique [ par Hartwood ]
Salut à tousMon problèmes est assez simple mais compliqué en même temps! :-)J'utilise (en C#) une listView qui me sert de liste de completion pour un
Analyse spectrale de la voix. [ par naoufal_chatt ]
Pour la mise en œuvre d 'un logiciel en vue d'echange de donnees de type voix sur un reseau je me demande si quelque un d entre vous a deja travaille
Coloration syntaxique [ par JaimeLinux ]
Bonjour, Je voudrais savoir comment changer la mise en forme de mots dans un RichTextBox sans sélectionner auparavant ce
javascript dans c#? [ par engelho ]
Bonjour,J'aurais voulu savoir s'il est possible d'insérer du code javascript dans mon code c#....par exemple :<FONT size=3
etat des lecteurs logiques [ par fethijemai ]
bonjour saviez vous comment savoir l'état d'un lecteur logique(actif,bloqué), désactriver et activer un lecteur logique (exp 
Analyse de l'activé reseau demon PC [ par ZeBFroG ]
Bonjour à tous,Voilà je recherche de l'aide pour développer un code me permettant de surveillerl'activité de ma carte réseau.
logique de connexion à une bdd [ par georgeduke ]
Salut les gens !! J'ai appris grâce à ce site notamment comme se connecter en c# à une bdd et à exécuter des requêtes.
Thread probleme d'acces a des controles [ par warenbe ]
Yop j'ai un probleme j'ai une fonction quia une boucle qui dure treeeeeeeeeeeeees longtemps (quelques milliers d'entree a verifier une par une et c'es
un rtb avec coloration syntaxique !! [ par Fildomen ]
Salut !!j'ai programmé un ptit scripting !! mais il me faut un richtextbox avec colorisation syntaxique !! je cherche quelque chose déjà faite :D parc
Lecteur logique récemment connecté [ par MrContent ]
Salut,Je suis en train de faire un prog pour gérer mes contacts. Je veux pouvoir syncrhoniser ces infos avec mon iPod... J'ai un listener qui écoute l
|
Derniers Blogs
TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3TECHDAYS PARIS 2012 : SESSION PLEINIèRE JOUR 3 par ROMELARD Fabrice
Speaker: Bernard Ourghanlian Cette session est comme chaque jour transmise en live par BrainSonic, et j'ai donc suivi cette troisième pleinière par ce moyen sur mon iPad . Elle est dédiée comme chaque année à la mise en perspective de l'é...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE !MISHRA READER : UN LECTEUR RSS TRèS ZUNE STYLE EN OPEN SOURCE ! par Vko
Hier durant une session dédiée aux Techdays 2012, j'ai eu le plaisir d'annoncer la sortie de la Béta 2 de Mishra Reader. C'est quoi ? Pour les utilisateurs, c'est une vraie expérience de lecture de flux RSS sur Windows. Rien à voir avec les produit...
Cliquez pour lire la suite de l'article par Vko [FRAMEWORK 4] LES TASKS ET LE THREAD UI[FRAMEWORK 4] LES TASKS ET LE THREAD UI par fathi
Je viens de passer quelques temps au TechDay's et j'ai pu voir pas mal de session intéressante. Par contre une chose m'a un peu étonné lors de certaines de ces sessions qui abordaient les améliorations du framework .NET (donc le 4.5) : en gros, bea...
Cliquez pour lire la suite de l'article par fathi WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|