Ремонт Стены Уход

Задать поведение робота с использованием формальной грамматики. Формальная грамматика

Л А Б О Р А Т О Р Н А Я Р А Б О Т А №1

Cоздание формальной грамматики и построение

Цель работы – изучение структуры языка программирования и запись ее в формальном виде; построение выводов на основе полученной грамматики для проверки ее правильности.

    ОСНОВНЫЕ СВЕДЕНИЯ

Создание грамматики языка

Языки программирования, используемые в настоящее время для решения задач на ЭВМ, значительно отличаются друг от друга своей структурой и средствами описания алгоритмов. Различны также и методы отладки и выполнения программ, написанных на этих языках.

Каковы же основные принципы проектирования и разработки новых языков программирования? Каким требованиям должен удовлетворять язык, рассчитанный на широкое использование при решении задач на ЭВМ? В первую очередь, язык должен быть удобен для программиста. В частности, он должен быть легок в изучении, а также иметь средства, позволяющие с минимальными затратами времени подготовить задачи к решению на ЭВМ. С другой стороны, должны учитываться характеристики работы ЭВМ с программой: память, необходимая для обработки программы, количество машинного времени для решения задачи и пр. К сожалению, эти требования являются в известной степени трудно совместимыми. То, что «удобно» для ЭВМ, оказывается не совсем удобным для программиста и наоборот. Но, т.к. любая задача содержит, как правило и те, и другие требования к используемому языку, то при его создании необходимо учитывать обе стороны работы с ним.

Подводя итог вышесказанному, можно сделать следующий вывод. Для создания языка программирования необходим такой математический и теоретический аппарат, который бы формально мог описать структуру любого языка, с одной стороны, а с другой – по возможности бы учел машинные требования к создаваемому языку.

Основным определением такого аппарата является определение формального языка. Всякий язык программирования можно определить как множество предложений – некоторое множество цепочек или конечных последовательностей элементарных единиц из некоторого непустого конечного множества символов, называемого словарем или алфавитом. При таком рассмотрении языка программирования задается только множество символов, которые можно использовать для записи программы, а также класс допустимых или синтаксически правильных программ и при этом не затрагивается вопрос зада­ния смысла каждой правильной программы. Чтобы отличать употребление слова «язык» в значении точно определенного множества цепочек от употребления этого слова в повседневной речи, множество цепочек иногда называют формальным языком .

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

Синтаксис – внешнее представление предложений языка.

Семантика – смысловое содержание предложений языка.

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

Формальная грамматика – абстрактное обобщение грамматики естественных языков – рассматривает строки (цепочки) символов.

Формальная грамматика есть четверка

G = { V , V , P , S },

где V- алфавит терминальных символов, т.е. символов, которые могут входить в левые части правил (соответствует набору слов и знаков языка);

V-алфавит нетерминальных символов (соответствует набору обобщающих понятий языка);

Р - набор порождающих правил вида

где  и  - цепочки терминальных и нетерминальных символов;

S - начальный символ грамматики (соответствует начальному понятию).

Грамматика G для любой цепочки    задает множество выводимых из нее цепочек, определяя их рекурсивно следующим образом: если  содержится в Р, то цепочка r =  непосредственно выводима из  (обозначается r), если  выводима из  и r , то r нетривиально выводима из  (  + r) ; если   + r или =r, то r выводима из  (=*r). Последо­вательность применения правил  1   2 ... r называется выводом цепочки , если  1 = S,  r =  .

Цепочка, выводимая из S, называется сентенциальной формой . Сентенциальная форма не содержащая нетерминальных символов, называется предложением . Множество предложений образует язык , порожденный грамматикой G (L(G)).

Формы Бэкуса-Науэ р а (БНФ)

Широко используемой формой записи правил грамматик являются формы Бэкуса-Науэра (БНФ).

Нормальные формы Бэкуса – язык, специально разработанный для описания синтаксиса других языков программирования. Основное назначение форм Бэкуса заключается в представлении в сжатом и компактном виде строго формальных и однозначных правил написания основных конструкций описываемого языка программирования.

Т.к. любое предложение языка можно рассматривать как цепочку основных символов этого языка, то в результате использования в определенном порядке форм Бэкуса, описывающих синтаксис языка, возможно построение любой правильной программы на этом языке.

Характерной особенностью языков программирования, так же как и естественных языков, является то, что в сложные синтаксические конструкции в качестве составных частей входят другие конструкции. Так, программа на языке TurboPascal является обычно блоком, который в свою очередь может включать в себя один или несколько внутренних блоков. Блок также является сложной конструкцией, включающей в себя описания, операторы; последние тоже имеют составные части и т.д. Таким образом, для того, чтобы написать программу, необходимо знать правила написания блоков и других конструкций, входящих в программу в качестве составных частей. Вторым классом объектов, используемых в формах Бэкуса, как раз и являются имена конструкций описываемого языка, или так называемые металингвистические переменные. Значение металингвистических переменных – это цепочки основных символов описываемого языка.

Каждая металингвистическая формула описывает правила построения некоторой конструкции языка и состоит из двух частей. В левой части находится металингвистическая переменная, обозначающая соответствующую конструкцию (нетерминальный (НТ) символ). Далее следует так называемая металингвистическая связка:: =, проставляемая вместо символа  и имеющая смысл глагола «быть». Она соединяет левую и правую части формулы. В правой части формулы указывается один или несколько вариантов построения конструкции, определенной в левой части. Каждый вариант представляет собой цепочку, состоящующую из металингвистических переменных и основных символов (терминальных(Т)). Для того, чтобы построить конструкцию, определяемую формулой, нужно выбрать некоторый вариант построения из правой части формулы и, используя соответствующие формулы вместо каждой металингвистической переменной некоторые цепочки основных символов. Варианты правой части формулы разделяются металингвистической связкой |, имеющей значение «или».

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

