blob: 5667ea93268037cfc58c62a5f0b430cdda95ccef [file] [log] [blame]
/* FILE: gr_iface.cpp
* DATE MODIFIED: 31-Aug-07
* DESCRIPTION: Part of the SREC graph compiler project source files.
*
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#include <iostream>
#include <string>
#include <assert.h>
#include <cstdio>
#include "grph.h"
#define DEBUG 0
int Graph::addSubGraph (SubGraph *sbGraph)
{
int ruleId;
if (numSubGraph%BLKSIZE == 0) {
if (numSubGraph >0) {
SubGraph **newSubGraph= new SubGraph * [numSubGraph+BLKSIZE];
int *newIndex= new int [numSubGraph+BLKSIZE];
for (int ii= 0; ii < numSubGraph; ii++) {
newSubGraph[ii]= subGraph[ii];
newIndex[ii]= subIndex[ii];
}
delete [] subGraph;
delete [] subIndex;
subGraph= newSubGraph;
subIndex= newIndex;
}
else {
subGraph= new SubGraph * [BLKSIZE];
subIndex= new int [BLKSIZE];
}
}
ruleId= sbGraph->getRuleId();
subGraph[numSubGraph]= sbGraph;
subIndex[numSubGraph]= ruleId;
#if DEBUG
char rulLabel[128];
if (sbGraph) {
sbGraph->getName (rulLabel, 128);
printf ("Adding rule %s with %d\n", rulLabel, ruleId);
}
#endif
numSubGraph++;
return numSubGraph;
}
int Graph::getSubGraphIndex (int subId)
{
for (int ii= numSubGraph-1; ii >= 0; ii--)
if (subIndex[ii] == subId)
return ii;
return -1;
}
int Graph::getSubGraphIndex (SubGraph *sGraph)
{
for (int ii= numSubGraph-1; ii >= 0; ii--)
if (subGraph[ii] == sGraph)
return subIndex[ii];
return -1;
}
/** Begin and end scope */
void Graph::BeginRule (SubGraph *subg)
{
subg->BeginScope (SCOPE_RULE, 0, 0);
#if DEBUG
subg->DebugPrintDirective ("<ruleref>");
#endif
return;
}
void Graph::EndRule (SubGraph *subg)
{
#if DEBUG
subg->DebugPrintDirective ("</ruleref>");
#endif
subg->EndScope();
return;
}
void Graph::BeginItem (SubGraph *subg)
{
subg->BeginScope (SCOPE_ITEM, 0, 0);
#if DEBUG
subg->DebugPrintDirective ("<item>");
#endif
return;
}
void Graph::BeginItemRepeat (SubGraph *subg, int minCount, int maxCount)
{
subg->BeginScope (SCOPE_REPEAT, minCount, maxCount);
#if DEBUG
subg->DebugPrintDirective ("<item repeat>");
#endif
return;
}
void Graph::AddRuleRef (SubGraph *subg, int ruleNo)
{
subg->AddItem (-ruleNo, ruleNo);
#if DEBUG
subg->DebugPrintDirective ("<add ruleref>");
printf (" %d\n", ruleNo);
#endif
return;
}
void Graph::AddLabel (SubGraph *subg, int labNo)
{
subg->AddItem (labNo, -1);
#if DEBUG
subg->DebugPrintLabel (labNo);
#endif
return;
}
void Graph::AddTag (SubGraph *subg, int tagNo)
{
subg->AddTag (tagNo);
#if DEBUG
subg->DebugPrintLabel (tagNo);
#endif
return;
}
void Graph::EndItem (SubGraph *subg)
{
#if DEBUG
subg->DebugPrintDirective ("</item>");
#endif
subg->EndScope();
return;
}
void Graph::BeginOneOf (SubGraph *subg)
{
subg->BeginScope (SCOPE_ONEOF, 0, 0);
#if DEBUG
subg->DebugPrintDirective ("<one-of>");
#endif
return;
}
void Graph::EndOneOf (SubGraph *subg)
{
#if DEBUG
subg->DebugPrintDirective ("</one-of>");
#endif
subg->EndScope ();
return;
}
void Graph::BeginCount (SubGraph *subg, int minCount, int maxCount)
{
subg->BeginScope (SCOPE_COUNT, minCount, maxCount);
#if DEBUG
subg->DebugPrintDirective ("<count>");
#endif
return;
}
void Graph::EndCount (SubGraph *subg)
{
#if DEBUG
subg->DebugPrintDirective ("</count>");
#endif
subg->EndScope();
return;
}
void Graph::BeginOptional (SubGraph *subg)
{
subg->BeginScope (SCOPE_OPT, 0, 0);
#if DEBUG
subg->DebugPrintDirective ("<item repeat= 0- >");
#endif
return;
}
void Graph::ExpandRules (SubGraph *subg)
{
subg->ExpandRules (subGraph, subIndex, numSubGraph);
return;
}