Amazon Best VPN GoSearch

অনওয়ার্কস ফেভিকন

পেগ - ক্লাউডে অনলাইন

উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটরের মাধ্যমে OnWorks ফ্রি হোস্টিং প্রদানকারীতে পেগ চালান

এটি হল কমান্ড পেগ যা আমাদের একাধিক বিনামূল্যের অনলাইন ওয়ার্কস্টেশন যেমন উবুন্টু অনলাইন, ফেডোরা অনলাইন, উইন্ডোজ অনলাইন এমুলেটর বা MAC OS অনলাইন এমুলেটর ব্যবহার করে OnWorks ফ্রি হোস্টিং প্রদানকারীতে চালানো যেতে পারে।

কার্যক্রম:

NAME এর


পেগ, লেগ - পার্সার জেনারেটর

সাইনোপিসিস


গোঁজ [-এইচভিভি -আউটপুট] [ফাইলের নাম ...]
পা [-এইচভিভি -আউটপুট] [ফাইলের নাম ...]

বর্ণনাঃ


গোঁজ এবং পা রিকার্সিভ-ডিসেন্ট পার্সার তৈরির জন্য টুলস: প্রোগ্রাম যা সম্পাদন করে
টেক্সটে প্যাটার্ন ম্যাচিং। তারা একটি পার্সিং এক্সপ্রেশন গ্রামার (PEG) [ফোর্ড 2004] থেকে প্রক্রিয়া করে
একটি প্রোগ্রাম তৈরি করুন যা সেই ব্যাকরণের আইনি বাক্যকে স্বীকৃতি দেয়। গোঁজ PEGs প্রসেস করে
ফোর্ড দ্বারা বর্ণিত মূল সিনট্যাক্স ব্যবহার করে লিখিত; পা ব্যবহার করে লেখা PEGs প্রসেস করে
সামান্য ভিন্ন সিনট্যাক্স এবং কনভেনশন যা এটিকে আকর্ষণীয় করে তোলার উদ্দেশ্যে করা হয়েছে
সঙ্গে নির্মিত পার্সার জন্য প্রতিস্থাপন আইন(1) এবং yacc(1)। অপছন্দ আইন এবং yacc, গোঁজ এবং পা
সীমাহীন ব্যাকট্র্যাকিং সমর্থন করুন, দ্ব্যর্থতা নিরসন করার উপায় হিসাবে অর্ডারকৃত পছন্দ প্রদান করুন এবং
স্ক্যানিং (লেক্সিক্যাল অ্যানালাইসিস) এবং পার্সিং (সিনট্যাকটিক অ্যানালাইসিস) একত্রিত করতে পারে
কার্যকলাপ.

গোঁজ নির্দিষ্ট পড়া ফাইলের নামs, বা স্ট্যান্ডার্ড ইনপুট যদি না হয় ফাইলের নামs দেওয়া হয়, একটি জন্য
তৈরি করতে পার্সার বর্ণনা করে ব্যাকরণ। গোঁজ তারপর একটি C উৎস ফাইল তৈরি করে
একটি ফাংশন সংজ্ঞায়িত করে yyparse()। এই C উৎস ফাইল অন্তর্ভুক্ত করা যেতে পারে, বা সংকলিত এবং তারপর
একটি ক্লায়েন্ট প্রোগ্রামের সাথে সংযুক্ত। প্রতিবার ক্লায়েন্ট প্রোগ্রাম কল করে yyparse() পার্সার
পার্সিং নিয়ম অনুযায়ী ইনপুট টেক্সট ব্যবহার করে, প্রথম নিয়ম থেকে শুরু করে
ব্যাকরণ yyparse() অ-শূন্য প্রদান করে যদি ইনপুট অনুযায়ী পার্স করা যায়
ব্যাকরণ; ইনপুট পার্স করা না গেলে এটি শূন্য প্রদান করে।

'YY' বা 'YY' উপসর্গটি জেনারেট করা সমস্ত বাহ্যিকভাবে দৃশ্যমান চিহ্নের সাথে যুক্ত করা হয়
পার্সার এটি ক্লায়েন্ট প্রোগ্রামগুলিতে নেমস্পেস দূষণের ঝুঁকি হ্রাস করার উদ্দেশ্যে।
('Y'-এর পছন্দ ঐতিহাসিক; দেখুন আইন(1) এবং yacc(1), উদাহরণস্বরূপ।)

বিকল্প


গোঁজ এবং পা নিম্নলিখিত বিকল্পগুলি প্রদান করুন:

-h উপলব্ধ বিকল্পগুলির একটি সারাংশ প্রিন্ট করে এবং তারপর প্রস্থান করে।

-আউটপুট
ফাইলে জেনারেট করা পার্সার লেখে আউটপুট স্ট্যান্ডার্ড আউটপুটের পরিবর্তে।

-v কাজ করার সময় স্ট্যান্ডার্ড ত্রুটিতে ভার্বোস তথ্য লেখে।

-V স্ট্যান্ডার্ড ত্রুটিতে সংস্করণ তথ্য লিখে তারপর প্রস্থান করে।

A সহজ EXAMPLE টি


অনুসরণ গোঁজ ইনপুট একটি একক নিয়ম (যাকে 'শুরু' বলা হয়) সহ একটি ব্যাকরণ নির্দিষ্ট করে
যখন ইনপুটে "ব্যবহারকারীর নাম" স্ট্রিং থাকে তখন সন্তুষ্ট হন।

শুরু <- "ব্যবহারকারীর নাম"

(উদ্ধৃতি চিহ্নগুলি হল না মিলে যাওয়া লেখার অংশ; তারা একটি আক্ষরিক ইঙ্গিত পরিবেশন
স্ট্রিং মেলাতে হবে।) অন্য কথায়, yyparse() উৎপন্ন সি উৎসে ফিরে আসবে
অ-শূন্য শুধুমাত্র যদি ইনপুট থেকে পরবর্তী আটটি অক্ষর পড়ে "ব্যবহারকারীর নাম" শব্দের বানান।
যদি ইনপুটে অন্য কিছু থাকে, yyparse() শূন্য দেয় এবং কোন ইনপুট হবে না
ক্ষয়প্রাপ্ত. (পরবর্তীতে কল yyparse() এছাড়াও শূন্য ফেরত দেবে, যেহেতু পার্সার
স্ট্রিং "ব্যবহারকারীর নাম" খুঁজছেন কার্যকরভাবে অবরুদ্ধ।) অগ্রগতি নিশ্চিত করতে আমরা একটি যোগ করতে পারি
'স্টার্ট' নিয়মের বিকল্প ধারা যা "ব্যবহারকারীর নাম" হলে যেকোনো একক অক্ষরের সাথে মিলবে
খুঁজে পাওয়া যায় নি.

শুরু <- "ব্যবহারকারীর নাম"
/।

