Les transducteurs permettent d'extraire facilement de l'information d'une chaîne de caractères ou d'un langage régulier (ensemble de chaînes).
Par exemple, si l'on souhaite extraire tous les nombres d'une chaîne ou d'un texte, il suffit de faire un automate qui traduit un nombre quelconque en lui-même et traduit toute autre chose en la chaîne vide epsilon. Comme le transducteur ne spécifie pas lequel des nombres doit être conservé s'il y en a plusieurs dans la chaîne, il permettra d'extraire tous les nombres.
Voyons la machine qu'il faut écrire. Le fichier s'appelle extractnb.grm.
export alphabet = Optimize["0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"| "a"|"b"|"c"|"d" | "e"|"f"|"g"|"h"|"i"|"j"|"k"|"l"|"m"|"n"|"o"|"p"|"q"|"r"|"s"|"t"|"u" |"v"|"w"|"x"|"y"|"z" | " "]; export chiffre = Optimize["0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"]; export chiffre_id = Optimize[("0":"0")|("1":"1")|("2":"2")|("3":"3")|("4":"4")|("5":"5")|("6":"6")|("7":"7")|("8":"8")|("9":"9")]; export pas_chiffre = alphabet - chiffre; pre_extract_chiffre = (alphabet : "")* (pas_chiffre:"") (chiffre_id+) (pas_chiffre:"")((alphabet : "")*); export extract_chiffre = Optimize[pre_extract_chiffre]; export chaine_test_1 = " ab t 123 zaetrt 58 dsfghhj 589 dsqd"; export result = Optimize[Project[Compose[chaine_test_1,extract_chiffre,'right'], 'output']];
Et voici les commandes pour compiler et afficher le résultat.
open@6ed7fd996340:~> thraxmakedep extractnb.grm open@6ed7fd996340:~> make thraxcompiler --input_grammar=extractnb.grm --output_far=extractnb.far Evaluating rule: alphabet Evaluating rule: chiffre Evaluating rule: chiffre_id Evaluating rule: pas_chiffre Evaluating rule: pre_extract_chiffre Evaluating rule: extract_chiffre Evaluating rule: chaine_test_1 Evaluating rule: result open@6ed7fd996340:~> farextract extractnb.far open@6ed7fd996340:~> fst_printstrings --byte --acceptor result 123 58 589 open@6ed7fd996340:~>
Notez que l'expression régulière (alphabet : "")*
utilisée en début et
en fin du transducteur extract_chiffre permet d'effacer
aussi bien des nombres que ce qui n'est pas des nombres.