Оценка надежности
На всех вариантах входных данных программа должна показать результаты, которые совпадают с теоретическими.
Заключение
В данном курсовом проекте рассматривалось технологии создания синтаксического анализатора на языке C++\Qt. Область применения синтаксических анализаторов очень широка: компиляторы программного кода, интерпретаторы, системы решения математических выражений, проверка орфографии национальных алфавитов.
Использование языка С++\Qt расширяет программно-аппаратную совместимость со всем спектров современных компьютеров, части смартфонов , UMPC и встроенных систем.
Также в течении разработки данного курсового проекта была произведена тщательная отладка, которая сильно повысила надежность синтаксического анализатора и область применимость его к различным задачам.
Список использованных источников
1. Разработка компиляторов [Электронный ресурс]/ Н.Н Волконская, А.Е Москаль, Д.Ю. Булычев, А.А. Терехов.- Интернет-Университет Информационнных технологий. - Электрон. текст. дан. - Режим доступа http//www.INYUIT.ru, свободный.
. Теория и реализация языков программирования [Электронный ресурс]/ В.А. Серебряков, М.П. Галочкин, Д.Р. Гончар, М.Г.Фуругян.-Интернет Университет Информационныхъ технологий - Электрон. текст. дан. - Режим доступа http//www.INYUIT.ru, свободный.
. Язык программирования С++ [Электронный ресурс]/ А.Л. Фридман.- Университет Информационнных технологий. - Электрон. текст. дан. - Режим доступа http//www.INYUIT.ru, свободный.
. Основы программирования на языке С [Электронный ресурс]/ Н.А. Калинин, Н.А. Костюкова. - Интернет-Университет Информационнных технологий. - Электрон. текст. дан. - Режим доступа http//www.INYUIT.ru, свободный.
Приложение А
/*
*/
#include <iostream>main()
{
char *formula="a&b|!a&b";
int result;
result=0;
int count;
count=1;
int u;
u=0;
int vars[255];
for (int i=0;i<255;i=i+1)
vars[i]=0;
d:
if (formula[u]=='&')
count=count+1;
if (formula[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 <QtGui>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();
}
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 <iostream>"){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=reg->cap(1);
if (vars.indexOf(var)>-1)
ParseExpr (reg->cap(2));
else
result=6;
}else
{
result=9;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}(result!=0)return line_nmb;
}(QString label,nlabels)
if (labels.indexOf(label)==-1)result=5;
}MainWindow::ParseExpr(QString expr){=expr.trimmed();(expr=="")result=4;ok;.toInt(&ok, 10);(ok)return;(vars.indexOf(expr)!=-1)return;*reg;=new QRegExp("^int ([a-z]+)$");(reg->indexIn(expr)>-1){
vars.append(reg->cap(1));
return;
}=new QRegExp("^int ([a-z]+)=([0-9]+)$");(reg->indexIn(expr)>-1){
vars.append(reg->cap(1));
return;
}=new QRegExp("^([a-z]+[a-z0-9]+)\\[(.+)\\]$");(reg->indexIn(expr)>-1){
if (arrays.indexOf(reg->cap(1))!=-1){
ParseExpr(reg->cap(2));
return;
}
}operands=QStringList()<<"||"<<"&&"<<"=="<<"!="<<"<<"<<">>"<<"<"<<"="<<"+"<<"-";(QString operand,operands)(expr.indexOf(operand)!=-1){
QStringList exprs=expr.split(operand);
foreach(QString exp,exprs)
ParseExpr(exp);
return;
}=new QRegExp("^'.'$");(reg->indexIn(expr)>-1)
return;=new QRegExp("^\"[a-z ]*\"$");(reg->indexIn(expr)>-1)
return;(expr=="'\\0'")return;=10;
}MainWindow::ShowCode(QString qwer){code=qwer.split("\n");incl=0;>clear();(QString line,code){
incl-=line.count("}");
line=line.trimmed();
for(int i=0;i<incl;i++)
line="\t"+line;
formated->append(line);
incl+=line.count("{");
}
}::~MainWindow()
{
}