ভাসমান ধ্রুবকটির জন্য সিউডো-ডিস্ট্রাক্টরকে কল করার বৈধ সিনট্যাক্স


9

নিম্নলিখিত বিক্ষোভমূলক প্রোগ্রাম বিবেচনা করুন।

#include <iostream>

int main()
{
    typedef float T;

    0.f.T::~T();
}

এই প্রোগ্রামটি দ্বারা সংকলিত Microsoft Visual Studio Community 2019

তবে clangএবং এর gccমতো একটি ত্রুটি জারি করুন

prog.cc:7:5: error: unable to find numeric literal operator 'operator""f.T'
    7 |     0.f.T::~T();
      |     ^~~~~

যদি মত লিখতে হয় ( 0.f ).T::~T()তবে তিনটি সংকলক প্রোগ্রামটি সংকলন করে।

সুতরাং একটি প্রশ্ন ওঠে: এই রেকর্ডটি 0.f.T::~T()সিনট্যাক্টিকভাবে বৈধ? এবং যদি তা না হয়, তবে কী সিনট্যাক্টিকাল নিয়মটি ভেঙে গেছে?


1
এর মধ্যে একটি স্থান স্থাপন 0.fএবং .Tজিসিসি এবং কলং উভয়কেই এটি স্বীকার করে তোলে ...
ক্রিস

1
পাশাপাশি(0.f).T::~T();
সিগিয়েন

একটি সরল float f = 1.0f.t;সংখ্যাগত আক্ষরিক সম্পর্কে ত্রুটি উত্পাদন করবে।
1201 প্রোগ্রাম অ্যালার্ম

floatএকটি বিল্ট-ইন টাইপ, এতে আপনার কল করার জন্য কোনও ডেস্ট্রাক্টর নেই। এমনকি আপনি ম্যানুয়ালি ডেস্ট্রাক্টরদের কল করতে কী করছেন? বসানো-নতুন অঞ্চলগুলির বাইরে, এটি একটি বড় নম্বর হবে ।
জেস্পার জুহল

