Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой 14 вариант / ПОЯСНИТЕЛЬНАЯ ЗАПИСКА.docx
Скачиваний:
18
Добавлен:
02.02.2015
Размер:
40.94 Кб
Скачать

3. Грамматика языка программирования обработки строк

  1. <программа> → PROGRAM ID ; <func_секция><var_секция> <тело>

  2. <func_секция> → <func> | <func_секция>

  3. <func> → FUNCTION ID (<объяв>):<тип><var_секция> <тело>

  4. <var_секция> → ε | VAR <объяв>

  5. <объяв> → <список_типа> | <список_типа><объяв>

  6. <список_типа> → <список_ид> : <тип>;

  7. <тип> → INTEGER | REAL | STRING

  8. <список_ид> → ID | ID,<список_ид>

  9. <тело> → BEGIN <конструкция>; END;

  10. <конструкция>→ READ(ID) | WRITE(<выражение>) | ID:=<выражение> | LABEL ID: | GOTO ID: | <тело> | ε

  11. <выражение> → <терм> | <выражение> + <терм> | <выражение> - <терм>

  12. <терм> → <подтерм> | <терм> * <подтерм> | <терм> / <подтерм>

  13. <подтерм> → ID | FUNC(<выражение>) | (<выражение>)

Таким образом языка данной грамматики является подмножеством языка Pascal

Реализация транслятора

Логика работы лексического анализатора и функции подсветки построена на конечных автоматах, синтаксического – на методе рекурсивного спуска. При синтаксическом разборе части программы, оформленные в виде классов, сами “собирают” себя, так как зная свой собственный тип, они “могут догадываться” о дальнейшем содержании. Причем работа идет параллельно для нескольких классов, поэтому входная цепочка проверяется всеми автоматами на причастность ее к своему классу.

Примеры автоматов

  1. Автомат для ключевых слов (на примере begin)

  1. Автомат для идентификаторов

  1. Автомат для комментариев

4. Заключение

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

Разработали на языке программирования Pascal программное средство. В процессе работы над данным программным средством выработал навыки самостоятельного решения инженерных задач. Программное средство способно выполнять следующие функции:

- ввод и редактирование текста программ, написанных на определенном модельном языке;

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

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

- интерпретировать программы на модельном языке, записанных в форме ПОЛИЗа.

Программное средство протестировано на различных программах, написанных на модельном языке. Программное средство безошибочно производить лексический анализ программ, выполняет синтаксическую и семантическую проверку программ, переводить программы в обратную польскую запись, интерпретирует программы на модельном языке, записанных в форме ПОЛИЗа.

Таким образом, поставленная цель курсовой работы достигнута.

5. Список использованной литературы

1 Ахо, А.В. Компиляторы: принципы, технологии и инструменты [Текст]: / А. Ахо, Р. Сети, Д. Ульман; перевод с англ. И.В. Красикова и др. - М.: Вильямс, 2001. - 767 с.: ил.; 24 см. - Библиогр.: с. 742-763. - Предм. указ.: 764-767. - 5000 экз. - ISBN 5-8459-0189-8 (в пер.).

2 Власенко, А.В. Теория языков программирования и методы трансляции [Текст]: учеб. пособие / А.В. Власенко, В.И. Ключко; М-во образования и науки РФ, ГОУ ВПО «Кубан. гос. технол. ун-т». - Краснодар: Изд-во КубГТУ, 2004. - 119 с.: ил.; 21 см. - Библиогр.: с. 118. - 75 экз. - ISBN 5-8333-0176-9.

3 Гордеев, А.В. Системное программное обеспечение [Текст]: учеб. для вузов / А. В. Гордеев, А.Ю. Молчанов; под. общ. ред. А.В. Гордеева. – СПб.: Питер, 2001. - 734 с.: ил.; 24 см. - Библиогр.: с. 719-724. – 5000 экз. – ISBN 5-272-00341-1 (в пер.).

4 Ишакова Е.Н. Теория языков программирования и методов трансляции: учебное пособие / Е.Н. Ишакова. – Оренбург: ИПК ГОУ ОГУ, 2007. – 137 с.-300 экз.- ISBN978-57410-0712-9.

5 Калинин, А.Г. Универсальные языки программирования: Семантический подход [Текст] / А.Г. Калинин, И.В. Мацкевич. – М.: Радио и связь, 1991. - 398, [1] с.: ил.; 21 см. - Библиогр.: с. 395-398. – 10000 экз. – ISBN 5-256-00638-X (в пер.).

ПРИЛОЖЕНИЕ А. ТЕКСТ ПРОГРАММЫ

using System;

using System.Collections;

using System.IO;

using System.Windows.Forms;

namespace MyTranslator

