- •Задание на курсовую работу
- •1. Описание входного языка.
- •1.2.3. Конструкции входного языка.
- •Если результат false, то происходит переход на оператор2, в противном случае выполняется оператор1 и происходит переход в конец оператора if-then-else. Лексический анализатор.
- •Представление основных операторов в полиз
- •Операционный символ { вычислить адрес }p, n, r
- •Операционный символ {сложить}p, q, r
- •Операционный символ {вычесть}p, q, r
- •Операционный символ { умножить }p, q, r
- •Операционный символ { делить }p, q, r
- •Операционный символ { общий знаменатель }p, q, r
- •Операционный символ { дизъюнкция }p, q, r
- •Операционный символ { конъюнкция }p, q, r
- •Операционный символ { отрицание }p, q
- •Операционный символ { меньше }p, q, r
- •Операционный символ { отношение }q1, q2, q3, r
- •Операционный символ { id }n
- •Операционный символ { init }n, V, r
- •Операционный символ { нач_ц }q1, q2, q3, m1, m2, r2
- •Операционный символ { кон_ц } q4, q5, m1, m2
- •Операционный символ { присвоить }p, q
- •Операционный символ { имя }q, r
- •Операционный символ { последовательность имён }p, q, r
- •Операционный символ {индекс}p, r
- •Операционный символ {массив}t, q, r
- •Операционный символ { последовательность индексов }p, q, r
- •Операционный символ {диапазон}p, q, r
- •Операционный символ {создать метку}p, r
- •Описание типа
- •Структуры данных дмп-процессора
- •Структура символа
- •Магазин дмп процессора
- •Часть 1 :
- •Часть 2 :
- •Разработка дмп-процессора
- •Взаимодействие дмп-процессоров
- •Алгоритм работы дмп-процессора
- •Передача атрибутов в дмп-процессоре
- •Тестирование дмп-процессора
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. Лексический анализатор.
Сначала выдвинем несколько соглашений по поводу лексического анализа:
Будем производить лексический анализ без учета регистра символов.
Будем производить лексический анализ с учетом комментариев только одного типа – {…}
При лексическом анализе будем выделять следующие типы лексем (токены):
Тип лексемы |
Описание |
Идентификатор |
Последовательность символов, состоящая из букв, цифр и знаков подчеркивания, не начинающаяся с цифры |
Число |
Числом считается последовательность символов, состоящая только из цифр |
Ключевое слово |
Ключевым словом является любое слово из нижеприведенного списка: 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 |
… |
… |
Определим функции, которыми будем пользоваться при лексическом анализе.
add_char – добавляет текущий символ к текущему слову справа.
process – обрабатывает и добавляет текущее слово в поток, затем обнуляет его.
Исходная КС-грамматика:
ProgramProgramName SectionDeclar SectionOper
ProgramNameprogram Name;
ProgramName
SectionDeclarSectionDeclarLabel SectionDeclar
SectionDeclarSectionDeclarConst SectionDeclar
SectionDeclarSectionDeclarType SectionDeclar
SectionDeclarSectionDeclarVar SectionDeclar
SectionDeclar
SectionDeclarLabellabel LabelName SeqLabelName ;
LabelNameName
LabelNameusi
SeqLabelName , LabelName SeqLabelName
SeqLabelName
SectionConstconst ConstDeclar ; SeqConstDeclar
ConstDeclarName = ConstExp
ConstExpName
ConstExpusi
SeqConstDeclarConstDeclar ; SeqConstDeclar
SeqConstDeclar
SeqTypeDeclartype TypeDeclar ; SeqTypeDeclar
TypeDeclarName = TypeName
SeqTypeDeclarTypeDeclar ; SeqTypeDelar
SeqTypeDeclar
TypeNameInternalType
TypeNameArrayType
TypeNameEnumType
TypeNameRangeType
TypeNameName
InternalTypeinteger
InternalTyperational
ArrayTypearray [ IndexType SeqIndexType ] of TypeName
IndexTypeEnumType
IndexTypeRangeType
IndexTypeid
SeqIndexType, IndexType SeqIndexType
SeqIndexType
EnumType( NameList )
RangeTypeConstExp .. ConstExp
SectionVarDeclarvar DeclarOneType ; SeqDeclarOneType
DeclarOneTypeNameList : TypeName
SeqDeclarOneTypeDeclarOneType ; SeqDeclarOneType
SeqDeclarOneType
NameListName SeqName
SeqName , Name SeqName
SeqName
ExpressionAddendum SeqAddendum
SeqAddendumAddOper Addendum SeqAddendum
SeqAddendum
AddendumMultiply SeqMultiply
SeqMultiplyMultiOper Multiply SeqMultiply
MultiplyUnaryOper Multiply
MultiplyVarName
Multiply usi
Multiply( Expression )
AddOper+
AddOper-
MultOper*
MultiOper/
MultiOpercommon
UnaryOperfrac
UnaryOperint
UnaryOper+
UnaryOper-
UnaryOpersimplify
UnaryOperirregular
ListExpression[ Expression SeqExpression ]
ListExpression
SeqExpression, Expression SeqExpression
SeqExpression
VarNameName ListExpression Part
Part.numerator
Part.denominator
Part
Nameidentifier
LogExpCon SeqCon
SeqConor Con SeqCon
SeqCon
LogExpRelation
ConLogMul SeqLogMul
SeqLogMuland LogMul SeqLogMul
SeqLogMul
LogMul(LogExp)|(Relation)|not LogMul
RelationExpresssion RelatoinOper Expression
RelatoinOper<
RelatoinOper>
RelatoinOper=
SectionOperComlexOper .
ComplexOperbegin Oper SeqOper end
SeqOper; Oper SeqOper
SeqOper
OperLabelName1 UnLabelOper
LabelName1LabelName
LabelName1
UnLabelOperCycleParamOper
UnLabelOperEqualOper
UnLabelOperEmptyOper
UnLabelOperComplexOper
UnLabelOperGotoOper
UnLabelOperConditionOper
UnLabelOperInOper
UnLabelOperOutOper
CycleParamOperfor Name := Expression Direction Expression do Oper
Directionto
Directiondownto
EqualOperVarName := Expression
EmptyOper
GotoOpergoto LabelName
ConditionOperif LogExp then Oper OperRest
OperRestelse Oper
OperRest
InOperread(VarName SeqVarName)
SeqVarName, VarName SeqVarName
SeqVarName
OutOperwrite(Expression SeqExpression)
SeqExpression, Expression SeqExpression
SeqExpression
Описание промежуточного языка
Промежуточным языком является польская инверсная запись (ПОЛИЗ).
Синтаксис арифметических выражений для бинарных операций в ПОЛИЗ можно описать БНФ-формулами:
<операнд> ::= id | const | <операнд><операнд><операция>
<операция> ::= + | - | * | /
Для расширения ПОЛИЗ, т.е. для представления других конструкций языков программирования следует придерживаться правила, что оператор непосредственно следует за соответствующими ему операндами.