Blame lib/Recognizer.cxx

Packit 8a864e
// Copyright (c) 1994 James Clark
Packit 8a864e
// See the file COPYING for copying permission.
Packit 8a864e
Packit 8a864e
#ifdef __GNUG__
Packit 8a864e
#pragma implementation
Packit 8a864e
#endif
Packit 8a864e
#include "splib.h"
Packit 8a864e
#include "Resource.h"
Packit 8a864e
#include "Trie.h"
Packit 8a864e
#include "Owner.h"
Packit 8a864e
#include "XcharMap.h"
Packit 8a864e
#include "Recognizer.h"
Packit 8a864e
#include "InputSource.h"
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
namespace SP_NAMESPACE {
Packit 8a864e
#endif
Packit 8a864e
Packit 8a864e
Recognizer::Recognizer(Trie *trie, const XcharMap<EquivCode> &map)
Packit 8a864e
: trie_(trie), map_(map), multicode_(0)
Packit 8a864e
{
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Recognizer::Recognizer(Trie *trie, const XcharMap<EquivCode> &map,
Packit 8a864e
		       Vector<Token> &suppressTokens)
Packit 8a864e
: trie_(trie), map_(map), multicode_(1)
Packit 8a864e
{
Packit 8a864e
  suppressTokens.swap(suppressTokens_);
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Recognizer::~Recognizer() {}
Packit 8a864e
Packit 8a864e
Token Recognizer::recognize(InputSource *in, Messenger &mgr) const
Packit 8a864e
{
Packit 8a864e
  if (multicode_) {
Packit 8a864e
    in->startToken();
Packit 8a864e
    if (in->scanSuppress())
Packit 8a864e
      return suppressTokens_[map_[in->tokenChar(mgr)]];
Packit 8a864e
  }
Packit 8a864e
  else
Packit 8a864e
    in->startTokenNoMulticode();
Packit 8a864e
  register const Trie *pos = trie_.pointer();
Packit 8a864e
  do {
Packit 8a864e
    pos = pos->next(map_[in->tokenChar(mgr)]);
Packit 8a864e
  } while (pos->hasNext());
Packit 8a864e
  if (!pos->blank()) {
Packit 8a864e
    in->endToken(pos->tokenLength());
Packit 8a864e
    return pos->token();
Packit 8a864e
  }
Packit 8a864e
  const BlankTrie *b = pos->blank();
Packit 8a864e
  const Trie *newPos = b;
Packit 8a864e
  size_t maxBlanks = b->maxBlanksToScan();
Packit 8a864e
  size_t nBlanks;
Packit 8a864e
  for (nBlanks = 0; nBlanks < maxBlanks; nBlanks++) {
Packit 8a864e
    EquivCode code = map_[in->tokenChar(mgr)];
Packit 8a864e
    if (!b->codeIsBlank(code)) {
Packit 8a864e
      if (newPos->hasNext())
Packit 8a864e
	newPos = newPos->next(code);
Packit 8a864e
      break;
Packit 8a864e
    }
Packit 8a864e
  }
Packit 8a864e
  while (newPos->hasNext())
Packit 8a864e
    newPos = newPos->next(map_[in->tokenChar(mgr)]);
Packit 8a864e
  if (newPos->token() != 0) {
Packit 8a864e
    in->endToken(newPos->tokenLength() + b->additionalLength() + nBlanks);
Packit 8a864e
    return newPos->token();
Packit 8a864e
  }
Packit 8a864e
  else {
Packit 8a864e
    in->endToken(pos->tokenLength() + (pos->includeBlanks() ? nBlanks : 0));
Packit 8a864e
    return pos->token();
Packit 8a864e
  }
Packit 8a864e
}
Packit 8a864e
Packit 8a864e
Packit 8a864e
#ifdef SP_NAMESPACE
Packit 8a864e
}
Packit 8a864e
#endif