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