3. Грамматика языка программирования обработки строк
-
<программа> → PROGRAM ID ; <func_секция><var_секция> <тело>
-
<func_секция> → <func> | <func_секция>
-
<func> → FUNCTION ID (<объяв>):<тип><var_секция> <тело>
-
<var_секция> → ε | VAR <объяв>
-
<объяв> → <список_типа> | <список_типа><объяв>
-
<список_типа> → <список_ид> : <тип>;
-
<тип> → INTEGER | REAL | STRING
-
<список_ид> → ID | ID,<список_ид>
-
<тело> → BEGIN <конструкция>; END;
-
<конструкция>→ READ(ID) | WRITE(<выражение>) | ID:=<выражение> | LABEL ID: | GOTO ID: | <тело> | ε
-
<выражение> → <терм> | <выражение> + <терм> | <выражение> - <терм>
-
<терм> → <подтерм> | <терм> * <подтерм> | <терм> / <подтерм>
-
<подтерм> → ID | FUNC(<выражение>) | (<выражение>)
Таким образом языка данной грамматики является подмножеством языка Pascal
Реализация транслятора
Логика работы лексического анализатора и функции подсветки построена на конечных автоматах, синтаксического – на методе рекурсивного спуска. При синтаксическом разборе части программы, оформленные в виде классов, сами “собирают” себя, так как зная свой собственный тип, они “могут догадываться” о дальнейшем содержании. Причем работа идет параллельно для нескольких классов, поэтому входная цепочка проверяется всеми автоматами на причастность ее к своему классу.
Примеры автоматов
-
Автомат для ключевых слов (на примере begin)

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

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

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;
}
}
}
