কমান্ড ইন্টারপ্রেটার / পার্সার কীভাবে লিখবেন?


22

সমস্যা: কমান্ডগুলি স্ট্রিং আকারে রান করুন।

  • কমান্ড উদাহরণ:

    /user/files/ list all; সমতুল্য: /user/files/ ls -la;

  • আরেকটা:

    post tw fb "HOW DO YOU STOP THE TICKLE MONSTER?;"

সমতুল্য: post -tf "HOW DO YOU STOP THE TICKLE MONSTER?;"

বর্তমান সমাধান:

tokenize string(string, array);

switch(first item in array) {
    case "command":
        if ( argument1 > stuff) {
           // do the actual work;
        }
}

এই সমাধানটিতে আমি যে সমস্যাগুলি দেখছি সেগুলি হ'ল:

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

এবং সর্বশেষে আমি সম্বোধন করতে পারি না হ'ল বিভিন্ন এনকোডিংয়ের প্রতিশব্দ, উদাহরণস্বরূপ:

case command:
case command_in_hebrew:
    do stuff;
break;

শেষটি তুচ্ছ হতে পারে, তবে ভাল, আমি যা দেখতে চাই তা হ'ল এই জাতীয় প্রোগ্রামের শক্ত তহবিল।

আমি বর্তমানে এটি পিএইচপি-তে প্রোগ্রামিং করছি তবে এটি পার্লেও করতে পারি।


এটি কীভাবে বিশেষত পিএইচপি-র সাথে সম্পর্কিত তা আমি মোটেও দেখতে পাচ্ছি না। ইতিমধ্যে এসও এবং এসইতে এই দোভাষী / সংকলক-বিষয়টিতে প্রচুর থ্রেড রয়েছে।
রাফেল

3
কেউ গোটপট উল্লেখ করেনি?
আন্তন বারকোভস্কি

@ অ্যান্টন বারকোভস্কি: আমি করেছি। আমার লিঙ্কগুলি দেখুন। আমি মনে করি ওবারম্যানশের মতো উত্তরগুলি ওপি যা করার চেষ্টা করছে তার জন্য কেবল গুরুতর জটিল-
কোয়ান্টিন-স্টারিন

1
আমি রেজিএক্সপ্যাক্স ব্যবহার করে একটি সহজ পদ্ধতির উদ্ধৃতিও দিয়েছি।
উত্তরটিও

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

উত্তর:


14

আমাকে অকপটে স্বীকার করতে দিন, পার্সার তৈরি করা একটি ক্লান্তিকর কাজ এবং সংকলক প্রযুক্তির নিকটে আসে তবে একটি তৈরি করা ভাল অ্যাডভেঞ্চার হিসাবে পরিণত হবে। এবং একটি পার্সার দোভাষী নিয়ে আসে। সুতরাং আপনি উভয় তৈরি করতে হবে।

পার্সার এবং দোভাষীদের একটি দ্রুত ভূমিকা introduction

এটি খুব প্রযুক্তিগত নয়। তাই বিশেষজ্ঞরা আমাকে নিয়ে হতাশ হন না।

আপনি যখন কোনও টার্মিনালে কিছু ইনপুট খাওয়ান, টার্মিনালটি ইনপুটটিকে একাধিক ইউনিটে ভাগ করে দেয়। ইনপুটটিকে এক্সপ্রেশন বলে এবং একাধিক ইউনিটকে টোকেন বলে। এই টোকেনগুলি অপারেটর বা প্রতীক হতে পারে। সুতরাং আপনি যদি কোনও ক্যালকুলেটরে 4 + 5 লিখেন তবে এই অভিব্যক্তিটি 3 টোকেন 4, +, 5 তে বিভক্ত হয়ে যায়। প্লাসটি 4 এবং 5 টি প্রতীক হিসাবে অপারেটর হিসাবে বিবেচিত হয়। এটি একটি প্রোগ্রামে পাস করা হয় (এটি দোভাষী হিসাবে বিবেচনা করুন) এতে অপারেটরদের সংজ্ঞা রয়েছে। সংজ্ঞাটির ভিত্তিতে (আমাদের ক্ষেত্রে যোগ করুন), এটি দুটি চিহ্ন যুক্ত করে এবং ফলাফলটি টার্মিনালে ফেরত দেয়। সমস্ত সংকলক এই প্রযুক্তির উপর ভিত্তি করে। যে প্রোগ্রামটি একটি এক্সপ্রেশনকে একাধিক টোকনে বিভক্ত করে তাকে লেক্সার বলে এবং যে প্রোগ্রামটি এই টোকেনগুলিকে আরও প্রক্রিয়াকরণ এবং প্রয়োগের জন্য ট্যাগগুলিতে রূপান্তরিত করে তাকে পার্সার বলে।

