最短的 REPEAT 语句 Modula-2

Shortest REPEAT statement Modula-2

我正在做家庭作业,其中提供了一段标题为 "EBNF Description of Modula-2's Syntax" 的文本,问题是:

"Give an example of the shortest REPEAT statement in Modula-2. ('Shortest' means fewest number of lexemes.)"

很抱歉无法提供文本,它位于受密码保护的页面上,但文本如标题所示。基本上这就是我想出的,我想知道这是否有效。

REPEAT 的 EBNF 描述及其以下语句如下:

RepeatStatement = `REPEAT` StatementSequence `UNTIL` Expression.

StatementSequence = Statement {“;” Statement}.

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

所以根据这个描述,我可以简单地说:

REPEAT EXIT.

完成了吗?还是我绝对必须使用 UNTIL and/or 完整的 StatementSequence EBNF 描述?

TL;DR 如果我只说 EXIT?

,则 EBNF 语句的其余部分无效

嗯,EBNF 很清楚:

RepeatStatement = `REPEAT` StatementSequence `UNTIL` Expression.

所以你必须有一个REPEAT关键字,一个语句序列(可以只是EXIT),UNTIL关键字和一种表达。只有这四个部分共同构成一个有效的重复语句...

所以我想这样的事情是你最短的时间:

REPEAT EXIT UNTIL TRUE

因为这是作业,我相信这里真正的问题是

"How do I figure out the EBNF for Modula-2?"

我想推荐通过绘制铁路图来可视化语法规则,然后将其与 EBNF 进行比较。这样你就可以逐渐了解EBNF表达的是什么了。

这是 REPEAT 语句的图表:

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

Wirth 的某些 PIM(Modula-2 编程)版本确实在本书的附件中包含了铁路图。如果你的没有,那么你可能需要在线查找语法图。

我们的项目 wiki 在

上并排(交叉链接)了 Modula-2 R10 的 EBNF 和语法图

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 转换为该脚本用于图表描述的列表表示法。

希望这对您有所帮助

更新:

我现在已经专门为 PIM Modula-2 生成了图表,并将其发布在 Modula-2 Info Wiki 上:

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

请注意,如果您在学校使用 ISO M2,仍然会有差异。