Стартовый символ
Стартовый символ — в программировании, формальных языках и теории автоматов это начальный (аксиоматический) символ формальной грамматики, с которого начинается порождение (вывод) любого предложения (цепочки терминальных символов) данного языка. В контексте компиляторов и интерпретаторов стартовый символ является корнем синтаксического дерева разбора. В более широком, неформальном значении термин может относиться к знаку или последовательности знаков, обозначающих начало какого-либо процесса, набора данных или сообщения.
Определение в формальных грамматиках
В теории формальных языков грамматика Хомского определяется четвёркой \( G = (N, T, P, S) \), где:
- \( N \) — множество нетерминальных символов (переменных);
- \( T \) — множество терминальных символов (алфавит языка);
- \( P \) — множество правил вывода (продукций);
- \( S \) — стартовый символ, \( S \in N \).
Стартовый символ \( S \) является единственным нетерминалом, который не может появиться в правой части ни одного правила вывода в некоторых нормальных формах (например, в нормальной форме Хомского), хотя в общем случае это не обязательно. Процесс порождения строки начинается с \( S \) и последовательным применением правил вывода заменяет нетерминалы на цепочки, пока не останутся только терминалы. Язык \( L(G) \), порождаемый грамматикой, — это множество всех терминальных цепочек, выводимых из \( S \).
Пример
Для грамматики простых арифметических выражений:
- \( N = \{ E, T, F \} \)
- \( T = \{ +, *, (, ), id \} \)
- \( P \):
- \( E \to E + T \mid T \)
- \( T \to T * F \mid F \)
- \( F \to (E) \mid id \)
- \( S = E \)
Здесь \( E \) (expression) — стартовый символ. Любое выражение, например id + id * id, выводится из \( E \).
В компиляторах и синтаксическом анализе
При разработке компиляторов стартовый символ грамматики определяет точку входа для синтаксического анализатора (парсера). Парсер, начиная с этого символа, строит дерево разбора (или последовательность правил) для входной программы. Если программа не может быть выведена из стартового символа, она считается синтаксически некорректной.
В LL-парсерах и LR-парсерах стартовый символ используется для инициализации стека (в случае нисходящего анализа) или для определения начального состояния автомата (в случае восходящего анализа). В расширенных грамматиках, например, в грамматиках с атрибутами, стартовый символ может нести начальные атрибуты, задающие контекст компиляции.
В протоколах и коммуникации
В телекоммуникациях и протоколах передачи данных «стартовый символ» (или стартовый бит) — это специальный сигнал, указывающий начало передачи блока данных. Классический пример — асинхронная последовательная передача (UART), где каждый байт данных предваряется стартовым битом (логический 0), за которым следует стоповый бит (логическая 1). Стартовый символ синхронизирует приёмник и передатчик.
В системах управления и протоколах промышленной автоматизации (например, Modbus) стартовый символ может быть фиксированным байтом (например, 0x3A для ASCII-режима), обозначающим начало сообщения.
В математике и логике
В формальных системах математической логики стартовый символ соответствует аксиоме или начальной формуле, из которой по правилам вывода получаются все теоремы системы. В исчислении высказываний и исчислении предикатов роль стартового символа играют аксиомы (или набор аксиом), а в генценовских секвенциальных исчислениях — начальные секвенции.
В цифровых системах и архитектуре
В микропрограммировании и цифровых автоматах стартовый символ (или начальное состояние) — это состояние конечного автомата, в которое он переходит после сброса (reset) или включения питания. Все последующие переходы осуществляются из этого состояния. В автоматах Мура и Мили стартовое состояние обычно обозначается \( q_0 \).
В языках разметки и данных
В некоторых языках разметки и форматах данных стартовый символ используется для обозначения начала структуры. Например:
- В XML и HTML — открывающий тег (
<tag>) является стартовым символом элемента. - В JSON — открывающая фигурная скобка
{для объекта или квадратная[для массива. - В языке программирования C — точка входа в программу обозначается функцией
main(), которая не является символом в грамматическом смысле, но выполняет аналогичную роль.
В теории кодирования и криптографии
В некоторых схемах кодирования (например, в кодах с переменной длиной) стартовый символ используется как маркер, позволяющий декодеру определить начало кодового слова. В криптографии стартовый вектор (IV) не является символом в строгом смысле, но выполняет функцию инициализации алгоритма шифрования.
Интересные факты
- В ранних версиях языка программирования ALGOL 60 стартовым символом грамматики был
<program>, который определял структуру всей программы. - В теории формальных грамматик существует понятие «расширенной грамматики», где вводится новый стартовый символ \( S' \) и правило \( S' \to S \), что позволяет упростить построение LR-таблиц.
- В контексте регулярных выражений стартовый символ (якорь начала строки
^) не является символом грамматики, а указывает позицию в строке.
Критика и ограничения
- В сложных грамматиках (например, с неоднозначностью) выбор стартового символа может влиять на сложность синтаксического анализа. Для устранения неоднозначности иногда вводят дополнительные стартовые символы или модифицируют грамматику.
- В некоторых формальных системах (например, в грамматиках с контекстно-зависимыми правилами) стартовый символ может не быть единственной точкой входа, если разрешены множественные аксиомы.
Источники
- Хопкрофт Дж., Мотвани Р., Ульман Дж. — «Введение в теорию автоматов, языков и вычислений»
- Ахо А., Лам М., Сети Р., Ульман Дж. — «Компиляторы: принципы, технологии и инструменты»
- Грис Д. — «Конструирование компиляторов для цифровых вычислительных машин»
- Материалы курса «Формальные языки и грамматики» (МГУ, кафедра математической логики)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →