Определение грамматики BNF для подстановочного знака пути файла (glob)
Я ищу какой-то широко распространенный диалект (например, https://github.com/vmeurisse/wildmatch + globstar **), описанный в правилах BFN.
В любом формате или на любом языке. OMeta или PEG было бы здорово.
1 ответ
Я не уверен, что понимаю ваш вопрос, так как грамматика для подстановочного знака пути к файлу может быть уменьшена до простого регулярного выражения. Эта грамматика определяется оболочкой Unix.
Вы можете найти BNF для Bash здесь: http://my.safaribooksonline.com/book/operating-systems-and-server-administration/unix/1565923472/syntax/lbs.appd.div.3
В языке программирования Python определение glob.glob()
Функция доступна в документации. Эта функция использует fnmatch.fnmatch()
функция для сопоставления с образцом. Документация доступна здесь: https://docs.python.org/2/library/fnmatch.html.
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)'
Это может помочь вам написать грамматику де БНФ...
РЕДАКТИРОВАТЬ
Вот очень простая грамматика:
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
Список популярных грамматик, проанализированных известным инструментом ANTLR, доступен здесь: http://www.antlr3.org/grammar/list.html.