yyparse() এখন সর্বদা নন-জিরো ফেরত দেয় (ইনপুটের একেবারে শেষে ছাড়া)। করতে
কিছু দরকারী আমরা নিয়মে কর্ম যোগ করতে পারেন. এই কর্ম একটি পরে সঞ্চালিত হয়
সম্পূর্ণ মিল পাওয়া যায় (প্রথম নিয়ম থেকে শুরু করে) এবং অনুযায়ী বেছে নেওয়া হয়
ইনপুট মেলাতে ব্যাকরণের মাধ্যমে নেওয়া 'পথ'। (ভাষাবিদরা এই পথটিকে ক
'শব্দ চিহ্নিতকারী'।)

শুরু <- "ব্যবহারকারীর নাম" { printf("%s\n", getlogin()); }
/ < > { putchar(yytext[0]); }

প্রথম লাইনটি পার্সারকে ব্যবহারকারীর লগইন নামটি প্রিন্ট করার নির্দেশ দেয় যখনই এটি দেখে
ইনপুটে "ব্যবহারকারীর নাম"। যদি সেই মিল ব্যর্থ হয়, দ্বিতীয় লাইনটি পার্সারকে ইকো করতে বলে
ইনপুটের পরবর্তী অক্ষরটি স্ট্যান্ডার্ড আউটপুট। আমাদের পার্সার এখন কার্যকরী কাজ করছে
কাজ: এটি ইনপুটটিকে আউটপুটে অনুলিপি করবে, "ইউজারনেম" এর সমস্ত ঘটনা প্রতিস্থাপন করবে
ব্যবহারকারীর অ্যাকাউন্টের নাম।

দ্বিতীয় বিকল্পে যোগ করা কোণ বন্ধনী ('<' এবং '>') নোট করুন। এইগুলো
নিয়মের অর্থের উপর কোন প্রভাব নেই, তবে পাঠ্যকে উপলভ্য করে সীমাবদ্ধ করতে পরিবেশন করুন
ভেরিয়েবলে নিম্নলিখিত কর্ম yytext.

উপরের ব্যাকরণটি ফাইলে বসানো থাকলে username.peg, কমান্ড চলমান

peg -o username.c username.peg

ফাইলে সংশ্লিষ্ট পার্সার সংরক্ষণ করবে username.c. একটি সম্পূর্ণ প্রোগ্রাম তৈরি করতে
এই পার্সারটি একটি সি প্রোগ্রাম দ্বারা নিম্নলিখিত হিসাবে অন্তর্ভুক্ত করা যেতে পারে।

#অন্তর্ভুক্ত /* printf(), putchar() */
#অন্তর্ভুক্ত /* getlogin() */

#ইনক্লুড "username.c" /* yyparse() */

প্রধান প্রধান ()
{
যখন (yyparse()) /* EOF পর্যন্ত পুনরাবৃত্তি করুন */
;
ফিরে 0;
}

PEG ব্যাকরণ


একটি ব্যাকরণ নামকৃত নিয়মের একটি সেট নিয়ে গঠিত।

নাম <- প্যাটার্ন

সার্জারির প্যাটার্ন নিম্নলিখিত এক বা একাধিক উপাদান রয়েছে।

নাম উপাদানটি প্রদত্ত নিয়মে সম্পূর্ণ প্যাটার্নের জন্য দাঁড়িয়েছে নাম.

"অক্ষর"
দ্বিগুণ উদ্ধৃতিতে আবদ্ধ একটি অক্ষর বা স্ট্রিং আক্ষরিকভাবে মিলে যায়। এএনএসআই সি
এস্কেপ সিকোয়েন্স এর মধ্যে স্বীকৃত অক্ষর.

'অক্ষর'
একক উদ্ধৃতিতে আবদ্ধ একটি অক্ষর বা স্ট্রিং উপরের মত আক্ষরিকভাবে মিলে যায়।

[অক্ষর]
বর্গাকার বন্ধনীতে আবদ্ধ অক্ষরের একটি সেট থেকে যেকোনো একক অক্ষরের সাথে মেলে
সেট, পালানোর অক্ষর সহ উপরের হিসাবে স্বীকৃত। যদি সেটটি একটি দিয়ে শুরু হয়
uparrow (^) তারপর সেটটি নেগেটিভ করা হয় (উপাদানটি যেকোনো অক্ষরের সাথে মেলে না মধ্যে
সেট)। একটি ড্যাশ (-) দিয়ে বিভক্ত অক্ষরগুলির যেকোন জোড়ার পরিসরের প্রতিনিধিত্ব করে
প্রথম থেকে দ্বিতীয় অক্ষর, অন্তর্ভুক্ত। একটি একক বর্ণানুক্রমিক অক্ষর
অথবা আন্ডারস্কোর নিম্নলিখিত সেট দ্বারা মিলিত হয়.

[a-zA-Z_]

একইভাবে, নিম্নলিখিত যে কোনো একক অ-সংখ্যার অক্ষরের সাথে মেলে।

[^0-9]

. একটি বিন্দু যে কোনো অক্ষরের সাথে মেলে। মনে রাখবেন যে এটি ব্যর্থ হওয়ার একমাত্র সময় শেষ হয়
ফাইল, যেখানে ম্যাচ করার মতো কোনো অক্ষর নেই।

( প্যাটার্ন )
বন্ধনীগুলিকে গোষ্ঠীবদ্ধ করার জন্য ব্যবহার করা হয় (অপারেটরদের অগ্রাধিকার পরিবর্তন করা
নীচে বর্ণিত).

