একটি .py ফাইল পার্স করুন, এএসটি পড়ুন, এটি সংশোধন করুন, এবং পরিবর্তিত উত্স কোডটি আবার লিখুন


168

আমি অজগর উত্স কোডটি প্রোগ্রামগতভাবে সম্পাদনা করতে চাই। মূলত আমি একটি .pyফাইল পড়তে চাই , এএসটি তৈরি করতে এবং তারপরে পরিবর্তিত পাইথন উত্স কোডটি (অর্থাৎ অন্য কোনও .pyফাইল) আবার লিখতে চাই।

স্ট্যান্ডার্ড পাইথন মডিউলগুলি ব্যবহার করে astবা যেমন পাইথন উত্স কোড পার্স / সংকলন করার উপায় আছে compiler। যাইহোক, আমি তাদের কোনও উত্স কোড পরিবর্তন করার উপায়গুলি (যেমন এই ফাংশন ঘোষণাটি মুছুন) সমর্থন করে এবং তারপরে পরিবর্তিত পাইথন উত্স কোডটি আবার লিখুন বলে আমি মনে করি না।

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


4
সংস্করণ ২.6 থেকে অবহেলিত: সংকলক প্যাকেজটি পাইথন 3.0 এ সরানো হয়েছে।
ডিএফএ

1
আপনি কি উত্স সম্পাদনা করতে পারবেন না? আপনি একটি সজ্জা লিখতে পারেন না কেন?
এস। লট

3
পবিত্র গরু! আমি একই কৌশলটি ব্যবহার করে অজগরটির জন্য একটি মিউটেশন টেস্টার তৈরি করতে চেয়েছিলাম (বিশেষত নাকের প্লাগইন তৈরি করা), আপনি কী ওপেন সোর্সিংয়ের পরিকল্পনা করছেন?
রায়ান

2
@ রায়ান হ্যাঁ আমি যা তৈরি করি তা উত্স থেকে খুলব। আমাদের এর সাথে যোগাযোগ রাখতে হবে
ররি

1
অবশ্যই, আমি আপনাকে লঞ্চপ্যাডের মাধ্যমে একটি ইমেল পাঠিয়েছি।
রায়ান 3

উত্তর:


73

পাইথোস্কোপ পাইথন ২.6 (এটি পাইথন ২.x উত্সকে পাইথন ৩.x উত্সে রূপান্তর করে) হিসাবে এটি স্বয়ংক্রিয়ভাবে 2to3 সরঞ্জামের মতো পরীক্ষার ক্ষেত্রে তৈরি করে to

এই দুটি সরঞ্জামই lib2to3 লাইব্রেরি ব্যবহার করে যা পাইথন পার্সার / সংকলক যন্ত্রপাতি প্রয়োগ করে যা উত্স -> এএসটি -> উত্স থেকে গোল হয়ে যাওয়ার পরে উত্সগুলিতে মন্তব্যগুলি সংরক্ষণ করতে পারে।

দড়ি প্রকল্পের যদি আপনি রূপান্তরগুলির মত আরো refactoring কাজ করতে চান আপনার চাহিদা পূরণ হতে পারে।

AST মডিউল আপনার অন্য বিকল্প, এবং সেখানে কিভাবে "unparse" সিনট্যাক্স গাছ কোড ফিরে একটি পুরোনো উদাহরণ (পার্সার মডিউল ব্যবহার করে)। তবে astমডিউলটি তখন কোনও কোডের মধ্যে একটি এসটি রূপান্তর করার সময় আরও কার্যকর হয় যা কোনও কোডের বস্তুতে রূপান্তরিত হয়।

Redbaron প্রকল্পের একটি সুযোগ্য হতে পারে (HT জেভিয়ার Combelle)


5
আনপারস উদাহরণটি এখনও বজায় রাখা আছে, এখানে আপডেট করা py3k সংস্করণটি রয়েছে: hg.python.org/cpython/log/tip/Tools/parser/unparse.py
জানুস

