我如何在 PLY 中发表评论

问题描述

我如何在 ply.js 中做评论。我正在 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,"11/09/09","n","11/09/35",1000)
    }
};

注释标记应该看起来像这样 \\inheritance and polymorphism\\ 但是它看起来像这样 \\inheritance and polymorphism\\;public class Main(){ public static main() { println... 我试过像这样 t_COMMENT = r"\\\\.*\\\\" 但这不起作用我也试过这样

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

解决方法

问题是 * 是一个贪婪的匹配,这意味着它会消耗比它需要的更多的时间:例如,假设我们有这行代码(“代码”),注释标记将吐出从第一个 \\ 到最后一个 \\ 以及其间所有不好的东西。

? 运算符上使用 * 将贪婪运算符转换为惰性运算符,这意味着注释标记将从第一个 \\ 吐出到下一个 {{1} } 停止制作令牌并找到另一条评论

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

固定代码是这个*,如果你想了解更多关于贪婪和懒惰运算符的细节,请访问这个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,它需要双反斜杠,因为

\ 字面上匹配字符 \(区分大小写)

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

第二个捕获组 (.|\n)*?

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