2014-09-07 12 views

risposta

2

Non sono sicuro di capire la tua domanda dal momento che la grammatica per il percorso del file jolly può essere ridotta a una semplice espressione regolare. Questa grammatica è definita dalla shell Unix.

È possibile trovare il BNF per Bash qui: http://my.safaribooksonline.com/book/operating-systems-and-server-administration/unix/1565923472/syntax/lbs.appd.div.3

Nel linguaggio di programmazione Python, una definizione della funzione glob.glob() è disponibile nella documentazione. Questa funzione utilizza la funzione fnmatch.fnmatch() per eseguire la corrispondenza del modello. La documentazione è disponibile qui: https://docs.python.org/2/library/fnmatch.html#fnmatch.fnmatch.

La funzione fnmatch.fnmatch tradurre un modello di percorso di file jolly per una classica espressione regolare, in questo modo:

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)' 

che possono aiutare a scrivere de BNF grammatica ...

EDIT

Ecco una semplice grammatica:

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 

Un elenco di grammatiche popolari analizzate dal famoso strumento ANTLR è disponibile qui: http://www.antlr3.org/grammar/list.html.

+0

'la grammatica per il jolly del percorso del file può essere ridotta a un'espressione regolare semplice' beh, in realtà sì. C'è il modo di scrivere un'espressione regolare per trasformare il modello in un'altra espressione regolare che può corrispondere al percorso. Ma questa soluzione non ha la gestione degli errori nel modello. Inoltre ho bisogno di una ricca implementazione grammaticale per creare il mio dialetto. –

Problemi correlati