পার্সারের জন্য আমি কীভাবে একটি ব্যাকরণ নির্দিষ্ট করব?


12

আমি বহু বছর ধরে প্রোগ্রামিং করে আসছি, তবে একটি কাজ যা এখনও আমাকে দীর্ঘমেয়াদী লাগে তা পার্সারের জন্য একটি ব্যাকরণ নির্দিষ্ট করা এবং এই অতিরিক্ত প্রচেষ্টা করার পরেও আমি কখনই নিশ্চিত হতে পারি না যে আমি যে ব্যাকরণটি নিয়ে এসেছি তা ভাল ( "ভাল" এর যেকোন যুক্তিসঙ্গত পরিমাপের দ্বারা)।

ব্যাকরণ নির্দিষ্ট করার প্রক্রিয়াটি স্বয়ংক্রিয়করণের জন্য অ্যালগরিদম রয়েছে বলে আমি আশা করি না, তবে আমি আশা করি যে সমস্যাটি গঠনের এমন কিছু উপায় রয়েছে যা আমার বর্তমান পদ্ধতির অনুমান এবং বিচার-এবং-ত্রুটির অনেকাংশকে সরিয়ে দেয়।

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

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

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

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


1
আপনার প্রকৃত সমস্যার দিকে মনোনিবেশ করতে আমি আপনার প্রশ্নটি কিছুটা সম্পাদনা করেছি। এই সাইটটি ঠিক এমন এক জায়গার যেখানে আপনি ব্যাকরণ এবং পার্সার সম্পর্কে আপনার প্রশ্ন জিজ্ঞাসা করতে এবং বিশেষজ্ঞের উত্তর পেতে পারেন। যদি দেখার মতো বাহ্যিক সংস্থান থাকে তবে তারা উত্তরগুলিতে স্বাভাবিকভাবে উত্থিত হবে যা সরাসরি আপনাকে সহায়তা করে।
অ্যাডাম লিয়ার

8
@ কেজো এটি দুর্ভাগ্যজনক। আপনি যা যা জিজ্ঞাসা করছেন সেগুলি যদি রেফারেন্সের তালিকা হয় তবে আপনি স্ট্যাক এক্সচেঞ্জকে এর সম্পূর্ণ সম্ভাবনার সাথে ব্যবহার করছেন না। আপনার মেটা-সমস্যাটি সাইটটিকে উদ্দেশ্য হিসাবে ব্যবহার করছে না। তালিকা প্রশ্নগুলি স্ট্যাক এক্সচেঞ্জে প্রায় সর্বজনীন নিরুৎসাহিত করা হয় কারণ তারা প্রশ্নোত্তর মডেলটির খুব ভাল মানায় না। আইটেম, ধারণা বা মতামত নয়, এমন উত্তরগুলির প্রশ্ন জিজ্ঞাসার দিকে আপনি আপনার মানসিকতাকে সরিয়ে দেওয়ার পরামর্শ দিচ্ছি ।
অ্যাডাম লিয়ার

3
@ কেজো এটি অবশ্যই একটি প্রশ্ন, তবে স্ট্যাক এক্সচেঞ্জে জিজ্ঞাসা করার সঠিক প্রশ্ন নয় । রেফারেন্সের তালিকা তৈরি করতে এসই এখানে নেই। এটি এখানে রেফারেন্স হতে পারে । আরও বিশদ ব্যাখ্যার জন্য দয়া করে আমার মন্তব্যে লিঙ্কিত মেটা পোস্টটি পড়ুন
অ্যাডাম লিয়ার

