问题描述
我如何在 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)*?
*?在零次和无限次之间匹配前一个令牌,尽可能少,根据需要扩展(懒惰)