মন্তব্যগুলি সাধারণত কীভাবে বিশ্লেষণ করা হয়?


31

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

উদাহরণস্বরূপ, একটি মন্তব্য টোকেনের মধ্যে এম্বেড করা উচিত 'হস্তক্ষেপ' টোকেনের সাথে বা না? সাধারণত: এরকম কিছু:

Sys/* comment */tem.out.println()

বৈধ?

এছাড়াও, যদি ভাষাটি নতুন লাইনের প্রতি সংবেদনশীল হয়, এবং মন্তব্যটি নতুন রেখাকে ছড়িয়ে দেয় তবে নতুন লাইনটি বিবেচনা করা উচিত কি না?

stuff stuff /* this is comment
this is still comment */more stuff 

হিসাবে চিকিত্সা করা

stuff stuff more stuff

অথবা

stuff stuff
more stuff

?

আমি জানি যে কয়েকটি সুনির্দিষ্ট ভাষাগুলি কী করে, না আমি মতামত খুঁজছি, তবে তা খুঁজছি কি না: টোকেন এবং নতুন লাইনের ক্ষেত্রে একটি চিহ্ন দ্বারা সাধারণত কোন sensক্যমত্য আশা করা যায়?


আমার বিশেষ প্রসঙ্গটি উইকের মতো মার্কআপ।


মন্তব্যটির ভিতরে নতুন লাইনের উপস্থিতি রয়েছে? কেন মন্তব্যটির অন্য কোনও চরিত্রের চেয়ে আলাদা আচরণ করা হবে?

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

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

উত্তর:


40

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

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

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

return /*
       */ 17

এর সমতুল্য

return 17

না

return
17

একক লাইনের মন্তব্যগুলি লাইন ব্রেকটি সংরক্ষণ করে, যেমন

return // single line comment
    17

সমতুল্য

return
17

না

return 17

যেহেতু মন্তব্যগুলি স্ক্যান করা হলেও পার্স করা হয়নি, তাই তারা বাসা বাঁধে না। সুতরাং

 /*  /* nested comment */ */

মন্তব্যটি প্রথমটি খোলার পরে এবং প্রথমটি /*বন্ধ হওয়ার কারণে একটি বাক্য গঠন ত্রুটি*/


3
বেশিরভাগ ভাষায় ইন-লাইন মন্তব্যগুলি ( /* like this */) একটি একক সাদা স্থানের সমান এবং // like thisএকটি ফাঁকা রেখায় একটি EOL- সমাপ্ত মন্তব্য ( ) হিসাবে বিবেচিত হয় ।
9000

@ জ্যাককসবি তাই আমি মন্তব্যগুলি তাদের উত্স থেকে সম্পূর্ণরূপে শূন্য-প্রস্থের স্থান হিসাবে প্রতিস্থাপিত হিসাবে বিবেচনা করার কথা ভাবছি , এটি আপনার পরামর্শের সমতুল্য বলে মনে হচ্ছে।
টানা স্লেজগাড়ির

1
@artb একটি সাধারণ স্থান ঠিক ঠিক কাজ করা উচিত, এবং ASCII কোড পৃষ্ঠাতে থাকা।
জন ডিভোরাক

@ জনডভোরাক একটি স্থান উপস্থিতি প্রভাবিত করবে এবং বোঝাপড়াটি সরিয়ে দেবে এবং "একটি মন্তব্য সত্যিই সেখানে নেই" এর শব্দার্থের নিকটে রয়েছে। প্রাথমিক রেন্ডারিং আউটপুটটি এইচটিএমএল হবে সুতরাং আমার ক্ষেত্রে এএসসিআইআই ব্রাউজারগুলি ইউনিকোডকে সমর্থন করার মতো বিষয় নয়। এটি বলেছিল, আমি বিশ্বাস করি যে সি স্ট্যান্ডার্ড আদেশগুলি মন্তব্যগুলিকে একক স্থানের সাথে প্রতিস্থাপন করা হয়েছে।
টানা স্লেজগাড়ির