2
বিষয়ে unparse.pyস্ক্রিপ্ট - এটি সত্যিই অন্য স্ক্রিপ্ট থেকে এটি ব্যবহার করতে কষ্টকর হতে পারে। কিন্তু, একটি প্যাকেজ (astunparse বলা হয় GitHub উপর , pypi উপর ) যা মূলত একটি সঠিকভাবে প্যাকেজ সংস্করণ unparse.py
mbdevpl

আপনি কি পছন্দসই বিকল্প হিসাবে পার্সো যুক্ত করে আপনার উত্তর আপডেট করতে পারবেন? এটি খুব ভাল এবং আপডেটেড।
বক্স

59

বিল্টিন অ্যাস্ট মডিউলটিতে উত্সটিতে ফিরে রূপান্তর করার কোনও পদ্ধতি আছে বলে মনে হয় না। তবে এখানে কোডজেন মডিউলটি অ্যাস্টের জন্য একটি দুর্দান্ত প্রিন্টার সরবরাহ করে যা আপনাকে এটি করতে সক্ষম করে। যেমন।

import ast
import codegen

expr="""
def foo():
   print("hello world")
"""
p=ast.parse(expr)

p.body[0].body = [ ast.parse("return 42").body[0] ] # Replace function body with "return 42"

print(codegen.to_source(p))

এটি মুদ্রণ করবে:

def foo():
    return 42

মনে রাখবেন যে আপনি সঠিক বিন্যাস এবং মন্তব্যগুলি হারাতে পারেন, কারণ এগুলি সংরক্ষণ করা হয়নি।

তবে আপনার প্রয়োজন হতে পারে না। আপনার যা যা প্রয়োজন তা হ'ল প্রতিস্থাপন করা এএসটি কার্যকর করা, আপনি কেবলমাত্র অ্যাস্টে সংকলন () কল করে এবং ফলাফল কোড অবজেক্টটি চালিয়ে এটি করতে পারেন।


20
ভবিষ্যতে যে কারও জন্য এটি ব্যবহার করা যায়, কোডজেন বেশিরভাগ সময়সীমার মধ্যে রয়েছে এবং কয়েকটি বাগ রয়েছে। আমি তাদের বেশ কয়েকটি স্থির করেছি; গিথুবটিতে
ম্যাটবস্টা

লক্ষ্য করুন সর্বশেষ কোডজেনটি 2012 সালে আপডেট হয়েছে যা উপরের মন্তব্যের পরে, সুতরাং আমার ধারণা কোডজেন আপডেট হয়েছে updated @ ম্যাটবাস্টা
zjffdu

4
জ্যোতিষ কোডজেনের রক্ষণাবেক্ষণকারী উত্তরসূরি বলে মনে হয়
মেডমন্ডস

20

অন্য একটি উত্তরে আমি astorপ্যাকেজটি ব্যবহার করার পরামর্শ দিয়েছিলাম তবে আমি তখন থেকে আরও একটি আধুনিক যুগের এএসটি আন-পার্সিং প্যাকেজটি পেয়েছি astunparse:

>>> import ast
>>> import astunparse
>>> print(astunparse.unparse(ast.parse('def foo(x): return 2 * x')))


def foo(x):
    return (2 * x)

আমি পাইথন 3.5 তে এটি পরীক্ষা করেছি।


19

আপনার উত্স কোডটি পুনরায় উত্পন্ন করার দরকার হতে পারে না। অবশ্যই এটি আমার পক্ষে কিছুটা বিপজ্জনক, অবশ্যই, যেহেতু আপনি আসলে কোডটি পূর্ণ একটি .py ফাইল তৈরি করার দরকার মনে করছেন কেন আপনি তা ব্যাখ্যা করেন নি; কিন্তু:

  • যদি আপনি এমন একটি .পি ফাইল তৈরি করতে চান যা লোকেরা প্রকৃতপক্ষে ব্যবহার করবে, যাতে তারা কোনও ফর্ম পূরণ করতে পারে এবং তাদের প্রকল্পে .োকানোর জন্য একটি দরকারী .py ফাইল পেতে পারে, তবে আপনি এএসটি তে পরিবর্তন করতে চান না এবং ফিরে আসুন কারণ আপনি সমস্ত বিন্যাস হারাবেন (ফাঁকা রেখাগুলি যা পাইথনকে পাঠাগুলির সাথে সম্পর্কিত লাইনের সেটগুলি একসাথে গ্রুপিং করে এত সহজে পাঠযোগ্য করে তোলে) ( অ্যাস্ট নোডগুলি linenoএবং col_offsetবৈশিষ্ট্যগুলি ) মন্তব্যগুলি। পরিবর্তে, আপনি সম্ভবত একটি টেম্প্লেটিং ইঞ্জিন ( জাজানো টেম্পলেট ভাষা , উদাহরণস্বরূপ, .py ফাইলটি কাস্টমাইজ করার জন্য টেম্পলেট ফাইলগুলি সহজ করার জন্য ডিজাইন করা হয়েছে) ব্যবহার করতে চাইবেন বা অন্যথায় রিক কোপল্যান্ডের মেটাপাইথন এক্সটেনশন ব্যবহার করুন।

  • আপনি যদি কোনও মডিউল সংকলনের সময় কোনও পরিবর্তন করার চেষ্টা করছেন, তবে মনে রাখবেন যে আপনাকে পাঠ্যটিতে ফিরে যেতে হবে না; আপনি এপিএস ফাইলে ফিরার পরিবর্তে সরাসরি এএসটিটি সংকলন করতে পারেন।

  • তবে প্রায় কোনও ক্ষেত্রেই আপনি সম্ভবত গতিশীল কিছু করার চেষ্টা করছেন যা পাইথনের মতো একটি ভাষা আসলে নতুন .py ফাইল না লিখে খুব সহজ করে তোলে! আপনি আসলে কী অর্জন করতে চান তা আমাদের যদি জানতে আপনার প্রশ্নটি প্রসারিত করেন তবে নতুন .py ফাইলগুলি সম্ভবত উত্তরের সাথে জড়িত হবে না; আমি শত শত পাইথন প্রজেক্টকে শত শত বাস্তব-জগতের জিনিসগুলি করতে দেখেছি, এবং সেগুলির মধ্যে একটিও কখনও কখনও .py ফাইল লেখার প্রয়োজন পড়ে না। সুতরাং, আমি অবশ্যই স্বীকার করতে হবে, আমি একটি সন্দেহবাদী যে আপনি প্রথম ভাল ব্যবহারের ক্ষেত্রে খুঁজে পেয়েছি কিছুটা। :-)

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


সম্ভাব্য সমাধান এবং সম্ভাব্য বিকল্পগুলির ভাল ওভারভিউ।
রায়ান 17

1
কোড জেনারেশনের জন্য রিয়েল ওয়ার্ল্ড ইউজ কেস: কিড এবং গেনশি (আমি বিশ্বাস করি) গতিশীল পৃষ্ঠাগুলি দ্রুত রেন্ডারিংয়ের জন্য এক্সএমএল টেমপ্লেটগুলি থেকে পাইথন তৈরি করে gene
রিক কোপল্যান্ড 19

10

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

দ্রষ্টব্য: নীচের উদাহরণগুলিকে astমডিউল ব্যবহারের প্রবর্তনমূলক টিউটোরিয়াল হিসাবে বিবেচনা করা যেতে পারে তবে মডিউলটি ব্যবহারের জন্য আরও বিস্তৃত গাইড astএখানে গ্রিন ট্রি সাপের টিউটোরিয়াল এবং মডিউলের অফিসিয়াল ডকুমেন্টেশন পাওয়া যায়ast

পরিচয় ast:

>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> exec(compile(tree, filename="<ast>", mode="exec"))
Hello Python!!

আপনি কেবল এপিআই কল করে পাইথন কোডটি (স্ট্রিংয়ে উপস্থাপিত) পার্স করতে পারেন ast.parse()। এটি হ্যান্ডেলটি অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি (এএসটি) কাঠামোর কাছে ফিরিয়ে দেয়। আকর্ষণীয়ভাবে আপনি এই কাঠামোটি আবার সংকলন করতে এবং উপরে প্রদর্শিত হিসাবে এটি সম্পাদন করতে পারেন।

