regex 我如何在PLY中做评论

r1zhe5dt  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(148)

我如何做评论在ply。我正在用PLY做一个名为calico的翻译器。我遇到的一个问题是评论。它们应该看起来像\\\\this\\\\。但是,我在执行它们时遇到了一些麻烦。下面是calico的源代码

...
\\inheritance and polymorphism\\;
public class Main(){
    public static main() {
        println("test"); \\hello world\\;
        me = class Person(11, "a", "b", "11/09/09"); \\objects\\;
        println(me.get_details());
        me.tax(); \\encapsulation\\;
        println(me.get_details());
        me2 = class Employee(11, "a", "b", "11/09/09", "n", "11/09/35", 1000)
    }
};

注解标记看起来应该是这样的\\\\inheritance and polymorphism\\\\,但实际上它看起来像这样的继承和多态性; public class Main(){ public static main(){ println...我试过这样做t_COMMENT = r"\\\\.*\\\\",但没有工作,我也试过这样做

def t_COMMENT(t):
    r'(/\\(.|\n)*?\\/)|(//.*)'
    pass
htzpubme

htzpubme1#

问题是*是一个贪婪的匹配,这意味着它会消耗比它需要的更多:例如,假设我们有这行代码\\a\\;print("ab");\\b\\;print("end"),注解标记将从第一个\\吐出到最后一个\\,以及中间的所有内容,使注解标记看起来像\\a\\;print("ab");\\b\\,这是不好的。
*操作符上使用?,将贪婪操作符转换为懒惰操作符,这意味着注解标记将从第一个\\到下一个\\停止,使标记并找到另一个注解,最终输出被分成2,就像它应该的那样。1. \\a\\ 2. \\b\\
在这个*上使用?会使它变得懒惰,做它想让我做的事情
修正的代码是这个\\\\.*?\\\\,如果你想了解更多关于贪婪和懒惰运算符的细节,就来看看这个问题吧

o2rvlv0m

o2rvlv0m2#

我建议您单独测试正则表达式,在像regex101.com这样的独立网站中
下面是一个link to the regex
我测试了这个字符串来声明注解:

(\\\\(.|\n)*?\\\\)

我找到了三个匹配的

\\ a multiline
comment \\
print (a)
\\inheritance and polymorphism\\;print ("ab");\\b\\;print("end")

\\ a multiline
comment \\

和/或

\\inheritance and polymorphism\\

和/或

\\b\\

根据regex 101,它需要双反斜杠,因为
“匹配字符”(区分大小写)
根据regex 101,它需要(.|\n)*?,因为
第2集(第2集)|\n)*?

  • ?在零到无限次之间匹配前一个令牌,次数尽可能少,根据需要扩展(惰性)

相关问题