0

为 C 的一个子集编写一个简单的 BNF 语法,它支持多个语句,包括赋值、if-else 和没有块语句的 while 语句。为您的非终结符使用有意义的名称(相对于神秘的字母)。假设变量由单个字母表示并且是整数。假设标准优先规则适用于运算符 *、/、+、- 和括号。确保包含关系运算符(==、!=、<、>、>= 和 <=)。以下是您的语法的有效程序:

 a = -35;while (b > a);a = a + b;if (a >= 10);c = a;else c = b;

您能否扩展您的 BNF 以正确处理 C 块语句作为 while 或 if 或 else 的一部分?修改你的作品以支持:while (b > a) a = a + b; printf(“循环中”);

使用我想出的上述语法

<statement> ::=  a=-35
<while> ::= while (b>a)
<assign>::= a = a + b;
<if>::= if (a >= 10) 
<assign> ::= c=a;
<else> 
<assign> ::= c = b;

<while>::= while (b>a)
<assign>:= a = a + b;
<statement>::= printf ("in loop");

这是一个有效的 bnf 语法吗?

4

1 回答 1

5

不。你写的是比语法更多的例子。语法解释了如何产生语言的所有有效结构。

例如

 <while> ::= while <expression> <block>

然后,您<expression>以一种允许用该语言编写任何表达式的方式进行定义,并将<block>其定义为语句块(一个简单的语句或由括号分组的多个语句)。

http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form

于 2013-09-23T10:55:47.250 回答