Смекни!
smekni.com

Лексический и синтаксический анализатор языка высокого уровня (стр. 5 из 7)

Программа запускается из файла Leks_Analizator.exe. В интерфейсе программы присутствуют четыре кнопки (рисунок 7). При нажатии на кнопку «Загрузить пример кода» (рисунок 7) пользователю будет дана возможность загрузки кода. Также код можно ввести с клавиатуры.

Рисунок 7 - Интерфейс программы

Рисунок 8 - Диалог загрузки файла

После ввода кода программы, при нажатии на кнопку «Лексический анализ», запускается процесс анализа. Результатом анализа будет строчка внизу формы.

По кнопке «Синтаксический анализ» запускается процесс анализа. Результат отображается внизу формы.

При нажатии на кнопке «Общий анализ» будет запущен по порядку лексический анализ, а затем синтаксический анализ.


Заключение

В данном курсовом проекте была разработана программа-анализатор, состоящая из двух частей: лексического анализатора, разбивающего исходный текст программы на лексемы и заполняющего таблицу имен; синтаксического анализатора, проверяющего соответствие текста заданной грамматике.

В ходе выполнения курсового проекта были получены следующие результаты:

- написана грамматика для учебного языка программирования;

- спроектирован и построен лексический анализатор;

- спроектирован и построен синтаксический анализатор.

Для написания курсовой работы мною были самостоятельно изучены литературные и справочные материалами по данной теме.

Список используемой литературы

1. Ключко В.И. Теория вычислительных процессов и структур. Учебное пособие, -КубГТУ, 1998.

2. Теория вычислительных процессов и структур. Методические указания к курсовой работе для студентов специальности 220400. Составитель проф. В.И.Ключко. -КубГТУ,1997. -27 с.

3. Соколов А.П. Системы программирования: теория, методы, алгоритмы: Учеб. Пособие, - М.: Финансы и статистика, 2004. – 320 с.: ил.

4. Гордеев А.В., Молчанов А.Ю. Системное программное обеспечение. – СПб.: Питер, 2001. – 736 с.

5. Ахо А, Сети Р., Ульман Д. Компиляторы: принципы, технологии инструменты. : Пер. с англ. – М.: Издательский дом «Вильямс» , 2003. – 768 с.:ил. ISBN5-8459-0189-8(рус), ББК 32.973.26.-018.2.75

6. Вольфенгаген В.Э. Конструкции языков программирования. Приемы описания. - М.: АО «Центр ЮрИнфоР», 2001.-276 с.

7. Карпов В.Э. Теория компиляторов. Учебное пособие — Московский государственный институт электроники и математики. М., 2001. – 79 с (электронный вариант)

8. Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman . Compilers Principles, Techniques, and Tools. 2000. (электронный вариант).

9. Серебряков В.А. Лекции по конструированию компиляторов. Москва, 1993 (электронный вариант).


Приложение А

Листинг лексического анализатора

private void btnLex_Click(object sender, EventArgs e)

{

char[] Letters={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'G',

'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',

'U', 'V', 'W', 'X', 'Y', 'Z', '_'};

char[] Digits={'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

char[] Symbols={',', ';', '(', ')', '=', '<', '>', '{', '}', '.', '+', '-', '*', '/'};

char[] Spaces={' ', char.Parse(Char.ConvertFromUtf32(9))};

LexAnalizerState CommentState = LexAnalizerState.Start;

lvLexTable.Items.Clear();

lvIdTable.Items.Clear();

lLexProgress.Text = "Лексический анализ завершен успешно!";

lLexProgress.ForeColor = Color.Blue;

lLexProgress.Visible = false;

for (int nNumStr = 0; nNumStr < rSrcFile.Lines.Length; nNumStr++)

{

String sSrcLine = rSrcFile.Lines[nNumStr].ToUpper();

if (String.IsNullOrEmpty(sSrcLine)) continue;

int nSrcSymbol = 0;

String sLexeme = "", sClass = "";

LexAnalizerState LexState = CommentState;

while(LexState != LexAnalizerState.Stop)

{

switch(LexState)

{

case LexAnalizerState.Start:

{

if (sSrcLine[nSrcSymbol] == '/')

{

sLexeme += sSrcLine[nSrcSymbol];

nSrcSymbol++;

LexState = LexAnalizerState.Comment;

}

else if (Array.IndexOf(Spaces, sSrcLine[nSrcSymbol]) != -1)

{

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.Start);

}

else if (Array.IndexOf(Letters, sSrcLine[nSrcSymbol]) != -1)

{

LexState = LexAnalizerState.Identify;

}

else if (Array.IndexOf(Symbols, sSrcLine[nSrcSymbol]) != -1)

{

sLexeme += sSrcLine[nSrcSymbol];

sClass = "Символ";

nSrcSymbol++;

LexState = LexAnalizerState.Ready;

}

else if (Array.IndexOf(Digits, sSrcLine[nSrcSymbol]) != -1)

{

sLexeme += sSrcLine[nSrcSymbol];

nSrcSymbol++;

LexState = LexAnalizerState.Num;

}

else LexState = LexAnalizerState.Error;

}

break;

case LexAnalizerState.Comment:

{

if (sSrcLine[nSrcSymbol] == '*')

{

sLexeme = "";

sClass = "";

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.CommentStart);

CommentState = LexAnalizerState.CommentStart;

}

else

{

LexState = LexAnalizerState.Ready;

CommentState = LexAnalizerState.Start;

sClass = "Символ";

}

}

break;

case LexAnalizerState.CommentStart:

{

if (sSrcLine[nSrcSymbol] == '*')

{

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.CommentEnd);

CommentState = LexAnalizerState.CommentEnd;

}

else

{

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.CommentStart);

}

}

break;

case LexAnalizerState.CommentEnd:

{

if (sSrcLine[nSrcSymbol] == '/')

{

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.Start);

CommentState = LexAnalizerState.Start;

}

else

{

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.CommentStart);

CommentState = LexAnalizerState.CommentStart;

}

}