{public class Program : Function

{ public ArrayList Functions;

Scanner Scan;

public bool ReadFunctionSection(Scanner scan)

{Token token = null;

// <FUNCTION>

token = NextToken(scan);

if (!IsFunction(token))

{scan.Position--;

return false; }

// FUNCTION <ID>

token = NextToken(scan);

if(!IsName(token)) return CreateError(token.Expr+" - недопустимое имя идентификатора", token.Line, 1);

Function NewFunction = new Function();

NewFunction.Name = token.Expr;

// Check for multiply definition

foreach( Function defF in Functions)

if (defF.Name == NewFunction.Name)

return CreateError("Повторное объявление идентификатора '"+NewFunction.Name+"'", token.Line, 0);

Functions.Add( NewFunction);

NewFunction.KnownFunctions = Functions;

KnownFunctions = Functions;

// FUNCTION ID <(>

token = NextToken(scan);

if (!IsOpenBracket(token)) return CreateError("Ожидается (", token.Line, 0);

// FUNCTION ID ( <VARS LIST>

NewFunction.ReadVarsListDeclarationSection(scan);

// Update Function.ArgumentTypes

// FUNCTION ID ( VARS LIST <)>

token = NextToken(scan);

if (!IsCloseBracket(token)) return CreateError("Ожидается )", token.Line, 0);

// FUNCTION ID ( VARS LIST ) <:>

token = NextToken(scan);

if (!IsDoublePoints(token)) return CreateError("Ожидается :", token.Line, 0);

// FUNCTION ID ( VARS LIST ) : TYPENAME

token = NextToken(scan);

NewFunction.ReturnType = CreateReturnType(token.Expr);

if (!IsTypeName(token)) return CreateError(token.Expr+" не является поддерживаемым типом", token.Line, 0);

// FUNCTION ID ( VARS LIST ) : TYPENAME <;>

token = NextToken(scan);

foreach (Variable v in NewFunction.Variables) NewFunction.ArgumentsReturnTypes.Add( v.ReturnType );

if (!IsDelimiter(token)) return CreateError("Ожидается ;", token.Line, 0);

// FUNCTION ID ( VARS LIST ) ;

// [<VAR>]

token = NextToken(scan);

if (IsVar(token))

{// FUNCTION ID ( VARS LIST ) ;

// [ VAR <VARS LIST> ]

if (!NewFunction.ReadVarsListDeclarationSection(scan)) return CreateError("В секции Var отсутствуют переменные", token.Line, 0);

}

else scan.Position--;

// FUNCTION ID ( VARS LIST ) ;

// [ VAR VARS LIST ]

// <BEGIN>

// token = NextToken(scan);

// if (!IsDelimiter(token))

// return CreateError("Must be ;", token.Line);

// FUNCTION ID ( VARS LIST ) ;

// [ VAR VARS LIST ]

// <BEGIN>

token = NextToken(scan);

if (!IsBegin(token)) return CreateError("Ожидается Begin", token.Line, 0);

// FUNCTION ID ( VARS LIST ) ;

// [ VAR <VARS LIST> ]

// BEGIN

// <STATEMENTS LIST>

if (!NewFunction.ReadStatementsSection(scan))return false;

if (!NewFunction.IsValidate()) return false;

// FUNCTION ID ( VARS LIST ) ;

// [ VAR <VARS LIST> ]

// BEGIN

// STATEMENTS LIST

// <END>

token = NextToken(scan);

if (!IsEnd(token)) return CreateError("Ожидается End", token.Line, 0);

return true; }

public bool Read(Scanner scan)

{

Functions = new ArrayList();

Function IntegerSinFunc = new Function("Sin",ReturnTypes.Real, true);

IntegerSinFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealSinFunc = new Function("Sin",ReturnTypes.Real, true);

RealSinFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( IntegerSinFunc);

Functions.Add( RealSinFunc);

Function IntegerCosFunc = new Function("Cos",ReturnTypes.Real, true);

IntegerCosFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealCosFunc = new Function("Cos",ReturnTypes.Real, true);

RealCosFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( IntegerCosFunc);

Functions.Add( RealCosFunc);

Function IntegerTanFunc = new Function("Tan",ReturnTypes.Real, true);

IntegerTanFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealTanFunc = new Function("Tan",ReturnTypes.Real, true);

RealTanFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( IntegerTanFunc);

Functions.Add( RealTanFunc);

Function IntegerExpFunc = new Function("Exp",ReturnTypes.Real, true);

IntegerExpFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealExpFunc = new Function("Exp",ReturnTypes.Real, true);

RealExpFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( IntegerExpFunc);

Functions.Add( RealExpFunc);

Function StringWriteLnFunc = new Function("WriteLn",ReturnTypes.Object, true);

StringWriteLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.String);

Function IntegerWriteLnFunc = new Function("WriteLn",ReturnTypes.Object, true);

IntegerWriteLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealWriteLnFunc = new Function("WriteLn",ReturnTypes.Object, true);

RealWriteLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( StringWriteLnFunc);

Functions.Add( IntegerWriteLnFunc);

Functions.Add( RealWriteLnFunc);

Function StringReadLnFunc = new Function("ReadLn",ReturnTypes.Object, true);

StringReadLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.String);

Function IntegerReadLnFunc = new Function("ReadLn",ReturnTypes.Object, true);

IntegerReadLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.Integer);

