我正在使用Ply来解释 FORTRAN 格式字符串。我在编写正则表达式以匹配格式为“H”的编辑描述符时遇到问题
x H ccccc ...
其中x指定在“H”之后要读入的字符数
Ply 将标记与单个正则表达式匹配,但我无法使用正则表达式执行上述操作。我正在寻找类似的东西,
(\d+)[Hh].{\1}
where\1被解析为整数并作为正则表达式的一部分进行评估 - 但事实并非如此。
看来以后在同一个正则表达式中不可能使用匹配的数字,是这样吗?
有没有人有其他可能使用 Ply 的解决方案?
我正在使用Ply来解释 FORTRAN 格式字符串。我在编写正则表达式以匹配格式为“H”的编辑描述符时遇到问题
x H ccccc ...
其中x指定在“H”之后要读入的字符数
Ply 将标记与单个正则表达式匹配,但我无法使用正则表达式执行上述操作。我正在寻找类似的东西,
(\d+)[Hh].{\1}
where\1被解析为整数并作为正则表达式的一部分进行评估 - 但事实并非如此。
看来以后在同一个正则表达式中不可能使用匹配的数字,是这样吗?
有没有人有其他可能使用 Ply 的解决方案?
正则表达式不能做那样的事情。你可以破解它:
(1[Hh].|2[Hh]..|3[Hh]...|etc...)
丑陋!
这就是认为正则表达式可以取代词法分析器的想法。
简短版本:正则表达式只能处理所有可能语言中称为“正则”的一小部分(我知道,这很令人惊讶)。但是“正则”与人类对“简单”的理解并不同构,因此即使是非常简单的语言也可以有非正则表达式。
为一种简单的语言编写词法分析器并不难。
有关该主题的资源的规范 Stack Overflow 问题是Learning to write a compiler。
啊。我似乎误解了这个问题。过错。
我对 ply 不熟悉,自从我使用 flex 以来已经有一段时间了,但认为你会吃掉后面的任意数量的数字,然后检查相关的代码块是否遵守了规则。
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 有类似的东西,也许你可以使用这种技术。