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" ; 
	};