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

File_ChessPGN lexer source (complex)

  1. <?php
  2. //require_once 'File/ChessPGN/Parser.php';
  3. require_once dirname(__FILE__'/Parser.php';
  4.  
  5. class File_ChessPGN_Lexer
  6. {
  7.     const TAGOPEN File_ChessPGN_Parser::TAGOPEN// [
  8.     
  9.     const TAGNAME File_ChessPGN_Parser::TAGNAME// ]
  10.     
  11.     const TAGCLOSE File_ChessPGN_Parser::TAGCLOSE// ]
  12.     
  13.     const STRING File_ChessPGN_Parser::STRING// ]
  14.     
  15.     const NAG File_ChessPGN_Parser::NAG// $1 $2, etc.
  16.     
  17.     const GAMEEND File_ChessPGN_Parser::GAMEEND// * 1-0 0-1
  18.     
  19.     const PAWNMOVE File_ChessPGN_Parser::PAWNMOVE// e4, e8=Q, exd8=R
  20.     
  21.     const PIECEMOVE File_ChessPGN_Parser::PIECEMOVE// Nf2, Nab2, N3d5, Qxe4, Qexe4, Q3xe4
  22.     
  23.     const PLACEMENTMOVE File_ChessPGN_Parser::PLACEMENTMOVE// N@f2, P@d5
  24.     
  25.     const CHECK File_ChessPGN_Parser::CHECK// +
  26.     
  27.     const MATE File_ChessPGN_Parser::MATE// #
  28.     
  29.     const DIGIT File_ChessPGN_Parser::DIGIT// 0-9
  30.     
  31.     const MOVEANNOT File_ChessPGN_Parser::MOVEANNOT// ! ? !! ?? !? ?!
  32.     
  33.     const RAVOPEN File_ChessPGN_Parser::RAVOPEN// (
  34.     
  35.     const RAVCLOSE File_ChessPGN_Parser::RAVCLOSE// )
  36.     
  37.     const PERIOD File_ChessPGN_Parser::PERIOD// .
  38.     
  39.     const COMMENTOPEN File_ChessPGN_Parser::COMMENTOPEN// {
  40.     
  41.     const COMMENTCLOSE File_ChessPGN_Parser::COMMENTCLOSE// }
  42.     
  43.     const COMMENT File_ChessPGN_Parser::COMMENT// anything
  44.     
  45.     const CASTLE File_ChessPGN_Parser::CASTLE// O-O O-O-O
  46.  
  47.     
  48.  
  49.     private $input;
  50.     private $N;
  51.     public $token;
  52.     public $value;
  53.     public $line;
  54.     private $_string;
  55.     private $debug 0;
  56.     
  57.     function __construct($data)
  58.     {
  59.         $this->input str_replace("\r\n""\n"$data);
  60.         $this->0;
  61.     }
  62.  
  63. /*!lex2php
  64. %input $this->input
  65. %counter $this->N
  66. %token $this->token
  67. %value $this->value
  68. %line $this->line
  69. ESCAPEDTHING = @"|\\@
  70. ANYTHINGELSE = /./
  71. PERIOD = "."
  72. ASTERISK = "*"
  73. TAGOPEN = "["
  74. TAGCLOSE = "]"
  75. TAGCONTENTS = @[^\]" ]+@
  76. RAVOPEN = "("
  77. RAVCLOSE = ")"
  78. COMMENTOPEN = "{"
  79. COMMENTCLOSE = "}"
  80. RESERVEOPEN = "<"
  81. RESERVECLOSE = ">"
  82. NAG = /\$[0-9]+/
  83. WHITEWINS = "1-0"
  84. BLACKWINS = "0-1"
  85. DRAW = "1/2-1/2"
  86. GAMEEND = @(?:1\-0|0\-1|1/2\-1/2)@
  87. CHECK = "+"
  88. MATE = "#"
  89. PROMOTE = "="
  90. RANK = /[a-h]/
  91. DIGIT = /[0-9]{1,3}/
  92. MOVEANNOT = /!|\?|!!|\?\?|!\?|\?!/
  93. PIECE = /Q|K|R|B|N/
  94. TAKES = "x"
  95. WHITESPACE = /[ \n\t]+/
  96. KINGCASTLE = "O-O"
  97. QUEENCASTLE = "O-O-O"
  98. CASTLE = /O\-O\-O|O\-O/
  99. PAWNMOVE = /P?[a-h](?:[2-7]|[18]\=(?:Q|R|B|N))|P?[a-h]x[a-h](?:[2-7]|[18]\=(?:Q|R|B|N))/
  100. PIECEMOVE = /(?:Q|K|R|B|N)(?:[a-h]|[1-8])?[a-h][1-8]|(?:Q|K|R|B|N)(?:[a-h]|[1-8])?x[a-h][1-8]/
  101. PLACEMENTMOVE = /(?:P|K|Q|R|B|N)@[a-h][1-8]/
  102. COMMENTCONTENTS = /[^}]+/
  103. STRINGCONTENTS = /[^\["\\]+/
  104. */
  105. /*!lex2php
  106. %statename YYINITIAL
  107. TAGOPEN {
  108.     if ($this->debug) echo 'new tag ['.$this->value."]\n";
  109.     $this->token = self::TAGOPEN;
  110.     $this->yybegin(self::INTAG);
  111. }
  112. RAVOPEN {
  113.     $this->yybegin(self::INMOVES);
  114.     if ($this->debug) echo '->found rav ['.$this->value."]\n";
  115.     $this->token = self::RAVOPEN;
  116. }
  117. GAMEEND {
  118.     // end of game
  119.     if ($this->debug) echo 'found game end ['.$this->value."]\n";
  120.     $this->token = self::GAMEEND;
  121. }
  122. DIGIT {
  123.     $this->yybegin(self::INMOVES);
  124.     if ($this->debug) echo '->found digit ['.$this->value."]\n";
  125.     $this->token = self::DIGIT;
  126. }
  127. PAWNMOVE {
  128.     $this->yybegin(self::INMOVES);
  129.     if ($this->debug) echo '->found pawn move ['.$this->value."]\n";
  130.     $this->token = self::PAWNMOVE;
  131. }
  132. PIECEMOVE {
  133.     $this->yybegin(self::INMOVES);
  134.     if ($this->debug) echo '->found piece move ['.$this->value."]\n";
  135.     $this->token = self::PIECEMOVE;
  136. }
  137. PLACEMENTMOVE {
  138.     $this->yybegin(self::INMOVES);
  139.     if ($this->debug) echo '->found placement move ['.$this->value."]\n";
  140.     $this->token = self::PLACEMENTMOVE;
  141. }
  142. COMMENTOPEN {
  143.     if ($this->debug) echo 'new comment ['.$this->value."]\n";
  144.     $this->yypushstate(self::INCOMMENT);
  145.     $this->token = self::COMMENTOPEN;
  146. }
  147. CASTLE {
  148.     $this->yybegin(self::INMOVES);
  149.     if ($this->debug) echo 'found castle move ['.$this->value."]\n";
  150.     $this->token = self::CASTLE;
  151. }
  152. WHITESPACE {
  153.     // cycle to next token
  154.     return false;
  155. }
  156. */
  157. /*!lex2php
  158. %statename INMOVES
  159. RAVOPEN {
  160.     if ($this->debug) echo '->found rav ['.$this->value."]\n";
  161.     $this->token = self::RAVOPEN;
  162. }
  163. GAMEEND {
  164.     // end of game
  165.     $this->yybegin(self::YYINITIAL);
  166.     if ($this->debug) echo 'found game end ['.$this->value."]\n";
  167.     $this->token = self::GAMEEND;
  168. }
  169. DIGIT {
  170.     if ($this->debug) echo '->found digit ['.$this->value."]\n";
  171.     $this->token = self::DIGIT;
  172. }
  173. PAWNMOVE {
  174.     if ($this->debug) echo '->found pawn move ['.$this->value."]\n";
  175.     $this->token = self::PAWNMOVE;
  176. }
  177. PIECEMOVE {
  178.     if ($this->debug) echo '->found piece move ['.$this->value."]\n";
  179.     $this->token = self::PIECEMOVE;
  180. }
  181. PLACEMENTMOVE {
  182.     if ($this->debug) echo '->found placement move ['.$this->value."]\n";
  183.     $this->token = self::PLACEMENTMOVE;
  184. }
  185. COMMENTOPEN {
  186.     if ($this->debug) echo 'new comment ['.$this->value."]\n";
  187.     $this->yypushstate(self::INCOMMENT);
  188.     $this->token = self::COMMENTOPEN;
  189. }
  190. CASTLE {
  191.     if ($this->debug) echo 'found castle move ['.$this->value."]\n";
  192.     $this->token = self::CASTLE;
  193. }
  194. WHITESPACE {
  195.     // cycle to next token
  196.     return false;
  197. }
  198. NAG {
  199.     if ($this->debug) echo 'found numeric annotation glyph ['.$this->value."]\n";
  200.     $this->token = self::NAG;
  201. }
  202.  
  203. ASTERISK {
  204.     // end of game
  205.     $this->yybegin(self::YYINITIAL);
  206.     if ($this->debug) echo 'found unfinished game indicator ['.$this->value."]\n";
  207.     $this->token = self::GAMEEND;
  208. }
  209.  
  210. PERIOD {
  211.     if ($this->debug) echo 'found period ['.$this->value."]\n";
  212.     $this->token = self::PERIOD;
  213. }
  214.  
  215. CHECK {
  216.     if ($this->debug) echo 'found check ['.$this->value."]\n";
  217.     $this->token = self::CHECK;
  218. }
  219.  
  220. MATE {
  221.     if ($this->debug) echo 'found mate ['.$this->value."]\n";
  222.     $this->token = self::MATE;
  223. }
  224.  
  225. MOVEANNOT {
  226.     if ($this->debug) echo 'found move annotation ['.$this->value."]\n";
  227.     $this->token = self::MOVEANNOT;
  228. }
  229.  
  230. RAVCLOSE {
  231.     if ($this->debug) echo 'found recursive annotation variation close ['.$this->value."]\n";
  232.     $this->token = self::RAVCLOSE;
  233. }
  234. */
  235. /*!lex2php
  236. %statename INTAG
  237. "\"" {
  238.     if ($this->debug) echo "starting string\n";
  239.     $this->yybegin(self::INSTRING);
  240.     $this->_string = '';
  241.     $this->N++;
  242.     return true; // cycle to next state
  243. }
  244.  
  245. TAGCLOSE {
  246.     if ($this->debug) echo "ending tag [".$this->value."]\n";
  247.     $this->yybegin(self::YYINITIAL);
  248.     $this->token = self::TAGCLOSE;
  249. }
  250.  
  251. TAGCONTENTS {
  252.     if ($this->debug) echo 'tag contents ['.$this->value."]\n";
  253.     $this->token = self::TAGNAME;
  254. }
  255.  
  256. " " {
  257.     // skip token
  258.     return false;
  259. }
  260. */
  261. /*!lex2php
  262. %statename INSTRING
  263. "\\" {
  264.     if ($this->debug) echo "string escape [\\]\n";
  265.     $this->yybegin(self::INESCAPE);
  266.     return true;
  267. }
  268.  
  269. "\"" {
  270.     if ($this->debug) echo "returning string [$this->_string]\n";
  271.     $this->yybegin(self::INTAG);
  272.     $this->value = $this->_string;
  273.     $this->token = self::STRING;
  274.     $this->N -= strlen($this->_string) - 1; // make sure the counter is right
  275.     $this->_string = '';
  276. }
  277.  
  278. STRINGCONTENTS {
  279.     if ($this->debug) echo "added to string [".$this->value."]\n";
  280.     $this->_string .= $this->value;
  281.     return false;
  282. }
  283. */
  284. /*!lex2php
  285. %statename INESCAPE
  286. ESCAPEDTHING {
  287.     if ($this->debug) echo "escape [".$this->value."]\n";
  288.     $this->yybegin(self::INSTRING);
  289.     $this->_string .= $this->value;
  290.     break;
  291. }
  292.  
  293. ANYTHINGELSE {
  294.     if ($this->debug) echo "non-escape [".$this->value."]\n";
  295.     $this->yybegin(self::INSTRING);
  296.     $this->_string .= $this->value;
  297.     return false;
  298. }
  299. */
  300. /*!lex2php
  301. %statename INCOMMENT
  302. "}" {
  303.     if ($this->debug) echo 'close comment ['.$this->value."]\n";
  304.     $this->yypopstate();
  305.     $this->token = self::COMMENTCLOSE;
  306. }
  307. COMMENTCONTENTS {
  308.     if ($this->debug) echo 'comment contents ['.$this->value."]\n";
  309.     $this->token = self::COMMENT;
  310. }
  311. */
  312.     /**
  313.      * return something useful, when a parse error occurs.
  314.      *
  315.      * used to build error messages if the parser fails, and needs to know the line number..
  316.      *
  317.      * @return   string 
  318.      * @access   public
  319.      */
  320.     function parseError(
  321.     {
  322.         return "Error at line {$this->yyline}";
  323.         
  324.     }

Documentation generated on Sun, 02 Jul 2006 08:51:27 -0400 by phpDocumentor 1.3.0