2015-02-18 1 views
2

Я делаю домашнее задание, в котором я был обеспечен фрагмент текста под названием «EBNF Описание Modula-2 Синтаксис» и вопрос спрашивает:Кратчайший REPEAT заявление Modula-2

«Приведите пример кратчайший REPEAT в Modula-2. («Самый короткий» означает меньшее количество лексем.) «

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

Описание EBNF из REPEAT и это после заявлений как таковой:

RepeatStatement = `REPEAT` StatementSequence `UNTIL` Expression. 

StatementSequence = Statement {“;” Statement}. 

Statement = [Assignment | ProcedureCall | IfStatement | CaseStatement | 
      WhileStatement | RepeatStatement | LoopStatement | 
      ForStatement | WithStatement | `EXIT` 

Итак, это описание я мог просто сказать:

REPEAT EXIT. 

и быть сделано? или мне абсолютно необходимо использовать описание UNTIL и/или полное описание StatementSequence EBNF?

TL; DR - остальная часть заявления EBNF void, если я только что скажу EXIT?

ответ

2

Ну, EBNF довольно ясно:

RepeatStatement = `REPEAT` StatementSequence `UNTIL` Expression. 

Так вы должны в REPEAT ключевое слово, последовательность утверждение (которое может быть только EXIT), то UNTIL ключевое слово и выражение. Только эти четыре части вместе составляют действительное заявление повтора ...

Так что я думаю, что-то вроде этого будет кратчайшим вы можете быть:

REPEAT EXIT UNTIL TRUE 
+0

Но тем не менее, используя это описание абсолютов при использовании EBNF для написания кода, не следует ли мне теперь использовать полный оператор StatementSequence = Statement {";" Statement} .' и т. Д.? –

+0

@ RyanTibbetts: это означает, что 'StatementSequence' - это один оператор, необязательно сопровождаемый точкой с запятой и другим выражением. Так что ** абсолютно верно **, чтобы иметь ** отдельный оператор ** заменить слово 'StatementSequence' ... –

+0

Хорошо круто! Спасибо за вашу помощь marc, я получил больше работы по этому заданию, поэтому продвигаться вперед с этим пониманием очень поможет. * Upvote + * –

0

Поскольку это домашнее задание, я считаю, что реальный вопрос здесь

«Как определить EBNF для модуля-2?»

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

Это схема для утверждения REPEAT:

http://modula-2.net/m2r10/pmwiki.php?n=SyntaxDiagrams.NonTerminals#repeatStatement

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

Наш проект вики имеет EBNF и синтаксические диаграммы для Modula-2 R10 бок о бок (связаны кросс-) на

http://modula-2.net/m2r10/pmwiki.php?n=Spec.Modula-2Syntax

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

Последнее, но не менее, вы можете использовать сценарий ниже, чтобы сделать свои собственные Modula-2 синтаксических диаграмм, используя диалект вашего выбора:

https://bitbucket.org/trijezdci/m2r10/src/tip/_GRAMMAR/modula2_syntax_diagrams.tcl

Сценарий содержит подробное объяснение, как конвертировать EBNF в нотацию списка, которую сценарий использует для описания диаграмм.

надеюсь, что это помогает

UPDATE:

Я теперь генерироваться диаграммы специально для ПИМ Modula-2 и поставить его на Modula-2 Info Wiki по адресу:

http://modula-2.info/m2pim/pmwiki.php/SyntaxDiagrams/PIM4NonTerminals

Обратите внимание: если вы используете ISO M2 в школе, все равно будут различия.

 Смежные вопросы

  • Нет связанных вопросов^_^