https://wiki.apertium.org/w/index.php?title=Exemple_d%27application_Lttoolbox&feed=atom&action=history
Exemple d'application Lttoolbox - Revision history
2024-03-29T09:01:23Z
Revision history for this page on the wiki
MediaWiki 1.34.1
https://wiki.apertium.org/w/index.php?title=Exemple_d%27application_Lttoolbox&diff=50492&oldid=prev
Bech: Lien page anglaise
2014-10-07T13:07:08Z
<p>Lien page anglaise</p>
<table class="diff diff-contentalign-left" data-mw="interface">
<col class="diff-marker" />
<col class="diff-content" />
<col class="diff-marker" />
<col class="diff-content" />
<tr class="diff-title" lang="en">
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">← Older revision</td>
<td colspan="2" style="background-color: #fff; color: #222; text-align: center;">Revision as of 13:07, 7 October 2014</td>
</tr><tr>
<td colspan="2" class="diff-lineno">Line 1:</td>
<td colspan="2" class="diff-lineno">Line 1:</td>
</tr>
<tr>
<td colspan="2" class="diff-empty"> </td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[Lttoolbox API examples|In English]]</div></td>
</tr>
<tr>
<td colspan="2" class="diff-empty"> </td>
<td class="diff-marker">+</td>
<td style="color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Exemple de base ==</div></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"><div>== Exemple de base ==</div></td>
</tr>
<tr>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
<td class="diff-marker"> </td>
<td style="background-color: #f8f9fa; color: #222; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;"></td>
</tr>
</table>
Bech
https://wiki.apertium.org/w/index.php?title=Exemple_d%27application_Lttoolbox&diff=33914&oldid=prev
Bech: Création page
2012-05-01T16:40:00Z
<p>Création page</p>
<p><b>New page</b></p><div>== Exemple de base ==<br />
<br />
C'est une version simple du programme C++/lttoolbox pour 'beer' dans un [[Dictionnaire_morphologique]]<br />
<br />
<pre><br />
// g++ -I/usr/local/include/lttoolbox-3.2 -I/usr/local/lib -llttoolbox3 lt_beer.cc -o lt-beer<br />
<br />
#include <cwchar><br />
#include <cstdio><br />
#include <cerrno><br />
#include <string><br />
#include <iostream><br />
#include <list><br />
#include <set><br />
<br />
#include <lttoolbox/ltstr.h><br />
<br />
// LtLocale::tryToSetLocale()<br />
#include <lttoolbox/lt_locale.h><br />
<br />
// Classe transducteur<br />
#include <lttoolbox/transducer.h><br />
<br />
// Alphabet de la classe<br />
#include <lttoolbox/alphabet.h><br />
<br />
// État de la classe<br />
#include <lttoolbox/state.h><br />
<br />
// Classe TransExe<br />
#include <lttoolbox/trans_exe.h><br />
<br />
int main (int argc, char** argv)<br />
{<br />
Alphabet alphabet;<br />
Transducer t;<br />
<br />
// Set locale<br />
LtLocale::tryToSetLocale();<br />
<br />
// Rajoute des symboles dans l'alphabet, garde les valeurs<br />
alphabet.includeSymbol(L"<n>");<br />
alphabet.includeSymbol(L"<sg>");<br />
alphabet.includeSymbol(L"<pl>");<br />
<br />
int n_sym = alphabet(L"<n>");<br />
int sg_sym = alphabet(L"<sg>");<br />
int pl_sym = alphabet(L"<pl>");<br />
<br />
// État initial<br />
int initial = t.getInitial();<br />
<br />
// construit "beer" à la main<br />
int beer = initial;<br />
<br />
// voici les transitions b:b e:e e:e r:r<br />
beer = t.insertSingleTransduction(alphabet(L'b',L'b'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'r',L'r'), beer);<br />
<br />
// il y a 0:<n> 0:<sg><br />
beer = t.insertSingleTransduction(alphabet(0, n_sym), beer);<br />
beer = t.insertSingleTransduction(alphabet(0, sg_sym), beer);<br />
t.setFinal(beer);<br />
<br />
// construit "beer" à la main<br />
int beers = t.getInitial();<br />
beers = t.insertSingleTransduction(alphabet(L'b',L'b'), beers);<br />
beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers);<br />
beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers);<br />
beers = t.insertSingleTransduction(alphabet(L'r',L'r'), beers);<br />
<br />
// cette transition est s:0<br />
beers = t.insertSingleTransduction(alphabet(L's', 0), beers);<br />
beers = t.insertSingleTransduction(alphabet(0, n_sym), beers);<br />
beers = t.insertSingleTransduction(alphabet(0, pl_sym), beers);<br />
t.setFinal(beers);<br />
<br />
t.minimize();<br />
<br />
// Plutôt que d'essayer de convertir entre Transducer et TransExe, an va<br />
// juste écrire et lire<br />
FILE* fst=fopen("beer.fst", "w");<br />
t.write(fst);<br />
fclose(fst);<br />
fst=fopen("beer.fst", "r");<br />
<br />
TransExe te;<br />
te.read(fst, alphabet);<br />
fclose(fst);<br />
<br />
State *initial_state = new State();<br />
initial_state->init(te.getInitial());<br />
State current_state = *initial_state;<br />
<br />
wstring input, output=L"";<br />
<br />
set<Node *> anfinals;<br />
anfinals.insert(te.getFinals().begin(), te.getFinals().end());<br />
<br />
FILE* in=stdin;<br />
<br />
bool reading=true;<br />
<br />
// C'est notre exécution : voir si l'entrée correspond<br />
while (reading)<br />
{<br />
wchar_t val = (wchar_t)fgetwc(in);<br />
if(val==WEOF||iswspace(val))<br />
{<br />
reading=false;<br />
}<br />
else<br />
{<br />
if (!reading)<br />
{<br />
// À la fin. On n'a pas besoin de faire quoi que ce soit<br />
// mais quitter la boucle dans cet exemple simpliste<br />
break;<br />
}<br />
else<br />
{<br />
current_state.step(val);<br />
alphabet.getSymbol(input, val);<br />
}<br />
}<br />
}<br />
<br />
if (current_state.isFinal(anfinals))<br />
{<br />
// Non utilisé, on veut juste que ce soit vide...<br />
set<wchar_t> escaped;<br />
escaped.insert(L'$');<br />
output = current_state.filterFinals(anfinals, alphabet, escaped);<br />
<br />
wcout << input << output << endl;<br />
}<br />
else<br />
{<br />
wcout << input << L"non reconnu : " << endl;<br />
}<br />
<br />
return 0;<br />
}<br />
</pre><br />
<br />
[[File:Ltbeer.png|center]]<br />
<br />
on peut simplifier la construction des transducteurs comme ceci :<br />
<pre><br />
// construit "beer" à la main<br />
int beer = initial;<br />
// voici les transitions b:b e:e e:e r:r<br />
beer = t.insertSingleTransduction(alphabet(L'b',L'b'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer);<br />
beer = t.insertSingleTransduction(alphabet(L'r',L'r'), beer);<br />
<br />
int beersg = beer;<br />
// il y a 0:<n> 0:<sg><br />
beersg = t.insertSingleTransduction(alphabet(0, n_sym), beersg);<br />
beersg = t.insertSingleTransduction(alphabet(0, sg_sym), beersg);<br />
t.setFinal(beersg);<br />
<br />
// construit "beer" à la main<br />
int beerpl = beer;<br />
beerpl = t.insertSingleTransduction(alphabet(L's', 0), beerpl);<br />
beerpl = t.insertSingleTransduction(alphabet(0, n_sym), beerpl);<br />
beerpl = t.insertSingleTransduction(alphabet(0, pl_sym), beerpl);<br />
t.setFinal(beerpl);<br />
</pre><br />
<br />
== Écriture/lecture de plusieurs transducteurs dans le même fichier ==<br />
<br />
<pre><br />
<br />
// g++ -o test test.cc -I/home/fran/local/include/lttoolbox-3.2 -L/home/fran/local/lib -llttoolbox3 <br />
<br />
#include <cwchar><br />
#include <cstdio><br />
#include <iostream><br />
#include <set><br />
<br />
#include <lttoolbox/ltstr.h><br />
#include <lttoolbox/lt_locale.h><br />
#include <lttoolbox/transducer.h><br />
#include <lttoolbox/alphabet.h><br />
#include <lttoolbox/regexp_compiler.h><br />
#include <lttoolbox/compression.h><br />
<br />
int main (int argc, char** argv)<br />
{<br />
map<int, Transducer> patterns;<br />
Alphabet a;<br />
RegexpCompiler re;<br />
<br />
LtLocale::tryToSetLocale();<br />
<br />
FILE *output = stdout;<br />
FILE *fst = fopen(argv[1], "w+");<br />
<br />
// Construire les transducteurs<br />
<br />
a.includeSymbol(L"<n>");<br />
<br />
re.initialize(&a); <br />
re.compile(L"foo");<br />
patterns[1] = re.getTransducer();<br />
re.initialize(&a); <br />
re.compile(L"bar");<br />
patterns[2] = re.getTransducer();<br />
re.initialize(&a); <br />
re.compile(L"baz");<br />
patterns[3] = re.getTransducer();<br />
<br />
// Écrire dans les transducteurs<br />
<br />
a.write(fst);<br />
Compression::multibyte_write(patterns.size(), fst);<br />
fwprintf(output, L"Patterns: %d, Alphabet: %d\n", patterns.size(), a.size());<br />
<br />
for(map<int, Transducer>::iterator it = patterns.begin(); it != patterns.end(); it++)<br />
{<br />
wchar_t buf[50];<br />
memset(buf, '\0', sizeof(buf));<br />
swprintf(buf, 50, L"%d", it->first);<br />
wstring id(buf);<br />
fwprintf(output, L"= %S =============================\n", id.c_str());<br />
it->second.show(a, output);<br />
<br />
Compression::wstring_write(id, fst);<br />
it->second.write(fst);<br />
}<br />
<br />
fclose(fst);<br />
fwprintf(output, L"\n\n");<br />
<br />
// Maintenant lire dans les transducteurs ce qui a été écrit, un par un.<br />
<br />
FILE *new_fst = fopen(argv[1], "r");<br />
Alphabet new_alphabet;<br />
map<wstring, Transducer> transducers;<br />
<br />
new_alphabet.read(new_fst);<br />
int len = Compression::multibyte_read(new_fst); <br />
<br />
while(len > 0)<br />
{ <br />
int len2 = Compression::multibyte_read(new_fst);<br />
wstring name = L"";<br />
while(len2 > 0)<br />
{<br />
name += static_cast<wchar_t>(Compression::multibyte_read(new_fst));<br />
len2--;<br />
}<br />
transducers[name].read(new_fst);<br />
len--;<br />
}<br />
fwprintf(output, L"Patterns: %d, Alphabet: %d\n", transducers.size(), new_alphabet.size());<br />
<br />
for(map<wstring, Transducer>::iterator it = transducers.begin(); it != transducers.end(); it++)<br />
{<br />
fwprintf(output, L"= %S =============================\n", it->first.c_str());<br />
it->second.minimize();<br />
it->second.show(a, output);<br />
}<br />
<br />
fclose(new_fst);<br />
<br />
return 0;<br />
}<br />
</pre><br />
<br />
== Utilisation d'expressions régulières ==<br />
<br />
<pre><br />
/* <br />
* g++ -o lt-regexp lt-regexp.cc -I/usr/include/libxml2 -I/home/fran/local/include/lttoolbox-3.2 -L/home/fran/local/lib -llttoolbox3 -llibxml2<br />
*/<br />
#include <cwchar><br />
#include <cstdio><br />
#include <cerrno><br />
#include <string><br />
#include <iostream><br />
#include <list><br />
#include <set><br />
<br />
#include <lttoolbox/ltstr.h><br />
#include <lttoolbox/lt_locale.h><br />
#include <lttoolbox/transducer.h><br />
#include <lttoolbox/alphabet.h><br />
#include <lttoolbox/state.h><br />
#include <lttoolbox/regexp_compiler.h><br />
#include <lttoolbox/match_exe.h><br />
#include <lttoolbox/match_state.h><br />
#include <lttoolbox/xml_parse_util.h><br />
<br />
wstring ws(char *arg)<br />
{<br />
wchar_t buf[1024];<br />
memset(buf, '\0', 1024);<br />
size_t num_chars = mbstowcs(buf, arg, strlen(arg));<br />
wstring ws(buf, num_chars);<br />
return ws;<br />
}<br />
<br />
bool match(Transducer t, wstring str, Alphabet a)<br />
{<br />
map<int, int> finals;<br />
for(int i = 0; i < t.size(); i++) <br />
{<br />
if(!t.isFinal(i))<br />
{<br />
continue;<br />
}<br />
finals[i] = i;<br />
}<br />
MatchExe me(t, finals);<br />
MatchState ms;<br />
ms.clear();<br />
ms.init(me.getInitial());<br />
<br />
for(wstring::iterator it = str.begin(); it != str.end(); it++) <br />
{<br />
wcout << ms.size() << " " << *it << endl;<br />
ms.step(a(*it, *it));<br />
}<br />
int val = ms.classifyFinals(me.getFinals());<br />
fwprintf(stdout, L"%d\n", val);<br />
<br />
if(val != -1) <br />
{ <br />
return true;<br />
}<br />
return false;<br />
}<br />
<br />
int main (int argc, char** argv)<br />
{<br />
Alphabet alphabet;<br />
Transducer t;<br />
RegexpCompiler re;<br />
bool matched;<br />
<br />
LtLocale::tryToSetLocale();<br />
<br />
if(argc < 3) <br />
{<br />
wcout << L"Utilisation : lt-regexp <pattern> <chaîne à rechercher>" << endl;<br />
exit(-1);<br />
}<br />
<br />
FILE *output = stdout;<br />
wstring pattern = ws(argv[1]);<br />
wstring s = ws(argv[2]);<br />
<br />
re.initialize(&alphabet);<br />
re.compile(pattern);<br />
t = re.getTransducer();<br />
t.minimize();<br />
<br />
t.show(alphabet, output);<br />
<br />
matched = match(t, s, alphabet); <br />
<br />
wcout << endl << pattern << " " << s << endl;<br />
}<br />
<br />
</pre><br />
<br />
[[Category:Lttoolbox]]<br />
[[Category:Documentation en français]]</div>
Bech