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

Dotnet Discussion :

Générer un parseur C#à partir d'une grammaire


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 55
    Par défaut Générer un parseur C#à partir d'une grammaire
    Bonjour,

    J'ai un langage plutôt simple à parser.

    Un petit exemple:
    debut {{ area zone1 }} fin
    J'ai besoin de detecter "{{ zone zone1 }}" et de le remplacer par la valeur que j'associe à "zone1".

    Le langage est en réalité plus compliqué puisque je peux avoir des "foreach" mais pour le moment restant simple.

    J'utilise l'outils tinyparser

    J'ai un peu joué avec et j'arrive à réaliser pas mal de chose. Mais je bloque sur un cas simple (noté le {):
    debut { {{ area zone1 }} fin
    le résultat devrait être:
    debut { REMPLACEMENT_ZONE1 fin
    Mais j'obtient (pas de changement)
    debut { {{ area zone1 }} fin
    Pour faire simple, mon problème est que si j'associé à ALL les caractères '{' et '}' il met toute ma chaîne dans d'entré dans ALL. Ce que je peux comprendre. mais comment je peux faire pour régler mon problème ?


    ma grammaire est:
    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
     
    SimpleBlockStart -> @"{{"; 
    SimpleBlockEnd -> @"}}";
     
    EOF 			-> @"^$";
    [Skip] WHITESPACE 	-> @"\s+";
    IDENTIFIANT       	-> @"[a-zA-Z_][a-zA-Z0-9_]*";
    AREA       		-> @"[a-zA-Z_][a-zA-Z0-9_]*";
    ALL       		-> @"[a-zA-Z0-9_ <>/\\{}]*";
     
    FCT_AREA 		-> @" *area *";
     
     
     
    Start -> Instructions EOF {return $Instructions ; };
     
    Instructions -> ALL(Block)*
    	{ 
    		string ret = "";
    		if($ALL[0] != null)
    			ret += $ALL[0];
     
    		int i = 0;
    		while ($Block[i] != null) { 	
    			ret += $Block[i];
    			i++;
    		}	
    		if($ALL[1] != null)
    			ret += $ALL[1];
    		return ret;
    	}; 
    Block -> SimpleBlock
    	{
    		if ($SimpleBlock != null)
    			return $SimpleBlock;
    		return $ComplexBlock;
    	};
    SimpleBlock -> SimpleBlockStart SimpleBlockArea SimpleBlockEnd (ALL)?  
    	{ 
    		string ret = "";
    		if($SimpleBlockArea != null)
    			ret += $SimpleBlockArea;
    		else
    			ret += $SimpleBlockItem;
    		return ret + $ALL; 
    	};
    SimpleBlockArea -> FCT_AREA AREA 
    	{ 
    		//must be override in ParseNode.Custom
    		return "area: " + $AREA + "\n" ; 
    	};

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Oufti!(Comme on dit à Liege)
    Je ne sais pas t'aider, mis à part que F# a pas mal de fonctionnalités pour le parsing, bien plus que C#. Ce serait peut-être une piste à explorer.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 55
    Par défaut
    Citation Envoyé par GuruuMeditation Voir le message
    Oufti!(Comme on dit à Liege)
    Je ne sais pas t'aider, mis à part que F# a pas mal de fonctionnalités pour le parsing, bien plus que C#. Ce serait peut-être une piste à explorer.
    Salut,

    Merci pour la réponse mais il s'agit d'un projet professionnel donc c'est C# et pis c'est tout

  4. #4
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    C'est peut être le [Skip] WHITESPACE -> @"\s+"; qu'il faut enlever, ainsi "{ {" ne sera pas interprété comme un un "{{"
    En tout cas merci pour le TnyParser, ça a l'air intéressant.

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/06/2007, 10h33
  2. Réponses: 2
    Dernier message: 07/05/2007, 12h29
  3. Réponses: 1
    Dernier message: 02/04/2007, 11h23
  4. Réponses: 5
    Dernier message: 18/11/2006, 14h26
  5. Réponses: 4
    Dernier message: 02/05/2005, 20h25

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