• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* FILE:		gr_iface.cpp
2  *  DATE MODIFIED:	31-Aug-07
3  *  DESCRIPTION:	Part of the  SREC graph compiler project source files.
4  *
5  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
6  *                                                                           *
7  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
8  *  you may not use this file except in compliance with the License.         *
9  *                                                                           *
10  *  You may obtain a copy of the License at                                  *
11  *      http://www.apache.org/licenses/LICENSE-2.0                           *
12  *                                                                           *
13  *  Unless required by applicable law or agreed to in writing, software      *
14  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
15  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
16  *  See the License for the specific language governing permissions and      *
17  *  limitations under the License.                                           *
18  *                                                                           *
19  *---------------------------------------------------------------------------*/
20 
21 #include <iostream>
22 #include <string>
23 #include <assert.h>
24 #include <cstdio>
25 
26 #include "grph.h"
27 
28 #define DEBUG       0
29 
addSubGraph(SubGraph * sbGraph)30 int Graph::addSubGraph (SubGraph *sbGraph)
31 {
32     int ruleId;
33 
34     if (numSubGraph%BLKSIZE == 0) {
35 	if (numSubGraph >0) {
36 	    SubGraph **newSubGraph= new SubGraph * [numSubGraph+BLKSIZE];
37 	    int *newIndex= new int [numSubGraph+BLKSIZE];
38 	    for (int ii= 0; ii < numSubGraph; ii++) {
39                 newSubGraph[ii]= subGraph[ii];
40                 newIndex[ii]= subIndex[ii];
41 	    }
42 	    delete [] subGraph;
43 	    delete [] subIndex;
44 	    subGraph= newSubGraph;
45 	    subIndex= newIndex;
46 	}
47 	else {
48 	    subGraph= new SubGraph * [BLKSIZE];
49 	    subIndex= new int [BLKSIZE];
50 	}
51     }
52     ruleId= sbGraph->getRuleId();
53 
54     subGraph[numSubGraph]= sbGraph;
55     subIndex[numSubGraph]= ruleId;
56 #if DEBUG
57     char rulLabel[128];
58 
59     if (sbGraph) {
60         sbGraph->getName (rulLabel, 128);
61         printf ("Adding rule %s with %d\n", rulLabel, ruleId);
62     }
63 #endif
64     numSubGraph++;
65     return numSubGraph;
66 }
67 
getSubGraphIndex(int subId)68 int Graph::getSubGraphIndex (int subId)
69 {
70     for (int ii= numSubGraph-1; ii >= 0; ii--)
71         if (subIndex[ii] == subId)
72             return ii;
73     return -1;
74 }
75 
getSubGraphIndex(SubGraph * sGraph)76 int Graph::getSubGraphIndex (SubGraph *sGraph)
77 {
78     for (int ii= numSubGraph-1; ii >= 0; ii--)
79         if (subGraph[ii] == sGraph)
80             return subIndex[ii];
81     return -1;
82 }
83 
84 /**  Begin and end scope */
85 
BeginRule(SubGraph * subg)86 void Graph::BeginRule (SubGraph *subg)
87 {
88     subg->BeginScope (SCOPE_RULE, 0, 0);
89 #if DEBUG
90     subg->DebugPrintDirective ("<ruleref>");
91 #endif
92     return;
93 }
94 
EndRule(SubGraph * subg)95 void Graph::EndRule (SubGraph *subg)
96 {
97 #if DEBUG
98     subg->DebugPrintDirective ("</ruleref>");
99 #endif
100     subg->EndScope();
101     return;
102 }
103 
BeginItem(SubGraph * subg)104 void Graph::BeginItem (SubGraph *subg)
105 {
106     subg->BeginScope (SCOPE_ITEM, 0, 0);
107 #if DEBUG
108     subg->DebugPrintDirective ("<item>");
109 #endif
110     return;
111 }
112 
BeginItemRepeat(SubGraph * subg,int minCount,int maxCount)113 void Graph::BeginItemRepeat (SubGraph *subg, int minCount, int maxCount)
114 {
115     subg->BeginScope (SCOPE_REPEAT, minCount, maxCount);
116 #if DEBUG
117     subg->DebugPrintDirective ("<item repeat>");
118 #endif
119     return;
120 }
121 
AddRuleRef(SubGraph * subg,int ruleNo)122 void Graph::AddRuleRef (SubGraph *subg, int ruleNo)
123 {
124     subg->AddItem (-ruleNo, ruleNo);
125 #if DEBUG
126     subg->DebugPrintDirective ("<add ruleref>");
127     printf ("    %d\n", ruleNo);
128 #endif
129     return;
130 }
131 
AddLabel(SubGraph * subg,int labNo)132 void Graph::AddLabel (SubGraph *subg, int labNo)
133 {
134     subg->AddItem (labNo, -1);
135 #if DEBUG
136     subg->DebugPrintLabel (labNo);
137 #endif
138     return;
139 }
140 
AddTag(SubGraph * subg,int tagNo)141 void Graph::AddTag (SubGraph *subg, int tagNo)
142 {
143     subg->AddTag (tagNo);
144 #if DEBUG
145     subg->DebugPrintLabel (tagNo);
146 #endif
147     return;
148 }
149 
EndItem(SubGraph * subg)150 void Graph::EndItem (SubGraph *subg)
151 {
152 #if DEBUG
153     subg->DebugPrintDirective ("</item>");
154 #endif
155     subg->EndScope();
156     return;
157 }
158 
BeginOneOf(SubGraph * subg)159 void Graph::BeginOneOf (SubGraph *subg)
160 {
161     subg->BeginScope (SCOPE_ONEOF, 0, 0);
162 #if DEBUG
163     subg->DebugPrintDirective ("<one-of>");
164 #endif
165     return;
166 }
167 
EndOneOf(SubGraph * subg)168 void Graph::EndOneOf (SubGraph *subg)
169 {
170 #if DEBUG
171     subg->DebugPrintDirective ("</one-of>");
172 #endif
173     subg->EndScope ();
174     return;
175 }
176 
BeginCount(SubGraph * subg,int minCount,int maxCount)177 void Graph::BeginCount (SubGraph *subg, int minCount, int maxCount)
178 {
179     subg->BeginScope (SCOPE_COUNT, minCount, maxCount);
180 #if DEBUG
181     subg->DebugPrintDirective ("<count>");
182 #endif
183     return;
184 }
185 
EndCount(SubGraph * subg)186 void Graph::EndCount (SubGraph *subg)
187 {
188 #if DEBUG
189     subg->DebugPrintDirective ("</count>");
190 #endif
191     subg->EndScope();
192     return;
193 }
194 
BeginOptional(SubGraph * subg)195 void Graph::BeginOptional (SubGraph *subg)
196 {
197     subg->BeginScope (SCOPE_OPT, 0, 0);
198 #if DEBUG
199     subg->DebugPrintDirective ("<item repeat= 0- >");
200 #endif
201     return;
202 }
203 
ExpandRules(SubGraph * subg)204 void Graph::ExpandRules (SubGraph *subg)
205 {
206     subg->ExpandRules (subGraph, subIndex, numSubGraph);
207     return;
208 }
209