Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

2.Лексическая структура

2.1Программы

Программа на C# состоит из одного или более исходных файлов, формально называемых единицами компиляции (§9.1). Исходный файл — это упорядоченная последовательность символов Юникода. Исходные файлы обычно взаимнооднозначно соответствуют файлам файловой системы, но это соответствие не является обязательным. Для максимальной переносимости рекомендуется использовать для файлов в файловой системе кодировку UTF-8.

С концептуальной точки зрения программа компилируется в три этапа:

  1. Преобразование: файл преобразуется из конкретного набора символов и схемы кодировки в последовательность символов Юникода.

  2. Лексический анализ: поток входных символов Юникода преобразуется в поток лексем.

  3. Синтаксический анализ: поток лексем преобразуется в исполняемый код.

2.2Грамматики

В настоящей спецификации представлен синтаксис языка программирования C#, использующий две грамматики. Лексическая грамматика (§2.2.2) определяет, как объединяются символы Юникода для образования признаков конца строки, пробелов, комментариев, лексем и препроцессорных директив. Синтаксическая грамматика (§2.2.3) определяет, как объединяются лексемы, полученные от лексической грамматики, для образования программ на C#.

2.2.1Грамматическая нотация

Лексическая и синтаксическая грамматики представлены с помощью грамматических порождений. Каждое грамматическое порождение определяет нетерминальный символ и возможные подстановки этого нетерминального символа в последовательности нетерминальных или терминальных символов. В грамматических порождениях нетерминальные символы отображаются курсивом, а терминальные символы — моноширинным шрифтом.

Первой строкой грамматического порождения является имя определяемого нетерминального символа, за которым следует двоеточие. Каждая последующая строка с отступом содержит возможную подстановку нетерминального символа, данную в виде последовательности нетерминальных или терминальных символов. Например, порождение:

оператор_while: while ( логическое_выражение ) внедренный_оператор

определяет оператор_while как состоящий из лексемы while, последующей лексемы «(», последующего логического_выражения, последующей лексемы «)» и последующего внедренного_оператора.

Если существует более одной возможной подстановки нетерминального символа, варианты перечисляются в отдельных строках. Например, порождение:

список_операторов: оператор список_операторов оператор

определяет список_операторов как состоящий или из оператора, или из списка_операторов с последующим оператором. Иначе говоря, это определение является рекурсивным и указывает, что список операторов состоит из одного или более операторов.

Подстрочный суффикс «необязательно» используется для указания необязательного символа. Порождение:

блок: { список_операторовнеобязательно }

является краткой записью для:

блок: { } { список_операторов }

и определяет блок как состоящий из необязательного списка_операторов, заключенного в лексемы «{» и «}».

Варианты обычно перечисляются в отдельных строках, но если вариантов много, фраза «one of» («одно из») может предшествовать списку подстановок, заданных в одной строке. Это просто краткая запись вместо перечисления каждого из вариантов отдельной строкой. Например, порождение:

суффикс_действительного_числа: один из следующих: F f D d M m

является краткой записью для:

суффикс_действительного_типа: F f D d M m

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]