আর একটি খুব দরকারী এপিআই ast.dump()যা পুরো এএসটিটিকে স্ট্রিং আকারে ফেলে দেয়। এটি গাছের কাঠামোটি পরিদর্শন করতে ব্যবহার করা যেতে পারে এবং এটি ডিবাগিংয়ে খুব সহায়ক। উদাহরণ স্বরূপ,

পাইথন ২.7 এ:

>>> import ast
>>> tree = ast.parse("print 'Hello Python!!'")
>>> ast.dump(tree)
"Module(body=[Print(dest=None, values=[Str(s='Hello Python!!')], nl=True)])"

পাইথন 3.5 তে:

>>> import ast
>>> tree = ast.parse("print ('Hello Python!!')")
>>> ast.dump(tree)
"Module(body=[Expr(value=Call(func=Name(id='print', ctx=Load()), args=[Str(s='Hello Python!!')], keywords=[]))])"

পাইথন ২.7 বনাম পাইথন ৩.৫ এর প্রিন্ট স্টেটমেন্টের বাক্য গঠনের পার্থক্য এবং স্ব স্ব গাছগুলিতে এএসটি নোডের পার্থক্য লক্ষ্য করুন।


কীভাবে কোডটি সংশোধন করবেন ast:

এখন, astমডিউল দ্বারা পাইথন কোড পরিবর্তন করার উদাহরণ দেখুন at এএসটি কাঠামো সংশোধন করার প্রধান সরঞ্জামটি ast.NodeTransformerবর্গ। যখনই কাউকে এএসটি সংশোধন করা দরকার তখন তাকে সেখান থেকে সাবক্লাস করতে হবে এবং সেই অনুযায়ী নোড ট্রান্সফরমেশন (গুলি) লিখতে হবে।

আমাদের উদাহরণস্বরূপ, আসুন একটি সাধারণ ইউটিলিটি লেখার চেষ্টা করি যা পাইথন 2 রূপান্তর করে, পাইথন 3 ফাংশন কলগুলিতে মুদ্রণ বিবৃতি প্রিন্ট করে।

ফান কল রূপান্তরকারী ইউটিলিটি মুদ্রণ বিবৃতি: print2to3.py:

#!/usr/bin/env python
'''
This utility converts the python (2.7) statements to Python 3 alike function calls before running the code.

USAGE:
     python print2to3.py <filename>
'''
import ast
import sys

class P2to3(ast.NodeTransformer):
    def visit_Print(self, node):
        new_node = ast.Expr(value=ast.Call(func=ast.Name(id='print', ctx=ast.Load()),
            args=node.values,
            keywords=[], starargs=None, kwargs=None))
        ast.copy_location(new_node, node)
        return new_node

def main(filename=None):
    if not filename:
        return

    with open(filename, 'r') as fp:
        data = fp.readlines()
    data = ''.join(data)
    tree = ast.parse(data)

    print "Converting python 2 print statements to Python 3 function calls"
    print "-" * 35
    P2to3().visit(tree)
    ast.fix_missing_locations(tree)
    # print ast.dump(tree)

    exec(compile(tree, filename="p23", mode="exec"))

if __name__ == '__main__':
    if len(sys.argv) <=1:
        print ("\nUSAGE:\n\t print2to3.py <filename>")
        sys.exit(1)
    else:
        main(sys.argv[1])

এই ইউটিলিটিটি উদাহরণস্বরূপ ছোট ফাইলগুলিতে চেষ্টা করা যেতে পারে যেমন নীচের একটিতে এবং এটি ঠিকঠাক কাজ করা উচিত।

ইনপুট ফাইল পরীক্ষা করুন: py2.py

class A(object):
    def __init__(self):
        pass

def good():
    print "I am good"

main = good

if __name__ == '__main__':
    print "I am in main"
    main()

দয়া করে মনে রাখবেন যে উপরোক্ত রূপান্তরটি কেবলমাত্র astটিউটোরিয়াল উদ্দেশ্যে হয় এবং বাস্তবের ক্ষেত্রে দৃশ্যে একজনকে সমস্ত ভিন্ন পরিস্থিতিতে যেমন: দেখতে হবে print " x is %s" % ("Hello Python")


6

আমি সম্প্রতি বেশ স্থিতিশীল তৈরি করেছি (কোরটি সত্যই ভালভাবে পরীক্ষা করা হয়েছে) এবং এক্সটেনসিবল কোডের কোড যা astগাছ থেকে কোড উত্পন্ন করে : https://github.com/paluh/code-formatter

আমি আমার প্রকল্পটি একটি ছোট ভিআইএম প্লাগইন (যা আমি প্রতিদিন ব্যবহার করছি) এর বেস হিসাবে ব্যবহার করছি, তাই আমার লক্ষ্য সত্যই সুন্দর এবং পঠনযোগ্য অজগর কোড উত্পন্ন করা।

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


4

অন্য উত্তরগুলির মধ্যে একটি সুপারিশ করে codegen, যা মনে হয় এর দ্বারা উত্তীর্ণ হয়েছে astor। সংস্করণ astorPyPI উপর (এই লেখার হিসাবে সংস্করণ 0.5) একটু পাশাপাশি সেকেলে হয়ে যাবে, আপনি উন্নয়নে সংস্করণ ইনস্টল করতে পারেন যাতে মনে হয় astorনিম্নরূপ।

pip install git+https://github.com/berkerpeksag/astor.git#egg=astor

তারপরে আপনি astor.to_sourceপাইথন এএসটিকে মানব-পঠনযোগ্য পাইথন উত্স কোডে রূপান্তর করতে ব্যবহার করতে পারেন :

>>> import ast
>>> import astor
>>> print(astor.to_source(ast.parse('def foo(x): return 2 * x')))
def foo(x):
    return 2 * x

আমি পাইথন 3.5 তে এটি পরীক্ষা করেছি।


4

আপনি যদি 2019 এর দিকে তাকিয়ে থাকেন তবে আপনি এই libcst প্যাকেজটি ব্যবহার করতে পারেন । এটির সাথে অ্যাস্টের মতো সিনট্যাক্স রয়েছে। এটি একটি কবজির মতো কাজ করে এবং কোড কাঠামো সংরক্ষণ করে। এটি মূলত সেই প্রকল্পের জন্য সহায়ক যেখানে আপনাকে মন্তব্য, সাদা স্থান, নিউলাইন ইত্যাদি সংরক্ষণ করতে হবে for

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


2

আমাদের অনুরূপ প্রয়োজন ছিল, যা এখানে অন্যান্য উত্তরগুলির দ্বারা সমাধান করা হয়নি। সুতরাং আমরা এই জন্য, একটি গ্রন্থাগার নির্মিত ASTTokens , যা একটি এবং AST গাছ সঙ্গে উত্পাদিত লাগে এবং AST বা astroid মডিউল এবং মূল সোর্স কোডে লেখার রেঞ্জ দিয়ে চিহ্ন।

এটি কোডের সরাসরি পরিবর্তন করে না, তবে শীর্ষে যোগ করা কঠিন নয়, কারণ এটি আপনাকে পাঠ্যর পরিসরটি সংশোধন করতে হবে বলে দেয়।

উদাহরণস্বরূপ, এটি কোনও ফাংশন কলকে গুটিয়ে রাখে WRAP(...), মন্তব্যগুলি এবং অন্যান্য কিছুর সংরক্ষণ করে:

example = """
def foo(): # Test
  '''My func'''
  log("hello world")  # Print
"""

import ast, asttokens
atok = asttokens.ASTTokens(example, parse=True)

call = next(n for n in ast.walk(atok.tree) if isinstance(n, ast.Call))
start, end = atok.get_text_range(call)
print(atok.text[:start] + ('WRAP(%s)' % atok.text[start:end])  + atok.text[end:])

উত্পাদন:

def foo(): # Test
  '''My func'''
  WRAP(log("hello world"))  # Print

আশাকরি এটা সাহায্য করবে!


1

একটি প্রোগ্রাম রূপান্তর সিস্টেম , একটি সরঞ্জাম যা পার্স উৎস পাঠ্য ASTs তৈরী করে, আপনি সোর্স-টু-উৎস রূপান্তরের ব্যবহার ( "যদি এই প্যাটার্ন দেখতে, এটা যে প্যাটার্ন দ্বারা প্রতিস্থাপন") তাদের পরিবর্তন করতে পারবেন। এই জাতীয় সরঞ্জামগুলি বিদ্যমান উত্স কোডগুলির রূপান্তর করতে আদর্শ, যা কেবল "যদি আপনি এই প্যাটার্নটি দেখেন তবে কোনও প্যাটার্ন বৈকল্পিক দ্বারা প্রতিস্থাপন করুন"।

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

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

ডিএমএস দিয়ে পাইথনের জন্য "মিউটেশন" নিয়মটি প্রয়োগ করতে, আপনি নিম্নলিখিত লিখতে পারেন:

rule mutate_addition(s:sum, p:product):sum->sum =
  " \s + \p " -> " \s - \p"
 if mutate_this_place(s);

এই নিয়মটি সিন্ট্যাক্টিক্যালি সঠিক উপায়ে "+" "+" এর সাথে প্রতিস্থাপন করে; এটি এএসটি-তে পরিচালিত হয় এবং এভাবে ডানদিকে প্রদর্শিত স্ট্রিং বা মন্তব্যগুলিকে স্পর্শ করবে না। "Mutate_this_place" এ অতিরিক্ত শর্ত হ'ল এটি কত ঘন ঘন ঘটে তা আপনাকে নিয়ন্ত্রণ করতে দেয়; আপনি প্রোগ্রামের প্রতিটি স্থান পরিবর্তন করতে চান না ।

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


আমি এই উত্তরটি 4 বছরে দেখিনি। বাহ, এটি বেশ কয়েকবার ডাউনওয়েট করা হয়েছে। এটি সত্যই চমকপ্রদ, যেহেতু এটি ওপির প্রশ্নের সরাসরি উত্তর দেয় এবং এমনকি তিনি কীভাবে পরিবর্তন করতে চান তা কীভাবে রূপান্তরিত করে তাও দেখায়। আমি মনে করি না যে ডাউনভোটারদের মধ্যে কেউ তাদের কেন ডাউনটিভয়েস্ট করেছেন তা ব্যাখ্যা করার যত্ন নেবে ।
ইরা বাক্সার 22

4
কারণ এটি একটি খুব ব্যয়বহুল, বদ্ধ-উত্স সরঞ্জামটি প্রচার করে।
জোরাণ পাভলভিক

@ জোড়ানপাভলভিক: সুতরাং আপনি এর কোনও প্রযুক্তিগত নির্ভুলতা বা ইউটিলিটি নিয়ে আপত্তি করছেন না?
ইরা

2
@ জোড়ান: তিনি বলেননি যে ওপেন সোর্স লাইব্রেরি আছে। তিনি বলেছিলেন যে তিনি পাইথনের উত্স কোডটি (এএসটি ব্যবহার করে) পরিবর্তন করতে চেয়েছিলেন এবং যে সমাধানগুলি তিনি খুঁজে পেতে পারেন সেগুলি তা করেনি not এটি এমন একটি সমাধান। আপনি কি মনে করেন না যে জাভাতে পাইথনের মতো ভাষায় লিখিত প্রোগ্রামগুলিতে লোকেরা বাণিজ্যিক সরঞ্জাম ব্যবহার করে?
ইরা

1
আমি কোনও ডাউন ভোটার নই, তবে পোস্টটি বিজ্ঞাপনের মতো কিছুটা পড়ে। উত্তর উন্নত করতে, তোমরা প্রকাশ কর পারে যে আপনি পণ্য সঙ্গে সম্বন্ধযুক্ত করছি
Wim

0

আমি এটির জন্য ব্যারন ব্যবহার করতাম, তবে এখন পার্সোতে স্যুইচ করেছি কারণ এটি আধুনিক অজগর দিয়ে আধুনিক date এটি দুর্দান্ত কাজ করে।

মিউটেশন পরীক্ষকের জন্যও আমার এটি দরকার ছিল। পার্সো দিয়ে একটি তৈরি করা সত্যিই বেশ সহজ, আমার কোডটি https://github.com/boxed/mutmut এ দেখুন

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