1 /* $XConsortium: Recognizer.C /main/1 1996/07/29 17:02:40 cde-hp $ */
2 // Copyright (c) 1994 James Clark
3 // See the file COPYING for copying permission.
13 #include "Recognizer.h"
14 #include "InputSource.h"
17 namespace SP_NAMESPACE {
20 Recognizer::Recognizer(Trie *trie, const XcharMap<EquivCode> &map)
21 : trie_(trie), map_(map), multicode_(0)
25 Recognizer::Recognizer(Trie *trie, const XcharMap<EquivCode> &map,
26 Vector<Token> &suppressTokens)
27 : trie_(trie), map_(map), multicode_(1)
29 suppressTokens.swap(suppressTokens_);
32 Token Recognizer::recognize(InputSource *in, Messenger &mgr) const
36 if (in->scanSuppress())
37 return suppressTokens_[map_[in->tokenChar(mgr)]];
40 in->startTokenNoMulticode();
41 register const Trie *pos = trie_.pointer();
43 pos = pos->next(map_[in->tokenChar(mgr)]);
44 } while (pos->hasNext());
46 in->endToken(pos->tokenLength());
49 const BlankTrie *b = pos->blank();
50 const Trie *newPos = b;
51 size_t maxBlanks = b->maxBlanksToScan();
53 for (nBlanks = 0; nBlanks < maxBlanks; nBlanks++) {
54 EquivCode code = map_[in->tokenChar(mgr)];
55 if (!b->codeIsBlank(code)) {
56 if (newPos->hasNext())
57 newPos = newPos->next(code);
61 while (newPos->hasNext())
62 newPos = newPos->next(map_[in->tokenChar(mgr)]);
63 if (newPos->token() != 0) {
64 in->endToken(newPos->tokenLength() + b->additionalLength() + nBlanks);
65 return newPos->token();
68 in->endToken(pos->tokenLength() + (pos->includeBlanks() ? nBlanks : 0));