Системное программирование / SSW_kw_Appendix
.pdfСоздание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
char* |
szRightBnfRule; // правая часть правила грамматики в форме Бэкуса-Наура |
char* |
szBnfRule; // правило в форме Бэкуса-Наура |
public: |
|
TSyntRule();
TSyntRule(int _iNumRule, int _iNumSyntSymbol, char* _cLeftRule, char* _cRightRule,
|
char* _cLeftBnfRule, char* _cRightBnfRule); |
~TSyntRule(); |
|
int |
getNumRule(); |
void |
setNumSyntSymbol(int _iNumSyntSymbol); |
int |
getNumSyntSymbol(); |
const char* getLeftRule(); |
const char* getRightRule(); const char* getLeftBnfRule(); const char* getRightBnfRule(); const char* getBnfRule();
};
#endif
Листинг 54. Файл реализации класса TSyntRule (файл
TSyntRule.cpp)
#pragma hdrstop
#pragma package(smart_init) #include "TSyntRule.h" #include <string.h>
//---------------------------------------------------------------------------
TSyntRule::TSyntRule() {
iNumRule |
= 0; |
iNumSyntSymbol = 0; |
|
szLeftRule |
= 0; |
szRightRule |
= 0; |
szLeftBnfRule |
= 0; |
szRightBnfRule |
= 0; |
szBnfRule |
= 0; |
} |
|
//---------------------------------------------------------------------------
TSyntRule::TSyntRule(int _iNumRule, int _iNumSyntSymbol, char* _cLeftRule, char* _cRightRule,
char* _cLeftBnfRule, char* _cRightBnfRule)
{
iNumRule = _iNumRule; iNumSyntSymbol = _iNumSyntSymbol; int iLen = strlen(_cLeftRule); szLeftRule = new char[iLen+1]; strcpy(szLeftRule,_cLeftRule);
iLen = strlen(_cRightRule); szRightRule = new char[iLen+1]; strcpy(szRightRule,_cRightRule); int iLeftLen = strlen(_cLeftBnfRule);
szLeftBnfRule = new char[iLeftLen+1]; strcpy(szLeftBnfRule,_cLeftBnfRule); int iRightLen = strlen(_cRightBnfRule);
szRightBnfRule = new char[iRightLen+1]; strcpy(szRightBnfRule,_cRightBnfRule);
szBnfRule = new char[iLeftLen + 3 + iRightLen + 1]; strcpy(szBnfRule,_cLeftBnfRule); strcat(szBnfRule,"::="); strcat(szBnfRule,_cRightBnfRule);
}
//---------------------------------------------------------------------------
TSyntRule::~TSyntRule() {
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы |
51 |
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
if (szLeftRule != NULL) delete[] szLeftRule;
szLeftRule = NULL;
if (szRightRule != NULL) delete[] szRightRule;
szRightRule = NULL;
if (szLeftBnfRule != NULL) delete[] szLeftBnfRule;
szLeftBnfRule = NULL;
if (szRightBnfRule != NULL) delete[] szRightBnfRule;
szRightBnfRule = NULL; if (szBnfRule != NULL)
delete[] szBnfRule; szBnfRule = NULL;
}
//---------------------------------------------------------------------------
int TSyntRule::getNumRule() { return iNumRule;
}
//---------------------------------------------------------------------------
void TSyntRule::setNumSyntSymbol(int _iNumSyntSymbol) { if (_iNumSyntSymbol > 0)
iNumSyntSymbol = _iNumSyntSymbol;
}
//---------------------------------------------------------------------------
int TSyntRule::getNumSyntSymbol() { return iNumSyntSymbol;
}
//---------------------------------------------------------------------------
const char* TSyntRule::getLeftRule() { return szLeftRule;
}
//---------------------------------------------------------------------------
const char* TSyntRule::getRightRule() { return szRightRule;
}
//---------------------------------------------------------------------------
const char* TSyntRule::getLeftBnfRule() { return szLeftBnfRule;
}
//---------------------------------------------------------------------------
const char* TSyntRule::getRightBnfRule() { return szRightBnfRule;
}
//---------------------------------------------------------------------------
const char* TSyntRule::getBnfRule() { return szBnfRule;
}
Листинг 55. Заголовочный файл класса TSyntRuleList (файл
TSyntRuleList.h)
#ifndef TSyntRuleListH #define TSyntRuleListH #include "TSyntRule.h"
//---------------------------------------------------------------------------
class TSyntRuleList
{
private:
TSyntRule** pSyntRuleList;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
52 |
М.Ф.Степанов |
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
int |
iSyntRuleCount; |
|
int |
iSyntRuleMax; |
|
public: |
|
|
|
TSyntRuleList(); |
|
|
~TSyntRuleList(); |
|
|
int |
addSyntRule(TSyntRule* _pSyntRule); // возвращает порядковый номер лексемы |
|
void |
getSyntRule(int _iNum, TSyntRule** _pSyntRule); |
|
const char* getLeftRule(int _iNum); |
|
}; |
int |
getSyntRuleCount(); |
|
|
|
#endif |
|
|
|
Листинг 56. Файл реализации класса TSyntRuleList (файл |
TSyntRuleList.cpp)
#pragma hdrstop
#pragma package(smart_init) #include "TSyntRuleList.h"
//---------------------------------------------------------------------------
TSyntRuleList::TSyntRuleList()
{
pSyntRuleList |
= 0; |
iSyntRuleCount |
= 0; |
iSyntRuleMax |
= 10; |
} |
|
//--------------------------------------------------------------------------- |
|
TSyntRuleList::~TSyntRuleList()
{
if (pSyntRuleList != 0) {
for (int i=0; i<iSyntRuleCount; i++) { TSyntRule* ptr = pSyntRuleList[i]; if (ptr != 0)
delete ptr; ptr = 0;
pSyntRuleList[i] = 0;
}
delete[] pSyntRuleList;
}
pSyntRuleList = 0;
}
//---------------------------------------------------------------------------
int TSyntRuleList::addSyntRule(TSyntRule* _pSyntRule)
{
if (pSyntRuleList == 0) {
pSyntRuleList = new TSyntRule*[iSyntRuleMax];
}
if (pSyntRuleList != 0) {
if (iSyntRuleCount == iSyntRuleMax) { iSyntRuleMax += 10;
TSyntRule** pList = new TSyntRule*[iSyntRuleMax]; for (int i=0; i<iSyntRuleCount; i++) {
pList[i] = pSyntRuleList[i]; pSyntRuleList[i] = 0;
}
delete[] pSyntRuleList; pSyntRuleList = pList; pList = 0;
}
if (iSyntRuleCount < iSyntRuleMax) { pSyntRuleList[iSyntRuleCount++] = _pSyntRule;
}
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы |
53 |
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
}
}
//---------------------------------------------------------------------------
void TSyntRuleList::getSyntRule(int _iNum, TSyntRule** _pSyntRule)
{
if (pSyntRuleList != 0) {
if (iSyntRuleCount > _iNum) { *_pSyntRule = pSyntRuleList[_iNum];
}
}
}
//---------------------------------------------------------------------------
const char* TSyntRuleList::getLeftRule(int _iNum)
{
const char *psz = 0;
if (pSyntRuleList != 0) {
if (iSyntRuleCount > _iNum) {
TSyntRule *pSyntRule = pSyntRuleList[_iNum]; if (pSyntRule != 0)
psz = pSyntRule->getLeftRule();
}
}
return psz;
}
//---------------------------------------------------------------------------
int TSyntRuleList::getSyntRuleCount()
{
return iSyntRuleCount;
}
Листинг 57. Заголовочный файл основного модуля синтаксического анализатора (файл kaSynt.h)
#ifndef kaSyntH #define kaSyntH #include "TLexemList.h" #include "TIdentList.h"
#include "TSyntSymbolList.h" #include "TSyntSymbolStack.h"
//---------------------------------------------------------------------------
extern "C" int makeSyntSymbolList(TLexemList *pLexemList, TIdentList *pIdentList, TSyntSymbolList **pSyntSymbolList,
char *_cProtocol, bool* _Terminated);
int getRelationStackToLexem(int iNumLexem, TLexemList *pLexemList, TSyntSymbolStack *pSyntSymbolStack, TIdentList *pIdentList, char* cRule);
int getRelationSyntSymbolToSyntSymbol(TSyntSymbol *_pSyntSymbol1, TSyntSymbol *_pSyntSymbol2, TIdentList *pIdentList, char* cRule);
#endif
Листинг 58. Исходный код основного модуля синтаксического анализатора (файл kaSynt.cpp)
#include <vcl.h> #pragma hdrstop
#pragma package(smart_init) //---------------------------------------------------------------------------
#include "kaSynt.h" #include "TSyntRuleList.h" #include "typeLexem.h"
//---------------------------------------------------------------------------
// матрица предшествования SIZE_GRAM_MATRIX х SIZE_GRAM_MATRIX
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
54 |
М.Ф.Степанов |
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
char gramMatrix[] =
// A |
h |
n |
t0 tk x0 ; |
',' |
вч цч = |
',' |
[ |
] |
Z |
R |
D |
r |
B |
E |
H |
S |
M |
C |
c |
X |
кц |
// кц |
||
{' ',' |
','<',' ',' |
',' ',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','=', |
// нц |
|||||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// A |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// h |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
','=','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// n |
||||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// t0 |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// tk |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
','=',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// x0 |
||||||||||||||
'>','=',' |
|
','>','=','>','=','>',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','>', |
// ; |
|||||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','>','>',' |
',' |
',' |
|
','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// вч |
|||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// цч |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=','=','=',' |
','=',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',' ',' ',' ', |
// = |
||||||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
','=',' |
',' |
',' |
|
','=',' ',' ',' ',' ',' ',' ',' ',' ',' ','=',' ',' ',' ', |
// [ |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','>',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// ] |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','<', |
// Z |
|||||||||||||
' ',' |
',' |
|
','=',' |
',' ',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// R |
|||||||||||||
' ',' |
',' |
|
','>',' |
',' ',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// D |
|||||||||||||
'=',' |
',' |
|
',' ',' |
',' ',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// r |
|||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// B |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// E |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','>', |
// H |
||||||||||||||
' ',' |
',' |
|
',' ',' |
','=',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// S |
|||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// M |
||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=','=',' |
',' |
',' |
|
','=',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// C |
|||||||||||||||
' ',' |
',' |
|
',' ',' |
',' ','=','=',' |
',' |
',' |
|
','>',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ', |
// c |
|||||||||||||||
' ',' |
',' |
|
','>',' |
',' ',' |
',' |
',' |
',' |
',' |
|
',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '}; |
// X |
|||||||||||||
//--------------------------------------------------------------------------- |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int makeSyntSymbolList(TLexemList *pLexemList, TIdentList *pIdentList, TSyntSymbolList **_pSyntSymbolList,
char *_cProtocol, bool* _Terminated)
{// формирование списка синтаксических символов int iRet = -1;
bool bDoWork = true; if (pLexemList != 0) {
TSyntRuleList *pSyntRuleList = new TSyntRuleList(); TSyntRule *pSyntRule = 0;
pSyntRule = new TSyntRule(1,1,"Z","RB2E2H2","<задача>","<массивыCразмерностью><началоАнализа>;<ко нецАнализа>;<шаг>;");
pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(2,4,"r","1n542","<размерность>","n=<целоеЧисло>;"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(3,5,"B","1t053","<началоАнализа>","t0=<вещественноеЧисло>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(4,6,"E","1tk53","<конецАнализа>","tk=<вещественноеЧисло>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(5,7,"H","1h53","<шаг>","h=<вещественноеЧисло>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(6,8,"S","1A5M2","<матрицаА>","A=<матрица>;"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(7,12,"X","1x05M2","<векторX0>","x0=<матрица>;"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(8,10,"C","Cc2","<строкиМатрицы>","<строкиМатрицы><строкаМатрицы>;");
pSyntRuleList->addSyntRule(pSyntRule); pSyntRule = new
TSyntRule(9,10,"C","CCc","<строкиМатрицы>","<строкиМатрицы><строкиМатрицы><строка Матрицы>");
pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(10,9,"M","6C7","<матрица>","[<строкиМатрицы>]"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(11,9,"M","6c7","<матрица>","[<строкаМатрицы>]"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(12,10,"C","CC","<строкиМатрицы>","<строкиМатрицы><строкиМатрицы>");
pSyntRuleList->addSyntRule(pSyntRule); pSyntRule = new
TSyntRule(13,10,"C","Cc","<строкиМатрицы>","<строкиМатрицы><строкаМатрицы>");
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы |
55 |
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(14,10,"C","c2","<строкиМатрицы>","<строкаМатрицы>;"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(15,11,"c","c3","<строкаМатрицы>","<строкаМатрицы><вещественноеЧисло>");
pSyntRuleList->addSyntRule(pSyntRule); pSyntRule = new
TSyntRule(16,2,"R","rD","<массивыCразмерностью>","<размерность><массивы>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(17,3,"D","SX","<массивы>","<матрицаА><векторX0>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(18,11,"c","3","<строкаМатрицы>","<вещественноеЧисло>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = new TSyntRule(20,10,"C","c","<строкиМатрицы>","<строкаМатрицы>"); pSyntRuleList->addSyntRule(pSyntRule);
pSyntRule = 0;
int iRuleCount = pSyntRuleList->getSyntRuleCount(); TSyntSymbolList *pSyntSymbolList = *_pSyntSymbolList; if (pSyntSymbolList != 0)
delete pSyntSymbolList;
pSyntSymbolList = new TSyntSymbolList(); // новый пустой список синтаксических символов *_pSyntSymbolList = pSyntSymbolList;
String sInStr;
String sStack; String sRuleList; String sProtocol; String s;
TSyntSymbol *pSyntSymbol = 0;
TSyntSymbolStack *pSyntSymbolStack = new TSyntSymbolStack(); // стек синт. символов
TLexem *pLexem = new TLexem( // новая лексема - "начало входной цепочки" - тип = "0" "_",0,0,0.0, 0,0,0);
pSyntSymbolStack->Push(pLexem); pLexem = 0;
int iLexemCount = pLexemList->getCount(); int iNumLexem = 0;
int iStep = 0;
while (bDoWork & (!*_Terminated) & (iNumLexem < iLexemCount)) { pLexemList->get(iNumLexem++,&pLexem);
int iTypeLexem = pLexem->getType(); s = iTypeLexem; s = s.Trim();
if (iTypeLexem == 1) {
s += pLexem->getText();
}
sInStr += s;
}
sStack = "";
int iCountSymbolStack = pSyntSymbolStack->getElemCount(); for (int i=iCountSymbolStack-1; i>=0; i--) {
pSyntSymbol = pSyntSymbolStack->getSymbol(i); int iRule = pSyntSymbol->getNumRule();
if (iRule > 0) {
s = pSyntSymbol->getLeftRule();
}
else {
int iType = pSyntSymbol->getLexemType(); s = iType;
if (iType <= 1)
s += pSyntSymbol->getLexemText();
}
sStack += s;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
56 |
М.Ф.Степанов |
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
}
s = iStep;
sProtocol += "\r\n шаг анализа = "; sProtocol += s;
sProtocol += "\r\nцепочка = '"; sProtocol += sInStr; sProtocol += "'";
sProtocol += "\r\nстек = '"; sProtocol += sStack; sProtocol += "'"; iNumLexem = 0;
char cRule = '\0'; int iNumName = 0; int iPosRelation = 0;
int iSyntTypeCurLexem = 0; int iSyntTypeTopStack = 0;
TSyntSymbol *pNewSyntSymbol = new TSyntSymbol();
while (bDoWork & (!*_Terminated) & (iNumLexem < iLexemCount)) { // собственно разбор s = ++iStep;
sProtocol += "\r\n шаг анализа = "; sProtocol += s;
iRet = getRelationStackToLexem(iNumLexem, pLexemList, pSyntSymbolStack, pIdentList, &cRule);
if (iRet == 0) { // разбор входной цепочки завершен ?
int iCountSymbolStack = pSyntSymbolStack->getElemCount(); if (iCountSymbolStack == 2) {
pSyntSymbol = pSyntSymbolStack->takeTop(); // д.б. символ "Z" - начальный символ грамматики
int iRule = pSyntSymbol->getNumRule(); if (iRule > 0) {
int iType = pSyntSymbol->getNumRule();
if (iType == 1) { // это начальный символ грамматики "Z"
sProtocol += "\r\n ==> в вершине стека символ начальный символ грамматики 'Z' \r\n
===> разбор завершен - цепочка допущена"; pSyntSymbolList->addSyntSymbol(pSyntSymbol);
}
else { // ошибка: в стеке не символ "Z" - начальный символ грамматики
sProtocol += "\r\n ==> в середине стека НЕ начальный символ грамматики 'Z' \r\n ===>
ОШИБКА - цепочка НЕ допущена";
}
}
else { // ошибка: в стеке терминальный символ, а не символ "Z" - начальный символ sProtocol += "\r\n ==> в вершине стека терминальный символ, а НЕ начальный символ
грамматики 'Z' \r\n ===> ОШИБКА - цепочка НЕ допущена";
}
}
bDoWork = false;
}
if (bDoWork & (!*_Terminated)) { switch (cRule) {
case '>': {// свертка
sProtocol += "\t ==> свёртка:"; String sRightTileRule;
int iRightTileRuleSymbolCount = 0; int iNumCurLexem = 1;
TSyntSymbol *pCurSyntSymbolStack = 0; TSyntSymbol *pNextSyntSymbolStack = 0; int iNextSyntSymbolStackType = -1;
int iNextSyntSymbolStackRuleNum = -1;
int iStackSyntSymbolCount = pSyntSymbolStack->getElemCount();
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы |
57 |
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
bool bDoWorkWithStack = true;
while (iRightTileRuleSymbolCount < MAXLEN_RIGHT_TILE_RULE) { pNextSyntSymbolStack = pSyntSymbolStack->getTop();
if (pNextSyntSymbolStack != 0) {
iNextSyntSymbolStackRuleNum = pNextSyntSymbolStack->getNumRule();
if (iNextSyntSymbolStackRuleNum > 0) { // очередной символ - занести в правило sRightTileRule = pNextSyntSymbolStack->getLeftRule() + sRightTileRule; pNewSyntSymbol->addTopSubItem(pNextSyntSymbolStack); pNextSyntSymbolStack = pSyntSymbolStack->takeTop(); iRightTileRuleSymbolCount++;
}
else { // очередной символ - терминальный
if (pCurSyntSymbolStack == 0) { // сделать выбранный символ текущим pCurSyntSymbolStack = pSyntSymbolStack->takeTop(); pNewSyntSymbol->addTopSubItem(pCurSyntSymbolStack); iNextSyntSymbolStackType = pNextSyntSymbolStack->getLexemType(); s = iNextSyntSymbolStackType;
if (iNextSyntSymbolStackType == TYPE_LEXEM_NAME) // символ - идентификатор s += pNextSyntSymbolStack->getLexemText(); // добавим текст символа
sRightTileRule = s + sRightTileRule; // занести тип выбранного символа в правило iRightTileRuleSymbolCount++;
}
else { // текущий символ не пуст char cRuleSymb = ' ';
int iRet = getRelationSyntSymbolToSyntSymbol(pNextSyntSymbolStack, pCurSyntSymbolStack, pIdentList, &cRuleSymb);
if (cRuleSymb == '=') { // сделать выбранный символ текущим pCurSyntSymbolStack = pSyntSymbolStack->takeTop(); pNewSyntSymbol->addTopSubItem(pCurSyntSymbolStack); iNextSyntSymbolStackType = pNextSyntSymbolStack->getLexemType(); s = iNextSyntSymbolStackType;
if (iNextSyntSymbolStackType == TYPE_LEXEM_NAME) // символ - идентификатор s += pNextSyntSymbolStack->getLexemText(); // добавим текст символа
sRightTileRule = s + sRightTileRule; // занести тип выбранного символа в правило iRightTileRuleSymbolCount++;
}
else
iRightTileRuleSymbolCount = MAXLEN_RIGHT_TILE_RULE; // выход из цикла
};
}
}
iStackSyntSymbolCount = pSyntSymbolStack->getElemCount(); if (iStackSyntSymbolCount == 0)
iRightTileRuleSymbolCount = MAXLEN_RIGHT_TILE_RULE; // выход из цикла
}
// если выбран хотя бы один символ из стека, то ищем правило с построенной правой частью bool isRuleFound = false;
while (!sRightTileRule.IsEmpty()) {
for (int iRuleNum = 0; iRuleNum < iRuleCount; iRuleNum++) { pSyntRuleList->getSyntRule(iRuleNum,&pSyntRule);
if (pSyntRule != 0) {
s = pSyntRule->getRightRule();
if (sRightTileRule.AnsiCompare(s) == 0) { // правило найдено isRuleFound = true;
s = "\r\n Применено правило с правой частью = '"; s += sRightTileRule;
s += "'"; sProtocol += s;
// создаем нетерминальный символ для правила и добавляем его в стек pNewSyntSymbol->setNumRule(pSyntRule->getNumRule());
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
58 |
М.Ф.Степанов |
Создание распределенной системы решения задач
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
pNewSyntSymbol->setNumSyntSymbol(pSyntRule->getNumSyntSymbol()); pNewSyntSymbol->setLeftRule(pSyntRule->getLeftRule()); pNewSyntSymbol->setRightRule(sRightTileRule.c_str()); pNewSyntSymbol->setLeftBnfRule(pSyntRule->getLeftBnfRule()); pNewSyntSymbol->setRightBnfRule(pSyntRule->getRightBnfRule()); pNewSyntSymbol->setBnfRule(pSyntRule->getBnfRule()); pCurSyntSymbolStack = 0;
pSyntSymbolStack->Push(pNewSyntSymbol); pNewSyntSymbol = new TSyntSymbol(); sRightTileRule = "";
if (!sRuleList.IsEmpty()) sRuleList += ",";
sRuleList += pSyntRule->getNumRule(); bDoWorkWithStack = false; // выход из цикла break;
}
}
}
if (!isRuleFound) { // возврат
s = sRightTileRule.SubString(1,1); if (s.AnsiCompare("1") == 0) {
int iLen = 0;
bool doCompare = true; while (doCompare) {
s = sRightTileRule.SubString(2,++iLen); int iIdentCount = pIdentList->getCount(); String sName;
for (int i=0; i<iIdentCount; i++) { sName = pIdentList->getText(i); if (s.AnsiCompare(sName) == 0) {
doCompare = false; break;
}
}
}
sRightTileRule = sRightTileRule.SubString(2+iLen,sRightTileRule.Length()-1-iLen);
}
else
sRightTileRule = sRightTileRule.SubString(2,sRightTileRule.Length()-1); pNewSyntSymbol->takeTopSubItem(&pNextSyntSymbolStack); pSyntSymbolStack->Push(pNextSyntSymbolStack);
}
}
if (!isRuleFound) {
s = "\r\n Ошибка: НЕТ подходящего правила для свертки!"; sProtocol += s;
bDoWork = false;
}
pCurSyntSymbolStack = 0; pNextSyntSymbolStack = 0; break;
}; case '<':
case '=':{ // сдвиг (перенос)
sProtocol += "\t ==> сдвиг (перенос):"; TLexem *pLexem = 0; pLexemList->get(iNumLexem++,&pLexem); pSyntSymbolStack->Push(pLexem); break;}
default: // ошибка
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
Методические указания к выполнению курсовой работы |
59 |
Системное программное обеспечение
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
bDoWork = false;
sProtocol += "\r\n ==> Ошибка: недопустимое следование символов."; break;
}
}
int iNum = iNumLexem; sInStr = "";
while (iNum < iLexemCount) { pLexemList->get(iNum++,&pLexem); int iTypeLexem = pLexem->getType(); s = iTypeLexem; s = s.Trim();
if (iTypeLexem == 1) {
s += pLexem->getText();
}
sInStr += s;
}
sStack = "";
int iCountSymbolStack = pSyntSymbolStack->getElemCount(); for (int i=iCountSymbolStack-1; i>=0; i--) {
pSyntSymbol = pSyntSymbolStack->getSymbol(i); int iRule = pSyntSymbol->getNumRule();
if (iRule > 0) {
s = pSyntSymbol->getLeftRule();
}
else {
int iType = pSyntSymbol->getLexemType(); s = iType;
if (iType <= 1)
s += pSyntSymbol->getLexemText();
}
sStack += s;
}
sProtocol += "\r\nцепочка = '"; sProtocol += sInStr; sProtocol += "'";
sProtocol += "\r\nстек = '"; sProtocol += sStack; sProtocol += "'";
sProtocol += "\r\nправила = '"; sProtocol += sRuleList; sProtocol += "'";
}
pNewSyntSymbol = 0; if (_cProtocol != NULL)
strcpy(_cProtocol,sProtocol.c_str()); pSyntSymbol = 0;
if (pSyntSymbolStack != 0) delete pSyntSymbolStack;
pSyntSymbolStack = 0;
}
return iRet;
}
//---------------------------------------------------------------------------
int getRelationStackToLexem(int iNumLexem, TLexemList *pLexemList, TSyntSymbolStack *pSyntSymbolStack, TIdentList *pIdentList, char* cRule)
{
int iRet = 1; String s;
int iIdentCount = pIdentList->getCount(); int iTypeCurLexem = -1;
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
60 |
М.Ф.Степанов |