1
কিছু ভাষা, উল্লেখযোগ্যভাবে র‌্যাকেট, নেস্টেড একাধিক-মন্তব্য মন্তব্য করেছে: (define x #| this is #| a sub-comment |# the main comment |# 3) xফলন 3
wchargin

9

প্রশ্নের উত্তর দিতে:

একটি সাধারণ ক্যমত্য যা সাধারণত একটি মার্ক আপ দ্বারা প্রত্যাশিত হয়?

আমি বলব যে কোনওটিই টোকেনের অভ্যন্তরে থাকা কোনও মন্তব্যকে বৈধ হওয়ার প্রত্যাশা করবে না।

থাম্বের একটি সাধারণ নিয়ম হিসাবে, মন্তব্যগুলিকে হোয়াইটস্পেসের মতোই বিবেচনা করা উচিত। এক্সট্রানাস হোয়াইটস্পেস থাকতে বৈধ যে কোনও জায়গাতেও একটি এম্বেড করা মন্তব্যে অনুমতি দেওয়া উচিত। শুধুমাত্র ব্যতিক্রম স্ট্রিং হবে:

trace("Hello /*world*/") // should print Hello /*world*/

স্ট্রিংয়ের ভিতরে থাকা মন্তব্যগুলিকে সমর্থন করা বেশ অদ্ভুত হবে এবং এগুলি পালিয়ে যাওয়া ক্লান্তিকর হবে!


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

3
স্ট্রিং পালানোর বিষয়ে বিটটির জন্য +1। যদিও, আপনার উদাহরণে, আমি সাধারণত Hello /* world*/!মন্তব্য সীমান্তকারীদের দমন করার চেয়ে এটি মুদ্রণের আশা করব । এছাড়াও, প্রোগ্রামারদের স্বাগতম!
বিট্রি

1
ধন্যবাদ 8 বিট্রি! এবং এটি পুরোপুরি আমি বোঝাতে চাইছি। মজাদারভাবে যথেষ্ট, আমার উত্তরটিতেও আমার ** পালানো দরকার ....
কনার ক্লার্ক

2
@ আর্টবি সাধারণভাবে, "প্রতিস্থাপনের মাধ্যমে পার্সিং" প্রান্তের কেসগুলি এবং অন্যান্য বৈশিষ্ট্যগুলির সাথে মিথস্ক্রিয়া নিয়ে রাস্তায় খুব জটিল হয়ে পড়ে এবং প্রথম থেকেই এড়ানো সেরা।
hobbs

7

শ্বেত স্পেস-সংবেদনশীল ভাষায়, উপেক্ষা করা অক্ষর (যেমন শ্বেত স্পেস বা মন্তব্যগুলির অংশ যারা) টোকেনকে সীমানা দেয়।

সুতরাং উদাহরণস্বরূপ Sys temদুটি টোকেন, যখন Systemএকটি। যদি আপনি তুলনা করেন new Foo()এবং এর মধ্যে newFoo()একটির Fooঅন্য কল করার সময় একটি উদাহরণ তৈরি করবে তবে এর কার্যকারিতা আরও স্পষ্ট হতে পারে newFoo

মন্তব্যগুলি হোয়াইটস্পেসের রান হিসাবে একই ভূমিকা পালন করতে পারে, যেমন new/**/Foo()একইরূপে কাজ করে new Foo()। অবশ্যই এটি আরও জটিল হতে পারে, যেমন new /**/ /**/ Foo()বা হোয়াট নোট।

প্রযুক্তিগতভাবে, সনাক্তকারীদের মধ্যে মন্তব্যের অনুমতি দেওয়া সম্ভব হওয়া উচিত, তবে আমি সন্দেহ করি এটি বিশেষভাবে কার্যকর।

এখন, সাদা-স্পর্শ সংবেদনশীল ভাষাগুলির কী?

পাইথন মনে আসে এবং এটির একটি খুব সহজ উত্তর রয়েছে: কোনও ব্লক মন্তব্য নেই। আপনি এর সাথে একটি মন্তব্য শুরু করেন #এবং তারপরে পার্সার ঠিক ঠিক এমনভাবে কাজ করে যেমন বাকী রেখার অস্তিত্ব ছিল না তবে পরিবর্তে কেবল একটি নতুন লাইন।

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

body
  //-
    As much text as you want
    can go here.
  p this is no longer part of the comment

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


হুম, নিউলাইন হ'ল আসল সমস্যা হওয়ায় আমরা মন্তব্যগুলির জন্য এইচটিএমএল \ এক্সএমএল সিনট্যাক্স ব্যবহার করছি যাতে এটি মাল্টি-লাইন হবে।
স্লাইড

3
@ আর্টবি আপনি যদি এইচটিএমএল / এক্সএমএল সিনট্যাক্স ব্যবহার করে থাকেন তবে তাদের আচরণটি সহজভাবে ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে।
বিট্রি

1
@ 8 বিট্রি বোঝায়, এটি চিন্তা করা উচিত ছিল। আমি প্রশ্নটি যেমন রেখে দেব তেমনি এটি আরও কার্যকর হবে।
স্লাইড

3

অতীতে আমি লেক্সিকাল বিশ্লেষণের অংশ হিসাবে মন্তব্যগুলিকে একক টোকেনে পরিণত করেছি। একই স্ট্রিং জন্য যায়। সেখান থেকে জীবন সহজ is

আমি নির্মিত শেষ পার্সারের নির্দিষ্ট ক্ষেত্রে, শীর্ষস্থানীয় বিশ্লেষণের রুটিনে একটি পালানোর নিয়ম পাস করা হয়। টোকেনগুলি যেমন মূল ব্যাকরণের সাথে ইনলাইন করে মন্তব্য টোকেনগুলি হ্যান্ডেল করতে পলায়নের নিয়ম ব্যবহার করা হয়। সাধারণভাবে, এই টোকেনগুলি বাতিল করা হয়েছিল।

এটি এইভাবে করার একটি পরিণতি হ'ল আপনি যে সনাক্তকরণকারীর মাঝে একটি মন্তব্য দিয়ে পোস্ট করেছেন, সনাক্তকারী কোনও একক সনাক্তকারী হবে না - এটি সমস্ত ভাষায় (মেমরি থেকে) প্রত্যাশিত আচরণ যা আমি কাজ করেছি ।

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

আমি আশা করি যে এটি উপলব্ধি করে / সহায়তা করে।


সুতরাং আপনার যদি এমন কোড থাকে তবে console.log(/*a comment containing "quotes" is possible*/ "and a string containing /*slash-star, star-slash*/ is possible")যেখানে একটি মন্তব্যে উক্তি রয়েছে এবং একটি স্ট্রিংয়ে মন্তব্য বাক্য গঠন আছে, কীভাবে লেক্সার এটি সঠিকভাবে টোকানাইজ করতে জানবে? আপনি কি দয়া করে আপনার উত্তর সম্পাদনা করতে পারেন, এই ক্ষেত্রেগুলির একটি সাধারণ বিবরণ সরবরাহ করে?
ছারভে

1

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

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

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

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

মন্তব্য সহ অ-মন্তব্য টোকেনগুলি বৌদ্ধিক করার ধারণাটি হল ব্যাকরণ থেকে সম্পূর্ণরূপে মন্তব্যগুলি সরিয়ে দেওয়া।

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

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

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