1

我正在使用Ply来解释 FORTRAN 格式字符串。我在编写正则表达式以匹配格式为“H”的编辑描述符时遇到问题

x H ccccc ...

其中x指定在“H”之后要读入的字符数

Ply 将标记与单个正则表达式匹配,但我无法使用正则表达式执行上述操作。我正在寻找类似的东西,

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

where\1被解析为整数并作为正则表达式的一部分进行评估 - 但事实并非如此。

看来以后在同一个正则表达式中不可能使用匹配的数字,是这样吗?

有没有人有其他可能使用 Ply 的解决方案?

4

3 回答 3

2

正则表达式不能做那样的事情。你可以破解它:

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

丑陋!

于 2010-02-07T13:17:28.660 回答
0

这就是认为正则表达式可以取代词法分析器的想法。

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

为一种简单的语言编写词法分析器并不难。

有关该主题的资源的规范 Stack Overflow 问题是Learning to write a compiler


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

我对 ply 不熟悉,自从我使用 flex 以来已经有一段时间了,但认为你会吃掉后面的任意数量的数字,然后检查相关的代码块是否遵守了规则。

于 2010-02-07T16:36:51.703 回答
0

Pyparsing 包含一个与此非常相似的自适应表达式,称为 countedArray。countedArray(expr) 解析前导整数“n”,然后解析 expr 的“n”个实例,将整个数组作为单个列表返回。其工作方式是 countedArray 解析一个前导整数表达式,后跟一个未初始化的 Forward 表达式。前导整数表达式附加了一个解析操作,它将以下 Forward 分配给 'n'*expr。pyparsing 解析器然后继续,并解析以下 'n' expr's。所以它是一种自我修改的解析器。

要解析您的表达式,这看起来像:

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 有类似的东西,也许你可以使用这种技术。

于 2010-02-08T03:50:31.903 回答