PHP: Как пропускаются комментарии? - PullRequest
3 голосов
/ 05 декабря 2010

Хорошо, если я что-то комментирую, оно пропускается на всех языках, но как они пропускаются и что читается?

Пример:

// This is commented out

Теперь PHP читает весь комментарий, чтобы перейти к следующим строкам, или просто читает //?

Ответы [ 3 ]

7 голосов
/ 05 декабря 2010

Сценарий анализируется и разбивается на токены .

Вы можете попробовать это на любом действительном исходном коде PHP, используя token_get_all(), он используетРодной токенайзер 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 голосов
/ 05 декабря 2010

Во время компиляции есть фаза токенизации.На этом этапе он видит //, а затем просто игнорирует все до конца строки.Компиляторы могут быть сложными, но по большей части довольно просты.

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

1 голос
/ 07 декабря 2010

Ваш вопрос не имеет смысла.Прочитав «//», он должен продолжить чтение до новой строки, чтобы найти его.Там нет выбора по этому поводу.Нет другого способа найти символ новой строки.

Концептуально, компиляция имеет несколько этапов, которые логически перед анализом:

  1. Сканирование.
  2. Screening.
  3. Tokenization.

(1) в основном означает чтение файла символ за символом слева направо.(2) означает отбрасывание вещей, не представляющих интереса, например, сведение нескольких последовательностей новой строки / пробела в один пробел.(3) означает объединение того, что осталось в токены, например, идентификаторы, ключевые слова, литералы, знаки пунктуации.

Комментарии выводятся на экран во время (2).В современных компиляторах все это делается сразу детерминированным автоматом.

...