【问题标题】:Is PHP an entirely Context-Free Language or does it have Context-Sensitive parts?PHP 是完全无上下文的语言还是有上下文相关的部分?
【发布时间】:2012-05-11 20:38:39
【问题描述】:

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

【问题讨论】:

  • 为 PHP 构建解析器。类似的问题,例如:stackoverflow.com/questions/9652436 让我相信 SO 将是最好的地方,但欢迎提出其他堆栈交换的建议!

标签: php grammar


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    只是想我会提一下,以防你没有看到它,它可能会为你节省很多时间,除非这是为了纯粹的学习。

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

    这个例子取自 PHP.net,它将源文件读入令牌,并在去掉 cmets 的情况下重现它:

    <?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;
           }
       }
    }
    ?>
    

    【讨论】:

    • 谢谢!它更像是一个学习项目,使用 PHP 标记化的缺点是您无法标记为更高(并且在较小程度上,更少)PHP 版本标记编写的 PHP 代码(例如在只有PHP 5.2).
    【解决方案3】:

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

    查看结构和数据,然后确定您提出问题的理由。

    【讨论】:

    • “看看结构和数据”?我还修改了问题,希望这更容易回答?
    • 我同意 Jazz 的上述评论。请完善您的问题,使其符合 SO 的工作方式。
    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2016-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多