setToken($this->getToken()); return $terminal; } public function &getToken() { $token =& $this->getTokenByPhpTokenizer(); if (is_string($token)) { switch ($token) { case '*': case '+': $token = array(VAROP, $token, 0); break; case '<': $next_token =& $this->getTokenByPhpTokenizer(); if (is_string($next_token) && $next_token == '-') { $token = array(VAROP, '<-', 0); } else { $this->ungetTokenByPhpTokenizer($next_token); } } if ($this->debug) { if (is_string($token)) { $this->log("STRING: $token"); } else { $this->log(sprintf("%s: %s", $token[0], $token[1])); } } return $token; } else if (!is_array($token)) { return $token; } $token_name = token_name($token[0]); switch ($token[0]) { case T_LNUMBER: $token[0] = NUMLIT; break; case T_PRINT: case T_STRING: $token[0] = VARID; break; case T_CONSTANT_ENCAPSED_STRING: $token[0] = STRINGLIT; break; default: $token[0] = 0; break; } switch ($token[1]) { case "as": $token[0] = ASMOD; break; case "case": $token[0] = CASEXP; break; case "class": $token[0] = TCLASS; break; case "data": $token[0] = DATA; break; case "default": $token[0] = DEFAULT_T; break; case "deriving": $token[0] = DERIVING; break; case "do": $token[0] = DO_T; break; case "else": $token[0] = ELSE_T; break; case "hiding": $token[0] = HIDING; break; case "if": $token[0] = IF_T; break; case "import": $token[0] = IMPORT; break; case "in": $token[0] = IN; break; case "infix": $token[0] = INFIXN; break; case "infixl": $token[0] = INFIXL; break; case "infixr": $token[0] = INFIXR; break; case "instance": $token[0] = TINSTANCE; break; case "let": $token[0] = LET; break; case "module": $token[0] = TMODULE; break; case "newtype": $token[0] = TNEWTYPE; break; case "of": $token[0] = OF; break; case "primitive": $token[0] = PRIMITIVE; break; case "qualified": $token[0] = QUALIFIED; break; case "then": $token[0] = THEN; break; case "type": $token[0] = TYPE; break; case "where": $token[0] = WHERE; break; } if ($this->debug) { if ($token[0]) { $this->log(sprintf("%s: %s", $token[0], $token[1])); } else { $this->log(sprintf("%s: %s", $token_name, $token[1])); } } return $token; } public function &getTokens($force = false) { if (!$this->tokens || $force) { $this->tokens = token_get_all($this->source); } return $this->tokens; } protected function log($str) { echo "{$str}\n"; } public function &setSource(&$source) { $this->source =& $source; $this->getTokens(true); return $source; } protected function &getTokenByPhpTokenizer() { $token = array_shift($this->tokens); if (is_string($token) || !is_array($token)) { return $token; } switch ($token[0]) { case T_CLOSE_TAG: case T_COMMENT: case T_DOC_COMMENT: case T_INLINE_HTML: case T_OPEN_TAG: case T_WHITESPACE: return $this->getTokenByPhpTokenizer(); } return $token; } protected function ungetTokenByPhpTokenizer(&$token) { return array_unshift($this->tokens, $token); } }