2017-03-14 12 views
5

मैं जंग में एक पार्सर लागू कर रहा हूं और व्हाइटस्पेस एक आम पैटर्न है जिसे मैं match पैटर्न में पुन: उपयोग करना चाहता हूं।मैं जंग में एक चर में एक पैटर्न कैसे स्टोर कर सकते हैं?

इस कोड काम करता है:

let ch = ' '; 

match ch { 
    ' ' | '\n' | '\t' | '\r' => println!("whitespace"), 
    _ => println!("token"), 
} 

यह वास्तव में दोहराव मिलेगा अगर मैं खाली स्थान के पैटर्न हर बार निर्दिष्ट करने पर रखने की जरूरत है। मैं इसे एक बार परिभाषित करना चाहता हूं और इसका पुन: उपयोग करना चाहता हूं।

let whitespace = ' ' | '\n' | '\t' | '\r'; 

let ch = ' '; 

match ch { 
    whitespace => println!("whitespace"), 
    _   => println!("token"), 
} 

संकलक ws काम पसंद नहीं है: मैं की तरह कुछ करना चाहते हैं। यह | को वैकल्पिकता के बजाय बाइनरी ऑपरेशन के रूप में व्याख्या करता है।

पैटर्न किसी भी तरह चर में संग्रहीत किया जा सकता है? क्या ऐसा करने के लिए कोई बेहतर या अधिक मूर्ख तरीका है?

+0

सी में यह एक मैक्रो के लिए एक अच्छा उम्मीदवार की तरह दिखेगा, आश्चर्य है कि मैक्रो जंग में जाने का तरीका भी है ... – turbulencetoo

+0

@ टर्बुलेंसेतु एक दिलचस्प विचार है। सी में, एक मैक्रो निम्न-स्तरीय टेक्स्ट मैनिपुलेशन होता है, जिसके परिणामस्वरूप अमान्य स्रोत कोड हो सकता है। जंग में, आप मैक्रो का आह्वान कर सकते हैं स्थानों की संख्या सीमित है और विस्तार वाक्य रचनात्मक रूप से मान्य होना चाहिए। मुझे नहीं लगता कि पैटर्न मान्य स्थानों के सेट में हैं। हालांकि, आप पाठ फ़ाइलों को उत्पन्न करने के लिए हमेशा कुछ प्रकार की बिल्ड स्क्रिप्ट कर सकते हैं जो परिणामस्वरूप वैध जंग कोड में होते हैं। – Shepmaster

उत्तर

10

क्या पैटर्न किसी भी तरह चर में संग्रहीत किए जा सकते हैं?

नहीं पैटर्न पैटर्न संकलन-समय निर्माण होते हैं, और चर चलने वाली अवधारणाओं को धारण करते हैं।

क्या ऐसा करने के लिए कोई बेहतर या अधिक मूर्ख तरीका है?

एक फ़ंक्शन या विधि बनाना दोहराना कोड से बचने के लिए हमेशा एक अच्छा समाधान है।

fn is_whitespace(c: char) -> bool { 
    match c { 
     ' ' | '\n' | '\t' | '\r' => true, 
     _ => false, 
    } 
} 

fn main() { 
    let ch = ' '; 

    match ch { 
     x if is_whitespace(x) => println!("whitespace"), 
     _ => println!("token"), 
    } 
} 

मैं भी दृढ़ता से एक मौजूदा पार्सर, of which there are a multitude उपयोग करने की अनुशंसा करते हैं, लेकिन हर कोई अपने जंग "हैलो दुनिया", पार्स करने जा करने के लिए जो भी कारण के लिए चाहता है।

एक पद व्याख्या पुस्तकालय का उपयोग मैं लेखन कोड इस के लिए समान की अनुमति देता है, जहां whitespace एक समारोह को पता है कि खाली स्थान के का वैध प्रकार पार्स करने के लिए कैसे:

sequence!(pm, pt, { 
    _   = literal("if"); 
    ws   = whitespace; 
    _   = literal("let"); 
    ws   = append_whitespace(ws); 
    pattern = pattern; 
    ws   = optional_whitespace(ws); 
    _   = literal("="); 
    ws   = optional_whitespace(ws); 
    expression = expression; 
}, |_, _| /* do something with pieces */); 

दाएँ हाथ की ओर पर चीजों में से प्रत्येक में हैं अभी भी अलग-अलग फ़ंक्शन जो जानते हैं कि कुछ विशिष्ट कैसे पार्स करें।

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