Logo GenDocs.ru

Поиск по сайту:  


Загрузка...

Лабораторная работа №2 - файл spo_lr_2.doc


Лабораторная работа №2
скачать (4532.7 kb.)

Доступные файлы (13):

graf.vsd
inputFile_error1.txt1kb.16.12.2008 09:16скачать
inputFile_error2.txt1kb.16.12.2008 09:17скачать
inputFile_error3.txt1kb.16.12.2008 09:18скачать
inputFile_error4.txt1kb.16.12.2008 09:19скачать
inputFile.txt1kb.16.12.2008 08:47скачать
mingwm10.dll
QtCore4.dll
QtGui4.dll
spo_lab2.exe
spo_lr_2.doc202kb.16.12.2008 13:17скачать
Thumbs.db
Граф переходов конечного автомата_cpo_lab2.doc333kb.15.12.2008 23:18скачать

содержание
Загрузка...

spo_lr_2.doc

Реклама MarketGid:
Загрузка...
Министерство общего и профессионального образования Российской Федерации

Уфимский государственный авиационный технический университет
Кафедра ТК
Лабораторная работа № 2

по дисциплине «Системное программное обеспечение».

Проектирование лексического анализатора.

Выполнила: студентка гр. ИВТ – 424

Пашпекина М.В.

Проверила: преподаватель

Карамзина А.Г.

Уфа

2008

Цель работы: изучение основных понятий теории регулярных грамматик, ознакомление с назначением и принципами работы лексических анализаторов (сканеров), получение практических навыков построения сканера на примере заданного простейшего входного языка.

Задание: написать программу, которая выполняет лексический анализ входного текста в соответствии с заданием и порождает таблицу лексем с указанием их типов и значений. Текст на входном языке задается в виде символьного (текстового) файла.

Входной язык содержит логические выражения, разделенные символом ;(точка с запятой). Логические выражения состоят из идентификаторов, шестнадцатеричных чисел, знака присваивания (:=), знаков операций or, xor, and, not и круглых скобок.

Шестнадцатеричными числами считается последовательность цифр и символов a, b, c, d, e, f, начинающаяся с цифры.

Идентификаторами считается последовательность строчных символов латинского алфавита и цифр, начинающаяся с символа.

Комментарий может содержать любые символы. Комментарий начинается с символов «//» и продолжается до конца строки.

Символом границы лексем является пробел или знак перевода строки и возврата каретки.

^ Описание грамматики входного языка:

G( { a..z, 0..9, =, :, ;, (, ) } , { <A>, <AN>, <AND>, <N>, <NO>, <NOT>, <O>, <OR>, <X>, <XO>, <XOR>, <PR>, <PR2>, <CH>, <ID>, <MOP>, <RAZ>, <RAZ2>, <S> }, P, S)

P:

<O> -> o

<OR> -> <O>r ­

<A> -> a

<AN> -> <A>n

<AND> -> <AN>d

<X> -> x

<XO> -> <X>o

<XOR> -> <XO>r


<N> -> a

<NO> -> <N>o

<NOT> -> <NO>t

<PR> - > :

<PR2> - > <PR>=

<RAZ> -> )|(

<RAZ2> -> ;


<CH> -> 0|1|2|3|4|5|6|7|8|9|<CH>0|<CH>1|<CH>2|<CH>3|<CH>4|<CH>5|

|<CH>6|<CH>7|<CH>8|<CH>9|<CH>a|<CH>b|<CH>c|<CH>d|<CH>e

|<CH>f

<ID> -> a|b|…|z|<ID>a|<ID>b|...|<ID>z|<ID>0|<ID>1|<ID>3|<ID>4|<ID>5

|<ID>6|<ID>7|<ID>8|<ID>9

<S> -> <AND>┴|<CH>┴|<ID>┴|<NOT>┴|<OR>┴|<XOR>┴|<RAZ>┴|<RAZ2>┴|

|<PR>┴|<PR2>┴

Текст программы

Файл mail.cpp

#include "precompiled.h"

#include "MainWindow.h"
int main( int argc, char **argv )

{

QApplication app( argc, argv );



MainWindow w;

w.show();



return app.exec();

}
Файл MainWindow.cpp

#include "precompiled.h"

#include "MainWindow.h"
MainWindow::MainWindow ( QWidget * parent /*= 0*/, Qt::WindowFlags flags /*= 0*/ ):

QMainWindow( parent, flags )

{

setupUi( this );

//

setWindowTitle( QString::fromLocal8Bit( "Лабораторная работа №2" ) );



tabWidget->setTabText( 0, QString::fromLocal8Bit( "Исходный файл" ) );

tabWidget->setTabText( 1, QString::fromLocal8Bit( "Таблица лексем" ) );



//tableWidget->setColumnWidth( 0, 50 );

tableWidget->setColumnWidth( 0, 150 );

tableWidget->setColumnWidth( 1, 200 );



QObject::connect( pushButton_openFile, SIGNAL(clicked()), this, SLOT(onOpen()) );

QObject::connect( pushButton_process, SIGNAL(clicked()), this, SLOT(onProcess()) );



// compiler

lexlist.clear();

}



void MainWindow::onOpen()

{

//QMessageBox::information( this, "onOpen", "onOpen" );

QString fileName = QFileDialog::getOpenFileName( this, tr("Open File"),

"", tr("Text (*.txt)") );

if( fileName.isEmpty() ) return;

QFile f;

qint64 llen = 0;

char lineFromFile[1024] = {0};

f.setFileName( fileName );

if( f.open( QFile::ReadOnly ) )

{

fileText->clear();

QString qstr;

//QString qstrAdd;

while( !f.atEnd() )

{

memset( lineFromFile, 0, sizeof(lineFromFile) );

llen = f.readLine( lineFromFile, sizeof(lineFromFile) );

if( llen > 0 )

{

qstr = QString::fromLocal8Bit( lineFromFile );

//qstr.chop( 1 ); // "\n\r" ==> "\n"

if( qstr.endsWith( "\r\n" ) ) qstr.chop( 2 );

//qstr = qstr.simplified();

fileText->appendPlainText( qstr );

}

}

f.close();

}

}
void MainWindow::onProcess()

{

QString s = fileText->toPlainText();

if( s.isEmpty() ) return;

wchar_t *allInput = NULL;

int size = s.size();

allInput = (wchar_t *)malloc( (size+1) * sizeof(wchar_t) );

if( !allInput )

{

QMessageBox::critical( this, "onProcess", "memory error!" );

return;

}

memset( allInput, 0, (size+1) * sizeof(wchar_t) );

int r = s.toWCharArray( allInput );

if( r >= 0 ) allInput[r] = 0;

//s.sprintf( "r = %d", r );

//QMessageBox::critical( this, "onProcess", s );



//

lexlist.clear();



LexAnalyzerError errorInfo;

memset( &errorInfo, 0, sizeof(errorInfo) );



// :D

//LexAnalyser *an = new LexAn_10();

LexAnalyser *an = new LexAn_11();



bool parseRes = an->processInput( allInput, &lexlist, &errorInfo );

delete an;



free( allInput );

//



int cnt = lexlist.count();

if( cnt == 0 )

{

QMessageBox::warning( this, "onProcess", "No lexems found??" );

return;

}



tableWidget->setRowCount( cnt );



char name[512] = {0};

Lexema *lex = lexlist.first();

QTableWidgetItem *twi;

int i = 0;

while( lex )

{

// row header

s.sprintf( "%d", i );

twi = new QTableWidgetItem( s );

tableWidget->setVerticalHeaderItem( i, twi );

// row height

tableWidget->setRowHeight( i, 20 );

// item 1 - lexema info (name)

strcpy( name, lex->name() );

s = QString::fromLocal8Bit( name );

twi = new QTableWidgetItem( s );

tableWidget->setItem( i, 1, twi );

// item 0 - lexema type

strcpy( name, lex->typeStr() );

s = QString::fromLocal8Bit( name );

twi = new QTableWidgetItem( s );

tableWidget->setItem( i, 0, twi );

// next loop

i++;

lex = lexlist.next();

}



if( !parseRes )

{

char errorMessage[2048] = {0};

sprintf( errorMessage, "Ошибка в строке %d столбец %d (смещение %d):\n%s",

errorInfo.line, errorInfo.col, errorInfo.pos, errorInfo.desc );

s = QString::fromLocal8Bit( errorMessage );

QMessageBox::critical( this, "Error!", s );

}



return;

}

Результаты работы:




Вывод:

В результате проделанной работы были изучены основные понятия теории регулярных грамматик, назначения и принципы работы лексических анализаторов (сканеров). Были получены практические навыки построения сканера на примере заданного простейшего входного языка.


Скачать файл (4532.7 kb.)

Поиск по сайту:  

© gendocs.ru
При копировании укажите ссылку.
обратиться к администрации
Рейтинг@Mail.ru