Ruby:注释是令牌吗?

6
我刚刚在这里读到(http://ruby.runpaint.org/programs#lexical),评论是标记。我从来没有把注释看作是标记,因为它们要么是注解,要么是用于后处理。
评论真的是标记吗?还是这个来源是错误的?
2个回答

4

是的,它们应该是标记,但在解析器忽略它们后。如果您使用类似于这样的文件运行ruby --dump parsetree foo.rb,则应该被忽略的内容如下:

# this is a comment
1+1
# another comment

这是你将会得到的内容:

# @ NODE_SCOPE (line: 3)
# +- nd_tbl: (empty)
# +- nd_args:
# |   (null node)
# +- nd_body:
#     @ NODE_CALL (line: 2)
#     +- nd_mid: :+
#     +- nd_recv:
#     |   @ NODE_LIT (line: 2)
#     |   +- nd_lit: 1
#     +- nd_args:
#         @ NODE_ARRAY (line: 2)
#         +- nd_alen: 1
#         +- nd_head:
#         |   @ NODE_LIT (line: 2)
#         |   +- nd_lit: 1
#         +- nd_next:
#             (null node)

3

是的,它们是解析器的标记。通常,如果你使用解析器生成器,这就是注释的定义。

{code} short_comment = '//' not_cr_lf* eol | '#' not_cr_lf* eol;
{code} long_comment = '/*' not_star* '*'+ (not_star_slash not_star* '*'+)* '/';  /* '4vim */
Ignored Tokens
  short_comment,
  long_comment;

这是一个SableCC语法。它们通常是被忽略的标记。

请记住,您在源代码中编写的所有内容都是标记,这始终是第一步。解析器需要从标记开始构建抽象语法树。


谢谢。那么空格也是一个标记吗?我原本以为空格不是一个标记,而只是影响其他标记的识别。 - Matty
1
通常情况下,扫描器(生成令牌流的程序)会忽略空格。当然也有一些语言,如Python和CoffeeScript,空格是有意义的。 - Christoph Schiessl
1
Matty:这取决于编程语言。正如Christoph所说,有些语言使用显著的空格。在这种情况下,通常要跟踪当前缩进级别,并在级别增加时添加新范围/在级别减少时弹出一个范围。 - Michael Kohl
我刚刚查看了Ruby规范的草案,在这种情况下,似乎空格不被视为一个标记,而通常只是作为分隔符标记。 - Matty
这取决于你如何编写解析器。实际上,你可以更具体一些。例如,在Python中,重要的是\t和\s会被忽略。 - dierre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接