Python 使用';定义语法的递归正则表达式;fr';串

Python 使用';定义语法的递归正则表达式;fr';串,python,regex,syntax,bnf,f-string,Python,Regex,Syntax,Bnf,F String,在为我正在编写的语言创建语法规则时,我希望能够检查语法并逐步执行,而不是使用当前的方法,因为当前的方法通常会忽略语法错误 我开始使用正则表达式来定义语法,如下所示: add=r“(\+)” sub=r“() mul=r“(\*)” div=r“(\\)” pow=r“(\ ^)” bin_op=fr“({add}{sub}{mul}{div}{pow})” 打开\u br=r“(\()” 关闭\u br=r“(\)” 打开sq=r“(\[)” 关闭\u sq=r“(\])” 点=r“(\)” 简

在为我正在编写的语言创建语法规则时,我希望能够检查语法并逐步执行,而不是使用当前的方法,因为当前的方法通常会忽略语法错误

我开始使用正则表达式来定义语法,如下所示:

add=r“(\+)”
sub=r“()
mul=r“(\*)”
div=r“(\\)”
pow=r“(\ ^)”
bin_op=fr“({add}{sub}{mul}{div}{pow})”
打开\u br=r“(\()”
关闭\u br=r“(\)”
打开sq=r“(\[)”
关闭\u sq=r“(\])”
点=r“(\)”
简短的_id=r“([A-Za-z]\d*)”,即“a1”、“b1232”等。
long_id=r“([A-Za-z0-9]+)”,即“sin2”、“tan”等,用于分配
long_id_ref=r“(““+long_id+”)”)”即“sin”,用于引用
#请注意,“'sin'”是一个值,而“sin”=“s”*“i”*“n”
id_assign=fr“({short_id}{long_id})”用于赋值
id_ref=fr“({short_id}{long_id_ref})”#供参考(撇号)
整数=r“(\d+)”即123
float=fr“(\d+{dot}\d+”#即3.4
操作数=fr“({integer}{float}}{id\u ref})”
现在这里的问题是定义可能是递归的,例如在
expression=fr{expression}{bin_op}{expression}{124;({open_br}{expression}{close_br}){124;({expression}{open sq expression}{close_sq}){124;
中,如您所见,我已经展示了一些可能是递归的表达式。当然,问题是定义
表达式
时没有定义
表达式
,因此会出现错误。 似乎
(?R)
不起作用,因为它会复制它之前的所有内容,而不是整个字符串。Python的正则表达式有办法处理这个问题吗?还是我必须创建自己的BNF或正则表达式解释器来支持递归? 或者,使用正则表达式但不使用任何递归是否可行


我知道有第三方应用程序可以帮助实现这一点,但我希望能够在没有外部代码的情况下自己完成这一切。

如果您有递归定义的语法,我认为最好编写一个解析器(假设您对使用Lark或类似的东西不感兴趣)。正则表达式对于一般解析来说是非常有限的。我完全同意@ggorlen。不幸的是,对于这个任务来说,Regex是一个错误的工具。
(?R)
及其派生工具应该在Python替换Regex引擎中提供,简称为
导入Regex