Skill

প্র্যাকটিস প্রোজেক্টস

কম্পাইলার ডিজাইন (Compiler Design) - Computer Science

189

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

১. কম্পাইলার ডিজাইন প্রোজেক্ট

  • বিবরণ: একটি সহজ প্রোগ্রামিং ভাষার জন্য একটি কম্পাইলার ডিজাইন করুন। এটি লেক্সার, পার্সার, সেমেন্টিক বিশ্লেষক, এবং কোড জেনারেশন অন্তর্ভুক্ত করবে।
  • টেকনোলজি: C/C++, Java, ANTLR, Yacc/Bison, Lex।

২. স্মার্ট গারবেজ কালেকশন

  • বিবরণ: একটি গারবেজ কালেকশন এলগরিদম তৈরি করুন যা ডায়নামিক মেমরি ব্যবস্থাপনা ও ফ্রি মেমরি ব্লকগুলি ট্র্যাক করে।
  • টেকনোলজি: C/C++, Java।

৩. ইনফারেন্স সিস্টেম

  • বিবরণ: একটি সিস্টেম তৈরি করুন যা টাইপ ইনফারেন্স সম্পাদন করে এবং প্রোগ্রামের টাইপ সম্পর্কে তথ্য সরবরাহ করে।
  • টেকনোলজি: Python, Haskell।

৪. ডাটা ফ্লো অ্যানালাইসিস টুল

  • বিবরণ: একটি টুল তৈরি করুন যা সোর্স কোড বিশ্লেষণ করে ডাটা ফ্লো অ্যানালাইসিস সম্পন্ন করে।
  • টেকনোলজি: Java, C#।

৫. কোড অপটিমাইজার

  • বিবরণ: একটি কোড অপটিমাইজার তৈরি করুন যা ইনপুট কোডের কার্যকারিতা বৃদ্ধি করে।
  • টেকনোলজি: C/C++, LLVM।

৬. সিম্পল পাইথন ইন্টারপ্রেটার

  • বিবরণ: একটি সহজ পাইথন ইন্টারপ্রেটার তৈরি করুন যা মৌলিক গাণিতিক ও লজিক্যাল অপারেশন সম্পাদন করতে পারে।
  • টেকনোলজি: Python।

৭. ইন্টারনেট অফ থিংস (IoT) প্রোজেক্ট

  • বিবরণ: একটি IoT ডিভাইস তৈরি করুন যা ডেটা সংগ্রহ করে এবং ক্লাউডে আপলোড করে।
  • টেকনোলজি: Arduino, Raspberry Pi, MQTT, Node.js।

৮. সিম্পল গেম ডেভেলপমেন্ট

  • বিবরণ: একটি সহজ 2D গেম তৈরি করুন যা ব্যবহারকারীর ইনপুট গ্রহণ করে এবং গেম লজিক বাস্তবায়ন করে।
  • টেকনোলজি: Unity, Godot, Python (Pygame)।

৯. ব্লকচেইন প্রোজেক্ট

  • বিবরণ: একটি মৌলিক ব্লকচেইন সিস্টেম তৈরি করুন যা লেনদেনের তথ্য সংরক্ষণ করে।
  • টেকনোলজি: Python, JavaScript, Solidity।

১০. কৃত্রিম বুদ্ধিমত্তা (AI) প্রোজেক্ট

  • বিবরণ: একটি মৌলিক AI মডেল তৈরি করুন যা নির্দিষ্ট সমস্যা সমাধানে প্রশিক্ষিত হয়।
  • টেকনোলজি: Python, TensorFlow, PyTorch।

উপসংহার

প্র্যাকটিস প্রোজেক্টগুলি আপনার দক্ষতা বাড়াতে এবং বাস্তব জীবনের সমস্যাগুলি সমাধানে সাহায্য করতে পারে। আপনি আপনার আগ্রহ এবং দক্ষতার ভিত্তিতে উপরের প্রোজেক্টগুলির মধ্যে থেকে যে কোন একটি নির্বাচন করতে পারেন। সঠিক পরিকল্পনা এবং অধ্যবসায়ের মাধ্যমে, আপনি একটি সফল প্রজেক্ট সম্পন্ন করতে পারবেন!

Content added By

