- •2.2. Управляющие последовательности
- •12.3.3. Отсутствие элементов конструкций.
- •2.4. Терминальные символы
- •12.4.1. Символ из множества.
- •12.4.2. Символ, не принадлежащий множеству
- •12.4.3. Строка символов из множества.
- •12.4.4. Строка из одинаковых символов.
- •12.4.5. Операция конкатенации строк
- •2.5. Круглые скобки
- •2.6. Семантика языка
- •Int I, number;
- •Int number_string - номер последней обрабатываемой строки,
- •3. Пример программы разбора
- •14.2. Преобразование грамматики
- •14.3. Примеры преобразования грамматик на метаязыке
12.3.3. Отсутствие элементов конструкций.
Любой нетерминальный, терминальный символы, а также сентенция (комби-
нация терминальных и нетерминальных символов) может отсутствовать.
Знак подчеркивания _ во всех конструкциях обозначает возможность их
отсутствия. То есть <* <цифра> *> порождает от одной до бесконечного
числа цифр, а <* <цифра> *>_ может не порождать ни одной цифры, может
порождать одну и более цифр.
Пример 2. Конструкция
<целое> ::= <цифра>
||= <целое>,<цифра>
эквивалентна
<целое> ::= <цифра><* , <цифра> *>_
Использование этого знака с терминальным или нетерминальным сим-
волом означает возможность его отсутствия. То есть <цифра>_ порождает,
либо одну цифру, либо ни одной. Запись 7_ означает, что цифра 7 может
быть, а может и отсутствовать.
2.4. Терминальные символы
Как уже отмечалось ранее терминальные символы в метаязыке предс-
- 13 -
тавляют сами себя. Примеры терминальных символов while for do [ 0
fg a и т.д. Такие терминальные символы нельзя разделить на части. Нап-
ример while и whi le не одно и тоже.
Наряду с приведенным выше неявным обозначением терминальных сим-
волов в метаязыке имеются средства для их явного задания. Последова-
тельность терминальных символов, а также отдельный терминальный символ
можно выделить в апострофах. Например, предыдущие примеры можно запи-
сать.
'while' эквивалентно while
'for' эквивалентно for
'whi''le' эквивалентно whi le
'whi''le' не эквивалентно while
'1' эквивалентно 1
Записи 'whi''le' и whi le допускают наличие любого числа пробель-
ных символов между whi и le. Пробельные символы определены в приложе-
нии. В частности к ним относятся символы пробел и символ новой строки,
а также комментарий.
В случае отсутствия апострофов символ рассматривается в первую
очередь как метасимвол. И только если он не совпадает ни с одним мета-
символом, его следует рассматривать, как терминальный символ. Например,
в продукциях
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
символ | это метасимвол. Он разделяет продукции. Однако продукция
<цифра> ::= '0|1|2|3|4|5|6|7|8|9'
определяет не множество цифр, а только одну строку, содержащую 19 сим-
волов - 10 цифр, разделенных вертикальной чертой.
Форму выделения терминальных символов апострофами полезно приме-
нять для записи терминальных символов, совпадающих с метасимволами,
вместо управляющих последовательностей. Например, '\' '<' '<*' '{' и
так далее.
- 14 -
12.4.1. Символ из множества.
Для ещё большего упрощения записи терминальных символов введем эквива-
лентные конструкции:
char{x,ad,...} и [x,ad,...]
Обе конструкции обозначают один символ из множества символов, пе-
речисленных в фигурных скобках. Если элементом множества являются две
буквы, как в нашем примере ad, то они задают граничные элементы мно-
жеств. Т.е. char{ad} = char{a,b,c,d}. Однако, если элементом множества
является цепочка символов, то её необходимо выделять в апострофы. Нап-
ример, char{a,bc,'bc','/*','*/'} означает следующее множество символов.
char{a,b,c,'bc','/*','*/'}
То есть при порождении строки вместо char{a,b,c,'bc','/*','*/'} можно
подставить любой терминальный символ из a, b, c, bc , /*, */ .
При использовании данной формы записи конструкцию <цифра> можно
представить в виде:
<цифра> ::= char{09} или <цифра> ::= [09]
что эквивалентно
<цифра> ::= char{0,1,2,3,4,5,6,7,8,9}
или
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
Данные конструкции также можно использовать совместно с символом
_, который указывает на то, что конструкция может отсутствовать. Сим-
вол '_' относится ко всей конструкции char, а не к символам множества.
То есть можно записать char{09}_ или [09]_ , но запрещена запись
[09_].
Отдельные символы в множестве можно указывать также с помощью уп-
равляющих последовательностей.
- 15 -