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

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Таблица соответствия регулярных выражений и автоматных грамматик)
(Дополнительные задания (5 баллов))
 
(не показано 37 промежуточных версий этого же участника)
Строка 1: Строка 1:
 
[[Страница_курса_%22Методы_построения_компиляторов%22| К основной странице курса]]
 
[[Страница_курса_%22Методы_построения_компиляторов%22| К основной странице курса]]
  
===Тема 2. Синтаксические диаграммы автоматных языков и реализация распознавателей на их основе===
+
====Введение====
====Эквивалентность регулярных выражений и автоматных грамматик====
+
Для описания лексем используются регулярные выражения.
*Автоматная грамматика порождает автоматный язык
+
 
*Регулярное выражение порождает регулярное множество
+
Регулярные выражения тесно связаны с автоматными грамматиками: по любой автоматной грамматике можно записать эквивалентное ей регулярное выражение и наоборот. Эквивалентность понимается в
*Автоматный язык является регулярным множеством и наоборот. Поэтому для любо автоматной грамматики можно записать эквивалентное регулярное выражение (языки, ими порождаемые, будут совпадать). Наоборот, для любого регулярного выражения можно построить эквивалентную автоматную грамматику.
+
том смысле что языки, ими порождаемые, будут совпадать.
*Автоматная грамматика легко переводится на язык синтаксических диаграмм.
+
 
 +
Автоматная грамматика легко переводится на язык синтаксических диаграмм.
  
 
====Основные обозначения в регулярных выражениях====
 
====Основные обозначения в регулярных выражениях====
 
Регулярное выражение над алфавитом Σ - это
 
Регулярное выражение над алфавитом Σ - это
# a - отдельный символ
+
# a - отдельный символ из алфавита Σ
 
# ε - пустая цепочка
 
# ε - пустая цепочка
 
# Если R и Q - регулярные выражения, то RQ - регулярное выражение, являющееся конкатенацией цепочек, порождаемых R и Q
 
# Если R и Q - регулярные выражения, то RQ - регулярное выражение, являющееся конкатенацией цепочек, порождаемых R и Q
Строка 18: Строка 19:
 
# Если R - регулярное выражение, то (R) - такое же регулярное выражение
 
# Если R - регулярное выражение, то (R) - такое же регулярное выражение
  
=====Примеры=====
+
=====Примеры регулярных выражений=====
 
Целое со знаком:  
 
Целое со знаком:  
 
  (+|-|)ц+
 
  (+|-|)ц+
Строка 32: Строка 33:
  
 
====Таблица соответствия регулярных выражений и автоматных грамматик====
 
====Таблица соответствия регулярных выражений и автоматных грамматик====
 +
Во всех фрагментах кода предполагается, что в начале первый символ уже считан в переменную ch. Предполагается также, что после работы участка алгоритма в переменную ch будет считан следующий символ для разбора следующей конструкции.
 
