Chris Smith blogja ihletett meg egy nyelvi parser megírására. Már régen izgatott, hogy miképp lehetne normális emberi nyelven megírni egy kérdést, amire a program értelmes választ is ad. Nem egyszerű dolog, de az F# csodákra képes. Néhány óra alatt persze, nem lehet tökéletest alkotni, de azért elégedett vagyok az eredménnyel. A lényeg, hogy azokat a szavakat felveszem tokenként, amelyek ennek a kis folyó-adatbázisnak a lekérdezésére lehet használni : ("Melyik", "folyó", "hosszabb/rovidebb", "mint", "a" 'valamelyik folyó').
Ezekből a tokenekből az fslex segédprogram egy parsert generál. Ami talán érdekes - nem találtam rá példát - hogyan lehet egy tetszőleges folyónevet megadni. A mellékelt forrásban* megtalálható a válasz.
A folyó adatbázisom :
let rivers = [("Nilus", 6690);("Mississipi", 6200);("Jangce", 5800);("Duna",2842);("Amur", 5780);("Don", 1870);("Amazonas", 6500);]
Ilyen jellegű a kérdésekre tudok válaszolni:
"Melyik folyo hosszabb mint az Amazonas "
"Melyik folyo rovidebb mint a Duna "
>Nilus(6690) hosszab mint a(z) Amazonas(6500)
>Don(1870) rvidebb mint a(z) Duna(2842)
A kérdések tovább bővíthetők. A mintaillesztős az F# erőssége. A match használata teszi lehetővé, hogy ennyire tömör legyen a kód.
*A mellékelt F# projekt nálam néha működött, néha nem. Az F# interpreter néha megbolondul. Garanciát nem tudok adni.