লে এর এবং ইয়্যাক সি এর অধীনে বিএনএফ ব্যাকরণের উপর ভিত্তি করে লেক্সার এবং পার্সার তৈরির জন্য আধ্যাত্মিক রূপ এবং এটি প্রস্তাবিত বিকল্প। বেশিরভাগ পার্সার লেক্স এবং ইয়্যাকের ক্লোন cl

পার্সার / ইন্টিপ্লেটার তৈরির পদক্ষেপ

  1. আপনার টোকেনকে প্রতীক, অপারেটর এবং কীওয়ার্ডগুলিতে শ্রেণিবদ্ধ করুন (কীওয়ার্ডগুলি অপারেটর হয়)
  2. বিএনএফ ফর্মটি ব্যবহার করে আপনার ব্যাকরণ তৈরি করুন
  3. আপনার ক্রিয়াকলাপের জন্য পার্সার ফাংশন লিখুন
  4. এটি একটি প্রোগ্রাম হিসাবে একটি রান সংকলন

সুতরাং উপরের ক্ষেত্রে আপনার সংযোজন টোকেনগুলি কোনও অঙ্ক এবং লেক্সারে প্লাস সাইন দিয়ে কী করবেন তার সংজ্ঞা সহ একটি অঙ্কের প্লাস চিহ্ন হবে

নোটস এবং টিপস

  • বাম থেকে ডান এলএলআরকে মূল্যায়ন করে এমন একটি পার্সার কৌশল চয়ন করুন
  • এটির অনুভূতি পেতে কম্পাইলারগুলিতে এই ড্রাগন বইটি পড়ুন । আমি ব্যক্তিগতভাবে বইটি শেষ করি নি
  • এই লিঙ্কটি পাইথনের অধীনে লেক্স এবং ইয়্যাককে একটি সুপার-ফাস্ট অন্তর্দৃষ্টি দেবে

একটি সহজ পদ্ধতির

আপনার যদি সীমাবদ্ধ ফাংশনগুলির সাথে কেবল একটি সাধারণ পার্সিং মেকানিজম প্রয়োজন হয় তবে আপনার প্রয়োজনীয়তাটিকে নিয়মিত এক্সপ্রেশন হিসাবে রূপান্তর করুন এবং কেবলমাত্র পুরো গুচ্ছ ক্রিয়াকলাপ তৈরি করুন। চিত্রিত করার জন্য, চারটি পাটিগণিত ফাংশনের জন্য একটি সাধারণ পার্সার ধরুন। সুতরাং আপনি প্রথমে অপারেটরকে কল করবেন এবং তারপরে শৈলীতে ফাংশনগুলির তালিকা (লিস্পের অনুরূপ) (+ 4 5)বা (add [4,5])তারপরে অপারেটরগুলির তালিকা এবং অপারেশনগুলির চিহ্নগুলি পেতে আপনি একটি সাধারণ রেজিপ্যাক্স ব্যবহার করতে পারেন।

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


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

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

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

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

1
@ alfa64: নিশ্চিত আমাদের তাহলে জেনে যখন আপনি এমন একটি সমাধান এই উত্তর ভিত্তিক কোড যাক করা
Quentin-starin

7

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

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

একটি ভাল বিকল্পকে পার্সিংয়ের পাঠাগার এমনকি আপনার জন্য উপলব্ধ বিকল্পগুলিতে বিন্যাসিত সহায়তা মুদ্রণ করবে।

সম্পাদনা 12/27

দেখে মনে হচ্ছে আপনি এটিকে যত জটিল তা তৈরি করছেন।

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

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

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

সব খুব সোজা। সব খুব সাধারণ। আপনি যে ভাষায় খুঁজে পেতে পারেন তার সম্ভবত প্রয়োগ করা হয়েছে, সম্ভবত পাঁচবার।

এটা লিখবেন না। ইতিমধ্যে যা লেখা আছে তা ব্যবহার করুন।

