জাভা সি এর তুলনায় পার্স করা সহজ করে কী?


90

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

এটিকে পার্স করার জন্য আরও ট্র্যাকটেবল করার জন্য আপনার সি সম্পর্কে কী পরিবর্তন করতে হবে?

আমি জিজ্ঞাসা করি কারণ আমি সি এর প্রসঙ্গে সংবেদনশীলতার যে উদাহরণগুলি দেখেছি তার সবগুলি প্রযুক্তিগতভাবে অনুমোদিত কিন্তু ভয়াবহভাবে অদ্ভুত। উদাহরণ স্বরূপ,

foo (a);

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

অন্যদিকে, জাভা ব্যাকরণে ভেরিয়েবল ডিক্লেয়ারেশন এবং ফাংশন ঘোষণার জন্য পৃথক উত্পাদন বিধি রয়েছে। যদি লিখি

foo a;

তাহলে আপনি জানেন যে এটি একটি পরিবর্তনশীল ঘোষণা এবং fooনির্বিঘ্নে টাইপনের নাম হিসাবে পার্স করা যায়। ক্লাসটি যদি fooবর্তমান কোথাও কোথাও সংজ্ঞায়িত না করা হয় তবে এটি বৈধ কোড হতে পারে না , তবে এটি শব্দার্থ বিশ্লেষণের একটি কাজ যা পরবর্তী সংকলক পাসে সঞ্চালিত হতে পারে।

আমি এটি দেখেছি যে টাইপয়েফের কারণে সি পার্স করা শক্ত, তবে আপনি জাভাতেও নিজের প্রকারের ঘোষণা করতে পারেন। কোন সি ব্যাকরণের নিয়মাবলী ছাড়াও direct_declaratorদোষ রয়েছে?


7
দুর্দান্ত প্রশ্ন। সম্ভবত উপায় খুব প্রশস্ত বা প্রাথমিকভাবে মতামত যদিও।
asteri

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

4
আমি সেই অনুযায়ী প্রশ্নটি সম্পাদনা করেছি, প্রতিক্রিয়াটির জন্য @ আর .. এর জন্য ধন্যবাদ।
korrok

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

4
@ ইরাক্যাক্সটার আমি এই "হ্যাকস" ডাকব না। সমস্যাটিকে দু'ভাগে বিভক্ত করা একটি যুক্তিসঙ্গত কাজ বলে মনে হচ্ছে, যেহেতু প্রসঙ্গ-সংবেদনশীল ভাষার পার্সিং দক্ষতার সাথে করা যায় না (এবং প্রকৃতপক্ষে প্রসঙ্গ-মুক্ত ভাষাগুলি পার্সিংও দক্ষ নয়, এবং এ কারণেই আমরা সাধারণত প্রসঙ্গ-মুক্তের সাবটেক্টগুলিতে সীমাবদ্ধ করি) । এএসটি-র মধ্যে কেবল প্রসঙ্গ-সংবেদনশীল বৈশিষ্ট্য যাচাই করার জন্য একটি প্রসঙ্গ-মুক্ত পার্স + স্থির বিশ্লেষণ এটি করা যুক্তিসঙ্গত জিনিস।
বাকুরিউ

উত্তর:


76

সি ++ পার্সিং করা শক্ত হয়ে উঠছে। পার্সিং জাভা ঠিক ততই শক্ত হয়ে উঠছে।

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

আইআইআরসি, জাভা 1.4 এর "সুস্পষ্ট" এলএলআর (1) ব্যাকরণটি অস্পষ্ট নয়, সুতরাং এটি বিশ্লেষণ করা "সহজ" ছিল। আমি এতটা নিশ্চিত নই যে আধুনিক জাভা কমপক্ষে দীর্ঘ দূরত্বের স্থানীয় অস্পষ্টতা পায় নি; "... >>" দুটি টেম্পলেট বন্ধ করে দেয় বা "ডান শিফট অপারেটর" কিনা তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে সবসময় সমস্যা রয়েছে। আমার সন্দেহ হয় আধুনিক জাভা আর এলএলআর (1) এর সাথে বিশ্লেষণ করে না

তবে উভয় ভাষার জন্য শক্তিশালী পার্সার (বা দুর্বল পার্সার এবং কনটেক্সট কালেকশন হ্যাক যেমন সি এবং সি ++ সামনের দিকে শেষ হয়) ব্যবহার করে কেউ পার্সিংয়ের সমস্যাটি পেরিয়ে যেতে পারে। সি এবং সি ++ প্রিপ্রোসেসর থাকার অতিরিক্ত জটিলতা রয়েছে; এগুলি বাস্তবে আরও বেশি জটিল তারা দেখায়। একটি দাবি হ'ল সি এবং সি ++ পার্সারগুলি এত শক্ত যে তাদের হাতে লিখে যেতে হবে। এটা সত্য নয়; আপনি জিএলআর পার্সার জেনারেটরগুলির সাথে জাভা এবং সি ++ পার্সার তৈরি করতে পারেন।

