PHP:如何跳过注释?

3

如果我在某个地方添加了注释,那么这些注释会被所有语言跳过,但是它们是如何跳过的以及读取的内容是什么?

示例:

// This is commented out

现在PHP是读整个注释才会换行还是只读取//之后的内容就会换行?
3个回答

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 */'));
?>

3

编译过程中有一个词法分析阶段。在此阶段,它会看到 // ,然后忽略该行末尾的所有内容。编译器可能会变得复杂,但大多数情况下都相当简单。

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


1

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

概念上,编译有几个阶段在逻辑上优先于解析:

  1. 扫描。
  2. 筛选。
  3. 标记化。

(1) 基本上意味着从左到右逐个字符地读取文件。 (2) 意味着丢弃不感兴趣的内容,例如将多个换行符/空格序列压缩为单个空格。 (3) 意味着将剩下的内容组合成标记,例如标识符、关键字、文字、标点符号。

注释在第(2)阶段被筛除。在现代编译器中,这一切都由确定性自动机一次性完成。


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