【发布时间】:2010-12-05 16:16:00
【问题描述】:
好吧,如果我评论某些内容,它在所有语言中都会被跳过,但是它们是如何被跳过的以及阅读了什么?
例子:
// This is commented out
现在 PHP 是读取整个注释以转到下一行还是只读取 //?
【问题讨论】:
标签: php language-design comments
好吧,如果我评论某些内容,它在所有语言中都会被跳过,但是它们是如何被跳过的以及阅读了什么?
例子:
// This is commented out
现在 PHP 是读取整个注释以转到下一行还是只读取 //?
【问题讨论】:
标签: php language-design comments
脚本被解析并拆分成tokens。
您实际上可以使用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) 基本上是指从左到右逐个字符地读取文件。 (2) 意味着扔掉不感兴趣的东西,例如将多个换行符/空白序列折叠到一个空格。 (3) 表示将剩下的内容组合成令牌,例如标识符、关键字、文字、标点符号。
评论在 (2) 期间被筛选掉。在现代编译器中,这一切都是由确定性自动机一次性完成的。
【讨论】: