2012-10-06 11 views
5

स्कैला पार्सर संयोजकों के साथ सी-स्टाइल मल्टी-लाइन टिप्पणियों (यानी, /* ... */) को पार्स करने के लिए सबसे अच्छा तरीका क्या है?स्कैला पार्सर कॉम्बिनेटर्स: कुशलता से पार्स सी-स्टाइल टिप्पणियां

एक परियोजना में जिसमें मैं शामिल हूं, हम सी-जैसी प्रोग्रामिंग भाषा का विश्लेषण करते हैं, और बहु-पंक्ति टिप्पणियों का समर्थन करना चाहते हैं। हम StandardTokenParsers का एक उपवर्ग, जो पहले से ही ऐसी टिप्पणियां (StdLexical के माध्यम से हैंडल का उपयोग करें। हालांकि, वर्ग केवल काफी कम बहु लाइन टिप्पणी के लिए काम करता है, और ढेर अंतरिक्ष अन्यथा से बाहर चलाता है।

हम भी हमारे अपने परिभाषा प्रदान की कोशिश की है खाली स्थान के की बातें अधिक कुशल बनाने के हम एक RegexParser (another question on StackOverflow से प्रेरित) का इस्तेमाल किया इस प्रकार है:।

class Parser extends StandardTokenParsers { 

    override val lexical = new StdLexical { 
    def rp: RegexParsers = new RegexParsers {} 
    override val whitespace: Parser[Any] = rp.regex("""(\s|//.*|(?m)/\*(\*(?!/)|[^*])*\*/)*""".r).asInstanceOf[Parser[Any]] 
    } 

    // ... 

} 

यह थोड़ा स्थिति में सुधार हुआ है, लेकिन अभी भी एक ढेर अतिप्रवाह का कारण बनता है, तो टिप्पणी कुछ दर्जन लाइनों से अधिक है। कोई विचार यह कैसे सुधारें?

उत्तर

7

हमें नियमित अभिव्यक्तियों का उपयोग करने के बजाय पार्सर्स का उपयोग करके व्हाइटस्पेस छोड़ने के द्वारा इस तरह के मुद्दे के साथ कुछ सफलता मिली है। कुछ समर्थन कोड के लिए हमारी किमा ParserUtilities.scala में व्हाइटस्पेस पार्सर विशेषता देखें।

सामान्य नियमित अभिव्यक्ति व्हाइटस्पेस हैंडलिंग को ओवरराइड करना और शाब्दिक और रेगेक्स संयोजकों में नए पार्सर को बांधना है (हम आमतौर पर टोकन पार्सर्स का उपयोग नहीं करते हैं)। उपयोग के लिए one of our examples देखें, इस मामले में नेस्टेड टिप्पणियों को संभालने के लिए।

संबंधित मुद्दे