Методы синтаксического анализа на базе регулярных выражений

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование

ula[u]!='&' && formula[u]!='|' && formula[u]!='\0' && formula[u]!='!')

{

int var;

var=formula[u];

if (vars[var]!=0)

result=1;

if (vars[var]==0)

vars[var]=1;

}

u=u+1;

if (formula[u]!='|' && formula[u]!='\0')

goto d;

int tablesize;

tablesize=1<<count;

int table[tablesize];

for (int i=0;i<tablesize;i=i+1)

table[i]=0;

//

// проверка всей функции на неповторения минтерм

//

int minterm;

minterm=0;

int table2[255];

for (int j=0;j<255;j=j+1)

table2[j]=vars[j];

for (int i=0;formula[i];i=i+1)

{

if (formula[i]=='|')

{

if (table[minterm]!=0)

result=2;

if (table[minterm]==0)

table[minterm]=1;

int h;

h=0;

for (int j=0;j<255;j=j+1)

if (table2[j]==1)

h=1;

if (h==1)

result=3;

minterm=0;

for (int j=0;j<255;j=j+1)

table2[j]=vars[j];

}

if ( i==0 && formula[0]!='!')

{

int push;

push=0;

int var;

var=formula[i];

if (table2[var]!=1)

result=1;

if (table2[var]==1)

table2[var]=0;

for (int j=0;j<var;j=j+1)

if (vars[j]==1)

push=push+1;

int t;

t=1<<push;

minterm=minterm+t;

}

if ( i==0 && formula[0]=='!')

{

int var;

var=formula[i+1];

if (table2[var]!=1)

result=1;

if (table2[var]==1)

table2[var]=0;

}

if (formula[i]=='&' || formula[i]=='|')

{

if ( formula[i+1]!='!')

{

int push;

push=0;

int var;

var=formula[i+1];

if (table2[var]!=1)

result=0;

if (table2[var]==1)

table2[var]=0;

for (int j=0;j<var;j=j+1)

if (vars[j]==1)

push=push+1;

int t;

t=1<<push;

minterm=minterm+t;

}

if ( formula[i+1]=='!')

{

int var;

var=formula[i+2];

if (table2[var]!=1)

result=0;

if (table2[var]==1)

table2[var]=0;

}

}

}

if (table[minterm]!=0)

result=2;

if (table[minterm]==0)

table[minterm]=1;

int h;

h=0;

for (int j=0;j<255;j=j+1)

if (table2[j]==1)

h=1;

if (h==1)

result=3;

switch (result)

{

case 0:

printf ("ok");

break;

case 1:

printf ("vars not uniq in one minterm");

break;

case 2:

printf ("minterms not uniq");

break;

case 3:

printf ("wront vars count in one minterm");

break;

}

system ("pause");

}

Приложение Г, Д, Е

 

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include MainWindow : public QMainWindow

{

Q_OBJECT:

MainWindow(QWidget *parent = 0);

~MainWindow();:

QTextEdit *source;

QTextEdit *formated;

QTextEdit *errors;

void ParseFile();

int ParseCode(QString code);

void ParseExpr(QString expr);

void ShowCode(QString code);

int result;

QStringList vars,arrays,labels,nlabels;slots:

void fileOpen();

};

#endif // MAINWINDOW_H

#include "mainwindow.h"::MainWindow(QWidget *parent)

: QMainWindow(parent)

{

QWidget *wgt=new QWidget(this);

setCentralWidget(wgt);

QVBoxLayout *lay1=new QVBoxLayout(wgt);

QHBoxLayout *lay2=new QHBoxLayout();

source=new QTextEdit(this);

formated=new QTextEdit(this);

errors=new QTextEdit(this);

lay1->addLayout(lay2);

lay2->addWidget(source);

lay2->addWidget(formated);

lay1->addWidget(errors);

errors->setMaximumHeight(60);

this->menuBar()->addAction("Open",this,SLOT(fileOpen()));

}MainWindow::fileOpen()

{

QString file= QFileDialog::getOpenFileName(this,"Source code","","*.cpp",new QString("*.cpp"));

if (file!=""){

QFile fl(file);

fl.open(QFile::Text|QFile::ReadOnly);

source->setText(fl.readAll());

fl.close();

ParseFile();

}

}MainWindow::ParseFile(){::setCodecForTr(QTextCodec::codecForName("UTF8"));

result=0;pre_code1=source->toPlainText(),code="";

bool rem=false,rem2=false;

for (int i = 0; i < pre_code1.length() - 1; i++)

{

if (!rem2)

{

if (pre_code1[i] == '/' && pre_code1[i+1] == '*') rem = true;

if (i>2)

if (pre_code1[i-2] == '*' && pre_code1[i-1] == '/') rem = false;

}

if (!rem)

{

if (pre_code1[i]=='/' && pre_code1[i+1]=='/')rem2=true;

if (pre_code1[i]=='\n')rem2=false;

}

if ((rem||rem2)==false) code += pre_code1[i];

}line_nmb;(code.indexOf("/*")!=-1)result=1;

line_nmb=ParseCode(code);err=QStringList()<<tr("Код верный")<<tr("%1:нарушен баланс /* */").arg(line_nmb)<<tr("%1:код за пределами функции майн").arg(line_nmb)<<("%1:нарушен баланс { }").arg(line_nmb)<<tr("%1:отсуствие требуемого выражения").arg(line_nmb)<<

tr("прыжок к необявленой метке")<<tr("%1:Использование необьявленой переменой").arg(line_nmb)<<tr("%1:Использование необьявленого масива").arg(line_nmb)<<("%1:кейс за пределами свитча").arg(line_nmb)<<tr("%1:Нераспознаная строка").arg(line_nmb)<<tr("%1:Нераспознаное выражение").arg(line_nmb);

errors->setText(err[result]);(code);

}MainWindow::ParseCode(QString qwer){

int line_nmb=0;code=qwer.split("\n");

int incl = 0,swit_ch = 0,need_op=0;

bool mained=false,included=false;(QString line,code){=line.trimmed();_nmb++;(line=="")continue;(swit_ch==1)

if (line == "{")

{

incl++;

swit_ch = 2;

continue;

}(swit_ch == 2)

if (line == "}")

{

incl--;

swit_ch = 0;

continue;

}(incl==0){

if (line=="#include "){included=true;continue;}

if (line=="int main()"){mained=true;continue;}

}(line=="{"){

incl++;

need_op=0;

continue;

}(line=="}"){

incl--;

 

if (incl<0)result=3;

 

}else{

if (!(included&&mained)){

result=2;

}*reg;=new QRegExp("^for \\((.*);(.*);(.*)\\)$");(reg->indexIn(line)>-1){

ParseExpr(reg->cap(1));

ParseExpr(reg->cap(2));

ParseExpr(reg->cap(3));

need_op=1;

}else{

reg=new QRegExp("^if \\((.*)\\)$");

if (reg->indexIn(line)>-1){

ParseExpr(reg->cap(1));

need_op=1;

}else{

need_op=0;

reg=new QRegExp("^switch \\((.*)\\)$");

if (reg->indexIn(line)>-1){

swit_ch = 1;

ParseExpr(reg->cap(1));

}else{

reg=new QRegExp("^case (.*):$");

if (reg->indexIn(line)>-1){

if (swit_ch!= 2)result=8;

ParseExpr(reg->cap(1));

}else{

reg=new QRegExp("^char \\*([a-z]+[a-z0-9]+)=\".*\";$");

if (reg->indexIn(line)>-1){

arrays.append(reg->cap(1));

}else{

reg=new QRegExp("^int ([a-z]+[a-z0-9]+)\\[(.+)\\];$");

if (reg->indexIn(line)>-1){

arrays.append(reg->cap(1));

ParseExpr(reg->cap(2));

}else{

reg=new QRegExp("^([a-z]+):$");

if (reg->indexIn(line)>-1){

labels.append(reg->cap(1));

}else{

reg=new QRegExp("^break;$");

if (reg->indexIn(line)>-1);

else{

reg=new QRegExp("^goto (.*);$");

if (reg->indexIn(line)>-1){

nlabels.append(reg->cap(1));

}

else{

reg=new QRegExp("^int ([a-z]+);$");

if (reg->indexIn(line)>-1){

vars.append(reg->cap(1));

}

else{

reg=new QRegExp("^system \\(\"pause\"\\);$");

if (reg->indexIn(line)>-1);

else {

reg=new QRegExp("^printf \\((.*)\\);$");

if (reg->indexIn(line)>-1){

QStringList params=reg->cap(1).split(",");

foreach (QString param,params)

ParseExpr(param);

}else

{

reg=new QRegExp("^(.*)\\[(.*)\\]=(.*);$");

if (reg->indexIn(line)>-1){

QString array=reg->cap(1);

if (arrays.indexOf(array)>-1)

{

ParseExpr (reg->cap(2));

ParseExpr (reg->cap(3));

}else

{

result=7;

}

}else{

reg=new QRegExp("^(.*)=(.*);$");

if (reg->indexIn(line)>-1){

QString var=re