Начиная с этого момента для описания синтаксических правил языка программирования С-51 применяются синтаксические диаграммы. Поясним основные понятия и обозначения, которые в них используются.
Синтаксические диаграммы являются формальным и одновременно наглядным представлением правил, составленных из терминальных и нетерминальных имен. Для того чтобы сделать описание синтаксиса более компактным, часть определений нетерминальных имен будет приводиться в словесной форме.
Терминальными называются имена, входящие в текст программы так, как они написаны. Например, терминальными именами являются символьные или строковые константы. В синтаксических правилах такие терминальные имена заключаются в апострофы и кавычки соответственно.
Нетерминальные имена — это понятия, которые выводятся при помощи синтаксических правил с использованием других нетерминальных и терминальных имен, а также символов. Нетерминальные имена будем начинать с заглавной буквы и использовать для их написания курсивный Шрифт Courier, например,
Элементы синтаксических правил, заключенные в квадратные скобки ([]), являются необязательными.
Итак, вооружившись этим набором несложных понятий и договоренностей, приступим к описанию синтаксиса языка программирования С-51.
Объявление переменной в этом языке представляется в следующем виде:
[Спецификатор класса памяти] Спецификатор типа
[Спецификатор типа памяти] Описатель ['=' Инициатор]
[, Описатель ['=' Инициатор]]…
Спецификатор класса памяти — определяется одним из ключевых слов языка С-51:
Компилятор С51 обеспечивает следующие расширения ANSI-стандарта языка программирования С, необходимые для программирования микроконтроллеров семейства MCS-51:
— области памяти;
— типы памяти;
— модели памяти;
— описатели типа памяти;
— описатели изменяемых типов данных;
— битовые переменные и данные с битовой адресацией;
— регистры специальных функций;
— указатели;
— атрибуты функций.
Типы данных
Основные типы данных определяют с использованием следующих ключевых слов.
Для целых типов данных:
Для типов данных с плавающей запятой:
Переменная любого типа может быть объявлена как неизменяемая. Это достигается добавлением ключевого слова const к спецификатору типа.
Объекты с квалификатором const представляют собой данные, используемые только для чтения, т. е. этой переменной в ходе выполнения программы не может быть присвоено новое значение. Отметим, что если после слова const отсутствует спецификатор типа, то подразумевается спецификатор типа int. Если ключевое слово const стоит перед объявлением составных типов (массив, структура, объединение, перечисление), то это приводит к тому, что каждый элемент также будет немодифицируемым, т. е. значение ему может быть присвоено только один раз.
Примеры использования ключевого слова const:
const float A=2.128E-2;
const В=286; //подразумевается const int В=286
Отметим, что переменные со спецификатором класса памяти размещаются во внутреннем ОЗУ. Неизменяемость контролируется только на этапе трансляции. Для размещения переменной в ПЗУ лучше воспользоваться спецификатором типа памяти code.