本文整理汇总了PHP中Rule::getTokenName方法的典型用法代码示例。如果您正苦于以下问题:PHP Rule::getTokenName方法的具体用法?PHP Rule::getTokenName怎么用?PHP Rule::getTokenName使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Rule
的用法示例。
在下文中一共展示了Rule::getTokenName方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的PHP代码示例。
示例1: addRule
/**
* @param Rule $rule
*/
public function addRule(Rule $rule)
{
if (array_key_exists($rule->getTokenName(), $this->rules)) {
$this->rules[$rule->getTokenName()]->addPatterns($rule->getPatterns());
} else {
$this->rules[$rule->getTokenName()] = $rule;
}
}
示例2: getRules
/**
* @inheritdoc
*/
public function getRules()
{
$data = $this->data;
$rules = new Rules();
foreach ($data->rule as $ruleData) {
$rule = new Rule((string) $ruleData->token);
$patternIdx = 0;
foreach ($ruleData->patterns->pattern as $patternData) {
$patternName = "Pattern {$rule->getTokenName()}#{$patternIdx}";
$hasStartToken = false;
$potentialStartTokenIdxs = [];
$tokens = [];
foreach ($patternData->token as $tokenData) {
$tokenName = (string) $tokenData;
$isStartToken = (bool) $tokenData['is_start_token'];
$tokens[] = ['name' => $tokenName, 'is_start_token' => $isStartToken];
if ($isStartToken) {
if ($tokenName !== $rule->getTokenName()) {
throw new ConfigurationException("{$patternName}: Only {$rule->getTokenName()} tokens can have the 'is_start_token' attribute.");
}
if ($hasStartToken) {
throw new ConfigurationException("{$patternName}: Multiple {$rule->getTokenName()} tokens with 'is_start_token' attribute found. Only one is allowed.");
} else {
$hasStartToken = true;
}
}
if ($tokenName === $rule->getTokenName()) {
$potentialStartTokenIdxs[] = count($tokens) - 1;
}
}
if (!$hasStartToken) {
if (count($potentialStartTokenIdxs) === 0) {
throw new ConfigurationException("Pattern {$rule->getTokenName()}/#{$patternIdx} must have unambiguous start token. No {$rule->getTokenName()} token found.");
} elseif (count($potentialStartTokenIdxs) > 1) {
throw new ConfigurationException("Pattern {$rule->getTokenName()}/#{$patternIdx} must have unambiguous start token. Multiple {$rule->getTokenName()} tokens found.");
} else {
$potentialStartTokenIdx = $potentialStartTokenIdxs[0];
$tokens[$potentialStartTokenIdx]['is_start_token'] = true;
}
}
$pattern = new RulePattern((int) $patternData['probability']);
foreach ($tokens as $token) {
$pattern->addToken(new RulePatternToken($token['name'], $token['is_start_token']));
}
$rule->addPattern($pattern);
$patternIdx++;
}
$rules->addRule($rule);
}
return $rules;
}
示例3: _parse
/**
* Parse current rule.
*
* @param \Hoa\Compiler\Llk\Rule $zeRule Current rule.
* @param int $next Next rule index.
* @return bool
*/
protected function _parse(Rule $zeRule, $next)
{
if ($zeRule instanceof Rule\Token) {
$name = $this->getCurrentToken();
if ($zeRule->getTokenName() !== $name) {
return false;
}
$value = $this->getCurrentToken('value');
if (0 <= ($unification = $zeRule->getUnificationIndex())) {
for ($skip = 0, $i = count($this->_trace) - 1; $i >= 0; --$i) {
$trace = $this->_trace[$i];
if ($trace instanceof Rule\Entry) {
if (false === $trace->isTransitional()) {
if ($trace->getDepth() <= $this->_depth) {
break;
}
--$skip;
}
} elseif ($trace instanceof Rule\Ekzit && false === $trace->isTransitional()) {
$skip += $trace->getDepth() > $this->_depth;
}
if (0 < $skip) {
continue;
}
if ($trace instanceof Rule\Token && $unification === $trace->getUnificationIndex() && $value !== $trace->getValue()) {
return false;
}
}
}
$namespace = $this->getCurrentToken('namespace');
$zzeRule = clone $zeRule;
$zzeRule->setValue($value);
$zzeRule->setNamespace($namespace);
if (isset($this->_tokens[$namespace][$name])) {
$zzeRule->setRepresentation($this->_tokens[$namespace][$name]);
} else {
foreach ($this->_tokens[$namespace] as $_name => $regex) {
if (false === ($pos = strpos($_name, ':'))) {
continue;
}
$_name = substr($_name, 0, $pos);
if ($_name === $name) {
break;
}
}
$zzeRule->setRepresentation($regex);
}
array_pop($this->_todo);
$this->_trace[] = $zzeRule;
$this->_errorState = ++$this->_currentState;
return true;
} elseif ($zeRule instanceof Rule\Concatenation) {
if (false === $zeRule->isTransitional()) {
++$this->_depth;
}
$this->_trace[] = new Rule\Entry($zeRule->getName(), 0, null, $this->_depth);
$content = $zeRule->getContent();
for ($i = count($content) - 1; $i >= 0; --$i) {
$nextRule = $content[$i];
$this->_todo[] = new Rule\Ekzit($nextRule, 0);
$this->_todo[] = new Rule\Entry($nextRule, 0);
}
return true;
} elseif ($zeRule instanceof Rule\Choice) {
$content = $zeRule->getContent();
if ($next >= count($content)) {
return false;
}
if (false === $zeRule->isTransitional()) {
++$this->_depth;
}
$this->_trace[] = new Rule\Entry($zeRule->getName(), $next, $this->_todo, $this->_depth);
$nextRule = $content[$next];
$this->_todo[] = new Rule\Ekzit($nextRule, 0);
$this->_todo[] = new Rule\Entry($nextRule, 0);
return true;
} elseif ($zeRule instanceof Rule\Repetition) {
$nextRule = $zeRule->getContent();
if (0 === $next) {
$name = $zeRule->getName();
$min = $zeRule->getMin();
if (false === $zeRule->isTransitional()) {
++$this->_depth;
}
$this->_trace[] = new Rule\Entry($name, $min, null, $this->_depth);
array_pop($this->_todo);
$this->_todo[] = new Rule\Ekzit($name, $min, $this->_todo);
for ($i = 0; $i < $min; ++$i) {
$this->_todo[] = new Rule\Ekzit($nextRule, 0);
$this->_todo[] = new Rule\Entry($nextRule, 0);
}
return true;
} else {
//.........这里部分代码省略.........