{| border="1" cellpadding = "10"
 
{| border="1" cellpadding = "10"
 
  | '''Фрагмент выражения''' || '''Участок синтаксической диаграммы'''|| '''Фрагмент кода'''
 
  | '''Фрагмент выражения''' || '''Участок синтаксической диаграммы'''|| '''Фрагмент кода'''
 
  |-  
 
  |-  
  | R || [[Изображение:R.png]] || <source lang="Pascal">if ch = R then NextCh else error;</source>
+
  | R || [[Изображение:R.png]] || <source lang="Pascal">if ch = R then  
 +
  NextCh  
 +
else error;</source>
 
  |-  
 
  |-  
 
  | ε ||  [[Изображение:eps.png]] ||  
 
  | ε ||  [[Изображение:eps.png]] ||  
 
  |-  
 
  |-  
  | RQ || [[Изображение:RandQ.png]] || if ch = R then NextCh else error; if ch = Q then NextCh else error;
+
  | R ! ε || [[Изображение:Roreps.png]] || <source lang="Pascal">if ch = R then  
 +
  NextCh;</source>
 
  |-  
 
  |-  
  | R ! Q || [[Изображение:RorQ.png]] || if ch in [R,Q] then NextCh else error;  
+
  | RQ || [[Изображение:RandQ.png]] || <source lang="Pascal">if ch = R then
 +
  NextCh
 +
else error;
 +
if ch = Q then  
 +
  NextCh  
 +
else error;</source>
 
  |-  
 
  |-  
  | R* || [[Изображение:Rstar.png]] ||   if ch = R then NextCh else error; while ch = R do NextCh;
+
  | R ! Q || [[Изображение:RorQ.png]] || <source lang="Pascal">if ch in [R,Q] then NextCh  
 +
  else error;</source>
 
  |-  
 
  |-  
  | R+ || [[Изображение:Rplus.png]] ||   
+
  | R+ || [[Изображение:Rstar.png]] ||  <source lang="Pascal">if ch = R then
 +
  NextCh
 +
else error;
 +
while ch = R do
 +
  NextCh;</source>
 +
|-
 +
| R* || [[Изображение:Rplus.png]] || <source lang="Pascal">while ch = R do
 +
  NextCh;</source>  
 
  |-  
 
  |-  
 
  | (R) ||  ||   
 
  | (R) ||  ||   
Строка 54: Строка 72:
 
[[Изображение:SyntNum.png|300px|Синтаксическая диаграмма целого со знаком]]
 
[[Изображение:SyntNum.png|300px|Синтаксическая диаграмма целого со знаком]]
  
=====Программа 2 распознавания целого со знаком по синтаксической диаграмме=====  
+
=====Программа распознавания целого со знаком по синтаксической диаграмме=====  
 +
 
 +
'''Правило.''' При разборе очередной конструкции первый символ уже должен быть считан с помощью NextCh.
 +
 
 
<source lang="Delphi">// Разбор целого со знаком с помощью синтаксических диаграмм
 
<source lang="Delphi">// Разбор целого со знаком с помощью синтаксических диаграмм
 
var  
 
var  
Строка 78: Строка 99:
 
     NextCh;
 
     NextCh;
 
   
 
   
   if ch in ['0'..'9'] then
+
   if char.IsDigit(ch) then
 
     NextCh
 
     NextCh
 
   else error;
 
   else error;
 
   
 
   
   while ch in ['0'..'9'] do
+
   while char.IsDigit(ch) do
 
     NextCh;
 
     NextCh;
 
   
 
   
Строка 91: Строка 112:
 
end.</source>
 
end.</source>
  
====Задания к теме 2 «Синтаксические диаграммы автоматных языков и реализация распознавателей на их основе»====
+
====Основные задания (5 баллов)====
# Реализовать программу 2
+
Реализовать программу на PascalABC.NET или C#.
# Реализовать в программе 2 семантические действия по накоплению в строке распознанного целого числа и преобразованию его в целое в конце разбора (при встрече завершающего символа)
+
 
# Составить синтаксическую диаграмму идентификатора. Реализовать по ней распознаватель.
+
Составить синтаксическую диаграмму, реализовать по ней распознаватель и выполнить указанные семантические действия для следующих лексем
# Составить синтаксическую диаграмму для целого со знаком, начинающегося не с цифры 0. Реализовать распознаватель. Оттестировать.
+
 
# Составить синтаксическую диаграмму для чередующихся букв и цифр. Реализовать распознаватель. Оттестировать.
+
# Реализовать в программе семантические действия по накоплению в строке распознанного целого числа и преобразованию его в целое в конце разбора (при встрече завершающего символа). Семантические действия следует добавлять перед каждым вызовом NextCh кроме первого. (1 балл)
# Составить синтаксическую диаграмму для списка букв, разделенных символом , или ;. Реализовать распознаватель. Оттестировать.
+
# Идентификатор. (1 балл)
# Составить синтаксическую диаграмму для списка цифр, разделенных одним или несколькими пробелами. Реализовать распознаватель. Оттестировать.
+
# Целое со знаком, начинающееся не с цифры 0.(1 балл)
# Составить синтаксическую диаграмму для выражения вида 1+2-3-4+5. Реализовать распознаватель. Оттестировать.
+
# Чередующиеся буквы и цифры, начинающиеся с буквы.(1 балл)
# Составить синтаксическую диаграмму для вещественного с десятичной точкой 123.45678. Реализовать распознаватель. Оттестировать.
+
# Список букв, разделенных символом , или ; В качестве семантического действия должно быть накопление списка букв в списке и вывод этого списка в конце программы.(1 балл)
# Составить синтаксическую диаграмму для выражения вида 1234*567, где вместо знака * может стоять знак операции +, -, /, div или mod. Реализовать распознаватель. Оттестировать.
+
 
# Составить синтаксическую диаграмму для выражения вида Id1.Id2.Id3 (количество точек между идентификаторами может быть произвольным). Реализовать распознаватель. Оттестировать.
+
====Дополнительные задания (5 баллов) ====
 +
Составить синтаксическую диаграмму, реализовать по ней распознаватель и выполнить указанные семантические действия для следующих лексем
 +
 
 +
# Список цифр, разделенных одним или несколькими пробелами. В качестве семантического действия должно быть накопление списка цифр в списке и вывод этого списка в конце программы (1 балл).
 +
# Лексема вида aa12c23dd1, в которой чередуются группы букв и цифр, в каждой группе не более 2 элементов. В качестве семантического действия необходимо накопить данную лексему в виде строки (1 балл).
 +
# Вещественное с десятичной точкой 123.45678 (1 балл).  
 +
# Лексема вида 'строка', внутри апострофов отсутствует символ ' (1 балл).
 +
# Лексема вида /*комментарий*/, внутри комментария не может встретиться последовательность символов */ (1 балл).
 +
 
 +
==== Дополнительные сложные задания ====
 +
# Лексема вида Id1.Id2.Id3 (количество идентификаторов может быть произвольным).

Текущая версия на 11:27, 4 декабря 2015

К основной странице курса

Введение

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

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

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

Основные обозначения в регулярных выражениях

Регулярное выражение над алфавитом Σ - это

  1. a - отдельный символ из алфавита Σ
  2. ε - пустая цепочка
  3. Если R и Q - регулярные выражения, то RQ - регулярное выражение, являющееся конкатенацией цепочек, порождаемых R и Q
  4. Если R и Q - регулярные выражения, то R | Q - регулярное выражение, являющееся цепочкой, порождаемой либо R, либо Q
  5. Если R - регулярное выражение, то R* - повторение R ноль и более раз
  6. Если R - регулярное выражение, то R+ - повторение R один и более раз. Очевидно, что R+ = RR*
  7. Если R - регулярное выражение, то (R) - такое же регулярное выражение
Примеры регулярных выражений

Целое со знаком:

(+|-|)ц+

Идентификатор:

б(б|ц)*

Альтернативные обозначения в регулярных выражениях

  • {R} = R*
  • [R] = (R | ε)

В этом случае * и + не используются

Таблица соответствия регулярных выражений и автоматных грамматик

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

Фрагмент выражения Участок синтаксической диаграммы Фрагмент кода
R R.png
if ch = R then 
  NextCh 
else error;
ε Eps.png
R ! ε Roreps.png
if ch = R then 
  NextCh;
RQ RandQ.png
if ch = R then 
  NextCh 
else error; 
if ch = Q then 
  NextCh 
else error;
R ! Q RorQ.png
if ch in [R,Q] then NextCh 
  else error;
R+ Rstar.png
if ch = R then 
  NextCh 
else error; 
while ch = R do 
  NextCh;
R* Rplus.png
while ch = R do 
  NextCh;
(R)


Синтаксическая диаграмма для целого со знаком

Синтаксическая диаграмма целого со знаком

Программа распознавания целого со знаком по синтаксической диаграмме

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

// Разбор целого со знаком с помощью синтаксических диаграмм
var 
  ch: Char;
  pos: integer;

procedure error();
begin
  writeln('^':pos);
  writeln('Ошибка в символе ',ch);
  halt;
end;
 
procedure NextCh;
begin
  read(ch);
  pos += 1;  
end; 
 
begin
  NextCh;
  if ch in ['+','-'] then
    NextCh;
 
  if char.IsDigit(ch) then
    NextCh
  else error;
 
  while char.IsDigit(ch) do
    NextCh;
 
  if ch<>#13 then
    error;
 
  writeln('Распознано целое число');
end.

Основные задания (5 баллов)

Реализовать программу на PascalABC.NET или C#.

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

  1. Реализовать в программе семантические действия по накоплению в строке распознанного целого числа и преобразованию его в целое в конце разбора (при встрече завершающего символа). Семантические действия следует добавлять перед каждым вызовом NextCh кроме первого. (1 балл)
  2. Идентификатор. (1 балл)
  3. Целое со знаком, начинающееся не с цифры 0.(1 балл)
  4. Чередующиеся буквы и цифры, начинающиеся с буквы.(1 балл)
  5. Список букв, разделенных символом , или ; В качестве семантического действия должно быть накопление списка букв в списке и вывод этого списка в конце программы.(1 балл)

Дополнительные задания (5 баллов)

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

  1. Список цифр, разделенных одним или несколькими пробелами. В качестве семантического действия должно быть накопление списка цифр в списке и вывод этого списка в конце программы (1 балл).
  2. Лексема вида aa12c23dd1, в которой чередуются группы букв и цифр, в каждой группе не более 2 элементов. В качестве семантического действия необходимо накопить данную лексему в виде строки (1 балл).
  3. Вещественное с десятичной точкой 123.45678 (1 балл).
  4. Лексема вида 'строка', внутри апострофов отсутствует символ ' (1 балл).
  5. Лексема вида /*комментарий*/, внутри комментария не может встретиться последовательность символов */ (1 балл).

Дополнительные сложные задания

  1. Лексема вида Id1.Id2.Id3 (количество идентификаторов может быть произвольным).