কঠিন পথে
আপনি একটি পুনরাবৃত্তিক বংশদ্ভুত পার্সার চান ।
অগ্রাধিকার পাওয়ার জন্য আপনাকে পুনরাবৃত্তভাবে চিন্তা করতে হবে, উদাহরণস্বরূপ, আপনার নমুনা স্ট্রিংটি ব্যবহার করে,
1+11*5
ম্যানুয়ালি এটি করতে, আপনাকে পড়তে হবে 1
, তারপরে যোগটি দেখতে হবে এবং শুরু করে একটি সম্পূর্ণ নতুন পুনরাবৃত্ত পার্স "সেশন" শুরু 11
করতে হবে ... এবং 11 * 5
তার নিজস্ব ফ্যাক্টারে পার্স করা নিশ্চিত করুন , যার সাথে একটি পার্স গাছ পাওয়া যাবে 1 + (11 * 5)
।
এটি সমস্ত ব্যাখ্যা করার চেষ্টা করার পরেও বেদনাদায়ক বোধ করে, বিশেষত সি'র যুক্ত হওয়া শক্তিহীনতার সাথে দেখুন 11 টি বিশ্লেষণের পরে, যদি * আসলে + এর পরিবর্তে + হয়, আপনাকে একটি শব্দ তৈরির চেষ্টাটি ত্যাগ করে পরিবর্তে পার্স করতে হবে 11
নিজেকে একটি কারণ হিসাবে। আমার মাথা ইতিমধ্যে বিস্ফোরিত হয়। এটি পুনরাবৃত্তিমূলক শালীন কৌশল দ্বারা সম্ভব, তবে আরও একটি ভাল উপায় আছে ...
সহজ (ডান) উপায়
আপনি যদি বাইসনের মতো জিপিএল সরঞ্জাম ব্যবহার করেন তবে সম্ভবত লাইসেন্স সংক্রান্ত বিষয়ে আপনার চিন্তা করার দরকার নেই যেহেতু বাইসনের মাধ্যমে উত্পন্ন সি কোডটি জিপিএল দ্বারা আচ্ছাদিত হয়নি (আইএনএএল তবে আমি নিশ্চিত যে জিপিএল সরঞ্জামগুলি জিপিএলকে জোর করে না উত্পন্ন কোড / বাইনারিস; উদাহরণস্বরূপ অ্যাপল জিসিসির সাথে অ্যাপারচার বলে এবং কোডটি জিপিএল কোড ছাড়াই এটি বিক্রয় করে) কোডগুলি কম্পাইল করে।
বাইসন ডাউনলোড করুন (বা সমমানের কিছু, এএনটিএলআর ইত্যাদি) ডাউনলোড করুন।
সাধারণত কিছু নমুনা কোড থাকে যা আপনি কেবল বাইসন চালাতে এবং আপনার পছন্দসই সি কোডটি পেতে পারেন যা এই চারটি ফাংশন ক্যালকুলেটরটি দেখায়:
http://www.gnu.org/software/bison/manual/html_node/Infix-Calc.html
উত্পন্ন কোডটি দেখুন এবং দেখুন এটি যতটা সহজ শোনাচ্ছে তত সহজ নয়। এছাড়াও, বাইসনের মতো কোনও সরঞ্জাম ব্যবহারের সুবিধাগুলি হ'ল 1) আপনি কিছু শিখুন (বিশেষত যদি আপনি ড্রাগন বইটি পড়ে থাকেন এবং ব্যাকরণ সম্পর্কে শিখেন), 2) আপনি চক্রটি পুনরায় উদ্ভাবনের চেষ্টা করে এনআইএইচ এড়ান । একটি আসল পার্সার-জেনারেটর সরঞ্জামের সাহায্যে আপনার কাছে পরে আরও বড় হওয়ার আশা রয়েছে, আপনি জানেন এমন অন্যান্য লোককে দেখিয়ে যা পার্সারগুলি পার্সিং সরঞ্জামগুলির ডোমেন।
হালনাগাদ:
এখানকার লোকেরা প্রচুর পরামর্শ দিয়েছেন। পার্সিং সরঞ্জামগুলি এড়িয়ে যাওয়া বা কেবল শান্টিং ইয়ার্ড অ্যালগরিদম বা একটি হাত ঘূর্ণিত পুনরাবৃত্তিক শালীন পার্সার ব্যবহারের বিরুদ্ধে আমার কেবল সতর্কতা হ'ল এই ছোট খেলনা ভাষা 1 ফাংশন (পাপ, কোস, লগ) এবং ভেরিয়েবল, শর্ত এবং এর সাথে বড় বাস্তব ভাষায় রূপান্তর করতে পারে লুপ।
একটি ছোট, সাধারণ দোভাষীর জন্য ফ্লেক্স / বাইসন খুব ভালভাবে ওভারকিল হতে পারে তবে পরিবর্তনগুলি করা দরকার বা বৈশিষ্ট্যগুলি যুক্ত করার প্রয়োজন হলে একটি পার্সার + মূল্যায়নকারী লাইনটিতে সমস্যা সৃষ্টি করতে পারে। আপনার পরিস্থিতি পরিবর্তিত হবে এবং আপনাকে আপনার রায় ব্যবহার করতে হবে; কেবলমাত্র আপনার পাপের জন্য অন্য ব্যক্তিকে শাস্তি দেবেন না [2] এবং পর্যাপ্ত সরঞ্জামের চেয়ে কম তৈরি করুন।
পার্সিংয়ের জন্য আমার প্রিয় সরঞ্জাম
কাজের জন্য বিশ্বের সেরা সরঞ্জামটি পার্সেক গ্রন্থাগার (পুনরাবৃত্ত শালীন পার্সারদের জন্য) যা প্রোগ্রামিং ভাষা হাস্কেলের সাথে আসে। এটি দেখতে অনেকটা বিএনএফ এর মতো , বা পার্সিংয়ের জন্য কিছু বিশেষ সরঞ্জাম বা ডোমেন নির্দিষ্ট ভাষার মতো (নমুনা কোড [3]), তবে এটি আসলে হাস্কেলের একটি নিয়মিত গ্রন্থাগার, যার অর্থ এটি বাকীগুলির মতো একই বিল্ড স্টেপে সংকলিত হয়েছে আপনার হাস্কেল কোডটি রয়েছে এবং আপনি নির্বিচারে হাস্কেল কোডটি লিখতে পারেন এবং আপনার পার্সারের মধ্যে কল করতে পারেন এবং আপনি একই কোডে অন্য লাইব্রেরিগুলিকে মিশ্রিত করতে এবং মিলাতে পারেন । (হাস্কেল ব্যতীত অন্য ভাষায় এর মতো পার্সিংয়ের ভাষা এম্বেডিংয়ের ফলে সিনট্যাকটিক ক্রাফ্টের বোঝা বোঝা যায় way আমি সি-তে এটি করেছি এবং এটি বেশ ভালভাবে কাজ করে তবে এটি এত সুন্দর এবং সংযোগ নয়))
মন্তব্য:
1 রিচার্ড স্টলম্যান বলেছেন, কেন আপনাকে টিসিএল ব্যবহার করা উচিত নয়
ইমাক্সের মূল পাঠটি হ'ল এক্সটেনশনের ভাষাটি কেবল "সম্প্রসারণের ভাষা" হওয়া উচিত নয়। এটি একটি আসল প্রোগ্রামিং ল্যাঙ্গুয়েজ হওয়া উচিত, যা প্রচুর প্রোগ্রাম লেখার জন্য এবং রক্ষণাবেক্ষণের জন্য তৈরি করা হয়েছিল। কারণ মানুষ তা করতে চাইবে!
[2] হ্যাঁ, আমি এই "ভাষা" ব্যবহার করে চিরতরে দাগ পড়েছি।
এছাড়াও নোট করুন যে আমি যখন এই এন্ট্রিটি জমা দিয়েছিলাম তখন পূর্বরূপটি সঠিক ছিল, তবে পর্যাপ্ত পার্সারের চেয়ে এসও এর কম অনুচ্ছেদে আমার ঘনিষ্ঠ অ্যাঙ্কর ট্যাগটি খেয়েছিল , প্রমাণ করে যে পার্সারগুলি এটিকে ছোট করে দেখানোর মতো কিছু নয় কারণ আপনি যদি রেজিক্সগুলি ব্যবহার করেন এবং একটি হ্যাক আপনাকে হ্যাক করে you সম্ভবত সূক্ষ্ম এবং ছোট কিছু ভুল পেতে হবে ।
[3] পার্সেক ব্যবহার করে হাস্কেল পার্সারের স্নিপেট: চারটি ফাংশন ক্যালকুলেটর এক্সটেনশনস, বন্ধনী, গুণের জন্য সাদা স্থান এবং ধীরে ধীরে (পাই এবং ই এর মতো) প্রসারিত।
aexpr = expr `chainl1` toOp
expr = optChainl1 term addop (toScalar 0)
term = factor `chainl1` mulop
factor = sexpr `chainr1` powop
sexpr = parens aexpr
<|> scalar
<|> ident
powop = sym "^" >>= return . (B Pow)
<|> sym "^-" >>= return . (\x y -> B Pow x (B Sub (toScalar 0) y))
toOp = sym "->" >>= return . (B To)
mulop = sym "*" >>= return . (B Mul)
<|> sym "/" >>= return . (B Div)
<|> sym "%" >>= return . (B Mod)
<|> return . (B Mul)
addop = sym "+" >>= return . (B Add)
<|> sym "-" >>= return . (B Sub)
scalar = number >>= return . toScalar
ident = literal >>= return . Lit
parens p = do
lparen
result <- p
rparen
return result