1 // Copyright (c) 1998-99, Ed Schlunder
2
3 #include <iostream.h>
4 #include <fstream.h>
5 #include "lexicon.h"
6
7 // ---------------------------------------------------------------------------
8 // Class Implementation: Lexicon
9 // ---------------------------------------------------------------------------
Lexicon(char * fileName)10 Lexicon::Lexicon(char *fileName) {
11 char buffer[1000];
12 ifstream inFile;
13
14 // specify that this is an empty lexicon currently
15 rootPtr = currPtr = NULL;
16
17 // try to open the lexicon file
18 inFile.open(fileName);
19 if(!inFile) {
20 cout << "Lexicon file can not be opened." << endl;
21 return;
22 }
23
24 // read in each lexicon entry and insert it into our BST
25 while(inFile) {
26 inFile.getline(buffer, 999);
27
28 // ignore blank lines
29 if(strlen(buffer) < 2) continue;
30
31 insert(new genericNode(buffer));
32 }
33 }
34
insert(genericNode * newWord)35 void Lexicon::insert(genericNode *newWord) {
36 #ifdef DEBUG
37 cout << "insertLexicon: [" << *newWord << "]" << endl;
38 #endif
39
40 // if this is an empty lexicon, insert at the top of the BST
41 if(rootPtr == NULL) {
42 rootPtr = new lexicalNode;
43 rootPtr->node = newWord;
44 rootPtr->leftPtr = NULL;
45 rootPtr->rightPtr = NULL;
46 }
47 else
48 insert(newWord, rootPtr);
49 }
50
insert(genericNode * newWord,lexicalNode * root)51 void Lexicon::insert(genericNode *newWord, lexicalNode *root) {
52 lexicalNode *tmp;
53
54 // does newWord belong to the right of this node?
55 if(strcmp(root->node->word(), newWord->word()) > 0)
56 // ASSERT: newWord belongs to the right of this word
57 if(root->rightPtr) {
58 // nodes already exist to the right, follow link down and try again
59 insert(newWord, root->rightPtr);
60 return;
61 }
62 else
63 // make a new node to the right
64 tmp = root->rightPtr = new lexicalNode;
65 else
66 if(root->leftPtr) {
67 insert(newWord, root->leftPtr);
68 return;
69 }
70 else
71 tmp = root->leftPtr = new lexicalNode;
72
73 tmp->node = newWord;
74 tmp->leftPtr = NULL;
75 tmp->rightPtr = NULL;
76 }
77
~Lexicon()78 Lexicon::~Lexicon() {
79 // -----------------------
80 // THIS NEEDS IMPLEMENTING
81 // -----------------------
82 }
83
currNode(void)84 genericNode *Lexicon::currNode(void) {
85 if(currPtr)
86 return currPtr->node;
87
88 return NULL;
89 }
90
91 // ---------------------------------------------------------------------------
92
lookupNext(void)93 bool Lexicon::lookupNext(void) {
94 if(currPtr->leftPtr == NULL)
95 return false;
96 else
97 return lookupWord(currPtr->leftPtr, currPtr->node->word());
98 }
99
lookupWord(char * word)100 bool Lexicon::lookupWord(char *word) {
101 return lookupWord(rootPtr, word);
102 }
103
lookupWord(lexicalNode * root,char * word)104 bool Lexicon::lookupWord(lexicalNode *root, char *word) {
105 int cmp;
106
107 // if we've hit a dead end, we know this word doesn't exist in the tree
108 if(root == NULL) return false;
109
110 // is this word the one we were looking for?
111 cmp = strcmp(root->node->word(), word);
112 if(cmp == 0) {
113 currPtr = root;
114 return true;
115 }
116
117 if(cmp > 0)
118 return lookupWord(root->rightPtr, word);
119 else
120 return lookupWord(root->leftPtr, word);
121 }
122