<?php
-
/**
* @author Niklas Laxström, Tim Starling
*
* for the level 4 operators, since they return boolean and don't accept
* boolean inputs.
*/
- static $precedence = array(
+ private static $precedence = array(
'or' => 2,
'and' => 3,
'is' => 4,
*/
public static function convert( $rule ) {
$parser = new self( $rule );
+
return $parser->doConvert();
}
// Iterate through all tokens, saving the operators and operands to a
// stack per Dijkstra's shunting yard algorithm.
- /** @var CLDRPluralRuleConverter_Operator $token */
+ /** @var CLDRPluralRuleConverterOperator $token */
while ( false !== ( $token = $this->nextToken() ) ) {
// In this grammar, there are only binary operators, so every valid
// rule string will alternate between operator and operand tokens.
$expectOperator = !$expectOperator;
- if ( $token instanceof CLDRPluralRuleConverter_Expression ) {
+ if ( $token instanceof CLDRPluralRuleConverterExpression ) {
// Operand
if ( $expectOperator ) {
$token->error( 'unexpected operand' );
/**
* Fetch the next token from the input string.
*
- * @return CLDRPluralRuleConverter_Fragment The next token
+ * @return CLDRPluralRuleConverterFragment The next token
*/
protected function nextToken() {
if ( $this->pos >= $this->end ) {
if ( $length !== 0 ) {
$token = $this->newNumber( substr( $this->rule, $this->pos, $length ), $this->pos );
$this->pos += $length;
+
return $token;
}
if ( $op2 === '..' || $op2 === '!=' ) {
$token = $this->newOperator( $op2, $this->pos, 2 );
$this->pos += 2;
+
return $token;
}
$op1 = $this->rule[$this->pos];
if ( $op1 === ',' || $op1 === '=' || $op1 === '%' ) {
$token = $this->newOperator( $op1, $this->pos, 1 );
- $this->pos ++;
+ $this->pos++;
+
return $token;
}
if ( isset( self::$precedence[$bothWords] ) ) {
$token = $this->newOperator( $bothWords, $this->pos, $nextTokenPos - $this->pos );
$this->pos = $nextTokenPos;
+
return $token;
}
}
if ( isset( self::$precedence[$word1] ) ) {
$token = $this->newOperator( $word1, $this->pos, strlen( $word1 ) );
$this->pos += strlen( $word1 );
+
return $token;
}
// The single-character operand symbols
if ( strpos( self::OPERAND_SYMBOLS, $word1 ) !== false ) {
$token = $this->newNumber( $word1, $this->pos );
- $this->pos ++;
+ $this->pos++;
+
return $token;
}
// Samples are like comments, they have no effect on rule evaluation.
// They run from the first sample indicator to the end of the string.
$this->pos = $this->end;
+
return false;
}
* a fragment with rpn and type members describing the result of that
* operation.
*
- * @param CLDRPluralRuleConverter_Operator $op
+ * @param CLDRPluralRuleConverterOperator $op
*/
protected function doOperation( $op ) {
if ( count( $this->operands ) < 2 ) {
*
* @param string $text
* @param int $pos
- * @return CLDRPluralRuleConverter_Expression The numerical expression
+ * @return CLDRPluralRuleConverterExpression The numerical expression
*/
protected function newNumber( $text, $pos ) {
- return new CLDRPluralRuleConverter_Expression( $this, 'number', $text, $pos, strlen( $text ) );
+ return new CLDRPluralRuleConverterExpression( $this, 'number', $text, $pos, strlen( $text ) );
}
/**
* @param string $type
* @param int $pos
* @param int $length
- * @return CLDRPluralRuleConverter_Operator The operator
+ * @return CLDRPluralRuleConverterOperator The operator
*/
protected function newOperator( $type, $pos, $length ) {
- return new CLDRPluralRuleConverter_Operator( $this, $type, $pos, $length );
+ return new CLDRPluralRuleConverterOperator( $this, $type, $pos, $length );
}
/**