【问题标题】:PHP: How are comments skipped?PHP:如何跳过评论?
【发布时间】:2010-12-05 16:16:00
【问题描述】:

好吧,如果我评论某些内容,它在所有语言中都会被跳过,但是它们是如何被跳过的以及阅读了什么?

例子:

// This is commented out

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

【问题讨论】:

    标签: php language-design comments


    【解决方案1】:

    脚本被解析并拆分成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 */'));
    ?>
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

        (1) 基本上是指从左到右逐个字符地读取文件。 (2) 意味着扔掉不感兴趣的东西,例如将多个换行符/空白序列折叠到一个空格。 (3) 表示将剩下的内容组合成令牌,例如标识符、关键字、文字、标点符号。

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

        【讨论】:

          猜你喜欢
          • 2017-11-21
          • 1970-01-01
          • 1970-01-01
          • 2018-04-26
          • 1970-01-01
          • 2013-08-13
          • 2011-11-09
          • 2012-01-15
          • 2016-09-09
          相关资源
          最近更新 更多