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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|