Function RealReadLnFunc = new Function("ReadLn",ReturnTypes.Object, true);

RealReadLnFunc.ArgumentsReturnTypes.Add(ReturnTypes.Real);

Functions.Add( StringReadLnFunc);

Functions.Add( IntegerReadLnFunc);

Functions.Add( RealReadLnFunc);

Variables = new ArrayList();

Token token = null;

// <PROGRAM>

token = NextToken(scan);

if (!IsProgram(token)) return CreateError("Ожидается Program", token.Line, 0);

// PROGRAM <ID>

token = NextToken(scan);

if (!IsName(token)) return CreateError(token.Expr+" - недопустимое имя идентификатора", token.Line, 1);

this.Name = token.Expr;

// PROGRAM ID <;>

token = NextToken(scan);

if (!IsDelimiter(token))

return CreateError("Ожидается ;", token.Line, 0);

// PROGRAM ID ;

// [ <FUNCTIONS LIST> ]

while (ReadFunctionSection(scan))

{token = NextToken(scan);

if (!IsDelimiter(token))

return CreateError("Ожидается ;", token.Line, 0);

}

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [<VAR>]

token = NextToken(scan);

if (IsVar(token))

{

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [ VAR <VARS LIST> ]

if (!ReadVarsListDeclarationSection(scan))

return CreateError("В секции Var отсутствуют переменные", token.Line, 0);

}

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [ VAR <VARS LIST> ]

// <BEGIN>

token = NextToken(scan);

if (!IsBegin(token))

return CreateError("Ожидается Begin", token.Line, 0);

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [ VAR <VARS LIST> ]

// BEGIN

// <STATEMENTS LIST>

if (!ReadStatementsSection(scan))

return false;

if (!IsValidate())

return false;

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [ VAR <VARS LIST> ]

// BEGIN

// STATEMENTS LIST

// <END>

token = NextToken(scan);

if (!IsEnd(token))

return CreateError("Ожидается End", token.Line, 0);

// PROGRAM ID ;

// [ FUNCTIONS LIST ]

// [ VAR STATEMENTS LIST;

// BEGIN

// STATEMENTS LIST

// END <.>

token = NextToken(scan);

if (!IsEndPoint(token))

return CreateError("Ожидается .", token.Line, 0);

return true;

}

public override ArrayList GetCommands()

{ArrayList commands = new ArrayList();

foreach(Function f in Functions)

{

if (!f.Sys)

commands.InsertRange(commands.Count, f.GetCommands());

}

string OriginalName = Name;

Name = "Main";

commands.InsertRange(commands.Count, base.GetCommands());

Name = OriginalName;

return commands; }

public bool Load(RichTextBox InputBox)

{

Scan = new Scanner();

Scan.DoScan(InputBox);

Read(Scan);

return true;

}

public bool SaveResults(object OutBox, ArrayList Data)

{

if(OutBox.GetType().Name=="ListBox")

{

((ListBox)OutBox).Items.Clear();

foreach (string line in Data) ((ListBox)OutBox).Items.Add(line);

}

else

{

int cnt=1;

RichTextBox Box=(RichTextBox)OutBox;

System.Text.StringBuilder text = new System.Text.StringBuilder();

Box.Clear();

foreach (string line in Data)

{

Box.SelectionColor=System.Drawing.Color.Gray;

text.Remove(0,text.Length);

text.AppendFormat(" {0,3}: ",cnt); Box.AppendText(text.ToString());

Box.SelectionColor=System.Drawing.Color.Blue;

if(line.IndexOf(" ")!=-1) Box.AppendText(line.Substring(0,line.IndexOf(" ")));

else

{

Box.SelectionColor=System.Drawing.Color.Magenta;

Box.AppendText(line+"\n"); }

Box.SelectionColor=System.Drawing.Color.Black;

if(line.IndexOf(" ")!=-1) Box.AppendText(line.Substring(line.IndexOf(" "))+"\n");

cnt++;

}

}

return true;

}

public bool NoErrors(ListBox ErrorBox)

{

ArrayList AllErrors = Errors.Clone() as ArrayList;

AllErrors.InsertRange(0, Scan.Errors);

foreach(Function f in Functions) AllErrors.InsertRange(AllErrors.Count, f.Errors);

if (AllErrors.Count>0)

{

SaveResults(ErrorBox, AllErrors);

return false;

}

else

{

ErrorBox.Items.Clear();

ErrorBox.Items.Add("> Трансляция программы успешно завершена.");

}

return true;

}

}

}

Соседние файлы в папке Курсовой 14 вариант