Générer un parseur C#à partir d'une grammaire
Bonjour,
J'ai un langage plutôt simple à parser.
Un petit exemple:
Citation:
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 {):
Citation:
debut { {{ area zone1 }} fin
le résultat devrait être:
Citation:
debut { REMPLACEMENT_ZONE1 fin
Mais j'obtient (pas de changement)
Citation:
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:
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" ;
}; |