Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по ТЯП(РЯП)1.doc
Скачиваний:
12
Добавлен:
01.05.2014
Размер:
1.87 Mб
Скачать

1.2.3. Конструкции входного языка.

Оператор итерационного цикла for-to-do и for-downto-do.

<оператор цикла с параметром>::=for <имя>:=<выражение> <направление изменения переменной цикла> <выражение> do <оператор>

1. Вычисляется первое арифметическое выражение и его значение присваивается переменной цикла.

2. Вычисляется и запоминается во временной переменной второе арифметическое выражение.

Если направление изменения переменной цикла - to

3. Если переменная цикла больше временной переменной, то выполняется безусловный переход на следующий в контексте цикла оператор.

4. Выполяется оператор – тело цикла.

5. Переменная цикла увеличивается на единицу. Безусловный переход на пункт 3.

Если направление изменения переменной цикла - downto

3. Если переменная цикла меньше временной переменной, то выполняется безусловный переход на следующий в контексте цикла оператор.

4. Выполяется оператор – тело цикла.

5. Переменная цикла уменьшается на единицу. Безусловный переход на пункт 3.

Значение переменной цикла при нормальном завершении не определено.

Оператор присваивания :=

<оператор присваивания>::=<переменная> := <выражение>

1. Вычисляется арифметическое выражение в правой части и, в случае соответствия типов, запоминается в переменной, указанной в левой части.

Для прямого обращения к числителю и знаменателю переменной рационального типа необходимо использовать разыменовывание .numerator или .denominator.

Каждая переменная, используемая в программе, должна быть предварительно описана.

В одном блоке не может объявляться две переменных с одним именем.

Имя переменной не может совпадать с зарезервированными языком словами.

Оператор безусловного перехода goto.

<оператор безусловного перехода>::=goto <метка>

Выполняется переход на метку

Метка должна быть объявлена в разделе label, и встречаться в теле программы один раз.

Условный опеатор if-then-else:

<условный оператор>::=if<логическое выражение>then<оператор1>[else<оператор2>]

Вычисляется значение логического выражения и результат помещается во временную переменную.

Если результат false, то происходит переход на оператор2, в противном случае выполняется оператор1 и происходит переход в конец оператора if-then-else. Лексический анализатор.

Сначала выдвинем несколько соглашений по поводу лексического анализа:

  1. Будем производить лексический анализ без учета регистра символов.

  2. Будем производить лексический анализ с учетом комментариев только одного типа – {…}

  3. При лексическом анализе будем выделять следующие типы лексем (токены):

Тип лексемы

Описание

Идентификатор

Последовательность символов, состоящая из букв, цифр и знаков подчеркивания, не начинающаяся с цифры

Число

Числом считается последовательность символов, состоящая только из цифр

Ключевое слово

Ключевым словом является любое слово из нижеприведенного списка:

begin end array program label const var type of integer rational int frac common simplify numerator denominator for to downto do write read goto if then else irregular and or not

Оператор

Оператором является любое слово из нижеприведенного списка:

+ - * / := = > >= < <= = <>

Разделитель

Разделителем является любой из нижеприведенных символов:

( ) [ ] , ; : . ..

Таким образом, можно сформировать 5 таблиц: таблицу идентификаторов, таблицу чисел и еще три предопределенные таблицы: таблицу ключевых слов, операторов и разделителей.

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

Таблица ключевых слов

Индекс

Информация

1

begin

2

end


Название таблицы

Адрес ячейки в таблице

Keyword

2

Identifier

1

...

Таблица операторов

Индекс

Информация

1

+

2

-


Таблица разделителей

Индекс

Информация

1

(

2

)

Таблица чисел

Индекс

Информация

1

239

2

30

Таблица идентификаторов

Индекс

Информация

1

count

2

index


Определим функции, которыми будем пользоваться при лексическом анализе.

  1. add_charдобавляет текущий символ к текущему слову справа.

  2. process – обрабатывает и добавляет текущее слово в поток, затем обнуляет его.

Исходная КС-грамматика:

ProgramProgramName SectionDeclar SectionOper

