Консультация № 176703
15.02.2010, 19:34
42.70 руб.
0 4 1
Извините, если не там задаю вопрос. Помогите написать грамматику(у меня есть решенная, но я не уверен, что правильно).
Задание: Задайте синтаксис описания функции в языке PASCAL. В теле функции можно использовать только операторы присваивания, правой частью которых являются арифметические выражения, составленные из простых переменных и констант целого типа, круглых скобок и знаков арифметических операций +,-,*,/
Приоритет операций обычный.
Построенная мной грамматика:
1)<I>='function' <B>(<Z>:<C>):<C>
2)<Z> -> <B>,<Z>|<R>
3)<D> -> a..z
4)<B> -> <D><B>|<D>
5)<C> -> 'int'|'real'
6)'var' <Z>:<C>
7)'begin'
8)<L>:=<P>
9)<D>=a|b|c|0..9
10)<O>=+|-|*|/
11)<L>=<P>
12)<R>=<P><O><P>
13)<R>=(<P><O><P>)
14)<R>=<R><O><R>
15)'end'
проверьте пожалуйста, правильно ли и если можно пример приведите, выполнения грамматики.

Обсуждение

Неизвестный
15.02.2010, 21:34
общий
Azarov88:
Существуют разные языки описания грамматик. Приведите ссылку (только не на файлообменник) на описание используемого Вами языка или само описание языка. А так, сразу бросается в глаза:

3)<D> -> a..z
9)<D>=a|b|c|0..9


В круглых скобках в заголовке функции может быть несколько списков переменных, возможно, предваряемых словом 'var', а у Вас только один (и аналогично, в строке 6 - 'var' <Z>:<C>) , да и то описано как-то странно:
2)<Z> -> <B>,<Z>|<R>
<R> ниже вы попытались описать как арифметичесое выражение, что никак не может быть в заголовке (или в объявлении переменных). Возможно, Вы хотели написать
2)<Z> -> <B>,<Z>|<B> (один или несколько идентификаторов, разделенные запятыми).

Константы у Вас никак не описаны.
Приоритет всех арифметических операций одинаков.

А что, нетерминальные символы должны быть обозначены одной буквой? Не лучше ли давать осмысленные имена?
<letter> -> a..z
<digit> -> 0-9
<number> -> <digit><number> | <digit>
давно
Старший Модератор
31795
6196
16.02.2010, 18:48
общий
Azarov88:
Пожалуйста, выложите на портале Вашу методичку.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
17.02.2010, 19:20
общий
это ответ
Здравствуйте, Azarov88.

Структура синтаксиса функции практически полностью повторяет структуру программы, за исключение нескольких разделов.
Синтаксис определен с помощью Расширенной Формы Бэкуса-Наура:
Синтаксические конструкции в фигурных скобках повторяются ноль и более раз. Необязательные элементы находятся в квадратных скобках.

<функция>::=<заголовок функции>[<разделы функции>]<тело функции>
<заголовок функции>::= function <идентификатор функции> [ <переменные функции> ] [i]:[/i] <тип> [i]; [/i]
<идентификатор функции>::=<буква> { <буква> | <цифра> }
<буква>::='A' .. 'Z' , 'a' .. 'z'
<цифра>::=0 .. 9
<переменные функции>::= ( <переменная типа> { <переменная типа> } )
<переменная типа>::=<идентификатор переменной>[i]:[/i]<тип> ; | <идентификатор переменной>[i],[/i] <переменная типа>
<идентификатор переменной>::=<буква> { <буква> | <цифра> }
<тип>::= integer | real
<разделы функции>::= { <раздел меток> | <раздел констант> | <раздел типов> | <раздел переменных> | <раздел описания внутренних функций> | <раздел описания внутренних процедур> }

Из разделов определяем только константы и переменные:
<раздел констант>::=const <константа> { <константа>}
<константа>::= <идентификатор константы> [b]=[/b] <цифра> { <цифра> }; | <цифра> { <цифра> } [i].[/i] <цифра> { <цифра> } ;
<идентификатор константы>::=<буква> { <буква> | <цифра> }
<раздел переменных>::= var <переменная типа> { <переменная типа> }

<тело функции>::=begin <оператор>; { <оператор>; }end;
<оператор>::= Присваивание (:=) | Begin..End | Case..Of..Else..End | For..To/Downto..Do |
Goto | If..Then..Else | InLine(...) | Вызов процедуры | Repeat..Until | While..Do | With..Do

Из операторов определяем только присваивание:
<левая часть>[b] := [/b]<выражение>
<выражение> ::= <операнд> { <операция суммирования> <операнд> }
<операнд>::= <множитель> { <операция умножения> <множитель> }
<множитель>::= <идетификатор константы> | <идентификатор переменной> | ( <выражение>)
<операция умножения>::= * | /
<операция суммирования>::= + | -

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
18.02.2010, 13:02
общий
Azarov88:
В ответе я описал формальную контекстно-свободную грамматику вида G=(N,[$8721$],P,S)
Практически составляя словари N(нетерминальных) и [$8721$](терминальных) символов Вы можете получить КС-грамматику в том виде как в вопросе.

Для справки: есть ещё КЗ-грамматики, LR-грамматики, LL-грамматики, АТ-грамматики. Поэтому у Вас и уточняли эту информацию.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа