phpDocumentor phpDocumentor
WordParsers
[ class tree: phpDocumentor ] [ index: phpDocumentor ] [ all elements ]

Source for file WordParser.inc

Documentation is available at WordParser.inc

  1. <?php
  2. /**
  3.  * a generic lexer
  4.  * 
  5.  * phpDocumentor :: automatic documentation generator
  6.  * 
  7.  * PHP versions 4 and 5
  8.  *
  9.  * Copyright (c) 2000-2006 Joshua Eichorn
  10.  * 
  11.  * LICENSE:
  12.  * 
  13.  * This library is free software; you can redistribute it
  14.  * and/or modify it under the terms of the GNU Lesser General
  15.  * Public License as published by the Free Software Foundation;
  16.  * either version 2.1 of the License, or (at your option) any
  17.  * later version.
  18.  * 
  19.  * This library is distributed in the hope that it will be useful,
  20.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  22.  * Lesser General Public License for more details.
  23.  * 
  24.  * You should have received a copy of the GNU Lesser General Public
  25.  * License along with this library; if not, write to the Free Software
  26.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  27.  *
  28.  * @package    phpDocumentor
  29.  * @subpackage WordParsers
  30.  * @author     Joshua Eichorn <[email protected]>
  31.  * @copyright  2000-2006 Joshua Eichorn
  32.  * @license    http://www.opensource.org/licenses/lgpl-license.php LGPL
  33.  * @version    CVS: $Id: WordParser.inc,v 1.3 2006/04/30 22:18:14 cellog Exp $
  34.  * @link       http://www.phpdoc.org
  35.  * @link       http://pear.php.net/PhpDocumentor
  36.  * @since      0.1
  37.  */
  38. /**
  39.  * Retrieves tokens from source code for use by the Parser
  40.  * @see Parser
  41.  * @author    Joshua Eichorn <[email protected]>
  42.  * @version    $Id: WordParser.inc,v 1.3 2006/04/30 22:18:14 cellog Exp $
  43.  * @package     phpDocumentor
  44.  * @subpackage WordParsers
  45.  */
  46. class WordParser
  47. {
  48.     /*
  49.     New lines around the world
  50.     Macintosh: \r 
  51.         Unix : \n 
  52.     Windows : \r\n 
  53.      */
  54.     
  55.     /**#@+
  56.      * @access private
  57.      */
  58.     /**
  59.      * List of text that separates tokens, used to retrieve tokens
  60.      * @var array 
  61.      */
  62.     var $wordseperators array();
  63.     
  64.     /**
  65.      * Position within input of the cursor pointing to the next text to be
  66.      * retrieved as a token
  67.      * @var integer 
  68.      */
  69.     var $pos 0;
  70.  
  71.     /**
  72.      * Size of the input source code
  73.      * @var integer 
  74.      */
  75.     var $size;
  76.  
  77.     /**
  78.      * Source code
  79.      * @var string 
  80.      */
  81.     var $data;
  82.  
  83.     var $cache;
  84.     /**
  85.      * Current line number
  86.      * @var integer 
  87.      */
  88.     var $linenum 0;
  89.     /**
  90.      * Position the cursor was at the last time line numbers were counted, used
  91.      * to guarantee that line numbers are incremented
  92.      * @var integer 
  93.      */
  94.     var $linenumpos 0;
  95.     
  96.     /**
  97.      * Used for {@}source} tag, contains currently parsed function source
  98.      * @var string 
  99.      */
  100.     var $source '';
  101.     /**
  102.      * flag, determines whether tokens are added to {@link $source}
  103.      * @var boolean 
  104.      */
  105.     var $getsource false;
  106.  
  107.     /**
  108.      * If true, then white space is returned as a part of tokens, otherwise
  109.      * tokens are trimmed
  110.      * @var boolean 
  111.      */
  112.     var $returnWhiteSpace false;
  113.     /**#@-*/
  114.  
  115.     /**
  116.      * Initialize the WordParser
  117.      * @param string source code
  118.      */
  119.     function setup(&$input)
  120.     {
  121.         $this->size strlen($input);
  122.         $this->data $input;
  123.         $this->pos 0;
  124.         $this->linenum 0;
  125.         $this->linenumpos 0;
  126.         $this->cache array();
  127.         //$this->run = 0;
  128.         //$this->word = WORD_PARSER_RET_WORD;
  129.     }
  130.     
  131.     /**
  132.      * Retrieve source code for the last function/method
  133.      * @return string 
  134.      */
  135.     function getSource()
  136.     {
  137.         $source $this->source;
  138.         $this->source '';
  139.         $this->getsource false;
  140.         return $source;
  141.     }
  142.     
  143.     /**
  144.      * Used to tell the WordParser to start retrieving source code
  145.      * @access private
  146.      */
  147.     function retrievesource($word '')
  148.     {
  149.         $this->source $word;
  150.         $this->getsource true;
  151.     }
  152.  
  153.     /**
  154.      * Retrieve a token from the token list
  155.      *
  156.      * The {@link Parser} class relies upon this method to retrieve the next
  157.      * token.  The {@link $wordseperators} array is a collection of strings
  158.      * that delineate tokens for the current parser state.  $wordseperators
  159.      * is set by the parser with a call to {@link Parser::configWordParser()}
  160.      * every time a new parser state is reached.
  161.      *
  162.      * For example, while parsing the source code for a class, the word
  163.      * <code>var</code> is a token, and <code>global</code> is not,
  164.      * but inside a function, the reverse is true.  The parser state
  165.      * {@link PARSER_STATE_CLASS} has a token list that includes whitespace,
  166.      * code delimiters like ; and {}, and comment/DocBlock indicators
  167.      *
  168.      * If the whitespace option has been turned off using
  169.      * {@link setWhitespace()}, then no whitespace is returned with tokens
  170.      *
  171.      * {@internal 
  172.      * In the first segment of the function, the code attempts to find the next
  173.      * token.  A cache is used to speed repetitious tasks.  The $tpos variable
  174.      * is used to hold the position of the next token.  $npos is used to
  175.      * hold the end of the token, and so $npos - $tpos will give the length
  176.      * of the token.  This is used to allow tokens that contain whitespace,
  177.      * should that option be desired.
  178.      *
  179.      * {@link $data} is of course the string containing the PHP code to be
  180.      * parsed, and {@link $pos} is the cursor, or current location within the
  181.      * parsed data.
  182.      * }}}
  183.      * @return string|falsethe next token, an empty string if there are no
  184.      *                       token separators in the $wordseperators array,
  185.      *                       or false if the end of input has been reached
  186.      */
  187.     function getWord()
  188.     {
  189.         //$st = $this->mtime();
  190.         if ($this->size == $this->pos)
  191.         {
  192.             return false;
  193.         }
  194.  
  195.         // assume, for starting, that the token is from $this->pos to the end
  196.         $npos $this->size;
  197.         if (is_array($this->wordseperators))
  198.         {
  199.             //$this->wordseperators = array();
  200.             foreach($this->wordseperators as $sep)
  201.             {
  202.                 // cache is set if this separator has been tested
  203.                 if (isset($this->cache[$sep]))
  204.                 $tpos $this->cache[$sep];
  205.                 else
  206.                 $tpos false;
  207.                 if ($tpos $this->pos || !is_int($tpos))
  208.                 {
  209.                     // find the position of the next token separator
  210.                     $tpos strpos($this->data,$sep,$this->pos);
  211.                 }
  212.  
  213.                 // was a token separator found that is closer to the current
  214.                 // location?
  215.                 if ( ($tpos $npos&& !($tpos === false))
  216.                 {
  217.                     //echo trim($sep) . "=$tpos\n";
  218.                     // set the length of the token to be from $this->pos to
  219.                     // the next token separator
  220.                     $npos $tpos;
  221.                     $seplen strlen($sep);
  222.                 
  223.                   else if (!($tpos === false))
  224.                 {
  225.                     $this->cache[$sep$tpos;
  226.                 }
  227.             }
  228.         else {
  229.             // no token separators, tell the parser to choose a new state
  230.             return "";
  231.         }
  232.  
  233.         $len $npos $this->pos;
  234.         if ($len == 0)
  235.         {
  236.             $len $seplen;
  237.         }
  238.  
  239.         //$st3 = $this->mtime();
  240.         $word substr($this->data,$this->pos,$len);
  241.         
  242.         // Change random other os newlines to the unix one
  243.         if ($word == "\r" || $word == "\r\n")
  244.         {
  245.             $word "\n";
  246.         }
  247.         
  248.         if ($this->linenumpos <= $this->pos)
  249.         {
  250.             $this->linenumpos $this->pos $len;
  251.             $this->linenum += count(explode("\n",$word)) 1;
  252.         }
  253.  
  254.         if ($this->getsource)
  255.         {
  256.             $this->source .= $word;
  257.         }
  258.         $this->pos $this->pos $len;
  259.         //$this->word = WORD_PARSER_RET_SEP;
  260.  
  261.         // Things like // commenats rely on the newline to find their end so im going to have to return them
  262.         // never return worthless white space /t ' '
  263.         if ($this->returnWhiteSpace == false)
  264.         {
  265.             if (strlen(trim($word)) == && $word != "\n"
  266.             {
  267.                 $word $this->getWord();
  268.             }
  269.         }
  270.         //$this->time3 = $this->time3 + ($this->mtime() - $st3);
  271.         //$this->time = $this->time + ($this->mtime() - $st);
  272.         return $word;
  273.     }
  274.     
  275.  
  276.     /**
  277.      * Returns the current pointer position, or 1 character after the end of the word
  278.      */
  279.     function getPos()
  280.     {
  281.         return $this->pos;
  282.     }
  283.  
  284.     /**
  285.      * Unused
  286.      *
  287.      * {@source } 
  288.      * @param integer starting position
  289.      * @param integer length of block to retrieve
  290.      */
  291.     function getBlock($start,$len)
  292.     {
  293.         return substr($this->data,$start,$len);
  294.     }
  295.  
  296.     /**
  297.      * @uses $wordseperators
  298.      * @param array array of strings that separate tokens
  299.      */
  300.     function setSeperator(&$seps)
  301.     {
  302.         $this->wordseperators &$seps;
  303.     }
  304.  
  305.     /**
  306.      * Set the internal cursor within the source code
  307.      * @param integer 
  308.      */
  309.     function setPos($pos)
  310.     {
  311.         $this->pos $pos;
  312.     }
  313.     
  314.     /**
  315.      * Backup to the previous token so that it can be retrieved again in a new
  316.      * context.
  317.      *
  318.      * Occasionally, a word will be passed to an event handler that should be
  319.      * handled by another event handler.  This method allows that to happen.
  320.      * @param string token to back up to
  321.      */
  322.     function backupPos($word)
  323.     {
  324.         if ($this->getsource$this->source substr($this->source,0,strlen($this->source1);
  325.         $this->pos $this->pos strlen($word);
  326.     }
  327.  
  328.     /**
  329.      * set parser to return or strip whitespace
  330.      * @param boolean 
  331.      */
  332.     function setWhitespace($val false)
  333.     {
  334.         $this->returnWhiteSpace $val;
  335.     }
  336. }
  337. ?>

Documentation generated on Tue, 24 Oct 2006 09:26:42 -0500 by phpDocumentor 1.3.1