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.
fonte
2014-09-19 20:25:02
'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. –