रेप्रेज़ेंटर में नॉर्मलाइज़ेशन


जिन हलों में सिर्फ ऐसे अंतर हैं जो ज़रूरी नहीं हैं, उन सबका रिप्रेज़ेंटेशन एक जैसा बने, इसके लिए रिप्रेज़ेंटर को नॉर्मलाइज़ेशन लागू करना चाहिए। आम तौर पर नॉर्मलाइज़्ड रिप्रेज़ेंटेशन बनाने की प्रक्रिया ऐसी होती है:

  • हल के कोड को पार्स करके उसका एब्सट्रैक्ट सिंटैक्स ट्री (AST) बनाइए
  • AST पर नॉर्मलाइज़ेशन लागू कीजिए
  • नॉर्मलाइज़्ड AST को स्ट्रिंग में बदलिए
  • नॉर्मलाइज़्ड AST स्ट्रिंग को representation.txt नाम की फाइल में लिखिए (देखिए इंटरफेस)

लेकिन ध्यान रखिए कि रिप्रेज़ेंटेशन का AST होना ज़रूरी नहीं है। यह सामान्य (नॉर्मलाइज़्ड) कोड भी हो सकता है, जो भी आपके ट्रैक के लिए सबसे अच्छा काम करे।

शुरुआत करने में आपकी मदद के लिए, अब हम कुछ आम नॉर्मलाइज़ेशन रणनीतियाँ बताते हैं।

नोट 1: ये नॉर्मलाइज़ेशन के उदाहरण एक-दूसरे पर आधारित नहीं हैं, हर उदाहरण सिर्फ एक खास नॉर्मलाइज़ेशन दिखाता है। असल रिप्रेज़ेंटर इन्हें एक के बाद एक लागू करना चाहेगा।

नोट 2: इन दिशानिर्देशों का कोड C# में होगा, लेकिन ये दिशानिर्देश किसी खास भाषा तक सीमित नहीं हैं।

आइडेंटिफायर नॉर्मलाइज़ कीजिए

रिप्रेज़ेंटेशन में नामों से कोई फर्क न पड़े, इसके लिए उपयोगकर्ता के दिए नामों (जैसे वेरिएबल, फंक्शन वगैरह) को प्लेसहोल्डर से बदला जा सकता है। इस स्थिति में एक mapping.json बनाना चाहिए (देखिए इंटरफेस)।

ध्यान देना ज़रूरी है कि एक जैसे सारे नामों को एक ही प्लेसहोल्डर से बदला जाना चाहिए, चाहे उनका स्कोप कोई भी हो।

सोर्स कोड

public static class Fake
{
    public static int Test(int input)
    {
        var test = input + 2;
        return test;
    }
}

रिप्रेज़ेंटेशन

public static class PLACEHOLDER_1
{
    public static int PLACEHOLDER_2(int PLACEHOLDER_3)
    {
        var PLACEHOLDER_4 = PLACEHOLDER_3 + 2;
        return PLACEHOLDER_4;
    }
}

व्हाइट स्पेस नॉर्मलाइज़ कीजिए

कोड में व्हाइट स्पेस का अलग-अलग होना इतना आम है कि उसे नॉर्मलाइज़ करना एक आम कदम है। लाइन एंडिंग को भी नॉर्मलाइज़ करना चाहिए।

सोर्स कोड

using   System;

     public static    class Fake
{
    public     static   DateTime Add    (DateTime    birthDate)
    {
        return birthDate.Add( TimeSpan.FromSeconds   (   10  ) )   ;
    }
}

रिप्रेज़ेंटेशन

public static class Fake
{
    public static DateTime Add(DateTime birthDate)
    {
        return birthDate.Add(TimeSpan.FromSeconds(10));
    }
}

ब्लॉक नॉर्मलाइज़ कीजिए

कई भाषाओं में ब्लॉक (या स्कोप) तय करने का तरीका कुछ हद तक उपयोगकर्ता पर छोड़ा गया है। जैसे, ज़्यादातर C जैसी भाषाओं में स्कोप को कर्ली ब्रैकेट के बीच लिखा जाता है। आम तौर पर इससे कोई फर्क नहीं पड़ता कि आप ब्रैकेट को उसी लाइन पर रखते हैं या अगली लाइन पर, इसलिए इसे नॉर्मलाइज़ किया जा सकता है।

सोर्स कोड

public static class Fake {
    public static int Test() {
        if (1 > 2) {
            return 0;
        }

        return 1;
    }
}

रिप्रेज़ेंटेशन

public static class Fake
{
    public static int Test()
    {
        if (1 > 2)
        {
            return 0;
        }

        return 1;
    }
}

महत्वहीन कोड हटाइए

कोड का हर हिस्सा रिप्रेज़ेंटर के लिए महत्वपूर्ण नहीं होता, और ऐसे हिस्सों को हटाया जा सकता है। जैसे, ज़्यादातर भाषाओं में कमेंट महत्वहीन होते हैं और उन्हें बिना डर के हटाया जा सकता है।

सोर्स कोड

/*
   These are some very nice
   comments spanning multiple lines
*/
public static class Fake
{
    // Nice method
    public static string Test()
    {
        return "Test"; // This is very nice
    }
}

रिप्रेज़ेंटेशन

public static class Fake
{
    public static string Test()
    {
        return "Test";
    }
}

जहाँ महत्व नहीं है वहाँ क्रम नॉर्मलाइज़ कीजिए

कुछ मामलों में कोड का क्रम मायने नहीं रखता। एक ही कोड अलग-अलग क्रम में लिखे जाने पर अलग-अलग रिप्रेज़ेंटेशन न बनें, इसके लिए कोड को क्रम में लगाना (सॉर्ट करना) फायदेमंद हो सकता है। आम तौर पर क्रम में लगाने वाली चीज़ें फंक्शन या डिक्लेरेशन होती हैं। यह तय करना मुश्किल हो सकता है कि किस मापदंड से क्रम लगाया जाए, और इसे लागू करना भी मुश्किल हो सकता है। एक मापदंड यह हो सकता है कि किसी नोड में AST के कितने चाइल्ड नोड हैं, और दूसरा यह कि पहले चाइल्ड नोड के टाइप का नाम क्या है।

यह उदाहरण फंक्शन की लंबाई जैसे किसी मापदंड से क्रम लगाता है:

सोर्स कोड

public static class Fake
{
    public static string Test2()
    {
        int a = "Test2";
        return a;
    }

    public static string Test()
    {
        return "Test";
    }
}

रिप्रेज़ेंटेशन

public static class Fake
{
    public static string Test()
    {
        return "Test";
    }

    public static string Test2()
    {
        int a = "Test2";
        return a;
    }
}