开发者社区> 问答> 正文

使用“fr”字符串定义语法的递归正则表达式

在为我正在创建的语言创建语法规则时,我希望能够检查语法并逐步执行它,而不是当前的方法,因为它常常会遗漏语法错误。 我已经开始使用正则表达式来定义语法,就像这样:

add = r"(\+)"
sub = r"(-)"
mul = r"(\*)"
div = r"(\\)"
pow = r"(\^)"
bin_op = fr"({add}|{sub}|{mul}|{div}|{pow})"

open_br = r"(\()"
close_br = r"(\))"
open_sq = r"(\[)"
close_sq = r"(\])"

dot = r"(\.)"

short_id = r"([A-Za-z]\d*)" # i.e. "a1", "b1232", etc.
long_id = r"([A-Za-z0-9]+)" # i.e. "sin2", "tan", etc. for use in assignment
long_id_ref = r"('" + long_id + "')" # i.e. "'sin'", for referencing
#note that "'sin'" is one value while "sin" = "s" * "i" * "n"
id_assign = fr"({short_id}|{long_id})" # for assignment
id_ref = fr"({short_id}|{long_id_ref})" # for reference (apostrophes)

integer = r"(\d+)" # i.e 123
float = fr"(\d+{dot}\d+)" # i.e. 3.4
operand = fr"({integer}|{float}|{id_ref})"

现在的问题是,这里的定义可能是递归的,例如表达式= fr“{expression}{bin_op}{expression}|({open_br}{expression}{close_br})|({expression}{open_sq}{expression}{close_sq})|…”当然,问题是在定义表达式时没有定义表达式,因此会引发错误。 似乎(?R)不会工作,因为它会复制之前的一切,而不是整个字符串。Python的正则表达式有处理这个问题的方法吗?或者我必须创建我自己的BNF或支持递归的正则表达式解释器吗? 或者,使用正则表达式而不使用递归是否可行? 我知道有第三方应用程序可以帮助解决这个问题,但我希望能够自己完成这些工作,而不需要外部代码。 问题来源StackOverflow 地址:/questions/59383155/recursive-regular-expressions-for-defining-syntax-using-fr-strings

展开
收起
kun坤 2019-12-27 11:21:15 453 0
1 条回答
写回答
取消 提交回答
  • 技术架构师 阿里云开发者社区技术专家博主 CSDN签约专栏技术博主 掘金签约技术博主 云安全联盟专家 众多开源代码库Commiter

    整个转换器吧

    2020-01-04 22:55:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载