{ কর্ম }
কোঁকড়া ধনুর্বন্ধনী কর্মের চারপাশে। ক্রিয়াটি নির্বিচারে সি সোর্স কোড হতে হবে
মিল শেষে মৃত্যুদন্ড কার্যকর করা হয়. কর্মের মধ্যে যে কোন ধনুর্বন্ধনী সঠিকভাবে হতে হবে
নেস্টেড যে কোনো ইনপুট পাঠ্য যা কর্মের আগে মেলে এবং কোণ দ্বারা সীমাবদ্ধ
বন্ধনী (নীচে দেখুন) এর বিষয়বস্তু হিসাবে কর্মের মধ্যে উপলব্ধ করা হয়
অক্ষর অ্যারে yytext. এর দৈর্ঘ্য (এতে অক্ষরের সংখ্যা) yytext is
ভেরিয়েবলে উপলব্ধ ইয়লেং. (এই পরিবর্তনশীল নামগুলি ঐতিহাসিক; দেখুন
আইন(1)।

< একটি খোলার কোণ বন্ধনী সর্বদা মেলে (কোনও ইনপুট গ্রহণ না করে) এবং পার্সার ঘটায়
মিলে যাওয়া টেক্সট জমা করা শুরু করতে। এই টেক্সট কর্মের জন্য উপলব্ধ করা হবে
পরিবর্তনশীল yytext.

> একটি ক্লোজিং অ্যাঙ্গেল ব্র্যাকেট সবসময় মেলে (কোনও ইনপুট ব্যবহার না করে) এবং পার্সার ঘটায়
জন্য পাঠ্য জমা বন্ধ করতে yytext.

সর্বোপরি উপাদাননিম্নলিখিত প্রত্যয়গুলির সাথে s ঐচ্ছিক এবং/অথবা পুনরাবৃত্তিযোগ্য করা যেতে পারে:

উপাদান ?
উপাদান ঐচ্ছিক. ইনপুট উপস্থিত হলে, এটি গ্রাস করা হয় এবং ম্যাচ
সফল হয় ইনপুটে উপস্থিত না থাকলে, কোন পাঠ্য গ্রাস করা হয় না এবং ম্যাচটি সফল হয়
যাহাই হউক না কেন।

উপাদান +
উপাদান পুনরাবৃত্তিযোগ্য. ইনপুটে উপস্থিত থাকলে, এর এক বা একাধিক ঘটনা
উপাদান খাওয়া হয় এবং ম্যাচ সফল হয়। যদি কোন ঘটনা না ঘটে উপাদান হয়
ইনপুট উপস্থিত, ম্যাচ ব্যর্থ হয়.

উপাদান *
উপাদানটি ঐচ্ছিক এবং পুনরাবৃত্তিযোগ্য। ইনপুটে উপস্থিত থাকলে, এক বা একাধিক
এর ঘটনা উপাদান খাওয়া হয় এবং ম্যাচ সফল হয়। যদি কোন ঘটনা না ঘটে
উপাদান ইনপুট উপস্থিত, ম্যাচ যাইহোক সফল.

উপরের উপাদান এবং প্রত্যয়গুলিকে পূর্বাভাসে রূপান্তরিত করা যেতে পারে (যা নির্বিচারে মেলে
ইনপুট টেক্সট এবং পরবর্তীতে সফল বা ব্যর্থ ছাড়া যে ইনপুট গ্রাস) সঙ্গে
নিম্নলিখিত উপসর্গ:

& উপাদান
ভবিষ্যদ্বাণী সফল হয় শুধুমাত্র যদি উপাদান মিলে যেতে পারে। ইনপুট টেক্সট স্ক্যান করার সময়
ম্যাচিং উপাদান ইনপুট থেকে গ্রাস করা হয় না এবং এর জন্য উপলব্ধ থাকে
পরবর্তী ম্যাচিং।

! উপাদান
ভবিষ্যদ্বাণী সফল হয় শুধুমাত্র যদি উপাদান মেলানো যাবে না। ইনপুট টেক্সট স্ক্যান করার সময়
ম্যাচিং উপাদান ইনপুট থেকে গ্রাস করা হয় না এবং এর জন্য উপলব্ধ থাকে
পরবর্তী ম্যাচিং। একটি জনপ্রিয় বাণী হল

!.

যা ফাইলের শেষের সাথে মেলে, ইনপুটের শেষ অক্ষরটি ইতিমধ্যেই রয়েছে
গ্রাস করা হয়েছে

'&' predicate এর একটি বিশেষ ফর্ম প্রদান করা হয়েছে:

&{ অভিব্যক্তি }
এই ভবিষ্যদ্বাণীতে সরল সি অভিব্যক্তি (না বিবৃতি) অবিলম্বে মূল্যায়ন করা হয়
যখন পার্সার predicate পৌঁছে। যদি অভিব্যক্তি অ-শূন্য ফলন (সত্য)
'ম্যাচ' সফল হয় এবং পার্সার প্যাটার্নের পরবর্তী উপাদানটির সাথে চলতে থাকে।
যদি অভিব্যক্তি শূন্য (মিথ্যা) ফল দেয় 'ম্যাচ' ব্যর্থ হয় এবং পার্সার ব্যাক আপ করে
ইনপুটের একটি বিকল্প পার্স সন্ধান করুন।

বেশ কয়েকটি উপাদান (উপসর্গ এবং প্রত্যয় সহ বা ছাড়া) a এ একত্রিত করা যেতে পারে ক্রম
একের পর এক লিখে। সম্পূর্ণ ক্রম মেলে শুধুমাত্র যদি প্রতিটি পৃথক
এটির মধ্যে উপাদান বাম থেকে ডানে মেলে।

অল্টারনেশন অপারেটর '/' দ্বারা সিকোয়েন্সগুলিকে বিচ্ছিন্ন বিকল্পগুলিতে বিভক্ত করা যেতে পারে।

ক্রম-1 / ক্রম-2 / ... / ক্রম-N
প্রতিটি ক্রম পর্যায়ক্রমে চেষ্টা করা হয় যতক্ষণ না তাদের মধ্যে একটি মেলে, যে সময়ে মিলছে
সামগ্রিক প্যাটার্ন সফল জন্য. কোনটি সিকোয়েন্স না মিললে ম্যাচ
সামগ্রিক প্যাটার্ন ব্যর্থ হয়.

অবশেষে, পাউন্ড চিহ্ন (#) একটি মন্তব্য (বাদ দেওয়া) উপস্থাপন করে যা শেষ পর্যন্ত চলতে থাকে
লাইনের

উপরের সংক্ষিপ্তসারের জন্য, পার্সার একটি প্যাটার্নের বিপরীতে ইনপুট পাঠ্যের সাথে মিল করার চেষ্টা করে
আক্ষরিক, নাম (অন্যান্য নিয়মের প্রতিনিধিত্ব করে), এবং বিভিন্ন অপারেটর (এরূপে লিখিত) ধারণকারী
উপসর্গ, প্রত্যয়, সিকোয়েন্সিংয়ের জন্য জুক্সটাপজিশন এবং এবং ইনফিক্স বিকল্প অপারেটর) যে
প্যাটার্নের মধ্যে উপাদানগুলি কীভাবে মেলে তা পরিবর্তন করুন। ম্যাচ বাম থেকে তৈরি করা হয়
ডানদিকে, নাম করা উপ-নিয়মের মধ্যে 'অবতরণ' যেমন তারা সম্মুখীন হয়। যদি ম্যাচিং প্রক্রিয়া
ব্যর্থ হয়, পার্সার 'ব্যাক ট্র্যাক' (প্রক্রিয়ায় যথাযথভাবে ইনপুটটিকে 'রিওয়াইন্ডিং') করতে
ব্যাকরণের মাধ্যমে নিকটতম বিকল্প 'পথ' খুঁজুন। অন্য কথায় পার্সার
প্রথম সফলভাবে মিলে যাওয়া পথের জন্য একটি গভীরতা-প্রথম, বাম-থেকে-ডানে অনুসন্ধান করে
নিয়মের মাধ্যমে। যদি পাওয়া যায়, সফল পথ বরাবর ক্রিয়াগুলি কার্যকর করা হয় (এ
অর্ডার তারা সম্মুখীন হয়েছে)।

উল্লেখ্য যে predicates মূল্যায়ন করা হয় অবিলম্বে একটি সফল ম্যাচের জন্য অনুসন্ধানের সময়,
যেহেতু তারা অনুসন্ধানের সাফল্য বা ব্যর্থতায় অবদান রাখে। কর্ম, তবে, হয়
একটি সফল ম্যাচ পাওয়া গেলেই মূল্যায়ন করা হয়।

PEG ব্যাকরণ জন্য PEG ব্যাকরণ


জন্য ব্যাকরণ গোঁজ ব্যাকরণ নীচে দেখানো হয়. এটি উভয়ই ব্যাখ্যা করবে এবং আনুষ্ঠানিক করবে
উপরে বর্ণনা।

ব্যাকরণ <- স্পেসিং সংজ্ঞা + EndOfFile

সংজ্ঞা <- শনাক্তকারী LEFTARROW এক্সপ্রেশন
অভিব্যক্তি <- সিকোয়েন্স ( স্ল্যাশ সিকোয়েন্স)*
ক্রম <- উপসর্গ*
উপসর্গ <- এবং ক্রিয়া
/ (এবং | না)? প্রত্যয়
প্রত্যয় <- প্রাথমিক ( QUERY / STAR / PLUS )?
প্রাথমিক <- শনাক্তকারী !LEFTARROW
/ খোলা অভিব্যক্তি বন্ধ
/ আক্ষরিক
/ ক্লাস
/ ডট
/ কর্ম
/ শুরু
/ শেষ

শনাক্তকারী <- < IdentStart IdentCont* > ব্যবধান
IdentStart <- [a-zA-Z_]
IdentCont <- IdentStart / [0-9]
আক্ষরিক <- ['] < ( !['] চর )* > ['] ব্যবধান
/ ["] < ( !["] চর )* > ["] ব্যবধান
শ্রেণী <- '[' < (!']' পরিসর )* > ']' ব্যবধান
পরিসর <- চর '-' চর/চর
চর <- '\\' [abefnrtv'"\[\]\\]
/ '\\' [0-3][0-7][0-7]
/ '\\' [0-7][0-7]?
/ '\\' '-'
/ !'\\'।
LEFTARROW <- '<-' ব্যবধান
স্ল্যাশ <- '/' ব্যবধান
এবং <- '&' ব্যবধান
না <- '!' ব্যবধান
প্রশ্ন <- '?' ব্যবধান
স্টার <- '*' ব্যবধান
প্লাস <- '+' ব্যবধান
খুলুন <- '(' ব্যবধান
বন্ধ <- ')' ব্যবধান
ডট <- '।' ব্যবধান
ব্যবধান <- ( স্থান / মন্তব্য )*
মন্তব্য <- '#' ( !EndOfLine. )* EndOfLine
স্থান <- ' ' / '\t' / EndOfLine
এন্ডঅফলাইন <- '\r\n' / '\n' / '\r'
EndOfFile <-!.
ক্রিয়া <- '{' < [^}]* > '}' ব্যবধান
শুরু <- '<' ব্যবধান
শেষ <- '>' ব্যবধান

লেগ ব্যাকরণ


পা এর একটি রূপ গোঁজ যে কিছু বৈশিষ্ট্য যোগ করে আইন(1) এবং yacc(1)। এটা থেকে ভিন্ন
গোঁজ নিম্নলিখিত উপায়ে.

%{ পাঠ্য... %}
একটি ঘোষণা বিভাগ যে কোনও জায়গায় উপস্থিত হতে পারে যেখানে একটি নিয়ম সংজ্ঞা প্রত্যাশিত। দ্য
পাঠ '%{' এবং '%}' সীমারেখার মধ্যে উৎপন্ন সি-তে শব্দার্থে অনুলিপি করা হয়
পার্সার কোড আগে কোড যা পার্সার নিজেই প্রয়োগ করে।

নাম = প্যাটার্ন
'অ্যাসাইনমেন্ট' অপারেটর বাম তীর অপারেটর '<-' প্রতিস্থাপন করে।

নিয়ম-নাম
হাইফেনগুলি নিয়মের নামে অক্ষর হিসাবে উপস্থিত হতে পারে। প্রতিটি হাইফেন রূপান্তরিত হয়
জেনারেট করা সি সোর্স কোডে একটি আন্ডারস্কোর। একটি একক একক হাইফেন '-' হল a
আইনি নিয়মের নাম।

- = [ \t\n\r]*
সংখ্যা = [০-৯]+ -
নাম = [a-zA-Z_][a-zA_Z_0-9]* -
l-paren = '(' -
r-paren = ')' -

এই উদাহরণটি দেখায় যে ব্যাকরণ পড়ার সময় কীভাবে উপেক্ষা করা সাদা স্থান স্পষ্ট হতে পারে
এবং এর সাথে যুক্ত প্রতিটি নিয়মের শেষে উদারভাবে স্থাপন করা হলে এখনও বাধাহীন
একটি আভিধানিক উপাদান।

seq-1 | seq-2
বিকল্প অপারেটর হল উল্লম্ব বার '|' ফরোয়ার্ড স্ল্যাশের পরিবর্তে '/'। দ্য
গোঁজ নিয়ম

নাম <- ক্রম-1
/ ক্রম-2
/ ক্রম-3

তাই লেখা হয়

নাম = ক্রম-1
| ক্রম-2
| ক্রম-3
;

in পা (পরবর্তী বর্ণনা অনুযায়ী চূড়ান্ত সেমিকোলন ঐচ্ছিক হওয়ার সাথে)।

মেপুঃ ~ { কর্ম }
একজন পোস্টফিক্স অপারেটর ~{ কর্ম } কোন অভিব্যক্তি পরে স্থাপন করা যেতে পারে এবং আচরণ করবে
একটি স্বাভাবিক কর্মের মত (নির্বিচারী C কোড) ছাড়া এটি শুধুমাত্র যখন আহ্বান করা হয় মেপুঃ
ব্যর্থ হয় এটি অল্টারনেশন এবং ছাড়া অন্য কোন অপারেটরের তুলনায় কম শক্তভাবে আবদ্ধ হয়
সিকোয়েন্সিং, এবং ত্রুটি হ্যান্ডলিং এবং পুনরুদ্ধার কোড সহজতর করার উদ্দেশ্যে
লিখুন মনে রাখবেন যে yytext এবং ইয়লেং এই কর্মের ভিতরে উপলব্ধ নয়, কিন্তু
পয়েন্টার পরিবর্তনশীল yy কোন ব্যবহারকারী-সংজ্ঞায়িত কোড অ্যাক্সেস দিতে উপলব্ধ
পার্সার রাষ্ট্রের সদস্য (নীচে "পার্সারের কাস্টমাইজিং" দেখুন)। এটাও খেয়াল করুন
মেপুঃ সর্বদা একটি একক অভিব্যক্তি; মধ্যে কোনো ব্যর্থতার জন্য একটি ত্রুটি পদক্ষেপ আহ্বান করতে
একটি ক্রম, বন্ধনী অবশ্যই একটি একক ক্রমকে গোষ্ঠীভুক্ত করতে ব্যবহার করতে হবে
অভিব্যক্তি।

নিয়ম = e1 e2 e3 ~{ ত্রুটি("e[12] ঠিক আছে; e3 ব্যর্থ হয়েছে"); }
| ...

নিয়ম = (e1 e2 e3) ~{ ত্রুটি("e[123] এর একটি ব্যর্থ হয়েছে"); }
| ...

প্যাটার্ন ;
একটি সেমিকোলন বিরাম যন্ত্র ঐচ্ছিকভাবে a শেষ করতে পারে প্যাটার্ন.

%% পাঠ্য...
একটি দ্বিগুণ শতাংশ '%%' এর নিয়ম (এবং ঘোষণা) বিভাগকে সমাপ্ত করে
ব্যাকরণ সব পাঠ নিম্নলিখিত '%%' উৎপন্ন C পার্সার কোডে মৌখিকভাবে অনুলিপি করা হয়
পরে পার্সার বাস্তবায়ন কোড।

$$ = মূল্য
একটি উপ-বিধি একটি শব্দার্থক ফেরত দিতে পারে মূল্য এটি বরাদ্দ করে একটি কর্ম থেকে
সিউডো-ভেরিয়েবল '$$'। সমস্ত শব্দার্থিক মান একই ধরনের হতে হবে (যা ডিফল্ট
থেকে 'int')। এই ধরনের একটি ঘোষণা বিভাগে YYSTYPE সংজ্ঞায়িত করে পরিবর্তন করা যেতে পারে।

আইডেন্টিফায়ার:নাম
সাব-রুল থেকে শব্দার্থিক মান ('$$'-এ বরাদ্দ করে) ফিরে এসেছে নাম is
এর সাথে যুক্ত আইডেন্টিফায়ার এবং পরবর্তী কর্মে উল্লেখ করা যেতে পারে।

নীচের ডেস্ক ক্যালকুলেটর উদাহরণটি '$$' এবং ':'-এর ব্যবহার চিত্রিত করে।

লেগ উদাহরণ: A ডেস্ক ক্যালকুলেটর


মধ্যে এক্সটেনশন পা উপরে বর্ণিত উপযোগী পার্সার এবং মূল্যায়নকারীদের (সহ
ঘোষণা, ব্যাকরণের নিয়ম এবং সমর্থনকারী সি ফাংশন যেমন 'প্রধান') এর মধ্যে রাখতে হবে
একটি একক উৎস ফাইল। এটি ব্যাখ্যা করার জন্য আমরা একটি সাধারণ ডেস্ক ক্যালকুলেটর দেখাই যা সমর্থন করে
চারটি সাধারণ গাণিতিক অপারেটর এবং নামযুক্ত ভেরিয়েবল। এর মধ্যবর্তী ফলাফল
গাণিতিক মূল্যায়ন একটি অন্তর্নিহিত স্ট্যাকের উপর তাদের হিসাবে ফেরত দিয়ে জমা করা হবে
উপ-বিধি থেকে শব্দার্থিক মান।

%{
#অন্তর্ভুক্ত /* printf() */
#অন্তর্ভুক্ত /* atoi() */
int vars[26];
%}

Stmt = - e: Expr EOL { printf("%d\n", e); }
| ( !EOL। )* EOL { printf("error\n"); }

এক্সপ্রেস = i:আইডি অ্যাসাইন s:সমষ্টি { $$ = vars[i] = s; }
| s:সমষ্টি { $$ = s; }

যোগফল = l: পণ্য
( প্লাস r: পণ্য { l += r; }
| বিয়োগ r: পণ্য { l -= r; }
)* { $$ = l; }

পণ্য = l:মান
( টাইমস r:মান { l *= r; }
| ডিভাইড r: মান { l /= r; }
)* { $$ = l; }

মান = i:NUMBER { $$ = atoi(yytext); }
| i:ID !অ্যাসাইন { $$ = vars[i]; }
| খুলুন i:Expr ক্লোজ { $$ = i; }

NUMBER = < [0-9]+ > - { $$ = atoi(yytext); }
আইডি = < [az] > - { $$ = yytext[0] - 'a'; }
অ্যাসাইন = '=' -
প্লাস = '+' -
বিয়োগ = '-' -
টাইমস = '*' -
ডিভাইড = '/' -
OPEN = '(' -
CLOSE = ')' -

- = [ \t]*
EOL = '\n' | '\r\n' | '\r' | ';'

%%

প্রধান প্রধান ()
{
যখন (yyparse())
;
ফিরে 0;
}

লেগ ব্যাকরণ জন্য লেগ ব্যাকরণ


জন্য ব্যাকরণ পা ব্যাকরণ নীচে দেখানো হয়. এটি উভয়ই ব্যাখ্যা করবে এবং আনুষ্ঠানিক করবে
উপরে বর্ণনা।

ব্যাকরণ = -
( ঘোষণা | সংজ্ঞা )+
লতা? ফাইলের শেষ

ঘোষণা = '%{' < ( !'%}'। )* > RPERCENT

ট্রেলার = '%%' < .* >

সংজ্ঞা = শনাক্তকারী সমান অভিব্যক্তি সেমিকোলন?

অভিব্যক্তি = ক্রম (বার ক্রম)*

ক্রম = ত্রুটি+

ত্রুটি = উপসর্গ ( TILDE কর্ম)?

উপসর্গ = এবং কর্ম
| (এবং | না)? প্রত্যয়

প্রত্যয় = প্রাথমিক ( QUERY | স্টার | প্লাস )?

প্রাথমিক = শনাক্তকারী কোলন শনাক্তকারী !সমান
| শনাক্তকারী!সমান
| খোলা অভিব্যক্তি বন্ধ
| আক্ষরিক
| ক্লাস
| ডট
| কর্ম
| শুরু
| শেষ

শনাক্তকারী = < [-a-zA-Z_][-a-zA-Z_0-9]* > -

আক্ষরিক = ['] < ( !['] চর )* > ['] -
| ["] < ( !["] চর )* > ["] -

ক্লাস = '[' < (!']' পরিসর )* > ']' -

range = char '-' char | চর

char = '\\' [abefnrtv'"\[\]\\]
| '\\' [0-3][0-7][0-7]
| '\\' [0-7][0-7]?
| !'\\'।

কর্ম = '{' < ধনুর্বন্ধনী * > '}' -

ধনুর্বন্ধনী = '{' ধনুর্বন্ধনী* '}'
| !'}'।

সমান = '=' -
কোলন = ':' -
সেমিকোলন = ';' -
বার = '|' -
AND = '&' -
না = '!' -
প্রশ্ন = '?' -
স্টার = '*' -
প্লাস = '+' -
OPEN = '(' -
CLOSE = ')' -
DOT = '।' -
BEGIN = '<' -
শেষ = '>' -
TILDE = '~' -
RPERCENT = '%}' -

- = (স্পেস | মন্তব্য)*
স্থান = '' | '\t' | বাক্যের শেষে
মন্তব্য = '#' ( ! লাইনের শেষ। )* লাইনের শেষ
লাইনের শেষ = '\r\n' | '\n' | '\r'
ফাইলের শেষ =!

কাস্টমাইজিং দ্য পার্সার


নিম্নোক্ত চিহ্নগুলিকে জেনারেট করা পরিবর্তন করতে ঘোষণা বিভাগে পুনরায় সংজ্ঞায়িত করা যেতে পারে
পার্সার কোড।

YYSTYPE
শব্দার্থিক মানের প্রকার। ছদ্ম-ভেরিয়েবল '$$' এবং শনাক্তকারী 'বাউন্ড'
কোলন অপারেটর ':' এর সাথে নিয়মের ফলাফলগুলিকে ঘোষিত হিসাবে বিবেচনা করা উচিত
এই ধরনের আছে. ডিফল্ট মান হল 'int'।

YYPARSE
পার্সারে প্রধান এন্ট্রি পয়েন্টের নাম। ডিফল্ট মান হল 'yyparse'।

YYPARSEFROM
পার্সারে একটি বিকল্প এন্ট্রি পয়েন্টের নাম। এই ফাংশন একটি আশা
যুক্তি: নিয়মের সাথে সম্পর্কিত ফাংশন যেখান থেকে একটি মিল অনুসন্ধান করা হয়
শুরু করা উচিত ডিফল্ট হল 'yyparsefrom'। মনে রাখবেন yyparse() হিসাবে সংজ্ঞায়িত করা হয়েছে

int yyparse() { প্রত্যাবর্তন yyparsefrom(yy_foo); }

যেখানে 'foo' ব্যাকরণের প্রথম নিয়মের নাম।

YY_INPUT(বুফ, ফল, max_size)
আরও ইনপুট পাঠ্য পেতে এই ম্যাক্রোটি পার্সার দ্বারা আহ্বান করা হয়েছে। বুফ একটি নির্দেশ করে
মেমরির এলাকা যা সর্বাধিক ধরে রাখতে পারে max_size চরিত্র. ম্যাক্রো কপি করা উচিত
ইনপুট টেক্সট বুফ এবং তারপর পূর্ণসংখ্যা ভেরিয়েবল বরাদ্দ করুন ফল নির্দেশ করতে
কপি করা অক্ষরের সংখ্যা। যদি আর কোন ইনপুট পাওয়া না যায়, ম্যাক্রো উচিত
0 কে বরাদ্দ করুন ফল. ডিফল্টরূপে, YY_INPUT ম্যাক্রোকে নিম্নরূপ সংজ্ঞায়িত করা হয়েছে।

# YY_INPUT(বাফ, ফলাফল, সর্বোচ্চ_আকার) সংজ্ঞায়িত করুন \
{ \
int yyc = getchar(); \
ফলাফল = (EOF == yyc)? 0 : (*(buf)= yyc, 1); \
}

মনে রাখবেন যদি YY_CTX_LOCAL সংজ্ঞায়িত করা হয় (নীচে দেখুন) তাহলে একটি অতিরিক্ত প্রথম আর্গুমেন্ট,
পার্সার প্রসঙ্গ ধারণ করে, YY_INPUT-এ পাঠানো হয়।

YY_DEBUG
যদি এই চিহ্নগুলি সংজ্ঞায়িত করা হয় তবে অতিরিক্ত কোডটি পার্সারে অন্তর্ভুক্ত করা হবে
পার্সার থাকাকালীন স্ট্যান্ডার্ড ত্রুটির জন্য প্রচুর পরিমাণে রহস্যময় তথ্য প্রিন্ট করে
চলছে.

YY_BEGIN
এই ম্যাক্রোটি ইনপুট পাঠ্যের শুরু চিহ্নিত করতে আহ্বান করা হয়েছে যা উপলব্ধ করা হবে
'yytext' হিসাবে কর্মে। এটি ব্যাকরণে '<' এর ঘটনার সাথে মিলে যায়।
এগুলি ভবিষ্যদ্বাণীতে রূপান্তরিত হয় যা সফল হবে বলে আশা করা হচ্ছে। ডিফল্ট
সংজ্ঞা

# YY_BEGIN সংজ্ঞায়িত করুন (yybegin= yypos, 1)

তাই বর্তমান ইনপুট অবস্থান সংরক্ষণ করে এবং ফলাফল হিসাবে 1 ('সত্য') প্রদান করে
predicate

YY_END এই ম্যাক্রোগুলি ব্যাকরণে '>'-এর সাথে মিলে যায়। আবার, এটি একটি predicate তাই
ডিফল্ট সংজ্ঞা 'সফল হওয়ার' আগে ইনপুট অবস্থান সংরক্ষণ করে।

# YY_END সংজ্ঞায়িত করুন (yyend= yypos, 1)

YY_PARSE(T)
এই ম্যাক্রো পার্সার এন্ট্রি পয়েন্ট (yyparse এবং yyparsefrom) টাইপের বলে ঘোষণা করে
T. ডিফল্ট সংজ্ঞা

# YY_PARSE(T) T সংজ্ঞায়িত করুন

বিশ্বব্যাপী দৃশ্যমানতার সাথে yyparse() এবং yyparsefrom() ছেড়ে যায়। যদি তাদের করা উচিত নয়
অন্যান্য সোর্স ফাইলগুলিতে বাহ্যিকভাবে দৃশ্যমান, এই ম্যাক্রোটিকে ঘোষণা করার জন্য পুনরায় সংজ্ঞায়িত করা যেতে পারে
তাদের 'অচল'।

# YY_PARSE(T) স্ট্যাটিক T সংজ্ঞায়িত করুন

YY_CTX_LOCAL
যদি এই চিহ্নটি একটি জেনারেটেড পার্সার সংকলনের সময় সংজ্ঞায়িত করা হয় তাহলে বিশ্বব্যাপী
পার্সার স্টেটকে 'yycontext' টাইপের একটি কাঠামোতে রাখা হবে যা ঘোষণা করা যেতে পারে
একটি স্থানীয় পরিবর্তনশীল হিসাবে। এটি পার্সারের একাধিক দৃষ্টান্তকে সহাবস্থান করতে এবং করতে অনুমতি দেয়
থ্রেড-নিরাপদ থাকুন। পার্সিং ফাংশন yyparse() একটি প্রথম আশা ঘোষণা করা হবে
'yycontext *' টাইপের আর্গুমেন্ট, গ্লোবাল ধরে রাখা কাঠামোর একটি উদাহরণ
পার্সার জন্য রাষ্ট্র. এই দৃষ্টান্তটি অবশ্যই বরাদ্দ করা উচিত এবং শূন্য থেকে শুরু করা উচিত
ক্লায়েন্ট একটি তুচ্ছ কিন্তু সম্পূর্ণ উদাহরণ নিম্নরূপ।

#অন্তর্ভুক্ত

#YY_CTX_LOCAL সংজ্ঞায়িত করুন

# "the-generated-parser.peg.c" অন্তর্ভুক্ত করুন

প্রধান প্রধান ()
{
yycontext ctx;
memset(&ctx, 0, sizeof(yycontext));
যখন (Yyparse(&ctx));
ফিরে 0;
}

মনে রাখবেন যে যদি এই চিহ্নটি অনির্ধারিত হয় তবে সংকলিত পার্সারটি স্ট্যাটিকভাবে থাকবে
এর বৈশ্বিক অবস্থা বরাদ্দ করুন এবং পুনরায় প্রবেশকারী বা থ্রেড-সুরক্ষিত হবে না। এছাড়াও নোট করুন
যে পার্সার yycontext স্ট্রাকচারটি প্রথমবার স্বয়ংক্রিয়ভাবে শুরু হয়
yyparse() বলা হয়; এই কাঠামো অবশ্যই তাই সঠিকভাবে শূন্য থেকে শুরু করা হবে
প্রথম কল করার আগে yyparse()।

YY_CTX_MEMBERS
যদি YY_CTX_LOCAL সংজ্ঞায়িত করা হয় (উপরে দেখুন) তাহলে ম্যাক্রো YY_CTX_MEMBERS সংজ্ঞায়িত করা যেতে পারে
ক্লায়েন্ট পছন্দ করে এমন কোনো অতিরিক্ত সদস্য ক্ষেত্রের ঘোষণায় প্রসারিত করতে
'yycontext' গঠন প্রকারের ঘোষণায় অন্তর্ভুক্ত। এই অতিরিক্ত
সদস্যদের অন্যথায় জেনারেট করা পার্সার দ্বারা উপেক্ষা করা হয়। 'yycontext' এর উদাহরণ
বর্তমান-সক্রিয় পার্সারের সাথে যুক্ত হিসাবে কর্মের মধ্যে উপলব্ধ
পয়েন্টার পরিবর্তনশীল yy.

YY_BUFFER_SIZE
টেক্সট বাফারের প্রাথমিক আকার, বাইটে। ডিফল্ট হল 1024 এবং বাফার
পার্সিংয়ের সময় চাহিদা মেটাতে প্রয়োজন হলে আকার দ্বিগুণ করা হয়। একটি দরখাস্ত
যেটি সাধারণত অনেক লম্বা স্ট্রিং পার্স করে অপ্রয়োজনীয় এড়াতে এটি বাড়াতে পারে
বাফার পুনর্বন্টন.

YY_STACK_SIZE
ভেরিয়েবল এবং অ্যাকশন স্ট্যাকের প্রাথমিক আকার। ডিফল্ট হল 128, যা
পার্সিংয়ের সময় চাহিদা মেটাতে যখনই প্রয়োজন তখন দ্বিগুণ। যে অ্যাপ্লিকেশন আছে
অনেক স্থানীয় ভেরিয়েবল সহ গভীর কল স্ট্যাক, বা যে a এর পরে অনেকগুলি ক্রিয়া সম্পাদন করে
একক সফল ম্যাচ, অপ্রয়োজনীয় বাফার এড়াতে এটি বাড়াতে পারে
পুনর্বন্টন

YY_MALLOC(YY, আকার)
সমস্ত পার্সার-সম্পর্কিত স্টোরেজের জন্য মেমরি বরাদ্দকারী। পরামিতি হল
বর্তমান yycontext গঠন এবং বরাদ্দ করার জন্য বাইটের সংখ্যা। ডিফল্ট
সংজ্ঞা হল: malloc(আকার)

YY_REALLOC(YY, PTR, আকার)
গতিশীলভাবে বেড়ে ওঠা স্টোরেজের জন্য মেমরি রিঅ্যালোকেটার (যেমন টেক্সট বাফার এবং
পরিবর্তনশীল স্ট্যাক)। পরামিতি হল বর্তমান yy কনটেক্সট গঠন,
পূর্বে-বরাদ্দকৃত সঞ্চয়স্থান, এবং সেই সঞ্চয়স্থানে বাইটের সংখ্যা
বড় হওয়া ডিফল্ট সংজ্ঞা হল: realloc(PTR, আকার)

YY_FREE(YY, PTR)
মেমরি ডিলোকেটার। পরামিতি হল বর্তমান yycontext গঠন এবং
ডিললোকেট করার জন্য স্টোরেজ। ডিফল্ট সংজ্ঞা হল: বিনামূল্যে(PTR)

YYRELEASE
ফাংশনের নাম যা একটি yycontext স্ট্রাকচার দ্বারা ধারণকৃত সমস্ত সংস্থান প্রকাশ করে।
ডিফল্ট মান হল 'yyrelease'।

নিম্নলিখিত ভেরিয়েবলগুলিকে কর্মের মধ্যে উল্লেখ করা যেতে পারে।

গৃহস্থালির কাজ *yybuf
এই পরিবর্তনশীলটি পার্সারের ইনপুট বাফারের দিকে নির্দেশ করে যা ইনপুট টেক্সট সংরক্ষণ করতে ব্যবহৃত হয়
এখনো মেলেনি।

কোন int yypos
এটি পরের অক্ষরের অফসেট (yybuf-এ) ম্যাচ করা এবং ব্যবহার করা।

গৃহস্থালির কাজ *yytext
'<' এবং '>' দ্বারা সীমাবদ্ধ করা সাম্প্রতিকতম মিলে যাওয়া পাঠ্য এই ভেরিয়েবলে সংরক্ষণ করা হয়েছে।

কোন int ইয়লেং
এই ভেরিয়েবলটি 'yytext'-এ অক্ষরের সংখ্যা নির্দেশ করে।

yy প্রসঙ্গ *yy
এই পরিবর্তনশীলটি এর সাথে যুক্ত 'yycontext'-এর উদাহরণকে নির্দেশ করে
বর্তমানে সক্রিয় পার্সার।

যে প্রোগ্রামগুলি একটি পার্সারের সাথে যুক্ত সমস্ত সংস্থান প্রকাশ করতে চায় তারা ব্যবহার করতে পারে
নিম্নলিখিত ফাংশন।

yyrelease(yycontext*yy)
এর সাথে সম্পর্কিত সমস্ত পার্সার-বরাদ্দ স্টোরেজ ফেরত দেয় yy সিস্টেমে স্টোরেজ
পরবর্তী কলে পুনরায় বরাদ্দ করা হবে yyparse()।

মনে রাখবেন যে yy কনটেক্সট স্ট্রাকচারের জন্য স্টোরেজ নিজেই কখনই বরাদ্দ বা পুনরুদ্ধার করা হয় না
অন্তর্নিহিতভাবে অ্যাপ্লিকেশনটিকে অবশ্যই এই কাঠামোগুলি স্বয়ংক্রিয় স্টোরেজ বা ব্যবহারে বরাদ্দ করতে হবে
কলোক() এবং বিনামূল্যে() তাদের সুস্পষ্টভাবে পরিচালনা করতে। নিম্নলিখিত বিভাগে উদাহরণ
সম্পদ ব্যবস্থাপনার একটি পদ্ধতি প্রদর্শন করে।

লেগ উদাহরণ: প্রসারিত দ্য পার্সার্স প্রেক্ষাপট


সার্জারির yy অ্যাকশনে পাস করা ভেরিয়েবলে পার্সারের অবস্থা এবং অতিরিক্ত যেকোনও থাকে
YY_CTX_MEMBERS দ্বারা সংজ্ঞায়িত ক্ষেত্র। থিসিস ক্ষেত্রগুলি অ্যাপ্লিকেশন-নির্দিষ্ট সংরক্ষণ করতে ব্যবহার করা যেতে পারে
তথ্য যা একটি নির্দিষ্ট কলের জন্য বিশ্বব্যাপী yyparse()। একটি তুচ্ছ কিন্তু সম্পূর্ণ পা
উদাহরণ অনুসরণ করে যেখানে yy কনটেক্সট গঠন a দিয়ে প্রসারিত হয় গণনা সংখ্যার
এখন পর্যন্ত ইনপুটে দেখা নতুন লাইনের অক্ষর (ব্যাকরণ অন্যথায় গ্রাস করে এবং উপেক্ষা করে
সম্পূর্ণ ইনপুট)। এর আহ্বানকারী yyparse() ব্যবহারসমূহ গণনা এর লাইন সংখ্যা প্রিন্ট করতে
ইনপুট যে পড়া হয়েছে.

%{
# YY_CTX_LOCAL 1 সংজ্ঞায়িত করুন
# YY_CTX_MEMBERS সংজ্ঞায়িত করুন \
int গণনা;
%}

চর = ('\n' | '\r\n' | '\r') { yy->গণনা++ }
| .

%%

#অন্তর্ভুক্ত
#অন্তর্ভুক্ত

প্রধান প্রধান ()
{
/* স্বয়ংক্রিয় সঞ্চয়স্থানে একটি স্থানীয় পার্সার প্রসঙ্গ তৈরি করুন */
yy প্রসঙ্গে yy;
/* প্রসঙ্গ *অবশ্যই* প্রথম ব্যবহারের আগে শূন্য থেকে শুরু করতে হবে*/
memset(&yy, 0, sizeof(yy));

যখন (Yparse(&yy))
;
printf("%d newlines\n", yy.count);

/* প্রসঙ্গের সাথে যুক্ত সমস্ত সংস্থান প্রকাশ করুন */
yyrelease(&yy);

ফিরে 0;
}

কারণ নির্ণয়


গোঁজ এবং পা একটি ব্যাকরণকে পার্সারে রূপান্তর করার সময় নিম্নলিখিত শর্তগুলি সম্পর্কে সতর্ক করুন৷

বাক্য গঠন ভুল
ইনপুট ব্যাকরণ কিছু উপায়ে বিকৃত ছিল. ত্রুটি বার্তা অন্তর্ভুক্ত হবে
টেক্সট প্রায়ই মিলবে (প্রায়শই এর প্রকৃত অবস্থান থেকে একটি বিশাল পরিমাণ ব্যাক আপ করা হয়
ত্রুটি) এবং অতি সম্প্রতি বিবেচিত অক্ষরের লাইন সংখ্যা (যা
প্রায়শই সমস্যার আসল অবস্থান)।

নিয়ম 'ফু' ব্যবহৃত কিন্তু না সংজ্ঞায়িত
ব্যাকরণটি 'foo' নামের একটি নিয়মকে উল্লেখ করেছে কিন্তু এর কোনো সংজ্ঞা দেওয়া হয়নি।
জেনারেট করা পার্সার ব্যবহার করার চেষ্টা করলে লিঙ্কার থেকে ত্রুটি হতে পারে
অনুপস্থিত নিয়মের সাথে যুক্ত অনির্ধারিত চিহ্নের কারণে।

নিয়ম 'ফু' সংজ্ঞায়িত কিন্তু না ব্যবহৃত
ব্যাকরণ 'foo' নামে একটি নিয়ম সংজ্ঞায়িত করেছে এবং তারপরে এটি উপেক্ষা করেছে। সংশ্লিষ্ট কোড
নিয়মের সাথে জেনারেট করা পার্সারে অন্তর্ভুক্ত করা হয়েছে যা অন্য সব ক্ষেত্রেই হবে
স্বাস্থ্যবান হও.

সম্ভব অসীম বাম পুনরাবৃত্তির in নিয়ম 'ফু'
ব্যাকরণের মাধ্যমে অন্তত একটি পথ বিদ্যমান যা 'foo' নিয়ম থেকে চলে
কোনো ইনপুট ব্যবহার না করেই একই নিয়মে ফিরে যান (এর পুনরাবৃত্তিমূলক আহ্বান)।

বাম পুনরাবৃত্তি, বিশেষ করে যা স্ট্যান্ডার্ড নথিতে পাওয়া যায়, প্রায়ই 'সরাসরি' এবং
তুচ্ছ পুনরাবৃত্তি বোঝায়।

# (6.7.6)
direct-abstract-declarator =
LPAREN বিমূর্ত-ঘোষনাকারী RPAREN
| প্রত্যক্ষ-বিমূর্ত-ঘোষক? LBRACKET assign-expr? আরব্র্যাকেট
| প্রত্যক্ষ-বিমূর্ত-ঘোষক? LBRACKET স্টার RBRACKET
| প্রত্যক্ষ-বিমূর্ত-ঘোষক? LPAREN প্যারাম-টাইপ-তালিকা? RPAREN

নিম্নলিখিত প্যাটার্নের অংশগুলিকে রূপান্তর করে পুনরাবৃত্তিটি সহজেই নির্মূল করা যেতে পারে
একটি পুনরাবৃত্তিযোগ্য প্রত্যয় মধ্যে recursion.

# (6.7.6)
direct-abstract-declarator =
direct-abstract-declarator-head?
প্রত্যক্ষ-বিমূর্ত-ঘোষনাকারী-পুচ্ছ*

direct-abstract-declarator-head =
LPAREN বিমূর্ত-ঘোষনাকারী RPAREN

direct-abstract-declarator-tail =
LBRACKET assign-expr? আরব্র্যাকেট
| LBRACKET স্টার RBRACKET
| LPAREN প্যারাম-টাইপ-তালিকা? RPAREN

সতর্কতা


একটি পার্সার যে খালি ইনপুট উইল গ্রহণ করে সর্বদা সফল নিম্নলিখিত উদাহরণ বিবেচনা করুন,
একটি PEG-ভিত্তিক পার্সার লেখার প্রথম প্রচেষ্টার মতো নয়:

প্রোগ্রাম = অভিব্যক্তি*
অভিব্যক্তি = "যাই হোক"
%%
int প্রধান () {
যখন (yyparse())
puts("সফল!");
ফিরে 0;
}

এই প্রোগ্রামটি চিরতরে লুপ হয়ে যায়, stdin-এ যাই (যদি থাকে) ইনপুট দেওয়া হোক না কেন। অনেক
সংশোধন করা সম্ভব, সবচেয়ে সহজ হচ্ছে জোর দেওয়া যে পার্সার সবসময় কিছু খায়
অ-খালি ইনপুট। প্রথম লাইনে পরিবর্তন করা হচ্ছে

প্রোগ্রাম = এক্সপ্রেশন+

এটি সম্পন্ন করে। যদি পার্সার সম্পূর্ণ ইনপুট গ্রহণ করবে বলে আশা করা হয়, তাহলে স্পষ্টভাবে
ফাইলের শেষের প্রয়োজনের জন্যও অত্যন্ত সুপারিশ করা হয়:

প্রোগ্রাম = এক্সপ্রেশন+!।

এটি কাজ করে কারণ পার্সার শুধুমাত্র কোনো অক্ষরকে ("!" predicate) মেলাতে ব্যর্থ হবে
("।" অভিব্যক্তি) যখন এটি ইনপুটের শেষের বাইরে পড়ার চেষ্টা করে।

onworks.net পরিষেবা ব্যবহার করে অনলাইন পেগ ব্যবহার করুন


বিনামূল্যে সার্ভার এবং ওয়ার্কস্টেশন

উইন্ডোজ এবং লিনাক্স অ্যাপ ডাউনলোড করুন

লিনাক্স কমান্ডগুলি

Ad




×
ভি .আই. পি  বিজ্ঞাপন
❤️এখানে কেনাকাটা করুন, বুক করুন, অথবা কিনুন — বিনামূল্যে, পরিষেবাগুলি বিনামূল্যে রাখতে সাহায্য করে।