সমস্যাটি যেখানে ঠিক আছে সেখানে পার্সিং করা হয়নি।

একবার পার্স করার পরে আপনি এএসটি / পার্স ট্রি দিয়ে কিছু করতে চাইবেন। অনুশীলনে, আপনাকে প্রতিটি সনাক্তকারী হিসাবে, এর সংজ্ঞাটি কী এবং এটি কোথায় ব্যবহৃত হয় তা জানতে হবে ("নাম এবং প্রকারের রেজোলিউশন", slালুভাবে, বিল্ডিং প্রতীক টেবিল)। এটি উত্তরাধিকার, ইন্টারফেস, ওভারলোডিং এবং টেমপ্লেটগুলি সংশ্লেষ করে পার্সার ডান পাওয়ার চেয়ে অনেক বেশি কাজ হতে দেখা যায় এবং এই সমস্তটির জন্য শব্দার্থক শব্দগুলি দশকে শত শত পৃষ্ঠায় ছড়িয়ে পড়ে অনানুষ্ঠানিক প্রাকৃতিক ভাষায় লিখিত হয়েছিল fact ভাষা মান। সি ++ এখানে সত্যিই খারাপ। জাভা 7 এবং 8 এই দৃষ্টিকোণ থেকে বেশ ভয়ঙ্কর হতে চলেছে। (এবং প্রতীক টেবিলগুলি আপনার যা দরকার তা নয়; "পার্সিংয়ের পরে জীবন" শীর্ষক দীর্ঘ নিবন্ধের জন্য আমার বায়ো দেখুন)।

বেশিরভাগ লোকেরা খাঁটি পার্সিং অংশের সাথে লড়াই করে (প্রায়শই শেষ হয় না; অনেকের জন্য নিজেকেই পরীক্ষা করে দেখুন, রিয়েল ল্যাঙ্গগুলির জন্য ওয়ার্কিং পার্সার কীভাবে তৈরি করবেন সে সম্পর্কে অনেক প্রশ্ন), তাই তারা পার্স করার পরে কখনও জীবন দেখেন না। এবং তারপরে আমরা কী পার্স করা কঠিন এবং সেই পর্যায়ে পরে কী ঘটে যায় সে সম্পর্কে কোনও সঙ্কেত নেই।

সি ++ সিনট্যাক্স ঠিক করা আপনাকে কোথাও পাবেন না get

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

আপনি নিজের পার্সার লিখতে চাইতে পারেন। সব ঠিকঠাক আছে; আপনার কাছে আরও সহজ করার জন্য কেবলমাত্র সম্প্রদায়ের বাকী ভাষাগুলি তাদের যে ভাষাটি ব্যবহার করতে হবে তা পরিবর্তনের জন্য আশা করবেন না। তারা সকলেই তাদের জন্য এটি আরও সহজ চায় এবং এটি ডকুমেন্টেড এবং প্রয়োগকৃত হিসাবে ভাষাটি ব্যবহার করা।


ভাল উত্তর. ডি এবং সি + দেখুন, যারা এর কয়েকটি সমস্যা সমাধানের চেষ্টা করে। এস / সামগ্রী /
প্রতিযোগিতা

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

4
@ করোক: জিএলআর পার্সারগুলির সাহায্যে জাভা / সি ++ তৈরি সম্পর্কে আমার উত্তরটি পড়ুন। আপনার কোনও লেসার হ্যাকের দরকার নেই । সুতরাং, পার্থক্যটি লোকেদের মনে আছে যারা ভুল পার্সিং প্রযুক্তি ব্যবহার করছে। ... অনুমোদিত, পুরো সি ++ সামনের প্রান্তটি তৈরি করা (উদাহরণস্বরূপ সি ++ 14, যা আমরা করেছি) জাভা 8 এর চেয়ে কঠিন, তবে তারা উভয়ই কঠোর (চেষ্টা এবং বিশদে মনোযোগ দেওয়ার ক্ষেত্রে) এবং পার্সিং সবচেয়ে সহজ টুকরা।
ইরা

4
আমি আপনার "পার্সিংয়ের পরে জীবন" সম্পর্কে একমত: যেমন # # ওভারলোড রেজোলিউশন যে কোনও 3-স্যাট সমস্যা এনকোড করতে পারে এবং এটি এনপি-হার্ড।
Jörg ডব্লু মিটাগ

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