break;

case LexAnalizerState.Identify:

{

if ((Array.IndexOf(Digits, sSrcLine[nSrcSymbol]) != -1)

|| (Array.IndexOf(Letters, sSrcLine[nSrcSymbol]) != -1))

{

sLexeme += sSrcLine[nSrcSymbol];

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Ready):(LexAnalizerState.Identify);

}

else if ((Array.IndexOf(Spaces, sSrcLine[nSrcSymbol]) != -1)

|| (Array.IndexOf(Symbols, sSrcLine[nSrcSymbol]) != -1))

{

LexState = LexAnalizerState.Ready;

}

else LexState = LexAnalizerState.Error;

sClass = "Идентификатор";

}

break;

case LexAnalizerState.Num:

{

if (Array.IndexOf(Digits, sSrcLine[nSrcSymbol]) != -1)

{

sLexeme += sSrcLine[nSrcSymbol];

nSrcSymbol++;

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Ready):(LexAnalizerState.Num);

}

else if (sSrcLine[nSrcSymbol] == 'L')

{

sLexeme += sSrcLine[nSrcSymbol];

nSrcSymbol++;

LexState = LexAnalizerState.Ready;

}

else if ((Array.IndexOf(Spaces, sSrcLine[nSrcSymbol]) != -1)

|| (Array.IndexOf(Symbols, sSrcLine[nSrcSymbol]) != -1))

{

LexState = LexAnalizerState.Ready;

}

else LexState = LexAnalizerState.Error;

sClass = "Число";

}

break;

case LexAnalizerState.Ready:

{

sClass = (IsKeyword(sLexeme) == true)?("Ключевое слово"):(sClass);

if (sClass == "Идентификатор") AddId(sLexeme);

AddLexeme(sLexeme, sClass);

sLexeme = "";

LexState = (nSrcSymbol == sSrcLine.Length)?

(LexAnalizerState.Stop):(LexAnalizerState.Start);

}

break;

case LexAnalizerState.Error:

{

lLexProgress.Text = "ОШИБКА! Неизвестный символ (" +

(nNumStr + 1).ToString() + ", " + (nSrcSymbol + 1).ToString() +

"): &bsol;"" + sSrcLine[nSrcSymbol].ToString() + "&bsol;"";

lLexProgress.ForeColor = Color.Red;

LexState = LexAnalizerState.Stop;

}

break;

}

}

}

AddLexeme("#", "Конец");

lLexProgress.Visible = true;

btnSintax.Enabled = true;

синтаксическийАнализToolStripMenuItem.Enabled = true;

} Приложение Б.

Листинг синтаксического анализатора

private void btnSintax_Click(object sender, EventArgs e)

{

string[,] Grammatic = {

/*0*/{"<S>", "USING", "<USING_LIST>", "<NEXT>", "", "", "", "", "", "", "", "", "", "", ""},

/*1*/{"<S>", "PUBLIC", "<CLASS>", "<NEXT>", "", "", "", "", "", "", "", "", "", "", ""},

/*2*/{"<NEXT>", ";", "<S>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*3*/{"<NEXT>", "e", "", "", "", "", "", "", "", "", "", "", "", "", ""},

/*4*/{"<USING_LIST>","ID", "<NEXT_USING>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*5*/{"<NEXT_USING>",".", "<USING_LIST>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*6*/{"<NEXT_USING>","e", "", "", "", "", "", "", "", "", "", "", "", "", ""},

/*7*/{"<CLASS>", "CLASS", "ID", "{", "<CLASS_BODY>", "}", "", "", "", "", "", "", "", "", ""},

/*8*/{"<CLASS_BODY>","PUBLIC", "<DEF>", "<NEXT_BODY>", "", "", "", "", "", "", "", "", "", "", ""},

/*9*/{"<NEXT_BODY>", ";", "<CLASS_BODY>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*10*/{"<NEXT_BODY>", "e", "", "", "", "", "", "", "", "", "", "", "", "", ""},

/*11*/{"<DEF>", "UINT", "<DEF_LIST>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*12*/{"<DEF>", "BOOL", "<DEF_LIST>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*13*/{"<DEF>", "CONST", "LONG", "INT", "<DEF_LIST>", "", "", "", "", "", "", "", "", "", ""},

/*14*/{"<DEF_LIST>", "ID", "<NEXT_DEF>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*15*/{"<NEXT_DEF>", "(", "<VAR_LIST>", ")", "{", "<OPER_LIST>", "}", "", "", "", "", "", "", "", ""},

/*16*/{"<NEXT_DEF>", ",", "<VAR_LIST>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*17*/{"<NEXT_DEF>", "=", "<EXPR>", "<NEXT_VAR>", "", "", "", "", "", "", "", "", "", "", ""},

/*18*/{"<NEXT_DEF>", "e", "", "", "", "", "", "", "", "", "", "", "", "", ""},

/*19*/{"<VAR_LIST>", "ID", "<NEXT_VAR>", "", "", "", "", "", "", "", "", "", "", "", ""},

/*20*/{"<NEXT_VAR>", ",", "<VAR_LIST>", "", "", "", "", "", "", "", "", "", "", "", ""},