public function testParse()
 {
     $lexer = new Lexer();
     $stream = $lexer->tokenize(" ClassName < BaseClass << Traversable > The Test Class\n" . "> Comment \n" . "+ prop1:integer[set get is bind] > The property 1\n" . "# prop2[set get] > The property 2\n" . "> Comment for prop2\n" . "- prop3:ArrayObject\n" . "\n" . "+ method1(name:string obj:object options:array):boolean > The method 1\n" . "# method2(type:int) > The method 2\n" . "- method3():IteratorAggrigate\n");
     $parser = new TokenParser();
     $nodeStream = $parser->parse($stream);
     $this->assertInstanceOf('KzykHys\\ClassGenerator\\Node\\NodeStream', $nodeStream);
 }
 /**
  * Generate a PHP class from .pcg content
  *
  * @param string $document
  *
  * @return ClassGenerator
  */
 public function generate($document)
 {
     $lexer = new Lexer();
     $tokenStream = $lexer->tokenize($document);
     $tokenParser = new TokenParser();
     $nodeStream = $tokenParser->parse($tokenStream);
     $nodeParser = new NodeParser();
     $this->classBuilder = $nodeParser->parse($nodeStream);
     $compiler = new Compiler($this->options);
     $this->streamWriter = $compiler->compile($this->classBuilder);
     return $this;
 }
 public function testTokenizeAllTokenType()
 {
     $lexer = new Lexer();
     $stream = $lexer->tokenize("\\Node\\Node < Node\\Node << Node \\Node\\Node\\Node > COMMENT\n" . "> TOKEN INSIDE COMMENT < << : () [] \n" . "+ PUBLIC:TYPE[set get is bind] > COMMENT\n" . "# PROTECTED[set get] > COMMENT\n" . "> COMMENT\n" . "- PRIVATE:TYPE\n" . "\n" . "+ PUBLIC(ARG:TYPE ARG:TYPE):TYPE > COMMENT\n" . "# PROTECTED(ARG:TYPE) > COMMENT\n" . "- PRIVATE():TYPE\n");
     $className = 'KzykHys\\ClassGenerator\\Token\\Token';
     $tokenList = array(1 => array(Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_EXTD, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_IMPL, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 2 => array(Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 3 => array(Lexer::TOKEN_PUBL, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_BRCO, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_BRCC, Lexer::TOKEN_WTSP, Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 4 => array(Lexer::TOKEN_PROT, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_BRCO, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_BRCC, Lexer::TOKEN_WTSP, Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 5 => array(Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 6 => array(Lexer::TOKEN_PRIV, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_EOL), 7 => array(Lexer::TOKEN_EOL), 8 => array(Lexer::TOKEN_PUBL, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_METO, Lexer::TOKEN_NODE, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_METC, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_WTSP, Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 9 => array(Lexer::TOKEN_PROT, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_METO, Lexer::TOKEN_NODE, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_METC, Lexer::TOKEN_WTSP, Lexer::TOKEN_CMNT, Lexer::TOKEN_EOL), 10 => array(Lexer::TOKEN_PRIV, Lexer::TOKEN_WTSP, Lexer::TOKEN_NODE, Lexer::TOKEN_METO, Lexer::TOKEN_METC, Lexer::TOKEN_TYPE, Lexer::TOKEN_NODE, Lexer::TOKEN_EOL));
     foreach ($tokenList as $line => $tokens) {
         foreach ($tokens as $key => $value) {
             $this->assertInstanceOf($className, $stream->expect($value));
         }
     }
     $this->assertInstanceOf($className, $stream->expect(Lexer::TOKEN_EOL));
     $this->assertTrue($stream->is(Lexer::TOKEN_EOF));
 }