最短的 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,仍然会有差异。
我正在做家庭作业,其中提供了一段标题为 "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 很清楚:
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,仍然会有差异。