@ জেস্পার জুহল এটি ধ্বংসকারী নয়, ছদ্ম ধ্বংসকারী, আমি কেবল এটি জানতে পারি যে এটি বিদ্যমান। ট্যাগ তথ্যের একটি উদাহরণ রয়েছে (যার মধ্যে
ডেস্ট্রাক্টর বিটিডব্লিউতে

উত্তর:


3

সংখ্যাসূচক টোকেনগুলির বিশ্লেষণটি বেশ অশোধিত এবং এমন অনেকগুলি বিষয়কে অনুমতি দেয় যা আসলে বৈধ সংখ্যা নয়। সি ++৯-এ, [লেকস.পিপम्बर] এ পাওয়া একটি "প্রিপ্রোসেসিং নম্বর" এর ব্যাকরণটি হ'ল

pp-number:
    digit
    . digit
    pp-number digit
    pp-number nondigit
    pp-number e sign
    pp-number E sign
    pp-number .

এখানে, "ননডজিট" হ'ল এমন কোনও অক্ষর যা শনাক্তকারীতে অঙ্কগুলি বাদে ব্যবহার করা যেতে পারে, এবং "চিহ্ন" হয় হয় + বা -। পরবর্তী মানগুলি সিঙ্গল কোট (সি ++ 14), এবং পি-, পি +, পি-, পি + (সি ++ 17) ফর্মের অনুক্রমের অনুমতি দেওয়ার জন্য সংজ্ঞাটি প্রসারিত করবে।

আপশটটি হ'ল, স্ট্যান্ডার্ডের কোনও সংস্করণে, যখন একটি প্রিপ্রসেসিং সংখ্যাটি একটি অঙ্ক দিয়ে শুরু করতে হয়, বা একটি নির্দিষ্ট সময় পরে একটি অঙ্ক হয়, তার পরে অঙ্ক, অক্ষর এবং পিরিয়ডগুলির একটি নির্বিচার ক্রম অনুসরণ করা যেতে পারে। সর্বাধিক মুখ না খুলিয়া চিবানো নিয়ম ব্যবহার করে, এটা ধরা যায় 0.f.T::~T();যেমন tokenized করা প্রয়োজন বোধ করা হয় 0.f.T :: ~ T ( ) ;, যদিও 0.f.Tএকটি বৈধ সংখ্যাসূচক টোকেন নয়।

সুতরাং, কোড না চিহ্নগুলি সিন্টেক্সের বৈধ।


মজার বিষয় হচ্ছে, [লেকস.প্পটোকেন] এর শালীন মিলের সাথে একটি উদাহরণ রয়েছে: eel.is/c++traft/lex.pptoken#5
ক্রিস

1

কোনও ব্যবহারকারী সংজ্ঞাযুক্ত আক্ষরিক প্রত্যয়, উদ-প্রত্যয় একটি সনাক্তকারী । একটি আইডেন্টিফায়ার অক্ষর (কিছু নন- ASCII অক্ষর সহ), আন্ডারস্কোর, এবং সংখ্যার একটি নম্বর দিয়ে শুরু হয় না একটি ক্রম। পিরিয়ডের চরিত্রটি অন্তর্ভুক্ত নয়।

সুতরাং এটি একটি সংকলক বাগ হিসাবে এটি সনাক্তকারী f.Tহিসাবে অ-শনাক্তকারী ক্রমটিকে চিকিত্সা করছে ।

0.একটি হল ভগ্ন-ধ্রুবক , যা একটি ঐচ্ছিক এক্সপোনেন্ট দ্বারা পারেন অনুসরণ করা যেতে পারে, তারপর উদ-প্রত্যয় বা (ক ব্যবহারকারী আক্ষরিক সংজ্ঞায়িত জন্য) ফ্লোটিং পয়েন্ট-প্রত্যয় (এক fFlL)। fএকটি বিবেচনা করা যেতে পারে উদ-suffx পাশাপাশি, কিন্তু এটা যে হওয়া উচিত এবং UDL যেহেতু এটা অন্য আক্ষরিক টাইপ মেলে। একটি উদ-প্রত্যয়টি সনাক্তকারী হিসাবে ব্যাকরণে সংজ্ঞায়িত করা হয়।


কেন এটি উদ-প্রত্যয় হিসাবে ব্যাখ্যা করা হয়?
মস্কো থেকে ভ্লাদ

@ ভ্লাদফ্রমমস্কো 0.এটি একটি ভগ্নাংশ-ধ্রুবক । এর পরে (উদ্ঘাটনকারী উপাদানগুলি বাদ দিয়ে) একটি উদ-প্রত্যয় (ব্যবহারকারীর সংজ্ঞায়িত আক্ষরিকের জন্য) বা ভাসমান-পয়েন্ট-প্রত্যয় (এর মধ্যে একটি fFlL) অনুসরণ করা যেতে পারে। fএকটি বিবেচনা করা যেতে পারে উদ-suffx পাশাপাশি, কিন্তু এটা যে হওয়া উচিত এবং UDL যেহেতু এটা অন্য আক্ষরিক টাইপ মেলে। একটি উদ-প্রত্যয়টি সনাক্তকারী হিসাবে ব্যাকরণে সংজ্ঞায়িত করা হয় ।
1201 প্রোগ্রাম অ্যালার্ম

@ 1201 প্রোগ্রাম অ্যালার্ম: যেখানে fউদ-প্রত্যয় হিসাবে ব্যাখ্যা f.Tকরা .যেতে পারে, সনাক্তকারী হিসাবে এটি হওয়া উচিত নয় । তবে এটি ... আমি কম্পাইলার বাগটি বলব তবে এটি আরও জটিল pretty
জারোড 42
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.