在为我正在创建的语言创建语法规则时,我希望能够检查语法并逐步执行它,而不是当前的方法,因为它常常会遗漏语法错误。 我已经开始使用正则表达式来定义语法,就像这样:
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
整个转换器吧
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。