আপনি যদি স্ট্যান্ডার্ড কমান্ড লাইন আর্গুমেন্ট ছাড়া অন্য কিছু মনে না করেন তবে ইতিমধ্যে বিদ্যমান অনেকগুলি পরীক্ষিত লাইব্রেরি ব্যবহার করুন that

জটিলতা কি?


3
সর্বদা, সর্বদা ওপেন সোর্স সম্প্রদায়ে লাভ করুন।
স্পেন্সার রথবুন

আপনি কি getoptionkit চেষ্টা করেছেন?
alfa64

না, আমি বেশ কয়েক বছরে পিএইচপি তে কাজ করি নি। অন্যান্য খুব ভাল পিএইচপি লাইব্রেরিও থাকতে পারে। আমি লিঙ্কযুক্ত সি # কমান্ড লাইন পার্সার লাইব্রেরি ব্যবহার করেছি।
কুইন্টিন-স্টারিন

4

আপনি কি ইতিমধ্যে http://qntm.org/loco এর মতো কিছু চেষ্টা করেছেন ? এই পদ্ধতির কোনও হস্তাক্ষর লিখিত অ্যাডহকের তুলনায় অনেক পরিষ্কার, তবে লেবুর মতো স্ট্যান্ডেলোন কোড জেনারেশন সরঞ্জামের প্রয়োজন হবে না।

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


+1 দুর্দান্ত লিঙ্ক, আমি আশ্চর্য হয়েছি এটি যদি গিথুব বা অন্য কিছুতে পাওয়া যায়। এবং ব্যবহারের পদগুলি সম্পর্কে কী?
hakre

1

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

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

পিএইচপি টোকেন পার্সার ( token_get_all) ব্যবহার করার জন্য কয়েকটি উদাহরণ নিম্নলিখিত প্রশ্নের উত্তরে দেওয়া হয়েছে:

উভয় উদাহরণে একটি সাধারণ পার্সার রয়েছে, সম্ভবত এর মতো কিছু আপনার দৃশ্যের জন্য উপযুক্ত।


হ্যাঁ, আমি ব্যাকরণ স্টাফ ছুটে এসেছি, আমি এখন এটি যোগ করব।
alfa64

1

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

টোকেনের বিরুদ্ধে কাজ করুন, তবে হার্ড কোডড কমান্ড ব্যবহার করবেন না। তারপরে অনুরূপ সাউন্ডিং কমান্ডগুলির সাথে সমস্যাটি চলে যায়।

প্রত্যেকেই সর্বদা ড্রাগনের বইয়ের পরামর্শ দেয় তবে আমি রোনাল্ড মাকের "রাইটিং কমপিলারস এবং দোভাষী" র প্রতি ইতিমধ্যে আরও ভাল পরিচিতি পেয়েছি ।


0

আমি প্রোগ্রাম লিখেছি যে কাজ করে। একটি ছিল একটি আইআরসি বট যা অনুরূপ কমান্ড সিনট্যাক্স রয়েছে। এখানে একটি বিশাল ফাইল রয়েছে যা একটি বড় সুইচ স্টেটমেন্ট। এটি কাজ করে - এটি দ্রুত কাজ করে - তবে এটি বজায় রাখা কিছুটা কঠিন।

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


আমি আপনার কোডটি পড়েছি এবং এটি আমার কোডের মতোই একই স্কিম, তবে আমি যেমন বলেছি যে আপনি যদি অন্য লোকেরা ব্যবহার করতে চান তবে আপনাকে ত্রুটি পরীক্ষা করা এবং স্টাফ যুক্ত করতে হবে
alfa64

1
@ alfa64 দয়া করে মন্তব্যে পরিবর্তে প্রশ্নে কোনও স্পষ্টতা যুক্ত করুন। আপনি ঠিক কী জন্য জিজ্ঞাসা করছেন এটি খুব পরিষ্কার নয়, যদিও এটি কিছুটা স্পষ্ট যে আপনি সত্যিকারের নির্দিষ্ট কিছু সন্ধান করছেন। যদি তা হয় তবে তা ঠিক কী তা আমাদের বলুন । আমি এটা খুব সহজ থেকে যেতে মনে করি না I think my implementation is very crude and faultyকরতে but as i stated, if you want other people to use, you need to add error checking and stuff... আমাদের বলুন ঠিক কি এটা সম্পর্কে অশোধিত এবং কি ত্রুটিপূর্ণ, এটি সাহায্য করবে আপনি ভাল উত্তর পেতে।
ইয়ানিস

অবশ্যই, আমি প্রশ্নটি পুনরায় কাজ করব
alfa64

0

আমি কোনও সংকলক বাস্তবায়নের পরিবর্তে বা নিজেকে অনুবাদকের পরিবর্তে কোনও সরঞ্জাম ব্যবহার করার পরামর্শ দিচ্ছি। উদ্দীপনা লক্ষ্য ভাষার ব্যাকরণ (আপনার কমান্ড লাইনের ব্যাকরণ) প্রকাশ করতে সি # ব্যবহার করে। কোডপ্লেক্সের বিবরণে বলা হয়েছে: "Irony .NET প্ল্যাটফর্মে ভাষা প্রয়োগের জন্য একটি উন্নয়ন কিট kit"

কোডপ্লেক্সে আয়রনির অফিসিয়াল হোমপেজটি দেখুন: লৌকিক - .NET ভাষা বাস্তবায়ন কিট


আপনি পিএইচপি দিয়ে এটি কীভাবে ব্যবহার করবেন?
এসকে-যুক্তি

আমি কোনও পিএইচপি ট্যাগ বা প্রশ্নে পিএইচপি সম্পর্কিত উল্লেখ দেখতে পাচ্ছি না।
অলিভিয়ার জ্যাকট-ডেসকোম্বেস

আমি দেখতে পাচ্ছি, এটি মূলত পিএইচপি সম্পর্কে ছিল তবে এখন আবার লিখিত।
এসকে-যুক্তি

0

আমার পরামর্শটি এমন একটি লাইব্রেরির জন্য গুগল হবে যা আপনার সমস্যার সমাধান করে।

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


0

আপনি কেন আপনার প্রয়োজনীয়তাগুলি কিছুটা সহজ করেন না?

একটি সম্পূর্ণ পার্সার ব্যবহার করবেন না, এটি খুব জটিল এবং এমনকি আপনার মামলার জন্য অযৌক্তিক।

একটি লুপ তৈরি করুন, একটি বার্তা লিখুন যা আপনাকে "প্রম্পট" উপস্থাপন করে, আপনি যে বর্তমান পথ হতে পারেন তা হতে পারে।

স্ট্রিংয়ের জন্য অপেক্ষা করুন, স্ট্রিংটিকে "পার্স" করুন এবং স্ট্রিংয়ের বিষয়বস্তুর উপর নির্ভর করে কিছু করুন।

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

উদাহরণ।

প্রোগ্রাম আউটপুট (এবং একই লাইনে থাকে): / ব্যবহারকারী / ফাইল / ব্যবহারকারী লিখেছেন (একই লাইনে) সমস্ত তালিকা;

আপনার প্রোগ্রামটি একটি তালিকা, সংগ্রহ বা অ্যারের মতো তৈরি করবে

list

all;

অথবা যদি ";" স্থানগুলির মতো পৃথককারী হিসাবে বিবেচিত

/user/files/

list

all

আপনার প্রোগ্রামটি ইউনিক্স-স্টাইল "পাইপ" ছাড়াই একটি একক নির্দেশের প্রত্যাশা দিয়ে শুরু করতে পারে, উইন্ডোজ-স্টাইলের পুনঃনির্দেশ নয়।

আপনার প্রোগ্রামে প্রতিটি নির্দেশের নির্দেশাবলীর একটি অভিধান তৈরি করতে পারে, পরামিতিগুলির একটি তালিকা থাকতে পারে।

কমান্ড ডিজাইনের ধরণটি আপনার ক্ষেত্রে প্রযোজ্য:

http://en.wikipedia.org/wiki/Command_pattern

এটি একটি "প্লেইন সি" সিউডোকোড, পরীক্ষা বা সমাপ্ত নয়, কীভাবে এটি করা যায় তার একটি ধারণা।

আপনি এটিকে আরও অবজেক্ট ওরিয়েন্টেড এবং প্রোগ্রামিং ভাষায় আপনার পছন্দ করতে পারেন।

উদাহরণ:


// "global function" pointer type declaration
typedef
  void (*ActionProc) ();

struct Command
{
  char[512] Identifier;
  ActionProc Action; 
};

// global var declarations

list<char*> CommandList = new list<char*>();
list<char*> Tokens = new list<char*>();

