آشنایی با عبارات با قاعده به همراه مثال - 2

 عبارات با قاعده چیست؟ عبارات باقاعده، فرمی است چکیده و خلاصه برای بیان قوانین لغوی زبان ها. شکل لغات در زبانهای برنامه نویسی دارای فرم کلی خاص است. براساس این فرم کلی است که انواع لغات از قبیل شناسه ها (اسامی) و اعداد، رشته های ثابت کرکتری، جملات تفسیری (Comment) و سایر لغات از یکدیگر تفکیک و تمیز داده می شوند.

نمونه هایی از عبارات با قاعده
به عنوان نمونه تعریف شناسه ها در زبان c را در نظر بگیرید. یک شناسه یا Identifire در زبان c حتما باید با یک کرکتر آغاز گردد و در ادامه ممکن است به هر تعداد و با هر ترکیبی از ارقام صفر تا نه (9-0) و الفبای انگلیسی (A-Z) و علامت خط زیر یا در اصطلاح (UnderLine) ادامه یابد. به عنوان مثال اسامی:

_ _A, B__1, BAC2345

از لحاظ زبان C به عنوان اسامی (شناسه )، شناخته میشوند. میتوان با استفاده از یک عبارت با قاعده به صورت زیر، فرم کلی شناسه ها را در زبان C تعریف نمود:

 *(‘_’|Letter ( Letter | Digit     :Identifire
A | B | ……… | Z | a | b | ………| z     :Letter
9|.......|2|1|0     :Digitall

در عبارت ارائه شده برای شناسه ها، علامت ’*‘ نمایانگر تکرار صفر یا بیشتر می باشد و علامت ’|‘ علامت یا می باشد. میتوان به صورت چکیده تر نیز Digit را تعریف نمود. به همین ترتیب، حروف الفبای انگلیسی را به صورت زیر میتوان تعریف نمود:

Digit: [0..9]

به همین ترتیب، حروف الفبای انگلیسی را به صورت زیر میتوان تعریف نمود:

Letter: [a .. z, A .. Z]

شکل کلی اعداد صحیح را میتوان با استفاده از یک عبارت به این صورت مشخص نمود:

*Number: digit digit

Digit: [0..9]

بر طبق این عبارت، یک عدد صحیح با یک رقم بین صفر تا نه آغاز میشود و به هر تعدادی رقم میتواند درادامه آن ظاهر شود، برای مثال:

0123, 5, 0

همانگونه که مشخص است، یک عدد حداقل دارای حداقل یک رقم باید باشد یا به عبارت دیگر یک عدد از یک یا بیشتر ارقام تشکیل شده، میتوان عدد را به صورت زیر تعریف کرد:

+Number: digit

در اینجا علامت ’+‘ نمایانگر تکرار یک یا بیشتر میباشد، یادآوری میکنیم که علامت ستاره ’*‘ نمایانگر تکرار صفر یا بیشتر است. اعداد میتوانند دارای علامت و یا بدون علامت باشند.
در این عبارت با قاعده، علامت لامبدا λ نمایانگر عدم وجود و یا تهی میباشد. عبارت فوق به این صورت خوانده میشود: یک عدد دارای علامت به علاوه یا منها و یا ممکن است اصلا علامتی نداشته باشد و به دنبال آن به تعداد یک یا بیشتر ارقام بین صفر تا نه ظاهر گردد. اعداد را میتوان به فرمی ساده تر با استفاده از این قاعده که هر عبارت اختیاری مثل r بصورت *r نمایش داده میشود. به صورت زیر مشخص نمود:

+Number: ( + | - )* digit

به عنوان نمونه ای دیگر از عبارات با قاعده، فرم کلی رشته ها در زبان پاسکال را در نظر بگیرید. باید توجه داشته باشید که در این زبان چنانچه در وسط رشته علامت کوتیشن ‘ نیاز باشد، میبایست آن را دو بار تکرارنمود. برای نمونه چنانچه جملة This is your ’s در خروجی مورد نظر باشد، میتوان دستور (‘writeln(‘This is your‘’s استفاده نمود. لذا، فرم کلی رشته ها با یک عبارت با قاعده به صورت زیر بیان میشود:

' * (‘ ‘ -String: ‘( Characters

در عبارت فوق، مجموعه Characters نمایانگر هر گونه کرکتر قابل مشاهده منهای کوتیشن است.

قوانین ایجاد عبارت باقاعده
برای ایجاد یک عبارت باقاعده، تعدادی از علائم مورد استفاده واقع میشوند. هر یک از این علائم دارای معنی و مفهوم خاصی میباشند. در حالت کلی اگر دلتا (Δ) مجموعه علائم بکار رفته شده در عبارات باشد، آنگاه:
1. هر عنصر? € a  خود یک عبارت با قاعده است. برای مثال چنانچه [9...0] = ? باشد آنگاه هر رقمی بین صفر تا نه مثل 1، خود به تنهایی یک عبارت باقاعده است.
2. چنانچه s و r دو عبارت با قاعده باشند، آنگاه rs نیز یک عبارت با قاعده است. به عبارت ساده تر در حالت کلی اگر دو عبارت با قاعده را در کنار یکدیگر قرار دهید، حاصل یک عبارت باقاعده خواهد بود.
3. چنانچه s و r دو عبارت با قاعده باشند، آنگاه r یا s که به صورت ( r- s) مشخص میشود نیز یک عبارت باقاعده است. عملگر λ دارای خاصیت جابجایی است. به عبارت دیگر:

(r-s = s - r = ( r-s

4. چنانچه r یک عبارت با قاعده باشد آنگاه *r نمایانگر تکرار صفر یا بیشتر از عبارت r است. برای نمونه اگر r ،a یا b باشد آنگاه *r برابر است با:

*(r: a - b: ( a-b

این عبارت گویای هر ترکیبی با هر تعدادی از a یا b که در کنار یکدیگر قرار گرفتهاند میباشد. برای نمونه رشته های BBBB، BAABB، AAA همگی فرم های خاصی از عبارت *r هستند. بنابراین علامت لامبدا λ که نمایانگر عنصر تهی است، به تنهایی یک عبارت باقاعده است.
5. چنانچه r یک عبارت باقاعده باشد، آنگاه +r نمایانگر تکرار یک یا بیشتر عبارت r است.

برای نمونه :

+Number: digit

به این ترتیب واضح است که:
با استفاده از پنج قاعدة فوق، میتوان عبارت با قاعده را بنا نمود. با استفاده از نکات فوق، فرم کلی جملات تفسیری Comment در زبان پاسکال را میتوان به صورت زیر معین نمود. باید توجه داشته باشید که در زبان پاسکال جملات تفسیری در بین علائم آکولاد باز و آکولاد بسته قرار میگیرند.

                   

(کلیه کرکترها منهای آکولاد):C,     {*Comment: { C

 در زبان پاسکال جملات تفسیری را میتوان بین علائم (* *) نیز مشخص نمود. در این فرم از جملات تفسیری باید توجه داشته باشید که اگر ستاره در داخل جمله ظاهر شود، در پشت آن باید هر حرفی به غیر از ستاره و پرانتز بسته ظاهر شود. برای نمونه، لغت زیر یک جملة تفسیری نیست:

(* abc *) abc *)

فرم کلی اینگونه جملات را میتوان در قالب یک عبارت باقاعده به صورت زیر خلاصه نمود:        
    :Comment2

 r: کلیة کاراکتر ها منهای علامت

s: کلیة کرکترها منهای علائم

به این ترتیب جملات تفسیری به صورت  Comment: Comment | Comment2 تعریف میشوند.

با توجه به اینکه اعداد یا به صورت صحیح و یا به صورت اعشاری ظاهر میشوند و با در نظر گرفتن اینکه اگرقبل از ممیز حداقل یک رقم ظاهر شود آنگاه وجود ارقام پس از ممیز ضروری نیست و نیز اینکه بعد از ممیزحداقل یک رقم ظاهر شود وجود رقم قبل از ممیز ضروری نیست. به طور خلاصه عبارت با قاعده برای بیان شکل کلی اعداد به صورت زیر میتواند باشد:

Number: (digit* . digit + ) | ( digit+ . digit* ) | digit

عبارات با قاعده مبین قوانین لغوی و نمایانگر فرم کلی لغات هستند. متأسفانه، این فرم کلی را به سادگی نمیتوان تبدیل به کد برنامه نمود. لذا برای رفع این مشکل از ماشینهای خودکار استفاده میشود.