| ISPELL(5) | File Formats Manual | ISPELL(5) |
نام (NAME)
ispell - قالب فرهنگ لغتها و فایلهای وند در ispell
توضیحات (DESCRIPTION)
برنامه Ispell(1) برای تعریف زبانی که املای آن را بررسی میکند به دو فایل نیاز دارد. نخستین فایل، یک فرهنگ لغت حاوی کلمات آن زبان است و دومی یک فایل «وند» (affix) است که معنای پرچمهای ویژه در فرهنگ لغت را مشخص میکند. این دو فایل توسط buildhash (ببینید ispell(1)) ترکیب شده و در یک فایل درهمسازی (hash) نوشته میشوند که ساختار آن در اینجا شرح داده نشده است.
یک فرهنگ لغت خام ispell (خواه فرهنگ لغت اصلی و خواه فرهنگ لغت شخصی شما) شامل فهرستی از کلمات است، هر کلمه در یک خط. هر کلمه میتواند به صورت اختیاری با یک ممیز («/») و یک یا چند پرچم دنبال شود، که ریشه کلمه را طبق توضیحات زیر تغییر میدهند. بسته به گزینههایی که ispell با آنها کامپایل شده است، حساسیت به بزرگی و کوچکی حروف ممکن است در ریشه کلمه یا در پرچمها، به طور مستقل از یکدیگر، معنادار باشد یا نباشد. به طور مشخص، اگر گزینه زمان کامپایل CAPITALIZATION تعریف شده باشد، بزرگی و کوچکی حروف در ریشه کلمه دارای اهمیت است؛ در غیر این صورت، از آن چشمپوشی میشود. اگر گزینه زمان کامپایل MASKBITS بر روی مقدار 32 تنظیم شده باشد، بزرگی و کوچکی حروف در پرچمها نادیده گرفته میشود؛ در غیر این صورت بزرگی و کوچکی حروف در پرچمها معنادار است. برای اطلاعات بیشتر با مدیر سیستم یا نگهدارنده ispell تماس بگیرید (یا از پرچم -vv برای فهمیدن آن استفاده کنید). فرهنگ لغت باید پیش از ساخته شدن فایل درهمسازی، با پرچم -f از دستور sort(1) مرتبسازی شود؛ این کار به صورت خودکار توسط munchlist(1) که روش استاندارد ساخت فرهنگ لغتها است، انجام میشود.
اگر فرهنگ لغت شامل کلماتی است که نویسههای رشتهای دارند (به مستندات فایل وند در ادامه نگاه کنید)، آنها باید در قالبی نوشته شوند که توسط دستور defstringtype در فایل وند تعیین شده است. این امر برای بیشتر زبانهای غیرانگلیسی صدق میکند. هنگام افزودن کلمات به فرهنگ لغت، دقت کنید که به جای قالب قالببند (formatter) دلخواه خود، از این قالب استفاده نمایید. (اگر در طول یک نشست ispell کلماتی را به فرهنگ لغت شخصی خود اضافه کنید، آنها به صورت خودکار به قالب صحیح تبدیل خواهند شد. در صورت نیاز میتوان از این ویژگی برای تبدیل ساختار کل یک فرهنگ لغت استفاده کرد:)
echo qqqqq > dummy.dict
buildhash dummy.dict affix-file dummy.hash
awk '{print "*"}END{print "#"}' old-dict-file \
| ispell -a -T old-dict-string-type \
-d ./dummy.hash -p ./new-dict-file \
> /dev/null
rm dummy.*
بزرگی و کوچکی حروف ریشه کلمه، وضعیت حروف کلمات پذیرفتهشده توسط ispell را به صورت زیر کنترل میکند:
- (1)
- اگر ریشه کلمه فقط با حروف کوچک باشد (مانند bob)، با حروف کوچک، با حرف اول بزرگ (Capitalized)، یا تماماً حروف بزرگ پذیرفته میشود.
- (2)
- اگر ریشه کلمه با حرف اول بزرگ ظاهر شود (مانند Robert)، با تمام حروف کوچک پذیرفته نخواهد شد، اما با حرف اول بزرگ یا با تمام حروف بزرگ پذیرفته میشود.
- (3)
- اگر ریشه کلمه با تمام حروف بزرگ ظاهر شود (مانند UNIX)، تنها با تمام حروف بزرگ پذیرفته خواهد شد.
- (4)
- اگر ریشه کلمه با ترکیب حروف خاصی (مانند ITCorp)، آمده باشد، کلمه تنها در صورتی پذیرفته میشود که دقیقاً همان شکل نگارش را دنبال کند، یا تمام حروف آن بزرگ باشد.
- (5)
- ممکن است بیش از یک شکل از وضعیت حروف یک ریشه در فرهنگ لغت وجود داشته باشد. پرچمهای مربوط به حالتهای مختلف حروف، با عملگر منطقی OR با یکدیگر ترکیب میشوند.
حالتهای تکراری بزرگی و کوچکی حروف (مانند bob و Bob) توسط buildhash و ispell (برای فرهنگ لغتهای شخصی) ترکیب میشوند و میتوان آنها را با استفاده از munchlist از یک فرهنگ لغت خام حذف کرد.
برای نمونه، فرهنگ لغت:
bob Robert UNIX ITcorp ITCorp
کلمات bob، Bob، BOB، Robert، ROBERT، UNIX، ITcorp، ITCorp و ITCORP را میپذیرد و تمام حالتهای دیگر را رد میکند. برخی از حالتهای غیرقابل قبول عبارتند از: bOb، robert، Unix و ItCorp.
همانطور که در بالا اشاره شد، ریشههای کلمات در هر فرهنگ لغتی میتوانند با پرچمها گسترش یابند. هر پرچم یک نویسه الفبایی منفرد است که پیشوند یا پسوندی را نشان میدهد که میتواند به ریشه اضافه شود تا کلمه جدیدی را شکل دهد. برای مثال در یک فرهنگ لغت انگلیسی، پرچم D میتواند به bathe اضافه شود تا bathed ساخته شود. از آنجا که پرچمها در فرهنگ لغت درهمسازیشده به صورت یک تکبیت ذخیره میشوند، این امر منجر به صرفهجویی چشمگیری در فضای مصرفی میشود. اسکریپت munchlist با اضافه کردن پرچمها در صورت امکان، حجم یک فرهنگ لغت خام موجود را کاهش میدهد.
هنگامی که کلمهای با یک وند گسترش مییابد، وند تنها در صورتی پذیرفته میشود که وضعیت بزرگی و کوچکی حروف آن با نویسه نخست (در پیشوند) یا نویسه پایانی (در پسوند) کلمه یکسان باشد. بنابراین برای مثال، ورودی UNIX/M در فرهنگ لغت اصلی (M به معنی افزودن آپاستروف و یک «s» برای ساختن حالت ملکی است) کلمه UNIX'S را میپذیرد اما UNIX's را رد میکند. اگر UNIX's مجاز باشد، باید به صورت یک ورودی جداگانه در فرهنگ لغت ظاهر شود و توسط munchlist ترکیب نخواهد شد. (به طور کلی نیازی نیست نگران این موضوعات باشید؛ munchlist تضمین میکند که فرهنگ لغت خروجی آن همان مجموعه کلماتی را بپذیرد که فرهنگ لغت ورودی پذیرفته بود، بنابراین تنها کاری که باید انجام دهید افزودن کلمات به فرهنگ لغت و اجرای گاهبهگاه munchlist برای کاهش اندازه آن است).
همانطور که ذکر شد، فایل تعریف وند (affix)، وندهای مرتبط با پرچمهای ویژه را شرح میدهد. همچنین مجموعه نویسههای (character set) استفادهشده توسط زبان را تعریف میکند.
اگرچه گرامر تعریف وند برای ساختاری خطمحور طراحی شده است، اما در حقیقت یک گرامر yacc با قالب آزاد (free-format) است و در صورت تمایل میتوان آن را با چیدمانهای گوناگون نوشت. توضیحات با علامت هش (#) آغاز میشوند و تا انتهای خط ادامه مییابند. بکاسلشها به روش معمول پشتیبانی میشوند (\nnn، به علاوه حالتهای خاص \n، \r، \t، \v، \f، \b و قالب جدید شانزدهشانزدهی \xnn). هر نویسهای که معنای خاصی برای تحلیلگر دارد را میتوان با افزودن بکاسلش به یک نشانه تفسیرنشده تبدیل کرد؛ برای نمونه، میتوانید پرچمی به نام 'asterisk' (ستاره) یا 'colon' (دو نقطه) را با flag \*: یا flag \:: تعریف کنید.
گرامر به صورت بالا به پایین ارائه شده و هر عنصر مورد بررسی قرار میگیرد. یک فایل تعریف وند باید دقیقاً شامل یک جدول باشد:
table : [headers] [prefixes] [suffixes]
حداقل یکی از بخشهای prefixes و suffixes الزامی است. آنها میتوانند به هر ترتیبی ظاهر شوند.
headers : [ options ] char-sets
بخش سرآیندها (headers) گزینههای عمومی این فرهنگ لغت و زبان را توصیف میکند. این موارد شامل مجموعههای نویسه مورد استفاده، قالببند، و پیشفرضهای مربوط به برخی پرچمهای ispell است.
options : { fmtr-stmt | opt-stmt | flag-stmt | num-stmt }
دستورهای گزینهها پیشفرضهای پرچمهای خاص ispell و مجموعههای نویسه مورد استفاده توسط قالببندها را تعیین میکنند.
fmtr-stmt : { nroff-stmt | tex-stmt }
یک fmtr-stmt نویسههایی را شرح میدهد که معنای ویژهای برای یک قالببند دارند. به طور معمول، این دستور ضروری نیست، اما ممکن است برخی زبانها از پیشفرضهای معمول برای استفاده به عنوان نویسههای خاص زبان خود استفاده کرده باشند. در این صورت، میتوان از این دستورها برای تعریف مجدد نویسههای ویژه مورد انتظار قالببند استفاده کرد.
nroff-stmt : { nroffchars | troffchars } string
دستور nroffchars امکان تعریف مجدد برخی نویسههای کنترلی nroff را فراهم میکند. رشته دادهشده باید دقیقاً پنج نویسه باشد و باید جایگزینها را برای پرانتزهای چپ و راست («()»)، نقطه («.»)، بکاسلش («\») و ستاره («*») فهرست کند. (پرانتز راست در حال حاضر استفاده نمیشود، اما برای کامل بودن گنجانده شده است.) برای نمونه، دستور:
nroffchars {}.\\*
پرانتزهای چپ و راست را برای تحلیل رشتههای nroff/troff با آکولادهای چپ و راست جایگزین میکند، بدون اینکه بر بقیه تأثیری بگذارد (مسلماً یک مثال فرضی است). توجه داشته باشید که بکاسلش با یک بکاسلش دیگر گریز داده شده است (escaped).
tex-stmt : { TeXchars | texchars } string
دستور TeXchars امکان تعریف مجدد برخی نویسههای کنترلی TeX/LaTeX را فراهم میکند. رشته دادهشده باید دقیقاً سیزده نویسه باشد و باید جایگزینها را برای پرانتزهای چپ و راست («()»)، قلابهای چپ و راست («[]»)، آکولادهای چپ و راست («{}»)، براکتهای زاویهدار چپ و راست («<>»)، بکاسلش («\»)، علامت دلار («$»)، ستاره («*»)، نقطه («.») و علامت درصد («%») فهرست کند. برای نمونه، دستور:
texchars ()\[]<\><\>\\$*.%
کارکرد آکولادهای چپ و راست را برای تحلیل ساختارهای TeX/LaTeX با براکتهای زاویهدار جایگزین میکند، در حالی که کارکرد آنها را برای پیشپردازنده کتابشناختی tib حفظ مینماید. توجه داشته باشید که بکاسلش، قلاب باز چپ و براکت زاویهدار راست باید با بکاسلش گریز داده شوند.
opt-stmt : { cmpnd-stmt | aff-stmt }
cmpnd-stmt : compoundwords compound-opt
aff-stmt : allaffixes on-or-off
on-or-off : { on | off }
compound-opt : { on-or-off | controlled character }
یک opt-stmt برخی پیشفرضهای ispell را کنترل میکند که بهتر است وابسته به زبان تنظیم شوند. دستور allaffixes پیشفرض مربوط به گزینههای -P و -m در ispell را کنترل میکند. اگر allaffixes بر روی off تنظیم شود (حالت پیشفرض)، ispell رفتار پیشفرض پرچم -P را در پیش خواهد گرفت: پیشنهادات ریشه/وند تنها در صورتی ارائه میشوند که هیچ کلمه «تقریباً مشابه» (near miss) وجود نداشته باشد. اگر allaffixes بر روی on تنظیم شود، ispell رفتار پرچم -m را در پیش میگیرد: پیشنهادات ریشه/وند همیشه ارائه خواهند شد. دستور compoundwords پیشفرض گزینههای -B و -C در ispell را کنترل میکند. اگر compoundwords بر روی off تنظیم شود (پیشفرض)، ispell رفتار پرچم -B را در پیش میگیرد: کلمات بههمچسبیده به عنوان خطا گزارش میشوند. اگر compoundwords بر روی on تنظیم شود، ispell رفتار پرچم -C را در پیش میگیرد: کلمات بههمچسبیده در صورتی که هر دو بخش در فرهنگ لغت موجود باشند، به عنوان کلمه مرکب تلقی میشوند. این ویژگی برای زبانهایی مانند آلمانی و نروژی که کلمات مرکب زیادی میسازند بسیار کاربردی است. در نهایت، اگر compoundwords بر روی controlled تنظیم شود، تنها کلماتی که با پرچم مشخصشده توسط character علامتگذاری شدهاند (که نباید برای مقاصد دیگر استفاده شود) مجاز به شرکت در ساخت کلمات مرکب خواهند بود. از آنجا که این گزینه نیازمند مشخص شدن پرچمها در فرهنگ لغت است، از طریق خط فرمان در دسترس نیست.
flag-stmt : flagmarker character
دستور flagmarker نویسهای را مشخص میکند که برای جداسازی پرچمهای وند از ریشه کلمه در فایل فرهنگ لغت خام به کار میرود. این نویسه باید چیزی باشد که در هیچ کلمهای (از جمله در نویسههای رشتهای؛ در ادامه ببینید) یافت نشود. مقدار پیشفرض «/» است زیرا این نویسه معمولاً برای نشان دادن نویسههای ویژه در هیچ زبانی استفاده نمیشود.
num-stmt : compoundmin digit
دستور compoundmin طول دو بخش تشکیلدهنده یک کلمه مرکب را کنترل میکند. این دستور تنها زمانی تأثیر دارد که compoundwords روی on تنظیم شده باشد یا پرچم -C به ispell داده شده باشد. در این صورت، تنها کلماتی که حداقل به اندازه حداقل طول تعیینشده باشند به عنوان اجزای یک کلمه مرکب پذیرفته میشوند. مقدار پیشفرض ۳ نویسه است.
char-sets : norm-sets [ alt-sets ]
بخش مجموعههای نویسه، نویسههایی را که میتوانند بخشی از یک کلمه باشند شرح داده و ترتیب مرتبسازی (collating order) آنها را تعریف میکند. همیشه باید تعریفی از مجموعههای نویسه «عادی» (normal) وجود داشته باشد؛ علاوه بر این، ممکن است یک یا چند تعریف جزئی از مجموعههای «جایگزین» (alternate) که با قالببندهای متنی گوناگون به کار میروند نیز وجود داشته باشد.
norm-sets : [ deftype ] [ set-options ] charset-group
یک مجموعه نویسه «عادی» میتواند به صورت اختیاری با تعریفی از پسوندهای فایلی که از این مجموعه استفاده میکنند آغاز شود. به دنبال آن یک یا چند اعلان مجموعه نویسه قرار میگیرد.
deftype : defstringtype name deformatter suffix*
اعلان defstringtype فهرستی از پسوندهای فایل را ارائه میدهد که باید از نویسههای رشتهای پیشفرضِ تعریفشده به عنوان بخشی از مجموعه نویسه پایه استفاده کنند؛ این مورد تنها در صورتی لازم است که نویسههای رشتهای تعریف شده باشند. پارامتر name رشتهای است که نام یکتای مرتبط با این پسوندها را مشخص میکند؛ اغلب این نام، نام یک قالببند است. اگر قالببند عضوی از خانواده troff باشد، باید از «nroff» برای نام مرتبط با پرکاربردترین بسته ماکرو استفاده شود؛ اعضای خانواده TeX باید از «tex» استفاده کنند. نامهای دیگر را میتوان آزادانه انتخاب کرد، اما باید ساده نگه داشته شوند، زیرا در سوئیچ -T برنامه ispell برای مشخص کردن نوع قالببند استفاده میشوند. پارامتر deformatter سبک قالبزدایی (deformatting) را برای پردازش فایلهای دارای پسوندهای دادهشده مشخص میکند. در حال حاضر، این مقدار باید یکی از موارد plain، tex، nroff یا html باشد. پارامترهای suffix فهرستی از رشتههای جداشده با فاصله هستند که در صورت وجود در انتهای یک نام فایل، نشان میدهند که مجموعه نویسههای رشتهای مرتبط باید به طور پیشفرض برای این فایل استفاده شود. برای نمونه، فهرست پسوندهای خانواده troff معمولاً شامل پسوندهایی مانند «.ms»، «.me»، «.mm» و غیره است.
set-options : options charset-options*
اعلان options یک یا چند گزینه جداشده با فاصله را برای مجموعه نویسه دادهشده (پیشفرض یا جایگزین) فعال میکند. در حال حاضر، دو گزینه پشتیبانی میشوند: گزینه raw_display نشان میدهد که نویسههای رشتهای باید همانطور که هستند نمایش داده شوند، حتی اگر به نظر برسد برخی از اجزای آنها غیرقابل چاپ هستند؛ این گزینه برای مجموعههای نویسهای مانند UTF-8 یا (اگر پایانه به درستی پیکربندی شده باشد) ISO Latin-1 مفید است. گزینه squeeze_string نشان میدهد هنگامی که ispell با یک کلاینت خارجی مانند emacs (از طریق پرچم -a) تعامل دارد، نویسههای رشتهای باید به جای طول واقعیشان بر حسب بایت، دارای طول ۱ در نظر گرفته شوند. این گزینه برای این لازم است که ispell بتواند هنگام پردازش فایلهای حاوی نویسههای UTF-8 با emacs همگامسازی شود؛ این گزینه تنها باید برای مجموعههای نویسه UTF-8 تعیین گردد.
charset-group : { char-stmt | string-stmt | dup-stmt}*
یک char-stmt نویسههای منفرد را توصیف میکند؛ یک string-stmt نویسههایی را شرح میدهد که باید با هم به عنوان یک رشته ظاهر شوند و معمولاً نشاندهنده یک نویسه منفرد در زبان مقصد هستند. هر دو دستور میتوانند تبدیل بین حروف بزرگ و کوچک را نیز توصیف کنند. یک dup-stmt برای توصیف اشکال جایگزین نویسههای رشتهای به کار میرود تا بتوان از یک فرهنگ لغت واحد به همراه چندین برنامه قالببندی که از قراردادهای مختلفی برای نمایش نویسههای غیر ASCII استفاده میکنند، بهره برد.
char-stmt : wordchars character-range | wordchars lowercase-range uppercase-range | boundarychars character-range | boundarychars lowercase-range uppercase-range string-stmt : stringchar string | stringchar lowercase-string uppercase-string
نویسههایی که با دستور boundarychars تعریف میشوند، تنها در صورتی بخشی از یک کلمه در نظر گرفته میشوند که به صورت منفرد بین نویسههای اعلامشده با دستورهای wordchars یا stringchar قرار گرفته باشند. برای مثال، اگر خط پیوند (hyphen) یک نویسه مرزی باشد (که در زبان فرانسوی کاربرد دارد)، رشته "foo-bar" یک کلمه منفرد خواهد بود، اما "-foo" مانند "foo" رفتار میکند و "foo--bar" به صورت دو کلمه جداشده با نویسههای غیرکلمهای تلقی میشود.
اگر در یک char-stmt یا string-stmt دو بازه یا رشته داده شود، اولی نویسههایی را شرح میدهد که به عنوان حروف کوچک تفسیر میشوند و دومی حروف بزرگ را توصیف میکند. در مورد دستور stringchar، دو رشته باید طول یکسانی داشته باشند. همچنین در یک دستور stringchar، رشتههای واقعی میتوانند بدون مشکل شامل هر دو نوع نویسه بزرگ و کوچک باشند؛ برای نمونه، دستور
stringchar "\\*(sS" "\\*(Ss"
مجاز است و با سایر اعلانهای "s" و "S" به عنوان حروف کوچک و بزرگ تداخلی ایجاد نخواهد کرد (و از آنها تداخل نمیپذیرد).
نکته پایانی در مورد نویسههای رشتهای: برخی زبانها نویسههای ویژه معینی را طوری مرتبسازی میکنند که گویی رشته هستند. برای مثال، در زبان آلمانی «a-umlaut» به طور سنتی طوری مرتب میشود که گویی «ae» است. برنامه Ispell قادر به انجام این کار نیست؛ با هر نویسه باید به عنوان یک موجودیت مستقل رفتار شود. بنابراین در موارد خاصی، ispell فهرستی از کلمات را به ترتیبی متفاوت از ترتیب استاندارد «فرهنگ لغت» برای زبان مقصد مرتب خواهد کرد.
alt-sets : alttype [ set-options ] [ alt-stmt* ]
از آنجا که قالببندهای مختلف از نمادهای متفاوتی برای نمایش نویسههای غیر ASCII استفاده میکنند، ispell باید از نمایشهای مورد استفاده توسط این قالببندها آگاه باشد. این موارد به عنوان مجموعههای جایگزینِ نویسههای رشتهای تعریف میشوند.
alttype : altstringtype name suffix*
دستور altstringtype هر مجموعه را با اعلان نام قالببند مرتبط و فهرست پسوندهای فایل معرفی میکند. این نام و فهرست دقیقاً مانند دستور defstringtype در بالا تفسیر میشوند. به دنبال این سرآیند، یک یا چند alt-stmt قرار میگیرد که نویسههای رشتهای جایگزین مورد استفاده توسط این قالببند را اعلام میکنند.
alt-stmt : altstringchar alt-string std-string
دستور altstringchar نمایشهای جایگزین را برای نویسههای رشتهای توصیف میکند. برای مثال، بسته ماکرو -mm در troff نویسه «a-umlaut» آلمانی را به صورت a\*: نشان میدهد، در حالی که TeX از توالی \"a استفاده میکند. اگر نسخههای troff به عنوان نسخههای استاندارد با استفاده از stringchar اعلان شده باشند، میتوان نسخههای TeX را به عنوان جایگزین با استفاده از دستور زیر تعریف کرد:
altstringchar \\\"a a\\*
هنگامی که دستور altstringchar برای تعیین اشکال جایگزین استفاده میشود، تمام اشکال برای یک قالببند خاص باید با هم به عنوان یک گروه اعلام شوند. همچنین هر قالببند یا بسته ماکرو باید یک مجموعه کامل از نویسهها (هم حروف بزرگ و هم کوچک) ارائه دهد، و توالیهای نویسهای استفادهشده برای هر قالببند باید کاملاً مجزا و متمایز باشند. توالیهای نویسهای که نسخههای بزرگ و کوچک یک نویسه قابل چاپ یکسان را توصیف میکنند نیز باید طول یکسانی داشته باشند. ممکن است برای برآورده کردن این محدودیتها لازم باشد ماکروهای جدیدی برای یک قالببند معین تعریف شود. (نسخه فعلی buildhash این محدودیتها را اجبار نمیکند، اما رعایت نکردن آنها ممکن است منجر به بروز خطا در فایلهایی شود که با ispell پردازش میشوند.)
یک نکته جانبی مهم این است که ispell فرض میکند تمام نویسههای اعلامشده به عنوان wordchars یا boundarychars دقیقاً یک موقعیت را در صفحه نمایش پایانه اشغال میکنند.
یک دستور مجموعه نویسه منفرد میتواند یک نویسه تکی یا یک بازه پیوسته از نویسهها را اعلان کند. یک بازه مانند egrep و پوسته مشخص میشود: [a-z] به معنای حروف الفبای کوچک است؛ [^a-z] به معنای همه چیز به جز حروف کوچک، و غیره. تمام دستورهای مجموعه نویسه با هم ترکیب (اجتماع) میشوند تا فهرست نهایی نویسههایی را تشکیل دهند که میتوانند بخشی از یک کلمه باشند. ترتیب مرتبسازی نویسهها بر اساس ترتیب اعلان آنها تعیین میشود؛ اگر از یک بازه استفاده شود، فرض میشود که نویسهها به ترتیب ASCII اعلان شدهاند. نویسههایی که دارای حروف کوچک و بزرگ هستند در کنار یکدیگر مرتب میشوند، به طوری که نویسه بزرگ در ابتدا قرار میگیرد.
دستورهای اعلان نویسه به دلیل نیازی که به تطبیق هر نویسه کوچک با معادل بزرگ آن دارند، رفتار نسبتاً ویژهای دارند. در هر دستور wordchars یا boundarychars معین، نویسهها در هر بازه ابتدا بر اساس مقادیر بایتی خود در یک توالی مرتبسازی قرار میگیرند، سپس یکبهیک با بازه دیگر تطبیق داده میشوند. (دو بازه باید تعداد نویسههای یکسانی داشته باشند). بنابراین برای مثال، دو دستور:
wordchars [aeiou] [AEIOU] wordchars [aeiou] [UOIEA]
دقیقاً همان اثر را ایجاد میکنند. برای تطبیق «نامتعارف» حروف صدادار، باید از دستورهای جداگانه استفاده کنید:
wordchars a U wordchars e O wordchars i I wordchars o E wordchars u A
که باعث میشود حرف بزرگ 'e' برابر با 'O' و حرف کوچک 'O' برابر با 'e' شود. این موضوع معمولاً فقط در زبانهایی مشکلساز میشود که ناچار به استفاده از یک توالی مرتبسازی نامعمول شدهاند. اگر حروف بزرگ و کوچک شما هر دو به یک ترتیب مرتب میشوند، نباید نگران این ویژگی باشید.
بخشهای پیشوندها (prefixes) و پسوندها (suffixes) نحو کاملاً یکسانی دارند، به جز کلیدواژه معرفیکننده.
prefixes : prefixes flagdef* suffixes : suffixes flagdef* flagdef : flag [*|~] char : repl*
یک جدول پیشوند یا پسوند شامل یک کلیدواژه آغازین و فهرستی از تعاریف پرچم است. پرچمها را میتوان بیش از یک بار تعریف کرد، که در این حالت تعاریف با هم ترکیب میشوند. هر پرچم یک یا چند repl (جایگزینی) را کنترل میکند که به صورت شرطی بر ابتدا یا انتهای کلمات مختلف اعمال میشوند.
پرچمها با یک نویسه منفرد char نامگذاری میشوند. بسته به یک گزینه پیکربندی، این نویسه میتواند هر حرف بزرگ (پیکربندی پیشفرض) یا هر نویسه ۷-بیتی ASCII باشد. بیشتر زبانها باید بتوانند تنها با ۲۶ پرچم کار خود را پیش ببرند.
یک نویسه پرچم ممکن است با یک یا چند نویسه گزینهای پیشوند شود. (اگر میخواهید از یکی از نویسههای گزینهای به عنوان نویسه پرچم استفاده کنید، کافی است آن را در گیومه دوتایی قرار دهید.)
گزینه ستاره (*) به این معنی است که این پرچم در ساخت «حاصلضرب متقاطع» (cross-product) شرکت میکند. این موضوع تنها در صورتی اهمیت دارد که فایل هم شامل جدول پیشوند و هم جدول پسوند باشد. در این صورت، تمام پیشوندها و پسوندهای علامتگذاریشده با ستاره در تمام ترکیبهای متقاطع ممکن بر ریشه کلمه اعمال خواهند شد. برای مثال، ریشه fix را با پیشوندهای pre و in، و پسوندهای es و ed در نظر بگیرید. اگر تمام پرچمهای کنترلکننده این پیشوندها و پسوندها با علامت ستاره مشخص شده باشند، ریشه منفرد fix کلمات prefix، prefixes، prefixed، infix، infixes، infixed، fix، fixes و fixed را نیز تولید خواهد کرد. ساخت حاصلضرب متقاطع میتواند کلمات زیادی را به سرعت تولید کند که برخی از آنها ممکن است نامعتبر باشند، بنابراین دقت کنید. اگر حاصلضرب متقاطع کلمات نامعتبر تولید کند، munchlist آن ترکیبهای پرچم را تولید نخواهد کرد و پرچم کارآمد نخواهد بود.
repl : condition* > [ - strip-string , ] append-string
گزینه ~ مشخص میکند که پرچم مرتبط تنها زمانی فعال است که یک کلمه مرکب در حال ساخت باشد. این ویژگی در زبانی مانند آلمانی که شکل یک کلمه گاهی در درون یک کلمه مرکب تغییر میکند، کاربرد دارد.
یک repl یک قاعده شرطی برای تغییر ریشه کلمه است. تا ۸ condition (شرط) را میتوان مشخص کرد. اگر conditions برقرار باشند، قواعد سمت راستِ repl به صورت زیر اعمال میشوند:
- (1)
- اگر یک strip-string (رشته حذفی) داده شده باشد، ابتدا از ابتدا یا انتهای ریشه کلمه (بسته به پیشوند یا پسوند بودن) حذف میشود.
- (2)
- سپس append-string (رشته الحاقی) در آن نقطه اضافه میشود.
برای نمونه، شرط . به معنای «هر کلمهای» است و شرط Y به معنای «هر کلمهای که به Y ختم میشود» است. جایگزینیهای (پسوند) زیر:
. > MENT Y > -Y,IES
کلمه induce را به inducement و fly را به flies تبدیل میکنند. (اگر هر دو توسط یک پرچم کنترل میشدند، fly را به flyment نیز تبدیل میکردند، که شاید مورد نظر نبوده باشد. برای جلوگیری از این نوع مشکلات میتوان از Munchlist استفاده کرد؛ توالی دستوری ارائهشده در زیر را ببینید.)
رشتههای سمت راست باید الزاماً رشتههایی از نویسههای مشخص باشند، نه بازهها (ranges). دلایل این امر عمیقاً در نحوه کارکرد ispell ریشه دارد و فراهم کردن انعطافپذیری بیشتر در آن دشوار خواهد بود. برای مثال، شاید بخواهید بنویسید:
[EY] > -[EY],IES
این شیوه کار نخواهد کرد. در عوض، باید از دو قاعده جداگانه استفاده کنید:
E > -E,IES Y > -Y,IES
اعمال repl ها میتواند با condition ها به کلمات خاصی محدود شود:
condition : { . | character | range }
یک condition محدودیتی بر روی نویسههایی است که با سمت راستِ repl همجوار هستند و/یا توسط آن جایگزین میشوند. تا ۸ condition میتوان تعیین کرد که زمینه (context) کافی را فراهم میکند. سمت راست تنها در صورتی اعمال خواهد شد که conditions در repl برقرار باشند. همچنین conditions به طور ضمنی یک طول را تعریف میکنند؛ ریشههایی که کوتاهتر از تعداد conditions باشند در آزمون رد خواهند شد. (به عنوان یک حالت خاص، یک condition شامل یک نقطه منفرد "." طولی برابر صفر را تعریف میکند، به طوری که قاعده بر روی تمام کلمات اعمال میشود). این طول مستقل از آزمون جداگانهای است که اصرار دارد تمام پرچمها طول کلمه خروجی حداقل چهار نویسه تولید کنند.
شرطهایی (Conditions) که نویسههای تکی هستند باید با فاصله از هم جدا شوند. برای مثال، برای مشخص کردن کلماتی که به "ED" ختم میشوند، بنویسید:
E D > -ED,ING # مانند covered > covering
اگر بنویسید:
ED > -ED,ING
اثر آن همانند زیر خواهد بود:
[ED] > -ED,ING
به عنوان یک نکته مهم، گاهی اوقات بازسازی یک فایل فرهنگ لغت با استفاده از یک فایل پسوند ناسازگار مفید است. برای مثال، فرض کنید پرچم "R" را گسترش دادهاید تا "er" و "ers" را تولید کند (و در نتیجه پرچم Z را تا حدودی منسوخ کردهاید). برای ساخت یک فرهنگ لغت جدید newdict که با استفاده از newaffixes، دقیقاً همان فهرست کلماتی را بپذیرد که فهرست قدیمی olddict با استفاده از oldaffixes میپذیرفت، سوئیچ -c در munchlist مفید است، مانند مثال زیر:
$ munchlist -c oldaffixes -l newaffixes olddict > newdict
اگر از این روش استفاده کنید، فرهنگ لغت جدید شما همیشه همان فهرستی را خواهد پذیرفت که فرهنگ لغت اصلی میپذیرفت، حتی اگر فایل وند دارای اشکالات ساختاری باشد. دلیل این امر این است که munchlist کلمات تولیدشده توسط یک پرچم را با فهرست کلمات اصلی مقایسه میکند و از به کار بردن هر پرچمی که کلمات غیرمجاز تولید کند خودداری مینماید.
مثالها (EXAMPLES)
به عنوان نمونهای از پسوندهای شرطی، در اینجا مشخصات پرچم S از فایل وند انگلیسی آمده است:
flag *S:
[^AEIOU]Y > -Y,IES # مانند imply > implies
[AEIOU]Y > S # مانند convey > conveys
[SXZH] > ES # مانند fix > fixes
[^SXZHY] > S # مانند bat > bats
خط اول برای کلماتی اعمال میشود که به Y ختم میشوند، اما پیش از Y حرف صدادار ندارند. خط دوم کلمات دارای حرف صدادار و سپس Y را مدیریت میکند. خط سوم کلماتی را پردازش میکند که به یک صدای صفیری (sibilant) یا نزدیک به صفیری ختم میشوند، و خط آخر سایر موارد را در بر میگیرد.
توجه داشته باشید که conditions بسیار دقیق نوشته شدهاند تا بر مجموعههای مجزایی از کلمات اعمال شوند. به طور ویژه، دقت کنید که خط چهارم علاوه بر موارد مشخص SXZH، کلماتی را که به Y ختم میشوند نیز مستثنی میکند. در غیر این صورت، "imply" را به "implys" تبدیل میکرد.
اگرچه فایل وند انگلیسی این کار را انجام نمیدهد، اما شما میتوانید کاری کنید که یک پرچم بیش از یک شکل تغییریافته از ریشه کلمه را تولید کند. برای مثال، میتوانیم پرچم "R" انگلیسی را به صورت زیر گسترش دهیم:
flag *R: E > R # مانند skate > skater E > RS # مانند skate > skaters [^AEIOU]Y > -Y,IER # مانند multiply > multiplier [^AEIOU]Y > -Y,IERS # مانند multiply > multipliers [AEIOU]Y > ER # مانند convey > conveyer [AEIOU]Y > ERS # مانند convey > conveyers [^EY] > ER # مانند build > builder [^EY] > ERS # مانند build > builders
این پرچم هم "skater" و هم "skaters" را از "skate" تولید میکند. این قابلیت میتواند در زبانهایی که از پسوندهای اسم، فعل و صفت استفاده میکنند بسیار مفید باشد؛ برای مثال، میتوان یک پرچم واحد تعریف کرد که تمام پسوندهای افعال «ضعیف» آلمانی را تولید کند.
همچنین ببینید (SEE ALSO)
| local |