代码之家  ›  专栏  ›  技术社区  ›  Brendan

如何在后面的regex中计算匹配的数字?-带ply的lexing fortran“h”编辑描述符

  •  1
  • Brendan  · 技术社区  · 16 年前

    我正在使用 Ply 解释Fortran格式字符串。我在写一个正则表达式来匹配 'H' edit descriptor 哪种形式的

    X H ccccc…

    在哪里? X 指定“h”之后要读取的字符数

    ply将令牌与单个正则表达式匹配,但使用正则表达式执行上述操作时遇到问题。我在找类似的东西,

    (\d+)[Hh].{\1}

    在哪里? \1 被解析为整数,并作为regex的一部分进行计算,但实际上不是。

    似乎 it is not possible to use matched numbers later in the same regex 是这样吗?

    是否有人有其他可能使用PLY的解决方案?

    3 回复  |  直到 10 年前
        1
  •  2
  •   Mark Byers    16 年前

    Regex不能做那样的事。但你可以破解它:

    (1[Hh].|2[Hh]..|3[Hh]...|etc...)
    

    丑陋!

        2
  •  0
  •   Community Mohan Dere    9 年前

    这就是为什么我们认为regexps可以取代lexer。

    简短的版本:正则表达式只能处理所有可能语言中被称为“正则”的那一小部分(我知道,这让人大吃一惊)。但是“正则”并不是同构于人类对“简单”的理解,所以即使非常简单的语言也可以有非正则表达式。

    为一种简单的语言编写一个lexer并不难。

    主题上资源的规范堆栈溢出问题是 Learning to write a compiler .


    啊。我似乎误解了这个问题。兆。

    我对ply不熟悉,用flex已经有一段时间了,不过我想你会吃的。 任意数量 跟在数字后面,然后 检查 在相关的代码块中,如果遵守了规则。

        3
  •  0
  •   PaulMcG    16 年前

    pyparsing包含一个与此非常类似的自适应表达式,称为countedarray。CountedArray(expr)解析前导整数“n”,然后解析expr的“n”实例,将整个数组返回为单个列表。其工作方式是CountedArray解析前导整数表达式,后跟未初始化的前向表达式。前导整数表达式附加了一个parse操作,该操作将以下forward赋给“n”*expr。然后,PyParsing解析器继续,并解析下面的“n”expr。因此,它是一种自我修改解析器。

    要分析表达式,如下所示:

    integer = Word(nums).setParseAction(lambda t:int(t[0]))
    following = Forward()
    integer.addParseAction(lambda t: following << Word(printables+" ",exact=t[0]))
    H_expr = integer + 'H' + following
    print H_expr.parseString("22HThis is a test string.This is not in the string")
    

    印刷品:

    [22, 'H', 'This is a test string.']
    

    如果ply有类似的东西,也许您可以使用这种技术。