Salut à tous,
J'essaye d'écrire une moteur wiki en C++ et pour cela j'ai besoin d'écrire un parser compatible avec le format de "trac" ...
Voici mon problème : Je n'arrive pas à trouver la bonne grammaire pour reconnaitre le format suivant pour les listes énumérées :
Voici ma tentative d'élaboration de la grammaire, mais impossible de savoir comment définir les "sublist" ... car pour cela, il faudrai être capable de savoir si la ligne commence par plus d'espaces (blank_p) que la ligne précédente !
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 The wiki supports both ordered/numbered and unordered lists. Example: * Item 1 * Item 1.1 * Item 1.1.1 * Item 1.1.2 * Item 1.1.3 * Item 1.2 * Item 2 1. Item 1 a. Item 1.a a. Item 1.b i. Item 1.b.i i. Item 1.b.ii 1. Item 2 And numbered lists can also be given an explicit number: 3. Item 3 Display: * Item 1 o Item 1.1 + Item 1.1.1 + Item 1.1.2 + Item 1.1.3 o Item 1.2 * Item 2 1. Item 1 1. Item 1.a 2. Item 1.b 1. Item 1.b.i 2. Item 1.b.ii 2. Item 2 And numbered lists can also be given an explicit number: 3. Item 3
Autre effet bizarre : la directive lexeme_d semble être sans effet ... le parser continu à "skipper" les blancs (puisque invoqué comme suit dans le main) ce qui ne facilite pas le comptage des blancs :
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 class WikiParser : public grammar<WikiParser> { public: template <typename ScannerT> struct definition { definition(WikiParser const& /*self*/) { document = *element ; element = title[&onTitle] | tab[&onTable] | para[&onPara] | list | eol_p ; // Definition des regles pour les listes : list = item >> !list >> !eol_p; item = bullet; bullet = "*" >> +(word | FormatedSequence)>> (lexeme_d[sublist]) >>!eol_p ; sublist= ??? ....
Merci d'avance pour votre aide !
Code : Sélectionner tout - Visualiser dans une fenêtre à part parse_info<> info = parse(str.c_str(), p, blank_p);
Pat
Partager