Определение грамматики 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.

Другие вопросы по тегам