int lab1_oc::vars(QString str)
{
buffer. clear();
while (str[j].isLetterOrNumber() || str[j]=='_')
{
buffer+=str[j];
j++;
}
word tmp; lec temp;
//если слово является служебным
if (all_service_words. contains(buffer)) addvector(service_words,1);
else addvector(Vars,2);
j--;
return 0;
}
int lab1_oc::nums(QString str)
{
//Инициализация
buffer. clear();
int flag=0;
int point_count=0;
int numflag=0;
//Формирование слова
while (str[j].isLetterOrNumber() || str[j]=='_' || str[j]=='.')
{
if (str[j]=='.') { flag=j; point_count++;}
buffer+=str[j];
j++;
}
//Обработка ошибки: неправильное имя переменной
for (int k=0;k<buffer. length();k++)
{
if (buffer[k].isDigit() || buffer[k]=='.'); else numflag=1;
}
if (numflag==1)
{
Point (strnum, colnum, j-buffer. length());
QMessageBox::warning(this, "Ошибка!", QString("Неправильное имя переменной!\nПеременная может начинаться с буквы\nили '_': '")+QString(buffer[0])+QString("' [")+QString::number(strnum)+QString(",")+QString::number(colnum)+QString("]!"));
ui. statusBar->showMessage(QString("Неправильное имя переменной: '")+QString(buffer[0])+QString("' [")+QString::number(strnum)+QString(",")+QString::number(colnum)+QString("]!"));
return 31;
}
//Обработка ошибки чисел с точками
if (point_count>1)
{
Point (strnum, colnum, j-buffer. length());
QMessageBox::warning(this, "Ошибка!", QString("Ошибка в записи дробного числа: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString(",")+QString::number(colnum)+QString("]!"));
ui. statusBar->showMessage(QString("Ошибка в записи дробного числа: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString(",")+QString::number(colnum)+QString("]!"));
return 32;
}
addvector(Nums,3);
j--;
return 0;
}
int lab1_oc::strs(QString str)
{
buffer. clear();
buffer+=str[j++];
int l=str. count("\"");
if (l%2 != 0)
{
Point (strnum, colnum, j);
QMessageBox::warning(this, "Ошибка!", QString("Незакрытая строка: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString("]!"));
ui. statusBar->showMessage(QString("Незакрытая строка: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString("]!"));
return 41;
}
while (str[j]!='"')
{
buffer+=str[j];
j++;
}
buffer+=str[j++];
for (int k=0;k<buffer. length();k++) if (buffer[k]=='\n') buffer[k]='|';
addvector(Strs,4);
j--;
return 0;
}
int lab1_oc::znaks(QString str)
{
buffer. clear();
int i=0;
while (isZnak(str[j].toAscii()))
{
buffer+=str[j];
j++;
if (all_znaks. contains(buffer))
{
addvector(Znaks,5);
j--;
return 0;
}
}
j--;
if (all_znaks. contains(buffer))
{
addvector(Znaks,5);
return 0;
}
else
{
QMessageBox::warning(this, "Ошибка!", QString("Неизвестный знак: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString(",")+QString::number(j-buffer. length())+QString("]!"));
ui. statusBar->showMessage(QString("Ошибка в записи дробного числа: '")+QString(buffer)+QString("' [")+QString::number(strnum)+QString(",")+QString::number(j-buffer. length())+QString("]!"));
return 51;
}
}
bool lab1_oc::isZnak(char ch)
{
for (int i=0;i<all_znaks. count();i++)
if (ch==all_znaks[i][0]) return true;
return false;
}
void lab1_oc::addvector(QVector<word> & vector, int p)
{
Point (strnum, colnum, j-buffer. length());
word tmp;
lec temp;
int flag=-1;
for (int k=0;k<vector. count();k++) if (vector[k].value==buffer) flag=k;
if (flag>-1)
{
vector[flag].point+=" "+QString::number(strnum)+","+QString::number(colnum)+";";
for (int k=0;k<lecs. count();k++)
if (lecs[k].tab_cod==p && lecs[k].lec_cod==flag)
lecs[k].point+=" "+QString::number(strnum)+","+QString::number(colnum)+";";
}
else
{
vector << tmp;
vector. last().value=buffer;
vector. last().point=QString::number(strnum)+","+QString::number(colnum)+";";
temp. tab_cod=p; temp. value=buffer; temp. point=QString::number(strnum)+","+QString::number(colnum)+";"; temp. lec_cod=vector. count()-1;
lecs << temp;
}
}
void lab1_oc::Point (int & row, int & col, int len)
{
row=buf. mid(0,len).count("\n");
int m=buf. mid(0,len).lastIndexOf("\n");
col=buf. mid(0,len).mid(m).length();
}
void lab1_oc::addtable(QVector<word> & vector, QString & str)
{
QString row;
str+=QString("%1 |%2 |%3 \n").arg(QString("Индекс"),4).arg("Лексема",20).arg("Координаты",6);
for (int i=0;i<vector. count();i++)
{
row+= QString("%1 %2 %3 \n").arg(QString::number(i),4).arg(vector[i].value,20).arg(vector[i].point,6);
}
str+=row+"";
}
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


