مسئولین پارک علموفناوری پردیس تصمیم دارند تا در سری رویداد بعدی المپیکفناوری، یک مسیر راه جدید برای زبانهای برنامهنویسی بومی به ویژه زبان برنامه نویسی آقای هاشمی برگزار کنند. نیما که مسئول طراحی محتوای این مسیر راه جدید و ویژه و تولید داخلی است، به دلیل کمتر شناخته شده بودن زبان برنامه نویسی آقای هاشمی، دسترسی به یک سینتکس هایلایتر (Syntax Highlighter) مناسب برای ژینگول و خوشگل کردن کدهای رویداد را ندارد و از شما برای پیاده سازی این کد هایلایتر کمک میخواهد!
پروژهی اولیه را از این لینک دانلود کنید.
برای اجرای پروژه، باید php
و composer
را از قبل نصب کرده باشید.
composer install
را در پوشهی اصلی پروژه برای نصب نیازمندیها اجرا کنید.php -S localhost:8000 -t tests/
را در پوشهی اصلی پروژه اجرا کنید. پروژه از طریق آدرس http://localhost:8000 در دسترس خواهد بود.برای تست پروژه لازم است تا به مسیر /tests
در مرورگر خود بروید. این صفحه یک فایل کد هاشمی را که از قبل در پروژه برای تست شما قرار داده شده هایلایت کرده و به شما نمایش میدهد.
tempestphp/highlight
🔗در این سوال از نسخه 2.10.2
پروژه آماده کد هایلایتر tempestphp/highlight استفاده کرده و با توسعهی آن، زبان برنامه نویسی آقای هاشمی را نیز به آن اضافه خواهیم کرد. شما در این سوال قرار است تا با توجه به توضیحات ساختارهای گفته شده، با استفاده از عبارات باقاعده (Regular expressions) نواحی و اجزای مختلف یک کد را تشخیص داده و به هستهی اصلی این کد هایلایتر بگویید تا با توکن تایپ (TokenType) مناسب آن را برای شما هایلایت کند.
tempestphp/highlight
(مهم، حتما مطالعه شود!)
2.10.2
کد هایلایتر tempestphp/highlight
🔗ساختار این کد هایلایتر به این شکل است که سه مفهوم اصلی به صورت languages، injections و patterns را از پیش پیادهسازی کرده است. در این بخش به برسی این بخشها میپردازیم و سپس به سراغ مواردی میرویم که از شما انتظار داریم تا در این سوال پیادهسازی کنید:
return
یا class
باشد یا میتواند هر قسمتی از کد باشد، مانند یک کامنت: /* this is a comment */
یا حتی فراخوانی یک تابع.
هر الگو با یک کلاس ساده نمایش داده میشود که یک عبارت باقاعده (Regular expression) و یک TokenType
دارد. عبارت Regex برای تطبیق محتوای مرتبط با این الگوی خاص استفاده میشود، در حالی که TokenType
یک مقدار از نوع enum است که تعیین میکند چگونه آن الگوی خاص هایلایت شود. برای برسی مثالهای بیشتر از این لینک اقدام کنید.توجه داشته باشید که در این سوال شما صرفا قرار است تا از TokenType
های پیشفرض استفاده کنید و نیازی به پیادهسازی جدیدی برای این مورد نیست. در هر بخش TokenType
مربوطه به شما داده میشود تا آن را در ساختار کد قرار دهید.
ساختار تزریقها (Injections):
ساختار بعدی مربوط به بخش تزریقها (Injections) میباشد. از تزریقها برای هایلایت کردن زبانهای مختلف در یک بلوک کد استفاده میشوند. برای مثال: HTML میتواند شامل CSS باشد که باید به شیوه درست در کنار HTML هایلایت شود. برای برسی مثالهای بیشتر از این لینک اقدام کنید. توجه داشته باشید که در این سوال شما صرفا قرار است تا در قالب jfarzand
در کدهای زبان هاشمی خود از ساختار Json استفاده کنید.
ساختار زبانها (Languages):
آخرین ساختار در این کد هایلایتر، ساختار زبانها (Languages) میباشد که همان نماینده زبانهای برنامهنویسی است به صورت کلاسهایی همراه با پیادهسازی الگوها (Patterns) و تزریقها (Injections) میباشد. برای برسی مثالهای بیشتر از این لینک اقدام کنید. زبانی که شما در این سوال به سراغ آن خواهید رفت زبان برنامهنویسی آقای هاشمی (HashemiLanguage
) خواهد بود.
در این بخش به برسی یک مثال مهم از شیوه تشخیص و هایلایت کردن الگوها (Patterns) مشخص شده در هر کدام از بخشهای یک زبان میپردازیم. به مثال زیر از پیادهسازی هایلایت کردن namespace
ها در php
دقت کنید:
NamespacePattern
ایجاد شده است که مسئول هایلایت کردن namespace ها میباشد. همانطور که مشاهده میکنید در تابع getPattern
یک عبارت باقاعده return
شده است که نمایانگر انتخابگر آن ساختار خاص (در اینجا namespace
ها) در کد میباشد. همچنین در تابع getTokenType
یک Enum از نوع TokenType
برگردانده میشود. در هر بخش مقدار TokenType
ای که باید در این ساختار return
کنید به شما معرفی میشود.(?<match>…)
. این گروه نمایانگر بخشی از کد است که در واقع هایلایت خواهد شد.توجه داشته باشید که هر الگو باید یک گروه تطبیق (Capture Group) نامگذاریشده در Regex داشته باشد که نام آن "match" باشد. هسته هایلایتر محتوایی که درون این گروه تطبیق پیدا کرده است را هایلایت خواهد کرد.
برای مثال، این regex namespace (?<match>[\w\\\\]+)
میگوید که هر خطی که با کلمه namespace
شروع شود باید در نظر گرفته شود، اما تنها بخشی که درون گروه نامگذاریشده (?<match>…)
قرار دارد هایلایت میشود اما خود واژه namespace
چون در گروه match
در نظر گرفته نشده است هایلایت نخواهد شد.
tempestphp/highlight
🔗شما باید پوشه Hashemi
که کدهای مربوط به هایلایتر زبان هاشمی در آن قرار دارد را مطابق با مستندات این زبان و توضیحات گفته شده در بخش زیر کامل و در پایان این بخش آن را آپلود کنید. توجه کنید که هایلایتر شما حتما باید در ساختار زیر عمل کند تا نمره کامل را دریافت کند. همچنین شما تنها مجاز به ویرایش فایلهای موجود هستید و نمیتوانید فایلهای جدیدی را به این بخش اضافه کنید.
HmSinglelineCommentPattern
ساختار کامنتهای تکخطی در زبان برنامهنویسی آقای هاشمی مطابق با مستندات این زبان، مانند بسیاری از زبان های دیگر به صورت زیر میباشد:
شما باید کلاس HmSinglelineCommentPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند کامنتهای تک خطی را با استفاده از TokenType
مربوط به کامنت یعنی COMMENT
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنتهای تکخطی را به درستی هایلایت کند.
HmMultilineCommentPattern
ساختار کامنتهای چندخطی در زبان برنامهنویسی آقای هاشمی مطابق با مستندات این زبان، مانند بسیاری از زبان های دیگر به صورت زیر میباشد:
شما باید کلاس HmMultilineCommentPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند کامنتهای چندخطی را با استفاده از TokenType
مربوط به کامنت یعنی COMMENT
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کامنتهای چندخطی را به درستی هایلایت کند.
HmKeywordPattern
کلمات کلیدی در هر زبان برنامهنویسی، کلماتی هستند که توسط این زبانها برای اعمال مختلف رزرو شدهاند. در زبان برنامهنویسی هاشمی، کلمات ta
، bede
، bebin
، age
، bood
، na?
، zirsakht
جزو کلمات کلیدی به حساب میآیند.
شما باید کلاس HmKeywordPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند کلماتکلیدی را با استفاده از TokenType
مربوط به آن یعنی KEYWORD
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به کلماتکلیدی را به درستی هایلایت کند.
HmBuiltinPattern
توابع پیشساخته در زبان برنامهنویسی آقای هاشمی مانند سایر زبانهای برنامهنویسی، مسئولیت انجام برخی موارد حیاتی از جمله چاپ یا پردازش برخی رشتههای متنی را دارند. در زبان هاشمی توابع پیشساخته به صورت کلمات azinja
، bechap
و jfarzand
میباشند.
شما باید کلاس HmBuiltinPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند توابع پیشساخته را با استفاده از TokenType
مربوط به آن یعنی TYPE
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به توابع پیشساخته را به درستی هایلایت کند.
HmFunctionCallPattern
فراخوانیها و تعریف توابع در زبانبرنامه نویسی هاشمی به شکل زیر میباشد:
jam
در خط اول (هنگام تعریف تابع) و در خط هشتم (در فراخوانی تابع) میباشد.شما باید کلاس HmFunctionCallPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از TokenType
مربوط به آن یعنی PROPERTY
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به فراخوانی و تعریف توابع را به درستی هایلایت کند.
HmNumberPattern
ساختار دیگری که شما باید در این هایلایتر پیادهسازی کنید مربوط به بخش استفاده از اعداد در این زبان میباشد. اعداد میتوانند در بخشهای مختلف کد از جمله در شرطها، در مقداردهی متغیرها و در فراخوانی توابع استفاده شوند. در زبان هاشمی تنها از اعداد صحیح، اعداد اعشاری و نمایش اعداد به صورت نمادگذاری علمی پشتیبانی میشود.
شما باید کلاس HmNumberPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تعریف و فراخوانی توابع را با استفاده از TokenType
مربوط به آن یعنی NUMBER
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از اعداد را به درستی هایلایت کند.
HmOperatorPattern
عملگرها در زبان آقای هاشمی در سه دستهبندی به شکل عملگرهای عددی -+%/*
، عملگرهای منطقی به صورتهای ==
، <=
، >=
، !=
، <
، >
و عملگر انتساب =
باشد. توجه کنید که عملگرهای دو کاراکتری، مثلا ==
باید به صورت یکجا به عنوان یک عملگر در نظر گرفته شود و نه به صورت دو عملگر =
و =
.
شما باید کلاس HmOperatorPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند عملگرهای مختلف را با استفاده از TokenType
مربوط به آن یعنی OPERATOR
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از عملگرها را به درستی هایلایت کند.
HmDoubleQuoteValuePattern
رشتهها در زبان برنامهنویسی آقای هاشمی به صورت DoubleQuote ( " "
) مورد استفاده قرار میگیرند. شما باید هایلایتر این مورد را به صورتی پیادهسازی کنید که محتوای درون این دو علامت نقلقول به صورت درستی هایلایت شوند.
شما باید کلاس HmDoubleQuoteValuePattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند رشتههای مختلف را با استفاده از TokenType
مربوط به آن یعنی VALUE
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشتهها را به درستی هایلایت کند.
HmTripleDoubleQuoteStringPattern
رشتههای چندخطی در زبان برنامهنویسی آقای هاشمی به صورت TripleDoubleQuote ( """ """
) مورد استفاده قرار میگیرند. شما باید هایلایتر این مورد را به صورتی پیادهسازی کنید که محتوای درون این سهتاییهای علامت نقلقول به صورت درستی هایلایت شوند.
شما باید کلاس HmTripleDoubleQuoteStringPattern
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند رشتههای بلند مختلف را با استفاده از TokenType
مربوط به آن یعنی VALUE
رنگی کند.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از رشتههای بلند را به درستی هایلایت کند.
JsonInjection
همانطور که پیشتر در بخش برسی بیشتر کد هایلایتر به تزریقها اشاره کردیم، در زبان برنامهنویسی آقای هاشمی میتوان از Json
در بین کدهای هاشمی به شکل زیر و با استفاده از jfarzand
پیادهسازی کرد:
شما باید کلاس JsonInjection
را به صورت زیر در فایلی با همین نام پیادهسازی کنید تا کد هایلایتر بتواند تزریقهای مختلف Json
را در زبان هاشمی را هایلایت کند. در ساختار تزریقها نیازی به TokenType
نیست و شما باید در ساختار زیر صرفا از هایلایتر از پیش ساخته شدهی Json
درون همین پکیج استفاده کنید.
در نهایت در صورتی که کد شما به درستی کار کند، باید مطابق تصویر زیر بخش مربوط به استفاده از تزریق Json
را به درستی هایلایت کند.
vendor
را ZIP کرده و آپلود کنید.