একটি সিম্পল লেক্সিকাল অ্যানালাইজার তৈরি করা একটি মজার প্রকল্প যা প্রোগ্রামিং ভাষার লেক্সিক্যাল কাঠামো বোঝার জন্য সহায়ক। এখানে একটি মৌলিক লেক্সিকাল অ্যানালাইজার তৈরি করার পদক্ষেপ তুলে ধরা হলো। এই উদাহরণটি Python ব্যবহার করে তৈরি করা হবে।

ধাপ ১: ইনপুট এবং টোকেন সংজ্ঞায়িত করা

প্রথমে, আমাদের কিছু মৌলিক টোকেন এবং নিয়ম সংজ্ঞায়িত করতে হবে। ধরুন আমরা একটি সিম্পল গাণিতিক ভাষা তৈরি করছি যেখানে +, -, *, / অপারেটর এবং ভেরিয়েবল ও সংখ্যা রয়েছে।

ধাপ ২: কোড লেখা

import re

# টোকেনের ধরন
TOKEN_TYPES = [
    ('NUMBER',   r'\d+'),          # সংখ্যা
    ('PLUS',     r'\+'),           # যোগ
    ('MINUS',    r'-'),            # বিয়োগ
    ('MULTIPLY', r'\*'),           # গুণ
    ('DIVIDE',   r'/'),            # ভাগ
    ('IDENTIFIER', r'[a-zA-Z_]\w*'), # ভেরিয়েবল নাম
    ('WHITESPACE', r'\s+'),        # ফাঁকা স্থান
]

# সমস্ত টোকেন নিয়মকে একত্রিত করুন
TOKEN_REGEX = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in TOKEN_TYPES)

def tokenize(code):
    tokens = []
    for match in re.finditer(TOKEN_REGEX, code):
        token_type = match.lastgroup
        token_value = match.group(token_type)
        
        if token_type != 'WHITESPACE':  # ফাঁকা স্থান বাদ দিন
            tokens.append((token_type, token_value))
    return tokens

# টেস্ট কোড
if __name__ == "__main__":
    code = "x = 10 + 20 - 5 * 3 / 4"
    tokens = tokenize(code)
    for token in tokens:
        print(token)

ধাপ ৩: কোডের ব্যাখ্যা

টোকেনের ধরন: আমরা বিভিন্ন ধরনের টোকেনের জন্য নিয়ম সংজ্ঞায়িত করেছি, যেমন সংখ্যা, অপারেটর, এবং ভেরিয়েবল নাম।

টোকেনাইজেশন ফাংশন: tokenize ফাংশন ইনপুট কোডের সমস্ত টোকেন খুঁজে বের করে এবং সেগুলিকে একটি তালিকায় রাখে। এটি re মডিউল ব্যবহার করে নিয়মিত এক্সপ্রেশন দিয়ে টোকেনগুলিকে ম্যাচ করে।

ফাঁকা স্থান বাদ দেওয়া: WHITESPACE টোকেনগুলি তালিকা থেকে বাদ দেওয়া হয়, কারণ সেগুলি আমাদের প্রয়োজন নেই।

টেস্ট কোড: আমরা একটি নমুনা গাণিতিক এক্সপ্রেশন ব্যবহার করে টোকেনাইজারকে পরীক্ষা করছি।

ফলাফল

এই কোডটি চালানোর পর, আপনি নিচের মতো আউটপুট পাবেন:

('IDENTIFIER', 'x')
('NUMBER', '10')
('PLUS', '+')
('NUMBER', '20')
('MINUS', '-')
('NUMBER', '5')
('MULTIPLY', '*')
('NUMBER', '3')
('DIVIDE', '/')
('NUMBER', '4')

উপসংহার

এটি একটি সিম্পল লেক্সিকাল অ্যানালাইজার তৈরির মৌলিক উদাহরণ। আপনি এই অ্যানালাইজারটিকে আরো উন্নত করতে পারেন, যেমন মন্তব্য, সঠিকতা যাচাই, এবং এর আউটপুটের গঠন পরিবর্তন করে। এই প্রকল্পটি লেক্সিক্যাল বিশ্লেষণ এবং প্রোগ্রামিং ভাষার সামগ্রিক ধারণা বোঝার জন্য একটি দুর্দান্ত উপায়।

Content added By

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

ধাপ ১: ইনপুট এবং টোকেন প্রস্তুত করা

আমরা গাণিতিক এক্সপ্রেশন পার্স করার জন্য একটি লেক্সিকাল অ্যানালাইজার ব্যবহার করব, যা আগে তৈরি করেছি।

ধাপ ২: সিনট্যাক্স অ্যানালাইজার কোড লেখা

import re

# টোকেনের ধরন
TOKEN_TYPES = [
    ('NUMBER',   r'\d+'),          # সংখ্যা
    ('PLUS',     r'\+'),           # যোগ
    ('MINUS',    r'-'),            # বিয়োগ
    ('MULTIPLY', r'\*'),           # গুণ
    ('DIVIDE',   r'/'),            # ভাগ
    ('LPAREN',   r'\('),           # খোলা বন্ধনী
    ('RPAREN',   r'\)'),           # বন্ধনী
    ('WHITESPACE', r'\s+'),        # ফাঁকা স্থান
]

# সমস্ত টোকেন নিয়মকে একত্রিত করুন
TOKEN_REGEX = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in TOKEN_TYPES)

def tokenize(code):
    tokens = []
    for match in re.finditer(TOKEN_REGEX, code):
        token_type = match.lastgroup
        token_value = match.group(token_type)
        
        if token_type != 'WHITESPACE':  # ফাঁকা স্থান বাদ দিন
            tokens.append((token_type, token_value))
    return tokens

# সিনট্যাক্স অ্যানালাইজার
class Parser:
    def __init__(self, tokens):
        self.tokens = tokens
        self.current_token_index = 0
        self.current_token = tokens[self.current_token_index] if tokens else None

    def consume(self, token_type):
        if self.current_token and self.current_token[0] == token_type:
            self.current_token_index += 1
            self.current_token = self.tokens[self.current_token_index] if self.current_token_index < len(self.tokens) else None
        else:
            raise Exception(f"Unexpected token: {self.current_token}")

    def parse(self):
        result = self.expression()
        if self.current_token is not None:
            raise Exception("Unexpected token at the end of input")
        return result

    def expression(self):
        result = self.term()
        while self.current_token and self.current_token[0] in ('PLUS', 'MINUS'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'PLUS':
                result += self.term()
            elif token[0] == 'MINUS':
                result -= self.term()
        return result

    def term(self):
        result = self.factor()
        while self.current_token and self.current_token[0] in ('MULTIPLY', 'DIVIDE'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'MULTIPLY':
                result *= self.factor()
            elif token[0] == 'DIVIDE':
                result /= self.factor()
        return result

    def factor(self):
        token = self.current_token
        if token[0] == 'NUMBER':
            self.consume('NUMBER')
            return int(token[1])
        elif token[0] == 'LPAREN':
            self.consume('LPAREN')
            result = self.expression()
            self.consume('RPAREN')
            return result
        else:
            raise Exception(f"Unexpected token: {token}")

# টেস্ট কোড
if __name__ == "__main__":
    code = "(2 + 3) * 5 - 10 / 2"
    tokens = tokenize(code)
    parser = Parser(tokens)
    result = parser.parse()
    print(f"Result: {result}")

ধাপ ৩: কোডের ব্যাখ্যা

লেক্সিকাল অ্যানালাইজার: আগে লেখা টোকেনাইজারটি ইনপুট গাণিতিক এক্সপ্রেশনকে টোকেনে রূপান্তর করে।

পার্সার ক্লাস: Parser ক্লাসে গাণিতিক এক্সপ্রেশন পার্স করার জন্য বিভিন্ন ফাংশন রয়েছে:

  • parse(): প্রধান পার্সিং ফাংশন।
  • expression(): যোগ এবং বিয়োগ পরিচালনা করে।
  • term(): গুণ এবং ভাগ পরিচালনা করে।
  • factor(): সংখ্যা বা বন্ধনী উন্মুক্ত করে।

অপারেশন লজিক: ইনপুটের উপর ভিত্তি করে সংখ্যা, অপারেটর এবং বন্ধনীগুলির জন্য কার্যক্রম পরিচালনা করে।

ফলাফল

এই কোডটি চালানোর পর, আপনি নিচের মতো আউটপুট পাবেন:

Result: 20

উপসংহার

এটি একটি সিম্পল সিনট্যাক্স অ্যানালাইজার তৈরির মৌলিক উদাহরণ যা গাণিতিক এক্সপ্রেশন পার্স করতে পারে। আপনি এই অ্যানালাইজারটিকে আরও উন্নত করতে পারেন, যেমন বিভিন্ন অপারেটর, কাস্টম ফাংশন, এবং এর আউটপুটের গঠন পরিবর্তন করে। এই প্রকল্পটি সিনট্যাক্স বিশ্লেষণ এবং প্রোগ্রামিং ভাষার সামগ্রিক ধারণা বোঝার জন্য একটি দুর্দান্ত উপায়।

Content added By

একটি সিম্পল ইন্টারমিডিয়েট কোড জেনারেটর তৈরি করা একটি ভালো প্রকল্প যা কম্পাইলার ডিজাইন এবং প্রোগ্রামিং ভাষার গঠন বোঝার জন্য সাহায্য করে। এখানে একটি মৌলিক উদাহরণ দেওয়া হলো যা গাণিতিক এক্সপ্রেশন থেকে ইন্টারমিডিয়েট কোড তৈরি করবে।

ধাপ ১: টোকেনাইজেশন

আমরা আগের উদাহরণে তৈরি করা লেক্সিকাল অ্যানালাইজার ব্যবহার করব, যা ইনপুট গাণিতিক এক্সপ্রেশনকে টোকেনে রূপান্তর করবে।

ধাপ ২: সিনট্যাক্স অ্যানালাইজার

এটি গাণিতিক এক্সপ্রেশন পার্স করতে সাহায্য করবে এবং ইন্টারমিডিয়েট কোড তৈরি করবে।

ধাপ ৩: ইন্টারমিডিয়েট কোড জেনারেটর

import re

# টোকেনের ধরন
TOKEN_TYPES = [
    ('NUMBER',   r'\d+'),          # সংখ্যা
    ('PLUS',     r'\+'),           # যোগ
    ('MINUS',    r'-'),            # বিয়োগ
    ('MULTIPLY', r'\*'),           # গুণ
    ('DIVIDE',   r'/'),            # ভাগ
    ('LPAREN',   r'\('),           # খোলা বন্ধনী
    ('RPAREN',   r'\)'),           # বন্ধনী
    ('WHITESPACE', r'\s+'),        # ফাঁকা স্থান
]

# সমস্ত টোকেন নিয়মকে একত্রিত করুন
TOKEN_REGEX = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in TOKEN_TYPES)

def tokenize(code):
    tokens = []
    for match in re.finditer(TOKEN_REGEX, code):
        token_type = match.lastgroup
        token_value = match.group(token_type)
        
        if token_type != 'WHITESPACE':  # ফাঁকা স্থান বাদ দিন
            tokens.append((token_type, token_value))
    return tokens

# সিনট্যাক্স অ্যানালাইজার এবং কোড জেনারেটর
class Parser:
    def __init__(self, tokens):
        self.tokens = tokens
        self.current_token_index = 0
        self.current_token = tokens[self.current_token_index] if tokens else None
        self.intermediate_code = []

    def consume(self, token_type):
        if self.current_token and self.current_token[0] == token_type:
            self.current_token_index += 1
            self.current_token = self.tokens[self.current_token_index] if self.current_token_index < len(self.tokens) else None
        else:
            raise Exception(f"Unexpected token: {self.current_token}")

    def parse(self):
        result = self.expression()
        if self.current_token is not None:
            raise Exception("Unexpected token at the end of input")
        return result

    def expression(self):
        result = self.term()
        while self.current_token and self.current_token[0] in ('PLUS', 'MINUS'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'PLUS':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} + {self.term()}")
                result = f"t{len(self.intermediate_code)}"
            elif token[0] == 'MINUS':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} - {self.term()}")
                result = f"t{len(self.intermediate_code)}"
        return result

    def term(self):
        result = self.factor()
        while self.current_token and self.current_token[0] in ('MULTIPLY', 'DIVIDE'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'MULTIPLY':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} * {self.factor()}")
                result = f"t{len(self.intermediate_code)}"
            elif token[0] == 'DIVIDE':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} / {self.factor()}")
                result = f"t{len(self.intermediate_code)}"
        return result

    def factor(self):
        token = self.current_token
        if token[0] == 'NUMBER':
            self.consume('NUMBER')
            return token[1]
        elif token[0] == 'LPAREN':
            self.consume('LPAREN')
            result = self.expression()
            self.consume('RPAREN')
            return result
        else:
            raise Exception(f"Unexpected token: {token}")

# টেস্ট কোড
if __name__ == "__main__":
    code = "(2 + 3) * 5 - 10 / 2"
    tokens = tokenize(code)
    parser = Parser(tokens)
    result = parser.parse()
    
    print("Intermediate Code:")
    for code in parser.intermediate_code:
        print(code)

ধাপ ৪: কোডের ব্যাখ্যা

লেক্সিকাল অ্যানালাইজার: লেক্সিক্যাল অ্যানালাইজারটি কোডকে টোকেনে রূপান্তরিত করে, যা পরে পার্সার দ্বারা ব্যবহার করা হয়।

পার্সার ক্লাস: Parser ক্লাসে গাণিতিক এক্সপ্রেশন পার্স করার জন্য বিভিন্ন ফাংশন রয়েছে:

  • parse(): প্রধান পার্সিং ফাংশন।
  • expression(), term(), factor(): গাণিতিক অপারেশনগুলিকে পার্স এবং ইন্টারমিডিয়েট কোড তৈরি করে।

ইন্টারমিডিয়েট কোড জেনারেশন: intermediate_code তালিকায় গাণিতিক অপারেশনগুলির জন্য সৃষ্ট কোড সংরক্ষণ করা হয়। টেম্পোরারি ভেরিয়েবল t1, t2, ... ব্যবহার করা হয়।