5
@ কেজো: দয়া করে নিরুৎসাহিত হবেন না! আন্না সম্পাদনাগুলি আপনার প্রশ্নের মূল এবং হৃদয় বজায় রেখেছে এবং তিনি আপনাকে প্রোগ্রামার্স.এসইতে আশা করি এমন ফর্মটি আরও তৈরি করে আপনাকে সহায়তা করেছে। আপনি যে সুনির্দিষ্ট উল্লেখ খুঁজছেন তা আমি জানি না, তবে একটি উত্তর দিতে সক্ষম হয়েছি। [ওটো, আমি যদি এই জাতীয় কোনও রেফারেন্স জানতাম তবে অবশ্যই আমি এটি অন্তর্ভুক্ত করতাম।] আমরা আমার মতো আরও উত্তর উত্সাহিত করতে চাই কারণ এই নির্দিষ্ট ক্ষেত্রে, আমি বিশ্বাস করি না যে আপনি যা খুঁজছেন তার কোনও রেফারেন্স আছে, ঠিক অন্যের সাথে কথা বলার অভিজ্ঞতা।
ম্যাকনিল

4
@ কেজো আমি আন্না সম্পাদনাগুলিতে ফিরে এসেছি এবং বইয়ের সুপারিশগুলির জন্য আমাদের গাইডেন্সির উপর ভিত্তি করে একটি প্রচলিত রেফারেন্সের জন্য একটি নির্দিষ্ট কলটি সংযুক্ত করার চেষ্টা করেছি : উত্তরের উত্তরগুলিতে প্রচুর ভাল তথ্য রয়েছে, এবং এগুলির সুযোগকে ফাঁক করে অকার্যকর করার জন্য শুধুমাত্র একটি বই সন্ধানের বিষয়ে প্রশ্ন হ'ল অপচয় হবে। এখন যদি আমরা সকলেই এডিট ওয়ারিংটি বন্ধ করে দিতে পারি তবে তা দুর্দান্ত।

উত্তর:


12

নমুনা ফাইলগুলি থেকে আপনাকে সেই উদাহরণগুলি থেকে আপনি কতটা সাধারণ করতে চান তার উপর ভিত্তি করে আপনাকে সিদ্ধান্ত নিতে হবে। ধরুন আপনার কাছে নিম্নলিখিত তিনটি নমুনা রয়েছে: (প্রতিটি পৃথক পৃথক ফাইল)

f() {}
f(a,b) {b+a}
int x = 5;

আপনি তুচ্ছভাবে দুটি ব্যাকরণ নির্দিষ্ট করতে পারেন যা এই নমুনাগুলি গ্রহণ করবে:

তুচ্ছ ব্যাকরণ এক:

start ::= f() {} | f(a,b) {b+a} | int x = 5;

তুচ্ছ ব্যাকরণ দুটি:

start ::= tokens
tokens ::= token tokens | <empty>
token ::= identifier | literal | { | } | ( | ) | , | + | = | ;

প্রথমটি তুচ্ছ কারণ এটি কেবলমাত্র তিনটি নমুনা গ্রহণ করে। দ্বিতীয়টি তুচ্ছ কারণ এটি সম্ভবত এমন সমস্ত টোকেন ধরণের ব্যবহার করতে পারে এমন সমস্ত কিছু গ্রহণ করে । [এই আলোচনার জন্য আমি ধরে নিচ্ছি যে আপনি টোকেনাইজার ডিজাইনের বিষয়ে খুব বেশি উদ্বিগ্ন নন: সনাক্তকারী, সংখ্যা এবং বিরামচিহ্নগুলি আপনার টোকেন হিসাবে ধরে নেওয়া সহজ, এবং আপনি যে কোনও স্ক্রিপ্টিং ভাষা থেকে কোনও টোকেন সেট ধার করতে পারেন যাইহোক।]

সুতরাং, আপনাকে যে পদ্ধতিটি অনুসরণ করতে হবে তা হ'ল উচ্চ স্তরে শুরু করে "সিদ্ধান্ত নেওয়ার জন্য প্রতিটি প্রতিবেদনের মধ্যে কতটি আমি চাই?" যদি কোনও সিন্ট্যাকটিক কনস্ট্রাক্ট কোনও methodক্লাসে s এর মতো যেকোন বার পুনরাবৃত্তি করতে অনুধাবন করতে পারে , আপনি এই ফর্মটি সহ একটি নিয়ম চাইবেন:

