我如何在 PLY 中发表评论

How do i do comments in PLY

如何在 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)
    }
};

评论标记应该看起来像这样\\继承和多态性\\但它看起来像这样\\继承和多态性\\;public class Main(){ public static main() { println... 我试过这样做t_COMMENT = r"\\.*\\"但是没有用我也试过这样

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

问题是 * 是一个贪婪的匹配,这意味着它会消耗超过它需要的:例如假设我们有这行代码 \a\;print("ab");\b\;print("end") 评论标记会吐出从第一个 \ 到最后一个 \ 以及介于两者之间的所有内容使评论标记看起来像这样 \a\;print("ab");\b\ 这很糟糕。

* 运算符上使用 ? 将贪婪运算符变成惰性运算符,这意味着评论标记将从第一个 \ 吐出到下一个 \ stop make the token 找另一条评论,最终输出分成2份,应该是这样的。 1.\a\ 2.\b\

在这个 * 上使用 ? 让它变得懒惰,做它想让我做的事

固定代码是这个\\.*?\\,如果你想了解更多关于贪婪和惰性运算符的详细信息,请看这个question

我建议您在像 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\

根据 regex101,它需要双反斜杠,因为

\ matches the character \ literally (case sensitive)

根据 regex101,它需要 (.|\n)*? 因为

2nd Capturing Group (.|\n)*?

*? matches the previous token between zero and unlimited times, as few times as possible, expanding as needed (lazy)