STATES(1) STATES STATES(1)

states - ابزار پردازش متن مشابه awk

states [-hvV] [-D var=val] [-f file] [-o outputfile] [-p path] [-s startstate] [-W level] [filename ...]

برنامه States یک ابزار پردازش متن مشابه awk به‌همراه افزونه‌های ماشین حالت (state machine) است. این ابزار برای برجسته‌سازی نحوی کد منبع برنامه‌ها و وظایف مشابهی طراحی شده است که در آن‌ها اطلاعات حالت به پردازش ورودی کمک می‌کند.

در هر لحظه، States در یک وضعیت (حالت) قرار دارد؛ هر یک از این حالت‌ها شباهت زیادی به محیط کاری awk دارند، بدین معنا که دارای عبارات باقاعده‌ای (regular expressions) هستند که با ورودی مطابقت داده می‌شوند و اقداماتی که هنگام یافتن یک تطابق به اجرا درمی‌آیند. states می‌تواند از درون بلوک‌های اقدام، انتقال حالت انجام دهد؛ یعنی می‌تواند به حالت دیگری برود و پردازش را از آنجا ادامه دهد. انتقال‌های حالت ثبت می‌شوند تا states بتواند پس از پایان حالت فعلی، به حالت فراخواننده بازگردد.

بزرگ‌ترین تفاوت بین states و awk، علاوه بر افزونه‌های ماشین حالت، این است که states خط‌محور (line-oriented) نیست. این ابزار توکن‌های عبارات باقاعده را از ورودی تطبیق می‌دهد و پس از پردازش هر تطابق، پردازش را از همان موقعیت فعلی ادامه می‌دهد، نه از ابتدای خط ورودی بعدی.

متغیر var را با مقدار رشته‌ای val تعریف می‌کند. تعاریف خط فرمان بر تعاریف متغیرهای موجود در فایل پیکربندی اولویت دارند و آن‌ها را بازنویسی می‌کنند.
تعاریف حالت را از فایل file می‌خواند. به‌طور پیش‌فرض، states تلاش می‌کند تعاریف حالت را از فایل states.st در دایرکتوری کاری فعلی بخواند.
پیام راهنمای کوتاهی را نمایش داده و خارج می‌شود.
خروجی را به جای چاپ در stdout، در فایل file ذخیره می‌کند.
مسیر بارگذاری را روی path تنظیم می‌کند. مسیر بارگذاری به‌طور پیش‌فرض همان دایرکتوری است که فایل تعاریف حالت از آن بارگذاری شده است.
اجرا را از حالت state آغاز می‌کند. این تعریف، حالت آغازینی را که از بلوک start تعیین شده است بازنویسی می‌کند.
میزان جزئیات پیام‌های خروجی برنامه را افزایش می‌دهد.
نسخهٔ states را نمایش داده و خارج می‌شود.
سطح هشدار را روی level تنظیم می‌کند. مقادیر ممکن برای level عبارتند از:
هشدارهای سبک (پیش‌فرض)
تمام هشدارها

فایل‌های برنامهٔ States می‌توانند شامل یک بلوک start، بلوک‌های startrules و namerules برای تعیین وضعیت اولیه، تعاریف state و عبارت‌های expressions باشند.

بلوک start در واقع ()main برنامهٔ states است؛ این بلوک هنگام راه‌اندازی اسکریپت برای هر فایل ورودی اجرا می‌شود و می‌تواند هرگونه مقداردهی اولیه‌ای را که اسکریپت نیاز دارد انجام دهد. این بلوک معمولاً توابع اولیهٔ check_startrules() و check_namerules() را نیز فراخوانی می‌کند که وضعیت اولیه را از روی نام فایل ورودی یا داده‌های یافت‌شده در ابتدای فایل ورودی تعیین می‌کنند. در اینجا یک نمونه بلوک start آورده شده است که دو متغیر را مقداردهی اولیه کرده و تعیین استاندارد وضعیت اولیه را انجام می‌دهد:

start
{
  a = 1;
  msg = "Hello, world!";
  check_startrules ();
  check_namerules ();
}

پس از پردازش بلوک start، پردازش ورودی از وضعیت اولیه ادامه می‌یابد.

وضعیت اولیه بر اساس اطلاعات یافت‌شده در بلوک‌های startrules و namerules تعیین می‌شود. هر دو بلوک شامل جفت‌های «عبارت باقاعده - نماد» هستند؛ هنگامی که عبارت باقاعده با نام فایل یا ابتدای فایل ورودی مطابقت پیدا کند، وضعیت اولیه با نماد متناظر آن نام‌گذاری می‌شود. برای مثال، قواعد start و name زیر می‌توانند فایل‌های C و Fortran را تشخیص دهند:

namerules
{
  /\.(c|h)$/    c;
  /\.[fF]$/     fortran;
}
startrules
{
  /-\*- [cC] -\*-/      c;
  /-\*- fortran -\*-/   fortran;
}

اگر این قواعد به همراه بلوک start که قبلاً نشان داده شد استفاده شوند، states ابتدا ابتدای فایل ورودی را بررسی می‌کند. اگر حاوی رشتهٔ -*- c -*- باشد، فرض می‌شود فایل حاوی کد C است و پردازش از وضعیتی به نام c آغاز می‌شود. اگر ابتدای فایل ورودی دارای رشتهٔ -*- fortran -*- باشد، وضعیت اولیه fortran خواهد بود. اگر هیچ‌یک از قواعد start مطابقت نداشته باشد، نام فایل ورودی با namerules مطابقت داده می‌شود. اگر نام به پسوند c یا C ختم شود، به وضعیت c می‌رویم. اگر پسوند f یا F باشد، وضعیت اولیه fortran است.

اگر هر دو دسته قواعد start و name در تعیین وضعیت شروع ناموفق باشند، states صرفاً ورودی خود را بدون تغییر به خروجی کپی می‌کند.

وضعیت شروع را می‌توان از خط فرمان نیز با گزینهٔ -s، --state مشخص کرد.

تعاریف وضعیت نحو دستوری زیر را دارند:

state { expr {statements} ... }

که در آن expr عبارت است از: یک عبارت باقاعده، عبارت ویژه یا یک نماد، و statements فهرستی از دستورات است. هنگامی که عبارت expr با ورودی مطابقت یابد، بلوک دستورات اجرا می‌شود. بلوک دستورات می‌تواند توابع اولیهٔ states یا زیرروال‌های تعریف‌شده توسط کاربر را فراخوانی کند، وضعیت‌های دیگر را فراخوانی کند و غیره. پس از اجرای بلوک، پردازش ورودی از موقعیت فعلی ورودی ادامه می‌یابد (که اگر بلوک دستورات وضعیت‌های دیگری را فراخوانی کرده باشد ممکن است تغییر کرده باشد).

عبارت‌های ویژهٔ BEGIN و END می‌توانند به جای expr استفاده شوند. عبارت BEGIN با ابتدای وضعیت مطابقت دارد و بلوک آن هنگام ورود به وضعیت فراخوانی می‌شود. عبارت END با پایان وضعیت مطابقت دارد و بلوک آن زمانی که states از وضعیت خارج می‌شود اجرا می‌گردد.

اگر expr یک نماد باشد، مقدار آن از محیط سراسری جستجو می‌شود و در صورتی که یک عبارت باقاعده باشد، با ورودی مطابقت داده می‌شود؛ در غیر این صورت، آن قاعده نادیده گرفته می‌شود.

فایل برنامهٔ states همچنین می‌تواند دارای عبارت‌های سطح بالا (top-level expressions) باشد؛ این عبارت‌ها پس از تجزیهٔ فایل برنامه اما پیش از پردازش هرگونه فایل ورودی یا ارزیابی بلوک start، ارزیابی می‌شوند..SH "توابع پایه (PRIMITIVE FUNCTIONS)"

