source: trunk/src/contentmodel.c @ 106

Last change on this file since 106 was 106, checked in by lindanl, 11 years ago

Content Models.

File size: 5.7 KB
Line 
1/*  contentmodel.c - Content Models from !ELEMENT declarations.
2    Copyright (c) 2008, Robert D. Cameron and Dan Lin.
3    Licensed to the public under the Open Software License 3.0.
4    Licensed to International Characters, Inc., under the Academic
5    Free License 3.0.
6*/
7
8#include "contentmodel.h"
9
10
11CM_Any::CM_Any(): ContentModel() {
12        cm_type = cm_Any;
13}
14
15CM_Empty::CM_Empty() : ContentModel() {
16        cm_type = cm_Empty;
17}
18
19CM_Mixed::CM_Mixed() : ContentModel() {
20        cm_type = cm_Mixed;
21}
22
23CM_RegExp::CM_RegExp() : ContentModel() {
24        cm_type = cm_RegExp;
25}
26
27CRE_Star::CRE_Star(Content_RE * s) : Content_RE() {
28        subCM = s;
29        matches_empty = true;
30}
31
32CRE_Plus::CRE_Plus(Content_RE * s) : Content_RE() {
33        subCM = s;
34        matches_empty = s->matches_empty;
35}
36
37CRE_Opt::CRE_Opt(Content_RE * s) : Content_RE() {
38        subCM = s;
39        matches_empty = true;
40}
41CRE_Name::CRE_Name(int id) : Content_RE() {
42        elemID = id;
43        matches_empty = false;
44}
45
46CRE_Seq::CRE_Seq() : Content_RE() {
47}
48
49CRE_Choice::CRE_Choice() : Content_RE() {
50}
51
52void CRE_Seq :: Compile() {
53         matches_empty = true;
54         for(int i=0; i< subCMs.size(); i++){
55                if (!(subCMs[i]->matches_empty)){
56                        matches_empty = false;
57                        return;
58                }
59        }
60}
61void CRE_Name :: Set_Follow_Map(symbol_set_t * transition_map) {
62/*      printf("stateID: %d\n",stateID);
63        for(int i=0;i<follow_map.size();i++)
64                printf("%d ",follow_map[i]);
65        printf("\n");*/
66        transition_map[stateID] = follow_map;
67}
68
69void CRE_Star :: Set_Follow_Map(symbol_set_t * transition_map) {
70        hash_map<int, int >::iterator j;
71        for (j=follow_map.begin(); j!=follow_map.end(); j++) {
72                subCM->follow_map[j->first]=j->second;
73        }
74        for (j=subCM->first_map.begin(); j!=subCM->first_map.end(); j++) {
75                if (subCM->follow_map[j->first] != 0) {
76                        printf("Error: nondeterminism in content model.\n");
77                        exit(-1);
78                }
79                subCM->follow_map[j->first]=j->second;
80        }
81        subCM->Set_Follow_Map(transition_map);
82}
83
84void CRE_Plus :: Set_Follow_Map(symbol_set_t * transition_map) {
85        hash_map<int, int >::iterator j;
86        for (j=follow_map.begin(); j!=follow_map.end(); j++) 
87                subCM->follow_map[j->first]=j->second;
88        for (j=subCM->first_map.begin(); j!=subCM->first_map.end(); j++) {
89                if (subCM->follow_map[j->first] != 0) {
90                        printf("Error: nondeterminism in content model.\n");
91                        exit(-1);
92                }
93                subCM->follow_map[j->first]=j->second;
94        }
95        subCM->Set_Follow_Map(transition_map);
96}
97
98void CRE_Opt :: Set_Follow_Map(symbol_set_t * transition_map) {
99        subCM->follow_map =  follow_map;
100        subCM->Set_Follow_Map(transition_map);
101}
102
103void CRE_Choice :: Set_Follow_Map(symbol_set_t * transition_map) {
104         for(int i=0; i< subCMs.size(); i++){
105                subCMs[i]->follow_map =  follow_map;
106                subCMs[i]->Set_Follow_Map(transition_map);
107         }
108}
109
110void CRE_Seq :: Set_Follow_Map(symbol_set_t * transition_map) {
111        hash_map<int, int >::iterator itr;
112        subCMs[subCMs.size()-1]->follow_map = follow_map;
113        for (int i=subCMs.size()-1; i >= 1; i--) {
114                // Set the follow_map for item i-1 to include first_map for i;
115                for (itr=subCMs[i]->first_map.begin(); itr!=subCMs[i]->first_map.end(); itr++) {
116                        if (subCMs[i-1]->follow_map[itr->first] != 0) {
117                                printf("Error: nondeterminism in content model.\n");
118                                exit(-1);
119                        }
120                        subCMs[i-1]->follow_map[itr->first]=itr->second;
121                }
122                // If item i matches empty, set follow_map for item i-1 to include
123                // follow_map for i.
124                if (subCMs[i]->matches_empty) {
125                        for (itr=subCMs[i]->follow_map.begin(); itr!=subCMs[i]->follow_map.end(); itr++) { 
126                                if (subCMs[i-1]->follow_map[itr->first] != 0) {
127                                        printf("Error: nondeterminism in content model.\n");
128                                        exit(-1);
129                                }
130                                subCMs[i-1]->follow_map[itr->first]=itr->second;
131                        }
132                }
133        }
134        for (int j = 0; j < subCMs.size(); j++) 
135                subCMs[j]->Set_Follow_Map(transition_map);
136}
137
138
139
140void CRE_Choice :: Compile() {
141         matches_empty = false;
142         for(int i=0; i< subCMs.size(); i++){
143                if (subCMs[i]->matches_empty)
144                        matches_empty = true;
145        }
146}
147
148int CRE_Name :: Set_IDs(int ID_base) {
149        stateID = ++ID_base;
150        return stateID;
151}
152
153int CRE_Seq :: Set_IDs(int ID_base) {
154        int b = ID_base;
155        for(int i=0; i< subCMs.size(); i++){
156                b = subCMs[i]->Set_IDs(b);
157        }
158        return b;
159}
160
161int CRE_Choice :: Set_IDs(int ID_base) {
162        int b = ID_base;
163        for(int i=0; i< subCMs.size(); i++){
164                b = subCMs[i]->Set_IDs(b);
165        }
166        return b;
167}
168
169int CRE_Star :: Set_IDs(int ID_base) {
170        return subCM->Set_IDs(ID_base);
171}
172
173int CRE_Plus :: Set_IDs(int ID_base) {
174        return subCM->Set_IDs(ID_base);
175}
176
177int CRE_Opt :: Set_IDs(int ID_base) {
178        return subCM->Set_IDs(ID_base);
179}
180
181
182void CRE_Name :: Set_First_Map() {
183        first_map[elemID]=stateID;
184}
185
186
187void CRE_Seq :: Set_First_Map() {
188        for(int i=0; i< subCMs.size(); i++){
189                subCMs[i]->Set_First_Map();
190        }
191        for(int i=0; i< subCMs.size(); i++){   
192                int fm_size = first_map.size();
193                symbol_set_t s_i = subCMs[i]->first_map;
194                int s_i_size = s_i.size();
195               
196                hash_map<int, int >::iterator j;
197                for (j=s_i.begin(); j!=s_i.end(); j++) first_map[j->first]=j->second;
198               
199//              if (first_map.size() < fm_size + s_i_size) {
200//                      printf("Error: nondeterminism in content model.\n");
201//                      exit(-1);
202//              }
203                if (!(subCMs[i]->matches_empty)){
204                        return;
205                }
206        }
207}
208
209void CRE_Choice :: Set_First_Map() {
210        for(int i=0; i< subCMs.size(); i++){
211                subCMs[i]->Set_First_Map();
212                int fm_size = first_map.size();
213                symbol_set_t s_i = subCMs[i]->first_map;
214                int s_i_size = s_i.size();
215               
216                hash_map<int, int >::iterator j;
217                for (j=s_i.begin(); j!=s_i.end(); j++) first_map[j->first]=j->second;
218               
219//              if (first_map.size() < fm_size + s_i_size) {
220//                      printf("Error: nondeterminism in content model.\n");
221//                      exit(-1);
222//              }
223        }
224}
225
226void CRE_Star :: Set_First_Map() {
227        subCM->Set_First_Map();
228        first_map=subCM->first_map;
229}
230
231void CRE_Plus :: Set_First_Map() {
232        subCM->Set_First_Map();
233        first_map=subCM->first_map;
234}
235
236void CRE_Opt :: Set_First_Map() {
237        subCM->Set_First_Map();
238        first_map=subCM->first_map;
239}
240
241       
242       
243       
244       
245       
246       
247       
248       
249       
Note: See TracBrowser for help on using the repository browser.