Введение

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

В информатике синтаксис компьютерного языка — это набор правил, определяющих допустимые комбинации символов, которые рассматриваются как правильно сформированные операторы или выражения в этом языке. Это применимо как к языкам программирования, где документ представляет собой исходный код, так и к языкам разметки, где документ представляет собой данные. Синтаксис языка определяет его поверхностную структуру. Текстовые компьютерные языки основаны на последовательностях символов, а визуальные языки программирования — на пространственном расположении и связях между символами (которые могут быть текстовыми или графическими). Документы, имеющие синтаксические ошибки, считаются синтаксически недействительными. При разработке синтаксиса языка разработчик может начать с записи примеров как допустимых, так и недопустимых строк, прежде чем пытаться вывести общие правила из этих примеров. Таким образом, синтаксис относится к форме кода и противопоставляется семантике — его значению. При обработке компьютерных языков семантический анализ обычно следует за синтаксическим анализом; однако в некоторых случаях семантический анализ необходим для полного синтаксического анализа, и они выполняются совместно или параллельно. В компиляторе синтаксический анализ составляет часть фронтенда, а семантический анализ — часть бэкенда (и промежуточного звена, если этот этап выделен).

Определение синтаксиса

Синтаксис текстовых языков программирования обычно определяется с использованием комбинации регулярных выражений (для лексической структуры) и формы Бэкуса — Наура (метаязыка для грамматической структуры) для индуктивного определения синтаксических категорий (нетерминальных) и терминальных символов. Хотя общий синтаксис чувствителен к контексту (из-за объявлений переменных и вложенных областей видимости), следовательно, относится к типу 1. Однако существуют исключения, и для некоторых языков грамматика относится к типу 0 (полностью Тьюринг-полная). В некоторых языках, таких как Perl и Lisp, спецификация (или реализация) языка допускает конструкции, выполняемые на этапе разбора. Более того, эти языки предоставляют конструкции, позволяющие программисту изменять поведение парсера. Эта комбинация фактически стирает грань между разбором и выполнением, делая синтаксический анализ неразрешимой задачей в этих языках, что означает, что этап разбора может не завершиться. Например, в Perl можно выполнять код во время разбора с помощью оператора BEGIN, а прототипы функций Perl могут изменять синтаксическую интерпретацию и, возможно, даже синтаксическую корректность оставшегося кода. В разговорной речи это называют «только Perl может разбирать Perl» (потому что код должен выполняться во время разбора и может изменять грамматику) или, более строго, «даже Perl не может разбирать Perl» (потому что задача неразрешима). Аналогично, макросы Lisp, вводимые синтаксисом `defmacro`, также выполняются во время разбора, что означает, что компилятор Lisp должен иметь в своем распоряжении полную среду выполнения Lisp. В отличие от этого, макросы C — это просто замена строк и не требуют выполнения кода.