ProgramNameprogram Name;

ProgramName

SectionDeclarSectionDeclarLabel SectionDeclar

SectionDeclarSectionDeclarConst SectionDeclar

SectionDeclarSectionDeclarType SectionDeclar

SectionDeclarSectionDeclarVar SectionDeclar

SectionDeclar

SectionDeclarLabellabel LabelName SeqLabelName ;

LabelNameName

LabelNameusi

SeqLabelName , LabelName SeqLabelName

SeqLabelName

SectionConstconst ConstDeclar ; SeqConstDeclar

ConstDeclarName = ConstExp

ConstExpName

ConstExpusi

SeqConstDeclarConstDeclar ; SeqConstDeclar

SeqConstDeclar

SeqTypeDeclartype TypeDeclar ; SeqTypeDeclar

TypeDeclarName = TypeName

SeqTypeDeclarTypeDeclar ; SeqTypeDelar

SeqTypeDeclar

TypeNameInternalType

TypeNameArrayType

TypeNameEnumType

TypeNameRangeType

TypeNameName

InternalTypeinteger

InternalTyperational

ArrayTypearray [ IndexType SeqIndexType ] of TypeName

IndexTypeEnumType

IndexTypeRangeType

IndexTypeid

SeqIndexType, IndexType SeqIndexType

SeqIndexType

EnumType( NameList )

RangeTypeConstExp .. ConstExp

SectionVarDeclarvar DeclarOneType ; SeqDeclarOneType

DeclarOneTypeNameList : TypeName

SeqDeclarOneTypeDeclarOneType ; SeqDeclarOneType

SeqDeclarOneType

NameListName SeqName

SeqName , Name SeqName

SeqName

ExpressionAddendum SeqAddendum

SeqAddendumAddOper Addendum SeqAddendum

SeqAddendum

AddendumMultiply SeqMultiply

SeqMultiplyMultiOper Multiply SeqMultiply

MultiplyUnaryOper Multiply

MultiplyVarName

Multiply usi

Multiply( Expression )

AddOper+

AddOper-

MultOper*

MultiOper/

MultiOpercommon

UnaryOperfrac

UnaryOperint

UnaryOper+

UnaryOper-

UnaryOpersimplify

UnaryOperirregular

ListExpression[ Expression SeqExpression ]

ListExpression

SeqExpression, Expression SeqExpression

SeqExpression

VarNameName ListExpression Part

Part.numerator

Part.denominator

Part

Nameidentifier

LogExpCon SeqCon

SeqConor Con SeqCon

SeqCon

LogExpRelation

ConLogMul SeqLogMul

SeqLogMuland LogMul SeqLogMul

SeqLogMul

LogMul(LogExp)|(Relation)|not LogMul

RelationExpresssion RelatoinOper Expression

RelatoinOper<

RelatoinOper>

RelatoinOper=

SectionOperComlexOper .

ComplexOperbegin Oper SeqOper end

SeqOper; Oper SeqOper

SeqOper

OperLabelName1 UnLabelOper

LabelName1LabelName

LabelName1

UnLabelOperCycleParamOper

UnLabelOperEqualOper

UnLabelOperEmptyOper

UnLabelOperComplexOper

UnLabelOperGotoOper

UnLabelOperConditionOper

UnLabelOperInOper

UnLabelOperOutOper

CycleParamOperfor Name := Expression Direction Expression do Oper

Directionto

Directiondownto

EqualOperVarName := Expression

EmptyOper

GotoOpergoto LabelName

ConditionOperif LogExp then Oper OperRest

OperRestelse Oper

OperRest

InOperread(VarName SeqVarName)

SeqVarName, VarName SeqVarName

SeqVarName

OutOperwrite(Expression SeqExpression)

SeqExpression, Expression SeqExpression

SeqExpression

Описание промежуточного языка

Промежуточным языком является польская инверсная запись (ПОЛИЗ).

Синтаксис арифметических выражений для бинарных операций в ПОЛИЗ можно описать БНФ-формулами:

<операнд> ::= id | const | <операнд><операнд><операция>

<операция> ::= + | - | * | /

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