void Action_ListDirectory()
{
  // code to list directory
} // Action_ListDirectory()

void Action_ChangeDirectory()
{
  // code to change directory
} // Action_ChangeDirectory()

void Action_CreateDirectory()
{
  // code to create new directory
} // Action_CreateDirectory()

void PrepareCommandList()
{
  CommandList->Add("ls", &Action_ListDirectory);
  CommandList->Add("cd", &Action_ChangeDirectory);
  CommandList->Add("mkdir", &Action_CreateDirectory);

  // register more commands
} // void PrepareCommandList()

void interpret(char* args, int *ArgIndex)
{
  char* Separator = " ";
  Tokens = YourSeparateInTokensFunction(args, Separator);

  // "LocateCommand" may be case sensitive
  int AIndex = LocateCommand(CommandList, args[ArgIndex]);
  if (AIndex >= 0)
  {
    // the command

    move to the next parameter
    *ArgIndex = (*ArgIndex + 1);

    // obtain already registered command
    Command = CommandList[AIndex];

    // execute action
    Command.Action();
  }
  else
  {
    puts("some kind of command not found error, or, error syntax");
  }  
} // void interpret()

void main(...)
{
  bool CanContinue = false;
  char* Prompt = "c\:>";

  char Buffer[512];

  // which command line parameter string is been processed
  int ArgsIndex = 0;

  PrepareCommandList();

  do
  {
    // display "prompt"
    puts(Prompt);
    // wait for user input
      fgets(Buffer, sizeof(Buffer), stdin);

    interpret(buffer, &ArgsIndex);

  } while (CanContinue);

} // void main()

আপনি আপনার প্রোগ্রামিং ভাষার উল্লেখ করেননি। আপনি যে কোনও প্রোগ্রামিং ভাষার উল্লেখ করতে পারেন, তবে তবে "এক্সওয়াইজেড"।


0

আপনার সামনে বেশ কয়েকটি কাজ রয়েছে।

আপনার প্রয়োজনীয়তা তাকান ...

  • আপনাকে কমান্ডটি বিশ্লেষণ করতে হবে। এটি মোটামুটি সহজ কাজ
  • আপনার একটি এক্সটেনসিবল কমান্ড ভাষা থাকা দরকার।
  • আপনার ত্রুটি পরীক্ষা এবং পরামর্শ থাকা দরকার।

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

ত্রুটি পরীক্ষা করে বোঝানো হয় যে আপনার সিস্টেম সম্ভাব্য কমান্ডগুলি সম্পর্কেও জানে। এটি পোস্ট-কমান্ড সিস্টেমের অংশ হবে।

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


0

ফাংশনাল প্রোগ্রামিংয়ে একটি দুর্দান্ত বৈশিষ্ট্য রয়েছে যা আপনার সন্ধান করতে আগ্রহী হতে পারে।

একে প্যাটার্ন ম্যাচিং বলে

স্কালায় এবং এফ # তে প্যাটার্নের মিলের উদাহরণের জন্য দুটি লিঙ্ক এখানে রয়েছে ।

আমি আপনার সাথে একমত যে switchকাঠামো ব্যবহার করা কিছুটা ক্লান্তিকর এবং আমি বিশেষত স্কালায় একটি সংকলক প্রয়োগের জন্য প্যাটার্ন ম্যাচিং ডুরিন্ট ব্যবহার করে উপভোগ করেছি।

বিশেষত, আমি আপনাকে স্কাল ওয়েবসাইটের ল্যাম্বডা ক্যালকুলাস উদাহরণটি সন্ধান করার পরামর্শ দিচ্ছি ।

এটি, আমার মতে, এগিয়ে যাওয়ার দুর্দান্ততম উপায়, তবে যদি আপনাকে পিএইচপি সহ কঠোরভাবে থাকতে হয়, তবে আপনি "পুরাতন-বিদ্যালয়ের" সাথে আটকে আছেন switch


0

পরীক্ষা করে দেখুন এ্যাপাচি CLI , এটা সম্পূর্ণ উদ্দেশ্য ঠিক কাজ করা কি আপনি কি করতে চান বলে মনে হয়, তাই এমনকি যদি আপনি এটি ব্যবহার করতে পারবেন না, আপনি খুঁজে তার স্থাপত্য চেক করুন এবং যে অনুলিপি করতে পারবেন।

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