Пример формальной грамматики, записанной в формах Бэкуса-Науэра.

Опишем грамматику образования целых чисел. Каждое число может быть одноразрядным, т.е. состоять из одной цифры - 5, а может быть многоразрядным - 55, т.е. состоять более чем из одной цифры. Для того, чтобы образовать многоразрядное число, необходимо зациклить конструкцию на самою себя.

Грамматика G1 записи числа содержит следующие 13 правил:

(1) число::= чс

(2) чс::= чс цифра

(3) чс::= цифра

(4) цифра::= 0

(5) цифра::= 1

(6) цифра::= 2

(7) цифра::= 3

(8) цифра::= 4

(9) цифра::= 5

(10) цифра::= 6

(11) цифра::= 7

(12) цифра::= 8

(13) цифра::= 9

G1 = {{0,1,2,3,4,5,6,7,8,9}, {цифра, число, чс}, Р, число },

Где первое указанное множество – алфавит терминальных символов;

второе указанное множество – алфавит нетерминальных символов;

Р - 13 правил, указанных выше;

число - начальный символ грамматики.

Поскольку в формах Бэкуса-Науэра вариант “или” записывается знаком «|», то грамматику необходимо записать так:

число::= чс

чс::= чс цифра | цифра

цифра::= 0|1|2|3|4|5|6|7|8|9

Классификация Хомского

Грамматики можно классифицировать по виду их правил.

Существует четыре вида грамматик:

    грамматика с фразовой структурой (на ней построены естественные языки);

    контекстно-зависимые грамматики (вид каждой сентенциальной формы зависит от того, в каком контексте находится символ, заменяемый по определенному правилу цепочкой символов);

    контекстно-свободные (КС) грамматики, где каждое правило имеет вид:

   где  V, а  - цепочка в алфавите V V;

    автоматные грамматики, где каждое правило имеет вид:

  х В или

  х, где

х  V, {,B}  V.

Язык L называется автоматным, контекстно-свободным, контекстно-зависимым или с фразовой структурой, если существует определяющая его грамматика G соответствующего типа, для которой L = L(G).

Грамматика формальная

Формальная грамматика или просто грамматика в теории формальных языков - способ описания формального языка, то есть выделения некоторого подмножества из множества всех слов некоторого конечного алфавитa . Различают порождающие и распознающие (или аналитические ) грамматики - первые задают правила, с помощью которых можно построить любое слово языка, а вторые позволяют по данному слову определить, входит оно в язык или нет.

Термины

Порождающие грамматики

Словами языка, заданного грамматикой, являются все последовательности терминалов, выводимые (порождаемые) из начального нетерминала по правилам вывода.

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

Итак, грамматика определяется следующими характеристиками:

Вывод

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

Существование вывода для некоторого слова является критерием его принадлежности к языку, определяемому данной грамматикой.

Типы грамматик

Терминальный алфавит:

Σ ={"0","1","2","3","4","5","6","7","8","9","+","-","*","/","(",")"}.

Нетерминальный алфавит:

{ ФОРМУЛА, ЗНАК, ЧИСЛО, ЦИФРА }

1. ФОРМУЛА ФОРМУЛА ЗНАК ФОРМУЛА (формула есть две формулы, соединенные знаком) 2. ФОРМУЛА ЧИСЛО (формула есть число) 3. ФОРМУЛА (ФОРМУЛА) (формула есть формула в скобках) 4. ЗНАК + | - | * | / (знак есть плюс или минус или умножить или разделить) 5. ЧИСЛО ЦИФРА (число есть цифра) 6. ЧИСЛО ЧИСЛО ЦИФРА (число есть число и цифра) 7. ЦИФРА 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 (цифра есть 0 или 1 или... 9)

Начальный нетерминал:

ФОРМУЛА

Вывод :

Выведем формулу (12+5) с помощью перечисленных правил вывода. Для наглядности, стороны каждой замены показаны попарно, в каждой паре заменяемая часть подчеркнута.

ФОРМУЛА (ФОРМУЛА) (ФОРМУЛА ) (ФОРМУЛА ЗНАК ФОРМУЛА ) (ФОРМУЛА ЗНАК ФОРМУЛА) (ФОРМУЛА + ФОРМУЛА) (ФОРМУЛА + ФОРМУЛА ) (ФОРМУЛА + ЧИСЛО ) (ФОРМУЛА + ЧИСЛО ) (ФОРМУЛА + ЦИФРА ) (ФОРМУЛА + ЦИФРА ) (ФОРМУЛА + 5 ) (ФОРМУЛА + 5) (ЧИСЛО + 5) (ЧИСЛО + 5) (ЧИСЛО ЦИФРА + 5) (ЧИСЛО ЦИФРА + 5) (ЦИФРА ЦИФРА + 5) (ЦИФРА ЦИФРА + 5) (1 ЦИФРА + 5) (1 ЦИФРА + 5) (1 2 + 5)

Аналитические грамматики

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

Источники

  • Гладкий А. В. Формальные грамматики и языки. - М.: Наука, 1973.
  • Касьянов В.Н. Лекции по теории формальных языков, автоматов и сложности вычислений . - Новосибирск: НГУ. - 1995. - 112 с.
  • Хомский Н., Миллер Дж. Введение в формальный анализ естественных языков // Кибернетический сборник / Под ред. А.А.Ляпунова и О.Б.Лупанова. - М.: Мир, 1965.

Wikimedia Foundation . 2010 .

