c_analyser.php
Current file: src/processor/c_analyser.php
Legend: executed not executed dead code

  Coverage
  Classes Functions / Methods Lines
Total
0.00% 0 / 1
0.00% 0 / 2 CRAP
92.56% 112 / 121
CAnalyser
0.00% 0 / 1
0.00% 0 / 2 28.32
92.56% 112 / 121
 resetState()
0.00% 0 / 1 2
0.00% 0 / 2
 process($tokens, $parser_file)
0.00% 0 / 1 27.15
94.12% 112 / 119


       1                 : <?php                                                                                                                                                       
       2                 : /*                                                                                                                                                          
       3                 : Copyright 2008 Josh Heidenreich                                                                                                                             
       4                 :                                                                                                                                                             
       5                 : This file is part of Pelzini.                                                                                                                               
       6                 :                                                                                                                                                             
       7                 : Pelzini is free software: you can redistribute it and/or modify                                                                                             
       8                 : it under the terms of the GNU General Public License as published by                                                                                        
       9                 : the Free Software Foundation, either version 3 of the License, or                                                                                           
      10                 : (at your option) any later version.                                                                                                                         
      11                 :                                                                                                                                                             
      12                 : Pelzini is distributed in the hope that it will be useful,                                                                                                  
      13                 : but WITHOUT ANY WARRANTY; without even the implied warranty of                                                                                              
      14                 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                                                                               
      15                 : GNU General Public License for more details.                                                                                                                
      16                 :                                                                                                                                                             
      17                 : You should have received a copy of the GNU General Public License                                                                                           
      18                 : along with Pelzini.  If not, see <http://www.gnu.org/licenses/>.                                                                                            
      19                 : */                                                                                                                                                          
      20                 :                                                                                                                                                             
      21                 :                                                                                                                                                             
      22                 : /**                                                                                                                                                         
      23                 :  * Contains the {@link CAnalyser} class                                                                                                                     
      24                 :  *                                                                                                                                                          
      25                 :  * @package Parsers                                                                                                                                         
      26                 :  * @author Josh                                                                                                                                             
      27                 :  * @since 0.2                                                                                                                                               
      28                 :  **/                                                                                                                                                        
      29                 :                                                                                                                                                             
      30                 : /**                                                                                                                                                         
      31                 :  * Analyses the C tokens, and creates a set of ParserItem objects.                                                                                          
      32                 :  **/                                                                                                                                                        
      33                 : class CAnalyser extends Analyser {                                                                                                                          
      34                 :     /**                                                                                                                                                     
      35                 :      * Resets any state variables used by this class back to their initial state                                                                            
      36                 :      **/                                                                                                                                                    
      37                 :     public function resetState()                                                                                                                            
      38                 :     {                                                                                                                                                       
      39               0 :         parent::resetState();                                                                                                                               
      40               0 :     }                                                                                                                                                       
      41                 :                                                                                                                                                             
      42                 :                                                                                                                                                             
      43                 :     /**                                                                                                                                                     
      44                 :      * Should create ParserItem objects that represent the provided tokens                                                                                  
      45                 :      * and apply those objects to the ParserFile specified.                                                                                                 
      46                 :      * @return boolean True on success, false on failure                                                                                                    
      47                 :      **/                                                                                                                                                    
      48                 :     public function process($tokens, $parser_file)                                                                                                          
      49                 :     {                                                                                                                                                       
      50               3 :         $this->setTokens($tokens);                                                                                                                          
      51                 :                                                                                                                                                             
      52                 :         // File docblock                                                                                                                                    
      53               3 :         $this->setPos(0);                                                                                                                                   
      54               3 :         while ($token = $this->getToken()) {                                                                                                                
      55               3 :             switch ($token->getType()) {                                                                                                                    
      56               3 :             case TOKEN_COMMENT:                                                                                                                             
      57               3 :             case TOKEN_C_PREPROCESSOR:                                                                                                                      
      58               0 :                 break;                                                                                                                                      
      59                 :                                                                                                                                                             
      60               3 :             case TOKEN_DOCBLOCK:                                                                                                                            
      61               0 :                 $parser_file->applyComment($token->getValue());                                                                                             
      62               0 :                 break 2;                                                                                                                                    
      63                 :                                                                                                                                                             
      64               3 :             default:                                                                                                                                        
      65               3 :                 break 2;                                                                                                                                    
      66               3 :             }                                                                                                                                               
      67               0 :             $this->movePosForward();                                                                                                                        
      68               0 :         }                                                                                                                                                   
      69                 :                                                                                                                                                             
      70                 :         // Functions                                                                                                                                        
      71               3 :         $this->setPos(0);                                                                                                                                   
      72               3 :         while ($function_open_bracket = $this->findTokenForwards(TOKEN_OPEN_NORMAL_BRACKET)) {                                                              
      73               3 :             $open_bracket_pos = $this->getTokenPos();                                                                                                       
      74               3 :             $this->setPos($open_bracket_pos);                                                                                                               
      75                 :                                                                                                                                                             
      76               3 :             $parser_function = new ParserFunction();                                                                                                        
      77               3 :             $parser_file->functions[] = $parser_function;                                                                                                   
      78               3 :                                                                                                                                                             
      79                 :             // Find the name                                                                                                                                
      80               3 :             $name = $this->findTokenBackwards(TOKEN_IDENTIFIER, array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));                                         
      81               3 :             if ($name == null) return false;                                                                                                                
      82               3 :             $this->setPos($this->getTokenPos());                                                                                                            
      83               3 :             $parser_function->name = $name->getValue();                                                                                                     
      84                 :                                                                                                                                                             
      85                 :             // Find the return type                                                                                                                         
      86               3 :             $return_type = '';                                                                                                                              
      87               3 :             $return = $this->findTokenBackwards(array(TOKEN_IDENTIFIER, TOKEN_ASTERIX, TOKEN_CONST), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));    
      88               3 :             $this->setPos($this->getTokenPos());                                                                                                            
      89               3 :             while ($return != null) {                                                                                                                       
      90               2 :                 $return_type = $return->getValue() . ' ' . $return_type;                                                                                    
      91                 :                                                                                                                                                             
      92               2 :                 $return = $this->findTokenBackwards(array(TOKEN_IDENTIFIER, TOKEN_ASTERIX, TOKEN_CONST), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));
      93               2 :                 $this->setPos($this->getTokenPos());                                                                                                        
      94               2 :             }                                                                                                                                               
      95                 :                                                                                                                                                             
      96                 :             // Set the function return value to the value found                                                                                             
      97               3 :             if ($return_type == '') {                                                                                                                       
      98               1 :                 $return_type = 'int';                                                                                                                       
      99               1 :             } else {                                                                                                                                        
     100               2 :                 $return_type = trim($return_type);                                                                                                          
     101               2 :                 $return_type = str_replace(' *', '*', $return_type);                                                                                        
     102                 :             }                                                                                                                                               
     103               3 :             $parser_function->returns[0] = new ParserReturn();                                                                                              
     104               3 :             $parser_function->returns[0]->type = $return_type;                                                                                              
     105                 :                                                                                                                                                             
     106                 :             // Find reserved words before the return type                                                                                                   
     107               3 :             $reserved = $this->findTokenBackwards(array(TOKEN_RESERVED_WORD), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));                           
     108                 :                                                                                                                                                             
     109               3 :             $this->setPos($this->getTokenPos());                                                                                                            
     110               3 :             while ($reserved != null) {                                                                                                                     
     111               1 :                 switch ($reserved->getValue()) {                                                                                                            
     112               1 :                 case 'static':                                                                                                                              
     113               1 :                     $parser_function->static = true;                                                                                                        
     114               1 :                     break;                                                                                                                                  
     115               1 :                 }                                                                                                                                           
     116                 :                                                                                                                                                             
     117               1 :                 $reserved = $this->findTokenBackwards(array(TOKEN_RESERVED_WORD), array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));                       
     118               1 :                 $this->setPos($this->getTokenPos());                                                                                                        
     119               1 :             }                                                                                                                                               
     120                 :                                                                                                                                                             
     121                 :                                                                                                                                                             
     122                 :                                                                                                                                                             
     123                 :             // Look for a docblock before the function                                                                                                      
     124               3 :             $docblock = $this->findTokenBackwards(TOKEN_DOCBLOCK, array(TOKEN_CLOSE_CURLY_BRACKET, TOKEN_SEMICOLON));                                       
     125               3 :             if ($docblock != null) {                                                                                                                        
     126               0 :                 $parser_function->applyComment($docblock->getValue());                                                                                      
     127               0 :             }                                                                                                                                               
     128                 :                                                                                                                                                             
     129                 :             // Find the end of the arguments by counting regular brackets                                                                                   
     130               3 :             $depth = 0;                                                                                                                                     
     131                 :             $find_types = array(                                                                                                                            
     132               3 :                 TOKEN_OPEN_NORMAL_BRACKET,                                                                                                                  
     133               3 :                 TOKEN_CLOSE_NORMAL_BRACKET,                                                                                                                 
     134               3 :                 TOKEN_IDENTIFIER,                                                                                                                           
     135               3 :                 TOKEN_COMMA,                                                                                                                                
     136               3 :                 TOKEN_ASTERIX,                                                                                                                              
     137               3 :                 TOKEN_CONST,                                                                                                                                
     138               3 :             );                                                                                                                                              
     139               3 :             $token = $function_open_bracket;                                                                                                                
     140               3 :             $this->setPos($open_bracket_pos);                                                                                                               
     141               3 :             $arg_tokens = array();                                                                                                                          
     142               3 :             while ($token) {                                                                                                                                
     143               3 :                 switch ($token->getType()) {                                                                                                                
     144               3 :                 case TOKEN_OPEN_NORMAL_BRACKET:                                                                                                             
     145               3 :                     $depth++;                                                                                                                               
     146               3 :                     break;                                                                                                                                  
     147                 :                                                                                                                                                             
     148               3 :                 case TOKEN_CLOSE_NORMAL_BRACKET:                                                                                                            
     149               3 :                     $depth--;                                                                                                                               
     150               3 :                     break;                                                                                                                                  
     151                 :                                                                                                                                                             
     152               2 :                 case TOKEN_IDENTIFIER:                                                                                                                      
     153               2 :                 case TOKEN_ASTERIX:                                                                                                                         
     154               2 :                 case TOKEN_CONST:                                                                                                                           
     155               2 :                     $arg_tokens[] = $token->getValue();                                                                                                     
     156               2 :                     break;                                                                                                                                  
     157                 :                                                                                                                                                             
     158               1 :                 case TOKEN_COMMA:                                                                                                                           
     159               1 :                     $arg = new ParserArgument();                                                                                                            
     160               1 :                     $parser_function->args[] = $arg;                                                                                                        
     161               1 :                     $arg->name = array_pop($arg_tokens);                                                                                                    
     162                 :                                                                                                                                                             
     163               1 :                     if (count($arg_tokens) == 0) {                                                                                                          
     164               1 :                         $arg->type = 'int';                                                                                                                 
     165               1 :                     } else {                                                                                                                                
     166               1 :                         $arg->type = trim(implode(' ', $arg_tokens));                                                                                       
     167               1 :                         $arg->type = str_replace(' *', '*', $arg->type);                                                                                    
     168                 :                     }                                                                                                                                       
     169                 :                                                                                                                                                             
     170               1 :                     $arg_tokens = array();                                                                                                                  
     171               1 :                     break;                                                                                                                                  
     172               3 :                 }                                                                                                                                           
     173                 :                                                                                                                                                             
     174               3 :                 if ($depth == 0) break;                                                                                                                     
     175                 :                                                                                                                                                             
     176               3 :                 $token = $this->findTokenForwards($find_types);                                                                                             
     177               3 :                 $this->setPos($this->getTokenPos());                                                                                                        
     178               3 :             }                                                                                                                                               
     179                 :                                                                                                                                                             
     180                 :             // Adds the last (or only) argument                                                                                                             
     181               3 :             if (count($arg_tokens) > 0) {                                                                                                                   
     182               2 :                 $arg = new ParserArgument();                                                                                                                
     183               2 :                 $parser_function->args[] = $arg;                                                                                                            
     184               2 :                 $arg->name = array_pop($arg_tokens);                                                                                                        
     185                 :                                                                                                                                                             
     186               2 :                 if (count($arg_tokens) == 0) {                                                                                                              
     187               1 :                     $arg->type = 'int';                                                                                                                     
     188               1 :                 } else {                                                                                                                                    
     189               1 :                     $arg->type = trim(implode(' ', $arg_tokens));                                                                                           
     190               1 :                     $arg->type = str_replace(' *', '*', $arg->type);                                                                                        
     191                 :                 }                                                                                                                                           
     192               2 :             }                                                                                                                                               
     193                 :                                                                                                                                                             
     194                 :             // Find the end of the function by counting curly brackets                                                                                      
     195               3 :             $depth = 0;                                                                                                                                     
     196               3 :             $token = $this->findTokenForwards(array(TOKEN_OPEN_CURLY_BRACKET, TOKEN_SEMICOLON));                                                            
     197               3 :             $this->setPos($this->getTokenPos());                                                                                                            
     198               3 :             while ($token) {                                                                                                                                
     199               3 :                 if ($token->getType() == TOKEN_OPEN_CURLY_BRACKET) $depth++;                                                                                
     200               3 :                 if ($token->getType() == TOKEN_CLOSE_CURLY_BRACKET) $depth--;                                                                               
     201                 :                                                                                                                                                             
     202               3 :                 if ($depth == 0) break;                                                                                                                     
     203                 :                                                                                                                                                             
     204               3 :                 $token = $this->findTokenForwards(array(TOKEN_OPEN_CURLY_BRACKET, TOKEN_CLOSE_CURLY_BRACKET));                                              
     205               3 :                 $this->setPos($this->getTokenPos());                                                                                                        
     206               3 :             }                                                                                                                                               
     207                 :                                                                                                                                                             
     208               3 :             $parser_function->post_load();                                                                                                                  
     209               3 :         }                                                                                                                                                   
     210               3 :     }                                                                                                                                                       
     211                 :                                                                                                                                                             
     212                 :                                                                                                                                                             
     213                 : }                                                                                                                                                           

Generated by PHP_CodeCoverage 1.1.2 using PHP 5.4.39-0+deb7u2 and PHPUnit 3.6.10 at Fri Sep 11 11:35:19 WIT 2015.