Является ли PHP полностью контекстно-свободным языком или имеет контекстно-зависимые части?

В PHP есть файл грамматики Bison. Значит ли это, что PHP является полностью контекстно-свободным языком?

3 ответа

Если вы создаете парсер для php, пожалуйста, посмотрите на существующие:

https://github.com/nikic/PHP-Parser - он написан на php и является автономным парсером php.

https://github.com/svalaskevicius/ionPulse/tree/master/ionParticles/ionPhp/phpParser - это часть плагина поддержки php для IDE ionPulse, написанного на C++, с функциональными тестами в <...>/ionTests/phpparsertest.h [все еще в стадии разработки]

Просто подумал, что я бы упомянул об этом, если вы этого не видели, это может сэкономить вам много времени, если только это не для чистого обучения.

Ознакомьтесь с функциями PHP Tokenizer, которые разбирают исходный файл в токены для вас. Затем вы можете перешагнуть жетоны, чтобы проверить источник.

Этот пример был взят из PHP.net, который считывает исходный файл в токены и воспроизводит его с удаленными комментариями:

<?php
/*
* T_ML_COMMENT does not exist in PHP 5.
* The following three lines define it in order to
* preserve backwards compatibility.
*
* The next two lines define the PHP 5 only T_DOC_COMMENT,
* which we will mask as T_ML_COMMENT for PHP 4.
*/
if (!defined('T_ML_COMMENT')) {
   define('T_ML_COMMENT', T_COMMENT);
} else {
   define('T_DOC_COMMENT', T_ML_COMMENT);
}

$source = file_get_contents('example.php');
$tokens = token_get_all($source);

foreach ($tokens as $token) {
   if (is_string($token)) {
       // simple 1-character token
       echo $token;
   } else {
       // token array
       list($id, $text) = $token;

       switch ($id) { 
           case T_COMMENT: 
           case T_ML_COMMENT: // we've defined this
           case T_DOC_COMMENT: // and this
               // no action on comments
               break;

           default:
               // anything else -> output "as is"
               echo $text;
               break;
       }
   }
}
?>

Я думаю, что вы смешиваете математику с интерпретируемым разбором.

Посмотрите на структуры и данные, а затем определите причину вашего вопроса.

Другие вопросы по тегам