Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2016-06-18T00:00:51+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Flex/Bison ou Boost.Spirit ?, message #1145622016-06-18T00:00:51+02:00jo_link_noir/@jo_link_noirhttps://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114562<p>@lmghs: Avec un système de flags ?</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="cp">#include</span> <span class="cpf"><boost/spirit/home/x3.hpp></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><iomanip></span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf"><string></span><span class="cp"></span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">struct</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">;</span> <span class="p">}</span> <span class="n">data</span> <span class="p">{};</span>
<span class="k">namespace</span> <span class="n">x3</span> <span class="o">=</span> <span class="n">boost</span><span class="o">::</span><span class="n">spirit</span><span class="o">::</span><span class="n">x3</span><span class="p">;</span>
<span class="kt">unsigned</span> <span class="n">init_flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">unsigned</span> <span class="n">current_flag</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">m</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="n">init_flags</span><span class="p">,</span> <span class="o">&</span><span class="n">current_flag</span><span class="p">](</span><span class="k">auto</span> <span class="o">&</span> <span class="n">member</span><span class="p">)</span> <span class="p">{</span>
<span class="k">auto</span> <span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="n">member</span><span class="p">,</span> <span class="o">&</span><span class="n">init_flags</span><span class="p">,</span> <span class="n">flag</span><span class="o">=</span><span class="n">current_flag</span><span class="p">](</span><span class="k">auto</span> <span class="o">&</span> <span class="n">ctx</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">init_flags</span> <span class="o">&</span> <span class="n">flag</span><span class="p">)</span> <span class="p">{</span>
<span class="n">_pass</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="k">return</span> <span class="p">;</span>
<span class="p">}</span>
<span class="n">init_flags</span> <span class="o">|=</span> <span class="n">flag</span><span class="p">;</span>
<span class="n">member</span> <span class="o">=</span> <span class="n">_attr</span><span class="p">(</span><span class="n">ctx</span><span class="p">);</span>
<span class="p">};</span>
<span class="n">current_flag</span> <span class="o"><<=</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">return</span> <span class="n">f</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">auto</span> <span class="n">check_initialized</span> <span class="o">=</span> <span class="p">[</span><span class="o">&</span><span class="n">init_flags</span><span class="p">,</span> <span class="o">&</span><span class="n">current_flag</span><span class="p">](</span><span class="k">auto</span> <span class="o">&</span> <span class="n">ctx</span><span class="p">){</span>
<span class="k">if</span> <span class="p">((</span><span class="n">init_flags</span> <span class="o">&</span> <span class="p">(</span><span class="n">current_flag</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span> <span class="o">!=</span> <span class="p">(</span><span class="n">current_flag</span><span class="o">-</span><span class="mi">1</span><span class="p">))</span> <span class="p">{</span>
<span class="n">_pass</span><span class="p">(</span><span class="n">ctx</span><span class="p">)</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">};</span>
<span class="k">auto</span> <span class="n">json_value</span> <span class="o">=</span> <span class="p">[](</span><span class="kt">char</span> <span class="k">const</span> <span class="o">*</span> <span class="n">key</span><span class="p">,</span> <span class="k">auto</span> <span class="n">parser</span><span class="p">){</span>
<span class="k">return</span> <span class="n">x3</span><span class="o">::</span><span class="n">lexeme</span><span class="p">[</span><span class="sc">'"'</span> <span class="o">>></span> <span class="n">x3</span><span class="o">::</span><span class="n">lit</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="o">>></span> <span class="sc">'"'</span><span class="p">]</span> <span class="o">>></span> <span class="sc">':'</span> <span class="o">>></span> <span class="n">parser</span><span class="p">;</span>
<span class="p">};</span>
<span class="k">auto</span> <span class="n">values</span> <span class="o">=</span>
<span class="n">json_value</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">x3</span><span class="o">::</span><span class="n">int_</span><span class="p">[</span><span class="n">m</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">a</span><span class="p">)])</span>
<span class="o">|</span> <span class="n">json_value</span><span class="p">(</span><span class="s">"b"</span><span class="p">,</span> <span class="n">x3</span><span class="o">::</span><span class="n">int_</span><span class="p">[</span><span class="n">m</span><span class="p">(</span><span class="n">data</span><span class="p">.</span><span class="n">b</span><span class="p">)])</span>
<span class="p">;</span>
<span class="k">auto</span> <span class="n">parser</span> <span class="o">=</span> <span class="p">(</span><span class="n">values</span> <span class="o">%</span> <span class="sc">','</span><span class="p">)[</span><span class="n">check_initialized</span><span class="p">];</span>
<span class="c1">// auto values = members(</span>
<span class="c1">// ref("a", data.a)</span>
<span class="c1">// ref("b", data.b)</span>
<span class="c1">// );</span>
<span class="c1">// auto json_values = transform(values.parser, to_json_value);</span>
<span class="c1">// auto parser = (json_values % ',')[values.checker];</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">R</span><span class="s">"~(example: `"</span><span class="n">a</span><span class="s">": 3, "</span><span class="n">b</span><span class="s">": 1`)~""</span><span class="se">\n</span><span class="s">> "</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">getline</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">,</span> <span class="n">s</span><span class="p">))</span> <span class="p">{</span>
<span class="k">auto</span> <span class="n">first</span> <span class="o">=</span> <span class="n">begin</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">last</span> <span class="o">=</span> <span class="n">end</span><span class="p">(</span><span class="n">s</span><span class="p">);</span>
<span class="n">x3</span><span class="o">::</span><span class="n">phrase_parse</span><span class="p">(</span><span class="n">first</span><span class="p">,</span> <span class="n">last</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">x3</span><span class="o">::</span><span class="n">space</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">first</span> <span class="o">!=</span> <span class="n">last</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o"><<</span> <span class="s">" "</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">setw</span><span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="p">(</span><span class="n">first</span> <span class="o">-</span> <span class="n">begin</span><span class="p">(</span><span class="n">s</span><span class="p">))))</span> <span class="o"><<</span> <span class="sc">'^'</span> <span class="o"><<</span> <span class="s">"~~ error here</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"a = "</span> <span class="o"><<</span> <span class="n">data</span><span class="p">.</span><span class="n">a</span> <span class="o"><<</span> <span class="s">" b = "</span> <span class="o"><<</span> <span class="n">data</span><span class="p">.</span><span class="n">b</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">return</span> <span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>Flex/Bison ou Boost.Spirit ?, message #1144732016-06-17T13:34:19+02:00lmghs/@lmghshttps://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114473<p>Le truc qui m'a gêné avec spirit, c'est que je peine à trouver des exemples pour lire des données fortement typées de façon désordonnée.</p>
<p>Lire un <code>John Doe 24 +33642424242 Avenue du ZdS</code> vers une structure/classe qui a 3 chaines, un age, et un <code>numéro_de_tel</code> est facile.</p>
<p>Mais lire depuis un truc plus structuré (json, or autre) vers une structure typée, je ne trouve pas. Je trouve juste comment lire vers des tables de clé-variant.</p>Flex/Bison ou Boost.Spirit ?, message #1144632016-06-17T12:30:56+02:00mehdidou99/@mehdidou99https://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114463<figure><blockquote>
<p>Quid de Antlr et de Clang ?
</p>
</blockquote>
<figcaption><p><a href="https://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114462">Gawaboumga</a></p></figcaption></figure><p>Comment ça, clang ? Clang est une suite de compilateurs. Si tu veux parler de LLVM, c'est du backend, donc pas d'analyse sémantique et syntaxique.</p>
<p>Quant à antlr, j'irai regarder, merci. <img alt=";)" src="/static/smileys/clin.png"></p>
<p>EDIT : Ça m'a tout l'air d'être pour du Java, non ?</p>
<p>EDIT 2 : Apparemment, il existe un portage pour le C++.</p>Flex/Bison ou Boost.Spirit ?, message #1144622016-06-17T12:26:26+02:00Gawaboumga/@Gawaboumgahttps://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114462<p>Quid de Antlr et de Clang ?</p>Flex/Bison ou Boost.Spirit ?, message #1144352016-06-17T10:31:39+02:00mehdidou99/@mehdidou99https://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114435<p>J'ai lu des critiques qui disaient :</p>
<ul>
<li>que les temps de compilation étaient longs, mais à la limite, on s'en fiche pour un projet de ce type ;</li>
<li>que les messages d'erreur étaient cryptiques, mais vu que j'aime bien les templates, ça ne devrait pas me changer de mes habitudes ; <img alt=":)" src="/static/smileys/smile.png"></li>
<li>mais ce qui m'a le plus gêné, c'est que j'ai entendu que Spirit n'était pas très stable d'une version à l'autre.</li>
</ul>Flex/Bison ou Boost.Spirit ?, message #1144222016-06-17T04:09:10+02:00jo_link_noir/@jo_link_noirhttps://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114422<p>Plop,</p>
<p>Je n'ai pas vraiment d'avis sur la question, principalement parce que je n'ai pas essayé Bison et ai à peine joué avec Spirit. Mais attention à la date des critiques, Spirit 3 (<a href="http://ciere.com/cppnow15/x3_docs/index.html">Spirit.x3</a>) est plutôt récent (l'année dernière) et simplifie un peu l'écriture par rapport aux anciennes versions. À voir quels sont les arguments.</p>
<p>Après, la syntaxe de x3 est moins élégante que du pur BNF (cela reste du C++), mais reste lisible. Concrètement, les opérateurs sont inversés (<code>a*</code> devient <code>*a</code>) et les espaces remplacés par des opérateurs <code>>></code>/<code>></code>. Il y aussi des opérateurs sympa comme <code>%</code>. On se chope par contre les problèmes des pré-déclarations, ce qui revient souvent à décrire la syntaxe à l'envers pour des raisons de commodité: les éléments de 'bas niveau' sont décrits en premier.</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span>exp_list <span class="o">::=</span> exp ( ',' exp ) +
exp <span class="o">::=</span> int op int
int <span class="o">::=</span> [0-9]+
op <span class="o">::=</span> [+-/*]
</pre></div>
</td></tr></table>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span></span><span class="k">auto</span> <span class="n">int_</span> <span class="o">=</span> <span class="n">x3</span><span class="o">::</span><span class="n">int_</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">op</span> <span class="o">=</span> <span class="n">x3</span><span class="o">::</span><span class="n">char_</span><span class="p">(</span><span class="s">"+-/*"</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">exp</span> <span class="o">=</span> <span class="n">int_</span> <span class="o">>></span> <span class="n">op</span> <span class="o">>></span> <span class="n">int_</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">exp_list</span> <span class="o">=</span> <span class="n">exp</span> <span class="o">%</span> <span class="sc">','</span><span class="p">;</span>
</pre></div>
</td></tr></table>
<p>Comme c'est du c++, on peut plus facilement faire des variations, grossièrement, des fonctions qui retournent des parseurs. Cela peut alléger l'écriture quand des actions entrent en jeux.</p>
<p>Pour une alternative, j'ai vu <a href="http://www.colm.net/open-source/ragel/">Ragel</a> dans les paquets Ubuntu. Cela crée une machine à état finie à base de goto. À mon avis, ce n'est pas très différent de Bison -peut-être même syntaxiquement compatible-, mais tu peux toujours jeter un œil.</p>Flex/Bison ou Boost.Spirit ?, message #1143662016-06-16T19:06:17+02:00mehdidou99/@mehdidou99https://zestedesavoir.com/forums/sujet/6333/flexbison-ou-boostspirit/?page=1#p114366<p>Salut,</p>
<p>Dans le cadre du projet de création d'un langage de programmation de la communauté, je cherche un outil d'analyse lexicale et syntaxique. Comme l'indique le titre, j'hésite entre Boost.Spirit et Flex/Bison :</p>
<ul>
<li>d'un côté, Boost.Spirit est une lib C++, donc vraisemblablement plus adaptée pour du C++, alors que Flex/Bison sont à l'origine faits pour le C.</li>
<li>de l'autre, je n'ai pas entendu dire que du bien de Boost.Spirit.</li>
</ul>
<p>Qu'en pensez-vous ?</p>
<p>Merci d'avance ! <img alt=":)" src="/static/smileys/smile.png"></p>
<p>EDIT : Si vous connaissez une meilleure alternative, je suis tout ouï.</p>