PHP是完全无上下文的语言还是具有上下文敏感的部分?

时间:2012-05-11 20:38:40

标签: php grammar

PHP有a Bison grammar file,这是否意味着PHP是一种完全无上下文的语言?

3 个答案:

答案 0 :(得分:2)

如果您正在为php构建解析器,请查看现有的解析器:

https://github.com/nikic/PHP-Parser - 这是用php编写的,是一个独立的php解析器。

https://github.com/svalaskevicius/ionPulse/tree/master/ionParticles/ionPhp/phpParser - 这个是用于离子脉冲IDE的php-support插件的一部分,用c ++编写,在< ...> /ionTests/phpparsertest.h中进行功能测试[仍在进行中]

答案 1 :(得分:1)

我想如果你没有看到它,我会提到这个,它可能会节省你很多时间,除非这是纯粹的学习。

查看PHP Tokenizer Functions,它会将源文件解析为令牌。然后你可以跨过标记来检查来源。

这个例子来自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;
       }
   }
}
?>

答案 2 :(得分:-2)

我认为你将数学与解释解析混合在一起。

查看结构和数据,然后确定问题背后的基本原理。