Смотреть что такое "Грамматика формальная" в других словарях:

    - (в лингвистике) логическая система, или исчисление, задающая некоторое множество («правильных») цепочек (= конечных последовательностей), построенных из символов заданного конечного набора, называемого «алфавитом» или «основным… … Большая советская энциклопедия

    грамматика формальная - В лингвистике: логическая система, или исчисление, задающая некоторое множество (правильных) цепочек (= конечных последовательностей), построенных из символов заданного конечного набора, называемого алфавитом или основным (терминальным)… … Словарь лингвистических терминов Т.В. Жеребило

    Грамматика формальная - В лингвистике: логическая система, или исчисление, задающая некоторое множество («правильных») цепочек (= конечных последовательностей), построенных из символов заданного конечного набора, называемого «алфавитом» или «основным (терминальным)… … Общее языкознание. Социолингвистика: Словарь-справочник

    Грамматика (от греч. γράμμα «запись»), как наука, есть раздел языкознания, изучающий грамматический строй языка, закономерности построения правильных осмысленных речевых отрезков на этом языке (словоформ, синтагм, предложений, текстов). Эти … Википедия

    Есть раздел языкознания, изучающий грамматический строй языка, закономерности построения правильных осмысленных речевых отрезков на этом языке (словоформ, синтагм, предложений, текстов). Эти закономерности грамматика формулирует в виде общих… … Википедия

    ФОРМАЛЬНАЯ ГРАММАТИКА. Грамматика, последовательно проводящая принцип изучения только форм языка и исключающая из своего состава все явления, не обозначенные формами языка. Ф. Г. противополагается т. н. логической (название неточное) грамматике,… … Литературная энциклопедия

    Генеративная лингвистика … Википедия

    У этого термина существуют и другие значения, см. Грамматика (значения). Грамматика (др. греч. γραμματική от γράμμα «буква») как наука является разделом языкознания, который изучает грамматический строй языка, закономерности построения… … Википедия

    См. грамматика формальная (в статье грамматика) … Словарь лингвистических терминов

Можно выделить четыре научных направления, связанных с четырьмя постановками различных задач, которые поначалу развивались самостоятельно и, казалось, были мало связаны между собой.

Первое из этих направлений связано с созданием основ формальной или математической лингвистики. Возникнув первоначально в связи с формальным изучением структуры литературного языка, математическая лингвистика начала особенно быстро развиваться, когда были сформулированы, например, такие вопросы машинного перевода:

Всякая ли фраза может быть переведена с одного языка на другой при заданном наборе правил и заданном объеме машинной памяти;

Как описать множество текстов, доступных для перевода в данных условиях? и.т.д.

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

Появление трансляторов сделало проблему перевода центральной в построении общей теории вычислительных систем.

Совершенно независимо развивалось направление науки, связанное с построением формальных моделей динамических систем. Типичным примером такого рода является модель «конечный автомат». Охватывая многие процессы, заданные на конечных множествах и развивающиеся в счетном времени, конечные автоматы оказались вместе с тем настолько узкой моделью, что для них удалось создать продуктивную теорию.

Однако, как только в эту модель вводилась бесконечность где-либо кроме шкалы времени, это немедленно приводило к слишком общему классу систем, эквивалентному столь широкому понятию как произвольный алгоритм. Это породило многочисленные попытки построить промежуточные модели динамических систем, более широкие, чем конечный автомат, но более узкие, чем машина Тьюринга.

Независимо и параллельно развивалась общая теория алгоритмов как ветвь современной математики. Была установлена эквивалентность понятий «нормальный алгоритм Маркова», «общерекурсивная функция» и «машина Тьюринга», а тезис Чёрча связал эти три понятия с интуитивным представлением об алгоритме.

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

Эквивалентность понятий «алгоритм» и «машина Тьюринга» сделало естественным предположение о том, что поиски классификации алгоритмов окажутся связанными с поисками промежуточных моделей между моделями конечного автомата и машиной Тьюринга.

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

Теория формальных языков и грамматик является основным разделом математической лингвистики – специфической математической дисциплины, ориентированной на изучение структуры естественных и искусственных языков.

Эта теория возникла в 50-е годы в работах американского лингвиста

Н. Хомского. По характеру используемого математического аппарата теория формальных грамматик и языков близка к теории алгоритмов и к теории автоматов.

Дадим некоторые определения.

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

Эти цепочки можно интерпретировать как языковые объекты разных уровней: словоформы, словосочетания, предложения.

Словоформа или просто слово – это последовательность (цепочка) морфем.

Морфема – это мельчайшая грамматически значимая часть слова.

Например, слово «ведший» состоит из морфем вед+ ш+ий (корень, суффикс, окончание).

Словосочетание или предложение – это цепочка словоформ.

Грамматика языка – это конечное множество правил, определяющих этот язык.

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

Синтаксис языка – это правила построения предложений в языке.

Семантика языка – толкование этих правил, правила использования синтаксиса.

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

Первым и основным требованием к грамматике является следующее:

она должна приписывать каждому предложению языка его структурное описание , то есть некоторые указания о том, из каких элементов построено предложение, каков их порядок, расположение и т. п.

Структурное описание будет тогда и только тогда однозначно, когда в языке через грамматику однозначно определены его синтаксические единицы и иерархическая взаимосвязь между ними.

Вторым требованием к грамматике является ее конечность .

Если допустить грамматики с неопределенным множеством правил, то сама проблема построения грамматик снимется как неразрешимая.

Классификация грамматик может быть представлена в следующем виде:

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

Между обычными и формальными грамматиками имеется существенное различие. В формальных грамматиках все утверждения формулируются в терминах небольшого числа чётко определенных символов и операций.

Это делает формальные грамматики сравнительно простыми с точки зрения их логического строения и облегчает изучение их свойств Однако формальные грамматики оказываются весьма громоздкими для описания естественных языков и поэтому предназначаются исключительно для теоретического исследования наиболее общих свойств языка.

распознающей , если для любой рассматриваемой цепочки,она умеет решить, является эта цепочка правильной или нет, и в случае положительного ответа дать указания о строении этой цепочки.

Формальная грамматика называется порождающей , если с ее помощью можно построить правильную цепочку, давая при этом указания о ее строении, и нельзя построить ни одной неправильной цепочки.

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

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

,

