glob - 文件路径通配符 (glob) 的 BNF 语法定义

标签 glob bnf peg ometa

我正在寻找一些用 BFN 规则描述的广泛扩展的方言(比如这个 https://github.com/vmeurisse/wildmatch + globstar **)。

任何格式或语言。 OMeta 或 PEG 会很棒。

最佳答案

我不确定是否理解您的问题,因为文件路径通配符的语法可以简化为简单的正则表达式。该语法由 Unix Shell 定义。

你可以在这里找到 Bash 的 BNF: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 .
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)'

那可以帮你写de 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

由著名的 ANTLR 工具解析的流行语法列表可在此处获得:http://www.antlr3.org/grammar/list.html .

关于glob - 文件路径通配符 (glob) 的 BNF 语法定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25711465/

相关文章:

Erlang 语法 - 为 Erlang 构建 Intellij IDEA 语言支持插件

gruntjs - Gruntfile 中的简单正则表达式

python - 将打印语句写入文本文件

c++ - 为什么主表达式不包含 template_id

java - 如何将 EBNF 重复实现为 Java 代码?

parsing - 解析器不会停止解析任意换行符和空格

javascript - 如何将简单语法转换为可在 PEG.js 中使用的语法(预期为 "a"但找到了 "a")

ruby - Treetop ruby​​ 解析器 - 无法解析 Ordered Choice

regex - 通配符的行为是否有所不同?

php - 使用 PHP ftp_get() 检索具有通配 rune 件名的文件