PHP:如何跳过评论?

时间:2010-12-05 16:16:00

标签: php comments language-design code-comments

好吧,如果我发表评论的话,它会在所有语言中被忽略,但它们是如何被跳过以及被勒死的?

示例:

// This is commented out

PHP现在读取整个注释以转到下一行还是只读取//

3 个答案:

答案 0 :(得分:7)

解析脚本并将其拆分为令牌

您可以使用token_get_all()自己尝试使用任何有效的PHP源代码,它使用PHP的本机标记器。

手册中的示例显示了如何处理评论:

<?php
$tokens = token_get_all('<?php echo; ?>'); /* => array(
                                                  array(T_OPEN_TAG, '<?php'), 
                                                  array(T_ECHO, 'echo'),
                                                  ';',
                                                  array(T_CLOSE_TAG, '?>') ); */

/* Note in the following example that the string is parsed as T_INLINE_HTML
   rather than the otherwise expected T_COMMENT (T_ML_COMMENT in PHP <5).
   This is because no open/close tags were used in the "code" provided.
   This would be equivalent to putting a comment outside of <?php ?> 
   tags in a normal file. */

$tokens = token_get_all('/* comment */'); 
// => array(array(T_INLINE_HTML, '/* comment */'));
?>

答案 1 :(得分:3)

编译时有一个标记化阶段。在此阶段,它会看到//然后忽略所有行到行尾。编译器可能会变得复杂,但大部分都非常简单。

http://compilers.iecc.com/crenshaw/

答案 2 :(得分:1)

你的问题没有意义。读完'//'后,必须继续读取换行符才能找到它。没有选择。没有其他方法找到换行符。

从概念上讲,编译在解析之前有逻辑上的几个阶段:

  1. 扫描
  2. 筛选。
  3. 符号化。
  4. (1)基本上是指从左到右逐字符读取文件。 (2)意味着扔掉没有兴趣的东西,例如将多个换行符/空白行序列折叠到一个空格中。 (3)意味着将剩下的东西组合成代币,例如标识符,关键字,文字,标点符号。

    在(2)期间筛选出评论。在现代编译器中,这一切都是由确定性自动机同时完成的。