正则表达式 – 正则表达式匹配,用于删除句点字符的某些用法
我有一些Fortran 77源文件,我试图从非标准的STRUCTURE和RECORD语法转换为标准化的Fortran 90 TYPE语法.这方面的一个棘手问题是结构成员的不同处理方式.
非标: s.member = 1 标准: s%member = 1 因此,我需要在这些场景中捕获句点的所有用法,并用%字符替换它们.还不错,除非您考虑可以使用句点的所有方式(数字中的小数点,包含语句中的文件名,注释中的标点符号,Fortran 77关系运算符,可能还有其他).我已经做了一些预处理来修复关系运算符以使用Fortran 90符号,我并不真正关心修改注释的语法,但我还没有想出一个很好的方法来翻译它.对于上述情况,为%.看起来我应该能够用sed做到这一点,但我不确定如何匹配我需要修复的实例.这是我想到的规则: 在逐行的基础上: >如果该行以< whitespace> include开头,那么我们不应对该行做任何事情;将它传递给输出,所以我们不会搞乱include语句中的文件名. 我自己不是本土的Fortran演讲者,所以这里有一些例子: include 'file.inc' ! We don't want to do anything here. The line can ! begin with some amount of whitespace if x == 1 .or. y > 2.0 ! In this case,we don't want to touch the periods that ! are part of the logical operator ".or.". We also don't ! want to touch the period that is the decimal point ! in "2.0". if a.member < 4.0 .and. b.othermember == 1.0 ! We don't want to touch the periods ! inside the numbers,but we need to ! change the "a." and "b." to "a%" ! and "b%". 有什么好方法可以解决这个问题吗? 编辑:我实际上发现了一些其他运算符,其中包含一个没有符号等价物的点.我已经更新了上面的规则列表. 解决方法
你不能用正则表达式做到这一点,并不是那么容易.
如果我必须做你必须做的事情,我可能会手工完成,除非代码库很大.如果前者适用,首先将所有[a-zA-Z0-9].[a-zA-Z]替换为非常奇怪的东西,保证永远不会编译,如“@ WHATEVER @”,然后继续搜索所有这些手动控制后手动更换. 如果代码量很大,那么你需要编写一个解析器.我建议你使用python来标记基本的fortran结构,但请记住fortran不是一种易于解析的语言.按“每个例程”工作,并尝试查找所有使用的变量名称,将它们用作过滤器.如果您遇到类似a.whatever的内容,并且您知道a位于本地或全局变量列表中,请应用更改. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |