- •2006 Оглавление:
- •1. Постановка задачи
- •Исходные данные:
- •2. Описание входного языка:
- •2.1. Описание синтаксиса входного языка
- •2.2. Описание семантики входного языка
- •Объявления и области действия
- •Оператор вывода
- •Оператор ввода
- •Зарезервированные функции
- •3. Описание этапа лексического анализа
- •3.1. Определение типов лексем
- •3.2. Определение синтаксиса лексем
- •3.3. Структуры данных
- •50 Таблица констант
- •3.5. Результаты работы лексического анализатора
- •4. Описание этапа синтаксического анализа:
- •4.1. Построение кс-грамматики входного языка
- •4.1.1. Определение программы
- •4.1.6. Подграмматика арифметических операций
- •4.2. Описание промежуточного языка (триады)
2.2. Описание семантики входного языка
Программа представляет собой множество пользовательских типов данных (далее - классов), находящихся в каталогах (package) и связанных включением (import), один из которых обязательно имеет функцию-член с сигнатуройvoid main(String args). В каждом файле может быть описан только один класс. Класс имеет поля, которые могут быть членами-данными встроенных или же определяемых пользователем типов (разработанных классов) или членами-функциями (далее - просто функциями). Инициализация члена-данного может быть осуществлена во время объявления этого члена-данного. Поля класса должны иметь уникальные имена. Переменные, объявленные внутри одно блока должны иметь уникальные имена. Областью видимости локальной переменной является блок. Локальные переменные объявленные внутри блока перекрывают переменные с теми же именами, объявленными вне этого блока. Имя формально параметра функции также перекрывает имя переменной, объявленной как член-данное класса. Время жизни неименованных переменных (используемых в выражениях) ограничивается временем вычисления результата выражения. Время жизни локальной переменной ограничивается блоком, в котором она была определена.
Представление данных различных типов в оперативной памяти (ширина и диапазоны):
Тип
Ширина, бит
Диапазон значений
int
32
от -2 147 483 648 до 2 147 483 647
double
64
от 1.7e-308 до 1.7e+308
char
16
от 0 до 65 536
String
ограничено размером ОП
…
Проектируемый язык - регистрозависимый.
Существует набор зарезервированных языком слов. Их нельзя использовать для задания <идентификатора>. Зарезервированные слова:
while |
int |
package |
length |
if |
double |
import |
concat |
else |
String |
class |
substring |
goto |
char |
void |
replace |
read |
true |
null |
find |
write |
false |
new |
|
Арифметические операции. Используются в выражениях, стоящих в правой части присваивания. В арифметическом выражении приоритет операций обычный. Деление на ноль запрещено.
Знак операции |
Название операции |
Порядок выполнения |
++ |
Увеличение на единицу |
Справа налево |
-- |
Уменьшение на единицу |
Справа налево |
* |
Умножение |
Слева направо |
/ |
Деление |
Слева направо |
+ |
Сложение (положительное число) |
Слева направо |
- |
Вычитание (отрицательное число) |
Слева направо |
Операции отношения. Используются при вычислении условных выражений.
Знак операции |
Название операции |
Порядок выполнения |
< |
Меньше |
Слева направо |
<= |
Меньше или равно |
Слева направо |
> |
Больше |
Слева направо |
>= |
Больше или равно |
Слева направо |
== |
Равно |
Слева направо |
!= |
Не равно |
Слева направо |
В случае сравнения переменных (или результатов выражений) разного типа, - типы преобразуются согласно правилам преобразования типов
String-переменной может быть назначена строковая константа (строка символов в двойных кавычках);
Когда операция деления применяется к целочисленному типу, дробная часть теряется;
Каждая переменная и каждое выражение имеют тип, и каждый тип строго определён;
Все назначения, явные или через передачу параметров в вызовах методов, проверяются на совместимость типов;
При выполнении операции присваивания результат приводится к типу переменной слева от знака операции присваивания, при этом возможно преобразование как старшего типа к младшему, так и наоборот;