به وضعیت symbol رفته و پردازش فایل ورودی را از آن وضعیت ادامه می‌دهد. این تابع هر آنچه را که دستور پایانی return وضعیت symbol بازگردانده است، بازمی‌گرداند.
مانند call عمل می‌کند، اما آرگومان name ارزیابی می‌شود و مقدار آن باید رشته باشد. برای مثال، از این تابع می‌توان برای فراخوانی وضعیتی که نام آن در یک متغیر ذخیره شده است استفاده کرد.
تلاش می‌کند تا وضعیت شروع را از قواعد namerules تشخیص دهد. این تابع در صورت تشخیص وضعیت شروع مقدار 1 و در غیر این صورت مقدار 0 را بازمی‌گرداند.
تلاش می‌کند تا وضعیت شروع را از قواعد startrules تشخیص دهد. این تابع در صورت تشخیص وضعیت شروع مقدار 1 و در غیر این صورت مقدار 0 را بازمی‌گرداند.
رشته‌های آرگومان را الحاق کرده و نتیجه را به عنوان یک رشته جدید بازمی‌گرداند.
آرگومان را به یک عدد ممیز شناور تبدیل می‌کند.
مقدار متغیر محیطی str را دریافت می‌کند. اگر متغیر var تعریف نشده باشد، یک رشته خالی بازمی‌گرداند.
آرگومان را به یک عدد صحیح تبدیل می‌کند.
طول رشته‌ها یا لیست‌های آرگومان را می‌شمارد.
یک لیست جدید شامل آیتم‌های any، ... ایجاد می‌کند.
یک خطای غیرقابل‌بازیابی را گزارش داده و با وضعیت 1 خارج می‌شود. این تابع هرگز بازنمی‌گردد.
آرگومان‌ها را به رشته تبدیل کرده و آن‌ها را در خروجی چاپ می‌کند.
یک زیربازه از source از موقعیت start (شامل خود آن) تا end (غیر شامل) بازمی‌گرداند. آرگومان source می‌تواند رشته یا لیست باشد.
رشته string را به یک عبارت باقاعده جدید تبدیل می‌کند.
نحو نویسه‌های عبارت باقاعده را با انتساب نحو جدید syntax به نویسه char تغییر می‌دهد. مقادیر ممکن برای syntax عبارتند از:
'w'
نویسه بخشی از یک کلمه است
' '
نویسه بخشی از یک کلمه نیست
بررسی می‌کند که آیا رشته string با عبارت باقاعده regexp مطابقت دارد یا خیر. تابع یک وضعیت موفقیت بولی بازمی‌گرداند و ثبات‌های زیرعبارت $n را مقداردهی می‌کند.
عبارت باقاعده regexp را در رشته string جستجو کرده و زیررشته منطبق را با رشته subst جایگزین می‌کند. رشته حاصل را بازمی‌گرداند. رشته جایگزین subst می‌تواند شامل ارجاعات $n به n‌امین زیرعبارت پرانتزبندی‌شده باشد.
مانند regsub عمل می‌کند، اما تمام تطابق‌های عبارت باقاعده regexp در رشته string را با رشته subst جایگزین می‌کند.
بررسی می‌کند که وضعیت symbol تعریف شده باشد. اگر وضعیت مورد نیاز تعریف نشده باشد، تابع تلاش می‌کند آن را به صورت خودکار بارگذاری کند. اگر بارگذاری ناموفق باشد، برنامه با یک پیام خطا خاتمه می‌یابد.
رشته string را با در نظر گرفتن تطابق‌های عبارت باقاعده regexp به عنوان جداکننده آیتم‌ها، به یک لیست تقسیم می‌کند.
آرگومان‌ها را مطابق با fmt قالب‌بندی کرده و نتیجه را به عنوان یک رشته بازمی‌گرداند.
یک مقایسه حساس به بزرگ و کوچکی حروف برای رشته‌های str1 و str2 انجام می‌دهد. این تابع مقداری را بازمی‌گرداند که بدین صورت است:
-1
رشته str1 کوچکتر از str2 است
0
رشته‌ها برابر هستند
1
رشته str1 بزرگتر از str2 است
آرگومان را به رشته تبدیل می‌کند.
یک مقایسه حساس به بزرگ و کوچکی حروف برای رشته‌های str1 و str2 انجام می‌دهد و حداکثر num نویسه را مقایسه می‌کند.
یک زیررشته از رشته str را از موقعیت start (شامل خود آن) تا end (غیر شامل) بازمی‌گرداند.
$.
شماره خط ورودی فعلی
$n
زیرعبارت پرانتزبندی‌شدهٔ nام عبارت باقاعده از آخرین عبارت باقاعده state یا از دستور اولیهٔ regmatch
$`
همه چیز پیش از عبارت باقاعدهٔ منطبق‌شده. این متغیر هنگام استفاده به همراه دستور اولیهٔ regmatch قابل استفاده است؛ محتوای این متغیر در صورت استفاده در بلوک‌های کنش برای ارجاع به داده‌های پیش از عبارت باقاعدهٔ بلوک، تعریف‌نشده است.
$B
یک نام مستعار برای $`
فهرست نام‌های فایل‌های ورودی
نام فایل ورودی فعلی
نام برنامه (معمولاً states)
رشتهٔ نسخه برنامه

/usr/share/enscript/hl/*.st	تعاریف states برای enscript

awk(1), enscript(1)

Markku Rossi <mtr@iki.fi> http://www.iki.fi/~mtr

صفحه خانگی وب GNU Enscript: http://www.iki.fi/~mtr/genscript

October 23, 1998 STATES