好吧,如果我发表评论的话,它会在所有语言中被忽略,但它们是如何被跳过以及被勒死的?
示例:
// This is commented out
PHP现在读取整个注释以转到下一行还是只读取//
?
答案 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)
编译时有一个标记化阶段。在此阶段,它会看到//然后忽略所有行到行尾。编译器可能会变得复杂,但大部分都非常简单。
答案 2 :(得分:1)
你的问题没有意义。读完'//'后,必须继续读取换行符才能找到它。没有选择。没有其他方法找到换行符。
从概念上讲,编译在解析之前有逻辑上的几个阶段:
(1)基本上是指从左到右逐字符读取文件。 (2)意味着扔掉没有兴趣的东西,例如将多个换行符/空白行序列折叠到一个空格中。 (3)意味着将剩下的东西组合成代币,例如标识符,关键字,文字,标点符号。
在(2)期间筛选出评论。在现代编译器中,这一切都是由确定性自动机同时完成的。