Создателями стандарта ставится цель создания унифицированного формата текстового представления синтаксических деревьев, генерируемых front-end-компиляторами при распознавании файлов программ на различных высокоуровневых языках.
В тексте стандарта используются следующие сокращения
- ЯВУ - язык программирования высокого уровня
Создаваемые ЯВУ должны уметь решать каждую из нижеприведённых задач:
- Вычисление факториала небольшого (не превышающего 12) целого числа при помощи рекурсивного алгоритма.
- Нахождение действительных корней квадратного трёхчлена.
- Вывод изображения при помощи записи в видеопамять.
При создании стандарта были выдвинуты следующие требования:
- Универсальность. Программа, написанная написанная на целевом ЯВУ должна быть корректно представима в формате, регламентируемом стандартом.
- Ориентированность на задачу. Стандарт должен учитывать специфику проблем, решаемых при помощи программ на целевых ЯВУ.
- Простота в реализации. Стандарт должен быть достаточно естественным, чтобы создатели компиляторов для целевых ЯВУ не испытывали чрезмерных сложностей при следовании ему.
- Синтаксические деревья представляются в виде текстового файла, использующего кодировку ASCII.
- Символы, не входящие в набор ASCII являются недопустимыми.
- Пробельные символы, не находящиеся внутри лексемы, являются незначимыми и игнорируются.
- Числа могут записываться как в формате с десятичной точкой, так и без неё. При записи в формате с десятичной точкой после неё может быть указано не более трёх десятичных разрядов.
- Любое синтаксическое дерево программы на целевом ЯВУ обязано содержать определение функции
main(), не принимающей аргументов. Функцияmain()считается точкой входа в программу. - Любая объявленная функция обязана содержать узел типа
RET(см. Типы узлов), лежащий в поддереве правого сына узла объявления функции, но не в поддереве никакого другого узла типаBLOCK. - Все функции и переменные должны быть объявлены до своего использования. Порядок объявлений определяется "post-order" обходом дерева.
- Поддерево узла типа
BLOCK(см. Типы узлов) задаёт область видимости. Не допускается использование переменной вне её области видимости. Глобальные переменные (т.е переменные, объявленные вне какого либо блока) имеют глобальную область видимости и доступны из любой точки программы.
Каждый узел дерева записывается в фигурных скобках ('{' и '}'). Внутри фигурных скобок через запятую записываются тип узла, хранимое значение, левый дочерний узел, правый дочерний узел. Пустой узел обозначается пустой парой фигурных скобок ("{ }").
Если правый дочерний узел пуст, пустым обязан быть и левый дочерний узел (т.е. если узел унарный, то его единственный ребёнок - правый).
Далее приведено формальное описание грамматики записи синтаксического дерева.
G ::= Node '\0'
Node ::= ('{' _ '}') | ('{' _ Type _ ',' _ ',' Val _ ',' _ Node _ ',' _ Node _ '}')
_ ::= [' ', '\n', '\t', '\v', '\f', '\r']*
Type ::= "DEFS" | "NVAR" | "NFUN" | "BLOCK" | "ARG" | "OP" | "SEQ" |
"ASS" | "WHILE" | "IF" | "BRANCH" | "CALL" | "PAR" | "RET" |
"CONST" | "VAR"
Val ::= Num | Name | Op | "NULL"
Num ::= [0-9]+ ('.'[0-9]? [0-9]? [0-9]? )?
Name ::= [A-Za-z_]+ [A-Za-z0-9_]*
Op ::= "ADD" | "SUB" | "MUL" | "DIV" | "NEG" |
"AND" | "OR" | "NOT" |
"GEQ" | "LEQ" | "GT" | "LT" | "EQ" | "NEQ"Список глобальных определений функций и переменных.
- Значение:
NULL - Левый сын:
NVARилиNFUN - Правый сын:
DEFSили пустой узел
Определение и инициализация глобальной либо локальной переменной.
- Значение: имя переменной
- Левый сын: пустой узел
- Правый сын:
OP,CONST,VARилиCALL
Определение новой функции.
- Значение: имя функции
- Левый сын:
ARG - Правый сын:
BLOCK
Арифметическая, логическая операция или операция сравнения.
- Значение: тип операции (см. раздел Типы операторов)
- Левый сын:
OP,CONST,VAR,CALLили пустой узел - Правый сын:
OP,CONST,VARилиCALL
Список формальных аргументов функции.
- Значение: имя аргумента
- Левый сын: пустой узел
- Правый сын:
ARGили пустой узел
Блок кода с собственной областью видимости.
- Значение:
NULL - Левый сын: пустой узел
- Правый сын:
SEQ
Последовательность команд и объявлений.
- Значение:
NULL - Левый сын:
BLOCKNVAR,ASS,IF,WHILE,RETилиCALL - Правый сын:
SEQили пустой узел
Изменение значения переменной.
- Значение: имя переменной
- Левый сын: пустой узел
- Правый сын:
OP,CONST,VARилиCALL
Цикл с предусловием.
- Значение:
NULL - Левый сын:
OP,CONST,VARилиCALL - Правый сын:
BLOCK,ASS,IF,WHILE,RETилиCALL
Конструкция условного выполнения кода.
- Значение:
NULL - Левый сын:
OP,CONST,VARилиCALL - Правый сын:
BRANCH
Ветви кода при условной конструкции.
- Значение:
NULL - Левый сын:
BLOCK,ASS,IF,WHILE,RETилиCALL - Правый сын:
BLOCK,ASS,IF,WHILE,RET,CALLили пустой узел
Вызов функции с передачей параметров.
- Значение: имя функции
- Левый сын: пустой узел
- Правый сын:
PAR
Фактические аргументы функции, передаваемые при вызове.
- Значение:
NULL - Левый сын:
OP,CONST,VARилиCALL - Правый сын:
PARили пустой узел
Завершение выполнения функции с возвращением значения.
- Значение:
NULL - Левый сын: пустой узел
- Правый сын:
OP,CONST,VARилиCALL
Действительная численная константа с фиксированной точностью.
- Значение: число с фиксированной точкой (не более трёх знаков после десятичной точки)
- Левый сын: пустой узел
- Правый сын: пустой узел
Обращение к объявленной ранее локальной или глобальной переменной.
- Значение: имя переменной
- Левый сын: пустой узел
- Правый сын: пустой узел
Узлы типа OP в качестве значения содержат одно из следующих значений:
- Бинарные операции
ADDарифметическое сложениеSUBарифметическое вычитаниеMULарифметическое умножение с фиксированной точностьюDIVарифметическое деление с фиксированной точностьюANDлогическая конъюнкцияORлогическая дизъюнкцияLTменьшеGTбольшеLEQменьше или равноGEQбольше или равноEQравноNEQне равно
- Унарные операции
NEGарифметический унарный минусNOTлогическое отрицание
Для решения поставленных перед стандартом задач, авторами стандарта было принято решение, о создании набора функций, не требующих явного объявления в коде на целевом ЯВУ, но при этом всегда доступных для использования. В целях предотвращения конфликтов имён, в дереве не должны встречаться узлы объявления функций с именами, совпадающих с именами функций стандартной библиотеки.
В стандартную библиотеку входят следующие функции:
sqrt(x)- возвращает значение квадратного корня изx, вычисленное с фиксированной точностью.abs(x)- возвращает абсолютную величинуx.read()- возвращает число, считанное из стандартного потока ввода.print(x)- выводит числоxв стандартный поток вывода и возвращает значениеx.set_pixel(x, y, ch)- записывает символchв видеопамять, используя числаxиyв качестве его относительных координат.chинтерпретируется как код символа в таблице ASCII, дробная часть числа отбрасывается.xиy- числа от -1 до 1, интерпретируются как относительные координаты пикселя на экране относительно центра экрана.x- координата по горизонтали,y- координата по вертикали. Возвращает значениеchflush()- обновляет экран, выводя содержимое видеопамяти. Возвращает число 1.
Если ну ооочень захочется, стандарт можно не соблюдать т.к. он - общепризнанное г**но.
Ну оплату за стандарт занесёшь в комнату №123, там дверь может упасть и не бойся ведра тараканов в углу, но там брось пачку на верхнюю полку косого шкафа в место, где там почище.