2014-09-07 12 views
7

के लिए बीएनएफ व्याकरण परिभाषा मैं बीएफएन नियमों के साथ वर्णित कुछ व्यापक रूप से विस्तारित बोली (जैसे इस https://github.com/vmeurisse/wildmatch + ग्लोबस्टार **) की खोज कर रहा हूं।फ़ाइल पथ वाइल्डकार्ड (ग्लोब)

किसी भी प्रारूप या भाषा में। ओमेता या पीईजी बहुत अच्छा होगा।

उत्तर

2

मुझे आपके प्रश्न को समझना निश्चित नहीं है क्योंकि फ़ाइल पथ वाइल्डकार्ड के व्याकरण को एक साधारण नियमित अभिव्यक्ति में कम किया जा सकता है। यह व्याकरण यूनिक्स शैल द्वारा परिभाषित किया गया है।

आप बैश यहाँ BNF पा सकते हैं: http://my.safaribooksonline.com/book/operating-systems-and-server-administration/unix/1565923472/syntax/lbs.appd.div.3

अजगर प्रोग्रामिंग भाषा में, glob.glob() समारोह की एक परिभाषा दस्तावेज में उपलब्ध है। यह फ़ंक्शन पैटर्न मिलान करने के लिए fnmatch.fnmatch() फ़ंक्शन का उपयोग करता है। दस्तावेज यहां उपलब्ध है: https://docs.python.org/2/library/fnmatch.html#fnmatch.fnmatch

fnmatch.fnmatch समारोह एक क्लासिक नियमित अभिव्यक्ति के लिए एक फ़ाइल पथ वाइल्डकार्ड पैटर्न का अनुवाद, इस तरह:

def translate(pat): 
    """Translate a shell PATTERN to a regular expression. 

    There is no way to quote meta-characters. 
    """ 

    i, n = 0, len(pat) 
    res = '' 
    while i < n: 
     c = pat[i] 
     i = i+1 
     if c == '*': 
      res = res + '.*' 
     elif c == '?': 
      res = res + '.' 
     elif c == '[': 
      j = i 
      if j < n and pat[j] == '!': 
       j = j+1 
      if j < n and pat[j] == ']': 
       j = j+1 
      while j < n and pat[j] != ']': 
       j = j+1 
      if j >= n: 
       res = res + '\\[' 
      else: 
       stuff = pat[i:j].replace('\\','\\\\') 
       i = j+1 
       if stuff[0] == '!': 
        stuff = '^' + stuff[1:] 
       elif stuff[0] == '^': 
        stuff = '\\' + stuff 
       res = '%s[%s]' % (res, stuff) 
     else: 
      res = res + re.escape(c) 
    return res + '\Z(?ms)' 

कि मदद कर सकते हैं डे BNF व्याकरण लिखने के लिए ...

संपादित

यहां एक बहुत ही सरल व्याकरण है:

wildcard : expr 
     | expr wildcard 

expr : WORD 
    | ASTERIX 
    | QUESTION 
    | neg_bracket_expr 
    | pos_bracket_expr 

pos_bracket_expr : LBRACKET WORD RBRACKET 

neg_bracket_expr : LBRACKET EXCLAMATION WORD RBRACKET 

प्रसिद्ध एएनटीएलआर उपकरण द्वारा पार्स किए गए लोकप्रिय व्याकरण की एक सूची यहां उपलब्ध है: http://www.antlr3.org/grammar/list.html

+0

'फ़ाइल पथ वाइल्डकार्ड के लिए व्याकरण को एक साधारण नियमित अभिव्यक्ति' में कम किया जा सकता है, वास्तव में हां। पैटर्न को दूसरे नियमित अभिव्यक्ति में बदलने के लिए नियमित अभिव्यक्ति लिखने का तरीका है जो पथ से मेल खा सकता है। लेकिन इस समाधान में पैटर्न में त्रुटि प्रबंधन की कमी है। इसके अलावा मुझे अपनी खुद की बोली बनाने के लिए समृद्ध व्याकरण क्रियान्वयन की आवश्यकता है। –

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