где - конечное множество символов, называемых терминальным

или основным словарем G.

Набор исходных элементов, из которых строятся цепочки или словарь основных слов, из которых строятся предложения.

Конечное непустое множество символов, называемых нетерминальным (вспомогательным) словарем G.

Нетерминальный словарь – набор символов, которые обозначают классы или цепочки исходных элементов, или словарь синтаксических типов.

Элементы и называются соответственно нетерминальными и терминальными символами.

- словарь грамматики G.

Произвольную конечную последовательность элементов будем называть цепочкой в словаре .

Пустая цепочка обозначается , т.о. . Число членов этой цепочки назовём ее длиной и будем обозначать .

Цепочки символов словаря получаются с помощью операции конкатенации
Например, . Символ может опускаться там, где не возникает неоднозначности.

Операция конкатенации ассоциативна, но не коммутативна.
эквивалентно .

S – начальный символ грамматики .

Это выделенный нетерминальный символ, обозначающий класс тех языковых объектов, для описания которых предназначается данная грамматика. Иногда в литературе S называют аксиомой или целью грамматики,

P – правила грамматики или конечное множество цепочек вида j à y, где j и y - слова в словаре V и цепочка j cодержит по крайней мере один символ из словаря Vн.

Конечое двуместное отношение à интерпретируется как “заменить j на y”.

Это отношение несимметрично и нерефлексивно.

Цепочка вида j à y называется правилами грамматики или правилами подстановки, а множество P – схемой грамматики .

Если задана грамматика , то будем говорить:

Цепочка w’ получается непосредственно из цепочки w применением правила j à y, если w=x1jx2 , w"=x1jx2 и {j à y}ÎP.

Последовательность цепочки j=j0, j1, j2 … , jn = y (n³1) ,

где 0 £ i £ n и j - есть вывод цепо чки y, если для каждого i ji+1 следует из ji .

Наличие j - вывода цепочки y будем обозначать: j => y.

Количество примененных правил в таком выводе называется его длиной . Длина вывода равна числу цепочки в нем, не считая начального символа.

Цепочка y выводится из цепочки j, если она получается из j примененных некоторых правил грамматики G .

Вывод цепочки y считается законченным , если не следует цепочка, которая следует из j.

Цепочка, состоящая только из терминальных символов, называется терминальной цепочкой .

Множество цепочек, выводимых в грамматике G, называется языком, порожденным этой грамматикой, и обозначается L(G).

Язык L(G) называется терминальным, если L-множество терминальных цепочек грамматики G.

Условимся:

Первыми строчными латинскими буквами a, b, c, … обозначать элементы терминального словаря Vт,

Прописными латинскими буквами A, B, C, … - элементы нетерминального словаря Vн,

Строчными греческими буквами a, b, … - элементы общего словаря V.

Предложения, составные из этих предложений будем обозначать последними буквами этих алфавитов, т. е. x1 , y1 , … - предложения составляемые из элементов Vт, X, Y, … - предложения, составляемые из элементов Vн, w, j, y , … - предложения составляемые из элементов общего словаря V.

Если к обозначению какого-либо множества добавить сверху символ *, например V*, то это означает что имеется в виду множество всех цепочек, которые могут быть получены из символов множества V.

Рассмотрим пример:

G=(Vт, Vн,P,S), где Vт={a, b}; Vн={A,B,C}; S=C; P={Càab, CàaCb}.

Пусть w=aCb, w"=aaCbb. Цепочка w" непосредственно выводится из w применением одного правила.

j-вывод: aCb, aaCbb, aaaCbbb, aaaabbbb (терминальная).

Длина вывода = 3.

Из примера видно, что порождающая грамматика не является алгоритмом.

Правила подстановки грамматики – это не последовательность предписаний, а совокупность разрешений.

Это означает следующее:

Правило j à y понимается как “ j может быть заменено на y”, а не “должно быть заменено”;

Порядок применения правил произволен, а в алгоритме был бы задан точный порядок.

Две грамматики G1 и G2 называются слабо эквивалентными , если они порождают один и то же язык L(G1)= L(G2), то есть совпадает множество порождаемых ими фраз.

Две грамматики называются сильно эквивалентными , если они не только порождают одни и те же цепочки, но и приписывают одинаковым цепочкам одинаковые описания структуры.

Основным объектом применения таких формальных грамматик являются не произвольные грамматики, а грамматики некоторых специальных типов.

Выделение этих типов производится по виду правил.

В теории Хомского выделяются четыре типа языков , порожденных четырьмя основными типами грамматик .

Грамматика называется грамматикой типа 0 в тех случаях, когда не накладывается никаких ограничений на правила j à y, где j и y могут быть любыми цепочками из словаря V.

Грамматика называется грамматикой типа 1 , если в системе Р правила j à y удовлетворяют условию j = j1Аj2 y = j1wj2,

j, y, w - цепочки из словаря V.

Таким образом, нетерминальный символ А переходит в непустую цепочку w в контексте j1 и j2 (j1 и j2 могут быть пустыми цепочками).

Грамматики типа 1 называют контекстными .

Грамматика называется грамматикой типа 2 – бесконтекстной , если в системе правил Р допустимы лишь правила вида:

где А – нетерминальный символ,

w - непустая цепочка из V.

Грамматика называется грамматикой типа 3 , когда допустимы лишь правила вида:

где w = аВ либо w = а.

Веденные классы могут быть разбиты на подклассы, но об этом немного позже

При создании формальных языков необходимо выбрать множество базовых знаков для формирования лексем, указать множество синтаксических правил написания выражений и предложений, согласовать множество семантических правил для интерпретации их значений. Подобно естественным языкам, грамматики формальных языков организованы в виде иерархии синтаксических конструкций, формирующих лексемы и последовательности лексем - выражения и предложения. Элементы нижнего уровня образованы знаками базового набора и формируют слова или лексемы формального языка. Элементы следующих уровней, образованные цепочками лексем и/или синтаксических переменных, формируют выражения формального языка. Элементы самого верхнего уровня, образованные цепочками выражений, формируют предложение. Так как языки программирования являются формальными языками, то все последующие обсуждения будем сопровождать примерами на этих языках.

Множество базовых знаков, используемых в языках программирования, опирается на 26 строчных и прописных букв латинского алфавита, на 10 арабских цифр и на 26 специальных символов, имеющих фиксированное значение (знаки препинания, арифметических действий, сравнения и т.п.).

Множество синтаксических правил, по которым строят синтаксически правильные выражения и предложения программы, определяет содержание грамматики языка программирования.

Для формирования модели грамматики обозначим элементарные лексические единицы языка строчными буквами латинского алфавита. Знаки этого множества называют терминальными (от лат. terminus - предел,конец). Множество терминальных символов обозначим знаком V T . Это множество называют также словарем или лексикой языка. Множество V T - счетно, но не конечно, т.к. всегда можно добавить новую лексему для какой-либо синтаксической переменной.

Элементарными лексическими единицами большинства языков программирования являются:

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

<служебные слова>: := AND ½ ARRAY ½ BEGIN ½ CASE ½ CONS ½ DIV ½ DOWNTO ½ DO ½ ELSЕ ½ END ½ FILE ½ FOR ½ FUNCTION ½ GOTO ½ IF ½ IN ½ LABEL ½ MOD ½ NIL ½ NOT ½ OF ½ OR ½ PACKED ½ PROCEDURE ½ PROGRAM ½ RECORD ½ REPEAT ½ SET½ THEN ½ TO ½ TYPE ½ UNTIL ½ VAR ½ WHILE ½ WITH ;

<специальные символы>: := + ½ - ½ * ½ / ½ = ½ < ½ > ½ <= ½ >= ½ [ ½ ] ½ (½) ½ _ ½:= ½ " ½ " ½ . ½ , ½: ½ ; ½ ¹ ½# ½$ ;



десятичные числа без знака.

В выражениях и предложениях формального языка, cодержащих лексемы и синтаксические переменные, лексемы всегда заключены в кавычки. Например, "BEGIN", "NOT", AND" и др.

Для обозначения синтаксических переменных введем прописные буквы латинского алфавита. Знаки этого множества называют нетерминальными. Обозначим множество нетерминальных символов знаком V N .

Множество V N - счетно и конечно.

Элементарными синтаксическими переменными для языка программирования являются:

<блок > :: = <блок-операторов>½<блок-процедуры>½<блок-функции>½...;

<заголовок > ::= <заголовок-программы>½<заголовок-процедуры>½

<заголовок-функции>½...;

<идентификатор > ::= <идентификатор-программы>½<идентификатор-

переменной>½...;

<оператор > ::= <оператор-присваивания>½<оператор-ЕСЛИ>...;

<операция > ::= <операция-сложения>½<операция-умножения>

½<операция-отношения>½...;

и другие синтаксические переменные.

В языке Паскаль всего около 240 синтаксических переменных.

В выражениях и предложениях формального языка, содержащих синтаксические переменные, их заключают в угловые скобки. Например, "PROGRAM" <идентификатор-программы> ";" "BEGIN" <блок-операторов> "END" и др.

Объединение символов двух множеств V T и V N представляет множество символов формального языка, т.е.

V = V T ÈV N . (2)

Цепочки символов формального языка могут содержать различное количество терминальных и/или нетерминальных символов. Поэтому множество правильных цепочек может быть записано так:

Если каждый элемент множества V* обозначить строчной буквой греческого алфавита, то множество V* можно описать перечислением его элементов:

V* = { a ; b ; g ;... } (4)

Например,

a:= "PROGRAM"<идентификатор-программы>";"<блок>".";

b:= "CONST" <определение-константы> "; " ;

g:= "(" <идентификатор> { " , " <идентификатор> } ") " ;

где знак ":=" означает: "...присвоить значение...". Цепочка a ÎV* содержит пять символов множества V, цепочка b ÎV* - три символа и цепочка g Î V* - не менее трех символов, т.к. в языках программирования знак "{ .. }" означает многократное повторение выражения, заключенного в фигурные скобки, включая нуль раз.

Конструкция программы на любом языке программирования состоит, как правило, из двух частей: заголовка - <заголовок-программы> и тела программы - <блок>. В заголовке программы, начинающемся служебным словом "PROGRAM", ей присваивается имя (идентификатор), вслед за которым в круглых скобках задается перечень идентификаторов тех файлов, через которые программа взаимодействует с внешним миром. В теле программы должны следовать в определенном порядке разделы меток, констант, типов, переменных, процедур, функций и операторов. Так как разделы, предшествующие разделу операторов, носят описательный характер, то каждый из них может быть пустой цепочкой, а раздел операторов является основным и должен присутствовать в любой программе. Поэтому в последующих объяснениях <блок> содержит только описание операторов, т.е. исполняет функции <блока-операторов>.

Синтаксические правила формальной грамматики можно рассматривать как элементарные операторы подстановки, которые, будучи примененными в определенной последовательности к исходной цепочке терминальных и/или нетерминальных символов, порождают правильные цепочки этих же символов. Поэтому эти правила часто называют правилами подстановки или продукциями.

Продукцию или правило подстановки записывают так:

где a - левая часть правила,

b - правая часть правила.

Если правил несколько,то их необходимо индексировать:

p i: a i::= b i , где i = 1;2;3;... (6)

Левая часть правила не может быть пустой цепочкой и всегда содержит один или несколько нетерминальных символов, т.е.

a ÎV* \ e, где e - пустая цепочка. (7)

Правая часть правила может содержать пустые цепочки и не содержать нетерминальных символов, т.е.

b ÎV * или b ÎV*\ V N . (8)

Пример 3 . Пусть даны несколько правил языка программирования Паскаль:

<программа> ::= <заголовок-программы> " ; "<блок>" . ";

<заголовок-программы> ::= "PROGRAM"<идентификатор-программы>;

<блок> ::= <раздел-операторов> | ...;

<раздел-операторов> ::= "BEGIN" <оператор> " END" ;

<оператор> ::= <оператор-присваивания> |...;

<оператор-присваивания> ::= <переменная> " := " <выражение>;

<выражение> ::= <терм> <операция-сложения> <терм> ;

<терм> ::= <множитель> <операция-умножения> <множитель>;

<множитель> ::= <переменная> ;

<переменная> ::= <идентификатор-переменной> ;

<операция-сложения> ::= " + " | " - " | "OR";

<операция-умножения> ::= " x " | " / " | "DIV" | "MOD" |"AND".

Синтаксической переменной <идентификатор-программы> присвоим какое-либо значение (например, "ALGEBRA"), т.е.

<идентификатор-программы>::= "ALGEBRA".

Cинтаксической переменной <идентификатор-переменной> также присвоим какое-либо значение, начинающееся с буквы (например," i "), т.е.

<идентификатор-переменной> ::= " i ".

Последовательность использования правил подстановки в процессе формирования цепочки терминальных и/или нетерминальных символов называют выводом. Поэтому эти же правила часто называют правилами вывода. Для указания процесса вывода используют знак "=>".

Выводы бывают левосторонние и правосторонние. При левостороннем выводе продукцию применяют к самому левому нетерминальному символу цепочки, а при правостороннем - к самому правому.

Пример 4 . а) Для начального символа <программа> (пример 3) исполнить левосторонний вывод:

<программа> => <заголовок-программы> ";" <блок> "." => "PROGRAM" <идентификатор-программы> ";" <блок> "." => "PROGRAM" "ALGEBRA" ";" <блок> "." => "PROGRAM" "ALGEBRA" ";" <раздел-операторов> "." => <оператор> "END" "." => "PROGRAM" "ALGEBRA" ";" "BEGIN" <оператор-присваивания> "END" "." => ."PROGRAM" "ALGEBRA" ";" "BEGIN" <переменная> ":= " <выражение> "END" "." => "PROGRAM" "ALGEBRA" ";" "BEGIN" <идентификатор-переменной> ":=" <выражение> "END" "." => "PROGRAM" "ALGEBRA" ";" "BEGIN" " i " ":=" <выражение> "END" "." => ..

b) Для начального символа <программа> (пример 3) исполнить правосторонний вывод:

<программа> => <заголовок-программы> ";" <блок> "." => <заголовок-программы> ";" <раздел-операторов> "." => <заголовок-программы> ";" "BEGIN" <оператор> "END" "." => <заголовок-программы> ";" "BEGIN" <оператор-присваивания> "END" "." => <заголовок-программы> ";" "BEGIN" <переменная> ":=" <выражение> "END" "." => ...

Cинтаксической переменной <выражение> может быть любое арифметическое, алгебраическое или логическое выражение. Так как содержание этого выражения не определено, то оба вывода остановились на этой синтаксической переменной. Остальные члены предложения <программа> представлены элементарными лексическими единицами текста программы.,

Пример 5 . Для cинтаксической переменной <выражение> (пример 3) выполнить левосторонний вывод:

<выражение> => <терм><операция-сложения><терм>=> <множитель> <операция-умножения><множитель><операция-сложения><терм> => <переменная><операция-умножения><множитель><операция-сложения> <терм>=> <идентификатор-переменной><операция-умножения> <множитель> <операция-сложения><терм> => "i" <операция-умножения> <множитель><операция-сложения><терм> => "i" "x" <множитель><операция-сложения><терм> => "i" "x" <переменная><операция-сложения><терм> => "i" "x" <идентификатор-переменной><операция-сложения><терм> => "i" "x" "i" <операция-сложения><терм> => "i" "x" "i" "+" <терм> => "i" "x" "i" "+" <множитель><операция-умножения><множитель> => "i" "x" "i" "+" <переменная> <операция-умножения><множитель> => "i" "x" "i" "+" <идентификатор-переменной><операция-умножения> <множитель> => "i" "x" "i" "+" "i" <операция-умножения> <множитель> => "i" "x" "i" "+" "i" "x" <множитель> "i" "x" "i" "+" "i" "x" <переменная> => "i" "x" "i" "+" "i" "x"<идентификатор-переменной> => "i" "x" "i" "+" "i" "x" "I".

Имя начальной синтаксической переменной языка, для которой дано множество правил вывода называют начальным символом и обозначают буквой J. Роль начального символа может исполнять любая синтаксическая переменная. Для текста программы начальной синтаксической переменной является <программа>. Для части текста программы - выражения - начальной синтаксической переменной является <выражение>.

Итак, модель формальной грамматики может быть описана совокупностью четырех основных компонент:

G = á V T ; V N ;J ; P ñ , (9)

где V T = { a;b;c;... } - терминальные символы;

V N = { A;B;C;...} - нетерминальные символы;

JÎ Vn - начальный символ;

P = { p i |i = 1; 2; 3; ... } - синтаксические правила.

Множество правильных цепочек терминальных символов представляет выражения и предложения формального языка данной формальной грамматики L(G) :

L (G) = { a , b , g ,...½ a , b , g Î V *\ VN }. (10)

Текст программы, ограниченный разделителем ".", называют предложением, а часть текста, ограниченную разделителем ";" , - выражением.

Если для начального символа дана цепочка терминальных и/или нетерминальных символов, то формальная грамматика позволяет установить, является ли эта цепочка правильной, и, в случае положительного ответа, выяснить структуру этой цепочки. Такая грамматика называется распознающей. Например, синтаксический анализатор компилятора проверяет текст исходной программы и, в случае положительного ответа, транслирует его на язык вычислительной машины. Для такого анализатора должны быть разработаны правила разбора текста программы.

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

1. Самостоятельные части речи:

  • существительные (см. морфологические нормы сущ.);
  • глаголы:
    • причастия;
    • деепричастия;
  • прилагательные;
  • числительные;
  • местоимения;
  • наречия;

2. Служебные части речи:

  • предлоги;
  • союзы;
  • частицы;

3. Междометия.

Ни в одну из классификаций (по морфологической системе) русского языка не попадают:

  • слова да и нет, в случае, если они выступают в роли самостоятельного предложения.
  • вводные слова: итак, кстати, итого, в качестве отдельного предложения, а так же ряд других слов.

Морфологический разбор существительного

  • начальная форма в именительном падеже, единственном числе (за исключением существительных, употребляемых только во множественном числе: ножницы и т.п.);
  • собственное или нарицательное;
  • одушевленное или неодушевленное;
  • род (м,ж, ср.);
  • число (ед., мн.);
  • склонение;
  • падеж;
  • синтаксическая роль в предложении.

План морфологического разбора существительного

"Малыш пьет молоко."

Малыш (отвечает на вопрос кто?) – имя существительное;

Морфологический разбор слова «молоко» (отвечает на вопрос кого? Что?).

  • начальная форма – молоко;
  • постоянная морфологическая характеристика слова: среднего рода, неодушевленное, вещественное, нарицательное, II -е склонение;
  • изменяемые признаки морфологические: винительный падеж, единственное число;
  • в предложении прямое дополнение.

Приводим ещё один образец, как сделать морфологический разбор существительного, на основе литературного источника:

"Две дамы подбежали к Лужину и помогли ему встать. Он ладонью стал сбивать пыль с пальто. (пример из: «Защита Лужина», Владимир Набоков)."

Дамы (кто?) - имя существительное;

  • начальная форма - дама;
  • постоянные морфологические признаки: нарицательное, одушевленное, конкретное, женского рода, I склонения;
  • непостоянная морфологическая характеристика существительного: единственное число, родительный падеж;
  • синтаксическая роль: часть подлежащего.

Лужину (кому?) - имя существительное;

  • начальная форма - Лужин;
  • верная морфологическая характеристика слова: имя собственное, одушевленное, конкретное, мужского рода, смешанного склонения;
  • непостоянные морфологические признаки существительного: единственное число, дательного падежа;

Ладонью (чем?) - имя существительное;

  • начальная форма - ладонь;
  • постоянные морфологические признаки: женского рода, неодушевлённое, нарицательное, конкретное, I склонения;
  • непостоянные морфо. признаки: единственного числа, творительного падежа;
  • синтаксическая роль в контексте: дополнение.

Пыль (что?) - имя существительное;

  • начальная форма - пыль;
  • основные морфологические признаки: нарицательное, вещественное, женского рода, единственного числа, одушевленное не охарактеризовано, III склонения (существительное с нулевым окончанием);
  • непостоянная морфологическая характеристика слова: винительный падеж;
  • синтаксическая роль: дополнение.

(с) Пальто (С чего?) - существительное;

  • начальная форма - пальто;
  • постоянная правильная морфологическая характеристика слова: неодушевленное, нарицательное, конкретное, среднего рода, несклоняемое;
  • морфологические признаки непостоянные: число по контексту невозможно определить, родительного падежа;
  • синтаксическая роль как члена предложения: дополнение.

Морфологический разбор прилагательного

Имя прилагательное - это знаменательная часть речи. Отвечает на вопросы Какой? Какое? Какая? Какие? и характеризует признаки или качества предмета. Таблица морфологических признаков имени прилагательного:

  • начальная форма в именительном падеже, единственного числа, мужского рода;
  • постоянные морфологические признаки прилагательных:
    • разряд, согласно значению:
      • - качественное (теплый, молчаливый);
      • - относительное (вчерашний, читальный);
      • - притяжательное (заячий, мамин);
    • степень сравнения (для качественных, у которых этот признак постоянный);
    • полная / краткая форма (для качественных, у которых этот признак постоянный);
  • непостоянные морфологические признаки прилагательного:
    • качественные прилагательные изменяются по степени сравнения (в сравнительных степенях простая форма, в превосходных - сложная): красивый-красивее-самый красивый;
    • полная или краткая форма (только качественные прилагательные);
    • признак рода (только в единственном числе);
    • число (согласуется с существительным);
    • падеж (согласуется с существительным);
  • синтаксическая роль в предложении: имя прилагательное бывает определением или частью составного именного сказуемого.

План морфологического разбора прилагательного

Пример предложения:

Полная луна взошла над городом.

Полная (какая?) – имя прилагательное;

  • начальная форма – полный;
  • постоянные морфологические признаки имени прилагательного: качественное, полная форма;
  • непостоянная морфологическая характеристика: в положительной (нулевой) степени сравнения, женский род (согласуется с существительным), именительный падеж;
  • по синтаксическому анализу - второстепенный член предложения, выполняет роль определения.

Вот еще целый литературный отрывок и морфологический разбор имени прилагательного, на примерах:

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

Прекрасна (какова?) - имя прилагательное;

  • начальная форма - прекрасен (в данном значении);
  • постоянные морфологические нормы: качественное, краткое;
  • непостоянные признаки: положительная степень сравнения, единственного числа, женского рода;

Стройная (какая?) - имя прилагательное;

  • начальная форма - стройный;
  • постоянные морфологические признаки: качественное, полное;
  • непостоянная морфологическая характеристика слова: полное, положительная степень сравнения, единственное число, женский род, именительный падеж;
  • синтаксическая роль в предложении: часть сказуемого.

Тоненькая (какая?) - имя прилагательное;

  • начальная форма - тоненький;
  • морфологические постоянные признаки: качественное, полное;
  • непостоянная морфологическая характеристика прилагательного: положительная степень сравнения, единственное число, женского рода, именительного падежа;
  • синтаксическая роль: часть сказуемого.

Голубые (какие?) - имя прилагательное;

  • начальная форма - голубой;
  • таблица постоянных морфологических признаков имени прилагательного: качественное;
  • непостоянные морфологические характеристики: полное, положительная степень сравнения, множественное число, именительного падежа;
  • синтаксическая роль: определение.

Изумительных (каких?) - имя прилагательное;

  • начальная форма - изумительный;
  • постоянные признаки по морфологии: относительное, выразительное;
  • непостоянные морфологические признаки: множественное число, родительного падежа;
  • синтаксическая роль в предложении: часть обстоятельства.

Морфологические признаки глагола

Согласно морфологии русского языка, глагол - это самостоятельная часть речи. Он может обозначать действие (гулять), свойство (хромать), отношение (равняться), состояние (радоваться), признак (белеться, красоваться) предмета. Глаголы отвечают на вопрос что делать? что сделать? что делает? что делал? или что будет делать? Разным группам глагольных словоформ присущи неоднородные морфологические характеристики и грамматические признаки.

Морфологические формы глаголов:

  • начальная форма глагола - инфинитив. Ее так же называют неопределенная или неизменяемая форма глагола. Непостоянные морфологические признаки отсутствуют;
  • спрягаемые (личные и безличные) формы;
  • неспрягаемые формы: причастные и деепричастные.

Морфологический разбор глагола

  • начальная форма - инфинитив;
  • постоянные морфологические признаки глагола:
    • переходность:
      • переходный (употребляется с существительными винительного падежа без предлога);
      • непереходный (не употребляется с существительным в винительном падеже без предлога);
    • возвратность:
      • возвратные (есть -ся, -сь);
      • невозвратные (нет -ся, -сь);
      • несовершенный (что делать?);
      • совершенный (что сделать?);
    • спряжение:
      • I спряжение (дела-ешь, дела-ет, дела-ем, дела-ете, дела-ют/ут);
      • II спряжение (сто-ишь, сто-ит, сто-им, сто-ите, сто-ят/ат);
      • разноспрягаемые глаголы (хотеть, бежать);
  • непостоянные морфологические признаки глагола:
    • наклонение:
      • изъявительное: что делал? что сделал? что делает? что сделает?;
      • условное: что делал бы? что сделал бы?;
      • повелительное: делай!;
    • время (в изъявительном наклонении: прошедшее/настоящее/будущее);
    • лицо (в настоящем/будущем времени, изъявительного и повелительного наклонения: 1 лицо: я/мы, 2 лицо: ты/вы, 3 лицо: он/они);
    • род (в прошедшем времени, единственного числа, изъявительного и условного наклонения);
    • число;
  • синтаксическая роль в предложении. Инфинитив может быть любым членом предложения:
    • сказуемым: Быть сегодня празднику;
    • подлежащим:Учиться всегда пригодится;
    • дополнением: Все гости просили ее станцевать;
    • определением: У него возникло непреодолимое желание поесть;
    • обстоятельством: Я вышел пройтись.

Морфологический разбор глагола пример

Чтобы понять схему, проведем письменный разбор морфологии глагола на примере предложения:

Вороне как-то Бог послал кусочек сыру... (басня, И. Крылов)

Послал (что сделал?) - часть речи глагол;

  • начальная форма - послать;
  • постоянные морфологические признаки: совершенный вид, переходный, 1-е спряжение;
  • непостоянная морфологическая характеристика глагола: изъявительное наклонение, прошедшего времени, мужского рода, единственного числа;

Следующий онлайн образец морфологического разбора глагола в предложении:

Какая тишина, прислушайтесь.

Прислушайтесь (что сделайте?) - глагол;

  • начальная форма - прислушаться;
  • морфологические постоянные признаки: совершенный вид, непереходный, возвратный, 1-го спряжения;
  • непостоянная морфологическая характеристика слова: повелительное наклонение, множественное число, 2-е лицо;
  • синтаксическая роль в предложении: сказуемое.

План морфологического разбора глагола онлайн бесплатно, на основе примера из целого абзаца:

Его нужно предостеречь.

Не надо, пусть знает в другой раз, как нарушать правила.

Что за правила?

Подождите, потом скажу. Вошел! («Золотой телёнок», И. Ильф)

Предостеречь (что сделать?) - глагол;

  • начальная форма - предостеречь;
  • морфологические признаки глагола постоянные: совершенный вид, переходный, невозвратный, 1-го спряжения;
  • непостоянная морфология части речи: инфинитив;
  • синтаксическая функция в предложении: составная часть сказуемого.

Пусть знает (что делает?) - часть речи глагол;

  • начальная форма - знать;
  • непостоянная морфология глагола: повелительное наклонение, единственного числа, 3-е лицо;
  • синтаксическая роль в предложении: сказуемое.

Нарушать (что делать?) - слово глагол;

  • начальная форма - нарушать;
  • постоянные морфологические признаки: несовершенный вид, невозвратный, переходный, 1-го спряжения;
  • непостоянные признаки глагола: инфинитив (начальная форма);
  • синтаксическая роль в контексте: часть сказуемого.

Подождите (что сделайте?) - часть речи глагол;

  • начальная форма - подождать;
  • постоянные морфологические признаки: совершенный вид, невозвратный, переходный, 1-го спряжения;
  • непостоянная морфологическая характеристика глагола: повелительное наклонение, множественного числа, 2-го лица;
  • синтаксическая роль в предложении: сказуемое.

Вошел (что сделал?) - глагол;

  • начальная форма - войти;
  • постоянные морфологические признаки: совершенный вид, невозвратный, непереходный, 1-го спряжения;
  • непостоянная морфологическая характеристика глагола: прошедшее время, изъявительное наклонение, единственного числа, мужского рода;
  • синтаксическая роль в предложении: сказуемое.