methods ::= method methods | empty

যা ইবিএনএফ-তে আরও ভালভাবে বলা হয়েছে :

methods ::= {method}

এটি সম্ভবত সুস্পষ্ট হবে যখন আপনি কেবল শূন্য বা একটি দৃষ্টান্ত চান (যেমন extendsজাভা শ্রেণীর ধারা হিসাবে কাঠামোটি alচ্ছিক), বা আপনি যখন এক বা একাধিক উদাহরণের অনুমতি দিতে চান (যেমন কোনও ঘোষণায় ভেরিয়েবল আরম্ভকারী হিসাবে) )। উপাদানগুলির মধ্যে বিভাজক প্রয়োজন ( ,তর্ক তালিকার মতো), প্রতিটি উপাদানগুলির পরে টার্মিনেটর প্রয়োজন ( ;পৃথক বিবৃতি হিসাবে) বা কোনও বিভাজক বা টার্মিনেটরের প্রয়োজন নেই (যেমন হিসাবে আছে) একটি ক্লাসে পদ্ধতি সহ)।

যদি আপনার ভাষা পাটিগণিতের এক্সপ্রেশন ব্যবহার করে তবে আপনার পক্ষে বিদ্যমান ভাষার অগ্রাধিকার বিধি থেকে অনুলিপি করা সহজ হবে। বহিরাগত কোনও কিছুর জন্য না গিয়ে সি এর এক্সপ্রেশন নিয়মের মতো সুপরিচিত কিছুকে আঁকানো ভাল তবে কেবলমাত্র অন্য যে সমস্ত কিছু সমান তা সরবরাহ করা।

অগ্রাধিকার সংক্রান্ত সমস্যাগুলি (একে অপরের সাথে কীভাবে বিশ্লেষণ ঘটে) এবং পুনরাবৃত্তি সংক্রান্ত সমস্যাগুলি (প্রতিটি উপাদানগুলির মধ্যে কতটি হওয়া উচিত, তারা কীভাবে পৃথক হয়?), এছাড়াও আপনাকে ক্রম সম্পর্কেও ভাবতে হবে: কিছু কি সর্বদা অন্য জিনিসের সামনে উপস্থিত হওয়া উচিত? একটি জিনিস অন্তর্ভুক্ত করা হয়, অন্য কি বাদ দেওয়া উচিত?

এই মুহুর্তে, আপনি ব্যাকরণগতভাবে কিছু বিধি প্রয়োগ করতে প্ররোচিত হতে পারেন, একটি নিয়ম যেমন যদি কোনও Personবয়সের নির্দিষ্ট করা হয় আপনি তাদের জন্ম তারিখটিও নির্দিষ্ট করার অনুমতি দিতে চান না। আপনি যখন এটি করতে আপনার ব্যাকরণটি তৈরি করতে পারেন, আপনি সবকিছু পার্স করার পরে "শব্দার্থক চেক" পাস দিয়ে এটি প্রয়োগ করা আরও সহজ হতে পারে। এটি ব্যাকরণকে সহজ রাখে এবং, আমার মতে, নিয়ম লঙ্ঘন করা হলে এর জন্য আরও ভাল ত্রুটির বার্তা তৈরি করে।


1
আরও ভাল ত্রুটি বার্তা জন্য +1। আপনার ভাষার বেশিরভাগ ব্যবহারকারী বিশেষজ্ঞ হতে পারবেন না, তাদের মধ্যে 10 বা 10 মিলিয়ন রয়েছে কিনা। পার্সিং তত্ত্বটি এই দিকটিকে অনেক দীর্ঘ অবহেলা করেছে।
এমসাল্টারস

10

পার্সারের জন্য ব্যাকরণ কীভাবে নির্দিষ্ট করতে হয় আমি কোথায় শিখতে পারি?

সবচেয়ে পার্সার জেনারেটর জন্য, এটি সাধারণত এর কিছু বৈচিত্র এর Backus-ঘর 'নর' 'র <nonterminal> ::= expressionবিন্যাস। আমি এই ধারণাটি নিয়ে যাচ্ছি যে আপনি এরকম কিছু ব্যবহার করছেন এবং হাত দিয়ে আপনার পার্সার তৈরি করার চেষ্টা করছেন না। আপনি যদি এমন বিন্যাসের জন্য পার্সার তৈরি করতে পারেন যেখানে আপনাকে সিনট্যাক্স দেওয়া হয়েছে (আমি নীচে একটি নমুনা সমস্যাটি অন্তর্ভুক্ত করেছি), ব্যাকরণ উল্লেখ করা আপনার সমস্যা নয়।

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

... আমি কখনই নিশ্চিত নই যে আমি যে ব্যাকরণটি এসেছি তা ভাল (কোনও "ভাল" এর কোনও যুক্তিসঙ্গত পরিমাপ দ্বারা)।

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

অপেক্ষাকৃত পরিস্থিতিতে, ব্যাকরণ পরীক্ষা করা অন্য যে কোনও কিছুর পরীক্ষা করার মতো: ননটারিনালগুলির সমস্ত রূপগুলি (এবং টার্মিনালগুলি, যদি তারা কোনও লেসারের দ্বারা উত্পাদিত হচ্ছে) অনুশীলনের জন্য আপনার পর্যাপ্ত পরীক্ষার কেস নিয়ে আসতে হবে।


নমুনা সমস্যা

একটি ব্যাকরণ লিখুন যা নীচের নিয়মগুলি দ্বারা সংজ্ঞায়িত হিসাবে তালিকাভুক্ত পাঠ্য ফাইলগুলিকে বিশ্লেষণ করবে :

  • একটি তালিকা শূন্য বা আরও কিছু জিনিস নিয়ে গঠিত ।
  • একটি জিনিস একটি শনাক্তকারী , একটি খোলা ব্রেস, একটি আইটেম তালিকা এবং একটি বন্ধনী বন্ধনী সমন্বিত।
  • একটি _item_list_ এ শূন্য বা আরও বেশি আইটেম থাকে
  • একটি আইটেম একটি সনাক্তকারী , একটি সমান চিহ্ন, অন্য শনাক্তকারী এবং অর্ধিকোলন সমন্বিত ।
  • একটি আইডেন্টিফায়ার এক বা অক্ষর জেড, AZ, 0-9 বা আন্ডারস্কোর একাধিক একটি ক্রম।
  • সাদা স্থান উপেক্ষা করা হয়।

ইনপুট উদাহরণ (সমস্ত বৈধ):

clank { foo = bar; baz = bear; }
clunk {
    quux =bletch;
    281_apple = OU812;
    He_Eats=Asparagus ; }

2
এবং "ব্যাকাস-নওরের কিছু বৈকল্পিক" ব্যবহারের বিষয়টি নিশ্চিত করুন এবং নিজে বিএনএফ নয়। বিএনএফ একটি ব্যাকরণ প্রকাশ করতে পারে তবে এটি প্রচুর প্রচলিত ধারণাগুলি তৈরি করে যেমন তালিকাগুলি তাদের প্রয়োজনের তুলনায় আরও জটিল। ইবিএনএফ-এর মতো বিভিন্ন উন্নত সংস্করণ রয়েছে যা এগুলিগুলির উন্নতি করে।
ম্যাসন হুইলারের

7

ম্যাকনিল এবং ব্লারফ্লার উত্তরগুলি দুর্দান্ত। আমি প্রক্রিয়াটির শুরু সম্পর্কে কিছু মন্তব্য যুক্ত করতে চাই।

একটি সিনট্যাক্স হ'ল একটি প্রোগ্রাম উপস্থাপন করার এক উপায় । সুতরাং আপনার প্রশ্নের বাক্য গঠনটি আপনার এই প্রশ্নের উত্তরের মাধ্যমে নির্ধারণ করা উচিত: একটি প্রোগ্রাম কী?

আপনি বলতে পারেন যে একটি প্রোগ্রাম ক্লাসের সংগ্রহ। ঠিক আছে, যে আমাদের দেয়

program ::= class*

একটি সূচনা পয়েন্ট হিসাবে। অথবা আপনি এটি লিখতে হতে পারে

program ::= ε
         |  class program

এখন, একটি ক্লাস কি? এটি একটি নাম পেয়েছে; একটি alচ্ছিক সুপারক্লাস স্পেসিফিকেশন; এবং একগুচ্ছ নির্মাতা, পদ্ধতি এবং ক্ষেত্রের ঘোষণা। এছাড়াও, আপনার ক্লাসকে একটি একক (দ্ব্যর্থহীন) ইউনিটে বিভক্ত করার কিছু উপায় প্রয়োজন এবং এর ব্যবহারযোগ্যতার জন্য কিছু ছাড় জড়িত হওয়া উচিত (যেমন, এটি সংরক্ষিত শব্দের সাথে ট্যাগ করুন class)। ঠিক আছে:

class ::= "class" identifier extends-clause? "{" class-member-decl * "}"

এটি চয়ন করতে পারেন এমন একটি স্বরলিপি ("কংক্রিট সিনট্যাক্স")। অথবা আপনি ঠিক সহজেই এ বিষয়ে সিদ্ধান্ত নিতে পারেন:

class ::= "(" "class" identifier extends-clause "(" class-member-decl* ")" ")"

অথবা

class ::= "class" identifier "=" "CLASS" extends-clause? class-member-decl* "END"

আপনি সম্ভবত ইতিমধ্যে নিখুঁতভাবে এই সিদ্ধান্ত নিয়েছেন, বিশেষত আপনার উদাহরণ থাকলে তবে আমি কেবলমাত্র এই বিষয়টিকে আরও শক্তিশালী করতে চাই: সিনট্যাক্সের কাঠামোটি প্রতিনিধিত্ব করে এমন প্রোগ্রামগুলির কাঠামো দ্বারা নির্ধারিত হয়। ম্যাকনিলের উত্তর থেকে এটিই "তুচ্ছ ব্যাকরণ" পেরিয়ে যায়। উদাহরণস্বরূপ প্রোগ্রামগুলি এখনও খুব গুরুত্বপূর্ণ। তারা দুটি উদ্দেশ্য পরিবেশন। প্রথমে, তারা আপনাকে একটি প্রোগ্রাম কী তা বিমূর্ত স্তরে, চিত্রিত করতে সহায়তা করে। দ্বিতীয়ত, তারা আপনাকে আপনার ভাষার কাঠামোর প্রতিনিধিত্ব করতে কোন কংক্রিট সিনট্যাক্স ব্যবহার করা উচিত তা সিদ্ধান্ত নিতে সহায়তা করে।

কাঠামোটি নীচে নেওয়ার পরে, আপনার ফিরে যাওয়া উচিত এবং সাদা জায়গা এবং মন্তব্য করার অনুমতি দেওয়া, অস্পষ্টতা ঠিক করা ইত্যাদির মতো বিষয়গুলি মোকাবেলা করা উচিত These এগুলি গুরুত্বপূর্ণ, তবে তারা সামগ্রিক নকশার ক্ষেত্রে গৌণ, এবং এগুলি অত্যন্ত নির্ভরশীল আপনি যে প্রযুক্তিটি ব্যবহার করছেন তা পার্সিং করছে।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.