কম্পিউটার টিউটোরিয়াল

রুবিতে স্ট্যাটিক অ্যানালাইসিস মাস্টার করুন: Parser Gem দিয়ে মেথড ও প্যারামিটার এক্সট্রাক্ট করুন

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

আপনি কীভাবে এটা করবেন?

আপনার প্রথম আইডিয়া হতে পারে এর জন্য একটি regexp লিখা…

কিন্তু কি এর চেয়ে ভালো কোনো পদ্ধতি আছে?

রুবিতে স্ট্যাটিক অ্যানালাইসিস মাস্টার করুন: Parser Gem দিয়ে মেথড ও প্যারামিটার এক্সট্রাক্ট করুন

হ্যাঁ!

স্ট্যাটিক অ্যানালাইসিস হলো একটি টেকনিক যা আপনি ব্যবহার করতে পারেন যখন আপনাকে সোর্স কোড থেকে ইনফরমেশন এক্সট্রাক্ট করতে হয়।

এটি করা হয় সোর্স কোডকে টোকেনে কনভার্ট করে (পার্সিং)।

চলুন সরাসরি এসে পড়ি!

Parser Gem ব্যবহার করা

রুবিতে স্ট্যান্ডার্ড লাইব্রেরিতে একটি পার্সার রয়েছে, নাম Ripper। আউটপুটটি কাজ করার জন্য কঠিন তাই আমি ফ্যান্টাস্টিক parser gem পছন্দ করি। Rubocop এই জেমটি ব্যবহার করে তার ম্যাজিক করার জন্য।

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

এখানে একটি উদাহরণ:

 ruby-parse -e '%w(hello world).map { |c| c.upcase }' 

আউটপুটটি এমন দেখায়:

 (block (send (array (str "hello") (str "world")) :map) (args (arg :c)) (send (lvar :c) :upcase)) 

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

উদাহরণ:

 require 'parser/current' code = File.read('app.rb') parsed_code = Parser::CurrentRuby.parse(code) 

পার্সার আপনার কোডের একটি AST (Abstract Syntax Tree) রিটার্ন করবে। নামটি দেখে ভয় পাবেন না, এটি শোনার চেয়ে সিম্পল 🙂

AST ট্রাভার্স করা

এখন যেহেতু আপনি parser gem ব্যবহার করে আপনার কোড পার্স করেছেন, আপনাকে রেজাল্টিং AST ট্রাভার্স করতে হবে।

আপনি এটা করতে পারেন AST::Processor- থেকে ইনহেরিট করে একটি ক্লাস তৈরি করে।

উদাহরণ:

 class Processor < AST::Processor end 

তারপর আপনাকে এই ক্লাস ইনস্ট্যানশিয়েট করতে হবে এবং .process মেথড কল করতে হবে:

 ast = Processor.new ast.process(parsed_code) 

আপনাকে কিছু on_ মেথড ডিফাইন করতে হবে। এই মেথডগুলো AST-এ নোড নামের সাথে মিলে যায়।

আপনার কোন মেথডগুলো ডিফাইন করতে হবে সেটা জানতে আপনি আপনার Processor ক্লাসে handler_missing মেথড যোগ করতে পারেন। আপনার on_begin মেথডও লাগবে।

 class Processor < AST::Processor def on_begin(node) node.children.each { |c| process(c) } end def handler_missing(node) puts "missing #{node.type}" end end 

এখানে আমরা আছি:

আপনার রুবি AST এবং একটি বেসিক প্রসেসর রয়েছে, আপনি যখন এই কোড রান করবেন আপনি আপনার AST-এর নোড টাইপগুলো দেখতে পাবেন।

এখন:

আপনাকে সকল on_ মেথড ইমপ্লিমেন্ট করতে হবে যা আপনি ব্যবহার করতে চান। উদাহরণস্বরূপ, আমি যদি সকল ইনস্ট্যান্স মেথড নাম তাদের লাইন নম্বরসহ চাই তবে আমি এভাবে করতে পারি:

 def on_def(node) line_num = node.loc.line method_name = node.children[0] puts "Found #{method_name} at line #{line_num}" end 

আপনি যখন আপনার প্রোগ্রাম এখন রান করবেন তবে এটি সকল খুঁজে পাওয়া মেথড নাম প্রিন্ট করবে।

উপসংহার

একটি রুবি স্ট্যাটিক অ্যানালাইসিস টুল বানানো এতটুকু কঠিন নয় যতটা দেখাবে। আপনি যদি একটি আরও কমপ্লিট উদাহরণ চান তবে আমার class_indexer জেমটি দেখুন। এখন আপনার পালা আপনার নিজস্ব টুলস বানাতে!

দয়া করে এই পোস্ট শেয়ার করুন আপনি যদি এটিকে এনজয় করেন! 🙂


  1. স্টফল ভাষার জন্য রুবি ইন্টারপ্রেটার গড়ে তোলা

  2. Minitest ডিমিস্টিফাইড: রুবিতে এটি কীভাবে কাজ করে

  3. রুবি NLP: ইনসাইটফুল টেক্সট মাইনিং-এর জন্য N-gram অ্যানালাইসিস মাস্টার করুন

  4. রুবিতে স্ট্যাটিক অ্যানালাইসিস মাস্টার করুন: Parser Gem দিয়ে মেথড ও প্যারামিটার এক্সট্রাক্ট করুন