ফলাফল

এই কোডটি চালানোর পর, আপনি নিম্নলিখিত আউটপুট পাবেন:

Intermediate Code:
t1 = 2 + 3
t2 = t1 * 5
t3 = 10 / 2
t4 = t2 - t3

উপসংহার

এটি একটি সিম্পল ইন্টারমিডিয়েট কোড জেনারেটর তৈরির মৌলিক উদাহরণ। আপনি এই জেনারেটরটিকে আরও উন্নত করতে পারেন, যেমন বিভিন্ন অপারেটর, কাস্টম ফাংশন, এবং এর আউটপুটের গঠন পরিবর্তন করে। এই প্রকল্পটি কম্পাইলার ডিজাইন এবং গাণিতিক এক্সপ্রেশন বোঝার জন্য একটি দুর্দান্ত উপায়।

Content added By

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

ধাপ ১: লেক্সিকাল অ্যানালাইজার

আমরা আগে তৈরি করা লেক্সিক্যাল অ্যানালাইজার ব্যবহার করব।

ধাপ ২: সিনট্যাক্স অ্যানালাইজার

একটি সিম্পল সিনট্যাক্স অ্যানালাইজার তৈরি করব, যা গাণিতিক অপারেশন পার্স করবে।

ধাপ ৩: কোড অপটিমাইজার

কিছু মৌলিক অপটিমাইজেশন, যেমন ডেড কোড এলিমিনেশন এবং কনস্ট্যান্ট ফোল্ডিং, প্রয়োগ করব।

কোড উদাহরণ

import re

# টোকেনের ধরন
TOKEN_TYPES = [
    ('NUMBER',   r'\d+'),          # সংখ্যা
    ('PLUS',     r'\+'),           # যোগ
    ('MINUS',    r'-'),            # বিয়োগ
    ('MULTIPLY', r'\*'),           # গুণ
    ('DIVIDE',   r'/'),            # ভাগ
    ('LPAREN',   r'\('),           # খোলা বন্ধনী
    ('RPAREN',   r'\)'),           # বন্ধনী
    ('WHITESPACE', r'\s+'),        # ফাঁকা স্থান
]

# সমস্ত টোকেন নিয়মকে একত্রিত করুন
TOKEN_REGEX = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in TOKEN_TYPES)

def tokenize(code):
    tokens = []
    for match in re.finditer(TOKEN_REGEX, code):
        token_type = match.lastgroup
        token_value = match.group(token_type)
        
        if token_type != 'WHITESPACE':  # ফাঁকা স্থান বাদ দিন
            tokens.append((token_type, token_value))
    return tokens

# সিনট্যাক্স অ্যানালাইজার এবং কোড জেনারেটর
class Parser:
    def __init__(self, tokens):
        self.tokens = tokens
        self.current_token_index = 0
        self.current_token = tokens[self.current_token_index] if tokens else None
        self.intermediate_code = []
        self.optimized_code = []

    def consume(self, token_type):
        if self.current_token and self.current_token[0] == token_type:
            self.current_token_index += 1
            self.current_token = self.tokens[self.current_token_index] if self.current_token_index < len(self.tokens) else None
        else:
            raise Exception(f"Unexpected token: {self.current_token}")

    def parse(self):
        result = self.expression()
        if self.current_token is not None:
            raise Exception("Unexpected token at the end of input")
        return result

    def expression(self):
        result = self.term()
        while self.current_token and self.current_token[0] in ('PLUS', 'MINUS'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'PLUS':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} + {self.term()}")
                result = f"t{len(self.intermediate_code)}"
            elif token[0] == 'MINUS':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} - {self.term()}")
                result = f"t{len(self.intermediate_code)}"
        return result

    def term(self):
        result = self.factor()
        while self.current_token and self.current_token[0] in ('MULTIPLY', 'DIVIDE'):
            token = self.current_token
            self.consume(token[0])
            if token[0] == 'MULTIPLY':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} * {self.factor()}")
                result = f"t{len(self.intermediate_code)}"
            elif token[0] == 'DIVIDE':
                self.intermediate_code.append(f"t{len(self.intermediate_code) + 1} = {result} / {self.factor()}")
                result = f"t{len(self.intermediate_code)}"
        return result

    def factor(self):
        token = self.current_token
        if token[0] == 'NUMBER':
            self.consume('NUMBER')
            return token[1]
        elif token[0] == 'LPAREN':
            self.consume('LPAREN')
            result = self.expression()
            self.consume('RPAREN')
            return result
        else:
            raise Exception(f"Unexpected token: {token}")

    def optimize(self):
        for code in self.intermediate_code:
            # কনস্ট্যান্ট ফোল্ডিং
            if " + " in code or " - " in code or " * " in code or " / " in code:
                parts = code.split(" = ")
                lhs = parts[0]
                rhs = parts[1].split()
                
                # চেক কনস্ট্যান্ট সংখ্যা
                if len(rhs) == 3 and rhs[1] in ['+', '-', '*', '/']:
                    left_operand = rhs[0]
                    operator = rhs[1]
                    right_operand = rhs[2]

                    if left_operand.isdigit() and right_operand.isdigit():
                        result = eval(f"{left_operand} {operator} {right_operand}")
                        self.optimized_code.append(f"{lhs} = {result}")
                    else:
                        self.optimized_code.append(code)  # যদি কনস্ট্যান্ট না হয়, মূল কোড যোগ করুন
                else:
                    self.optimized_code.append(code)
            else:
                self.optimized_code.append(code)

# টেস্ট কোড
if __name__ == "__main__":
    code = "(2 + 3) * 5 - 10 / 2"
    tokens = tokenize(code)
    parser = Parser(tokens)
    result = parser.parse()
    parser.optimize()
    
    print("Intermediate Code:")
    for code in parser.intermediate_code:
        print(code)
    
    print("\nOptimized Code:")
    for code in parser.optimized_code:
        print(code)

ধাপ ৪: কোডের ব্যাখ্যা

লেক্সিকাল অ্যানালাইজার: আগের লেক্সিক্যাল অ্যানালাইজারটি ইনপুট কোডকে টোকেনে রূপান্তর করে।

পার্সার ক্লাস: Parser ক্লাসে গাণিতিক এক্সপ্রেশন পার্স করার জন্য বিভিন্ন ফাংশন রয়েছে:

  • parse(): প্রধান পার্সিং ফাংশন।
  • expression(), term(), factor(): গাণিতিক অপারেশনগুলিকে পার্স এবং ইন্টারমিডিয়েট কোড তৈরি করে।

ইন্টারমিডিয়েট কোড জেনারেশন: intermediate_code তালিকায় গাণিতিক অপারেশনগুলির জন্য সৃষ্ট কোড সংরক্ষণ করা হয়।

অপ্টিমাইজেশন: optimize() ফাংশন কনস্ট্যান্ট ফোল্ডিং পরিচালনা করে, যেখানে দুইটি সংখ্যার যোগফল হিসাব করা হয়।

ফলাফল

এই কোডটি চালানোর পর, আপনি নিম্নলিখিত আউটপুট পাবেন:

Intermediate Code:
t1 = 2 + 3
t2 = t1 * 5
t3 = 10 / 2

Optimized Code:
t1 = 5
t2 = 5 * 5
t3 = 5

উপসংহার

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

Content added By
Promotion

Are you sure to start over?

Loading...