C 使用循环语句的BNF语法

C 使用循环语句的BNF语法,c,C,为支持多个语句的C子集编写一个简单的BNF语法,这些语句包括赋值、if-else和while语句,但不支持块语句。对非终端使用有意义的名称(而不是神秘的字母)。假设变量由单个字母表示,并且是整数。假设标准优先规则适用于运算符*、/、+、-、和括号。确保包含关系运算符(=、!=、>=、和a) a=a+b; printf(“循环中”) 使用我想出的上述语法 <statement> ::= a=-35 <while> ::= while (b>a) <assign

为支持多个语句的C子集编写一个简单的BNF语法,这些语句包括赋值、if-else和while语句,但不支持块语句。对非终端使用有意义的名称(而不是神秘的字母)。假设变量由单个字母表示,并且是整数。假设标准优先规则适用于运算符*、/、+、-、和括号。确保包含关系运算符(=、!=、>=、和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");
::=a=-35
:=while(b>a)
:=a=a+b;
:=如果(a>=10)
:=c=a;
:=c=b;
:=while(b>a)
:=a=a+b;
:=printf(“循环中”);

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

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

比如说

 <while> ::= while <expression> <block>
::=while
然后,以允许用该语言编写任何表达式的方式定义
,并将
定义为一个语句块(一个简单语句或几个用括号分组的语句)


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

比如说

 <while> ::= while <expression> <block>
::=while
然后,以允许用该语言编写任何表达式的方式定义
,并将
定义为一个语句块(一个简单语句或几个用括号分组的语句)


@scravy显然这是家庭作业(除了老师,还有谁会对“C BNF语法的子集”感兴趣?)。问题不在于它是否是家庭作业(为什么家庭作业与工作任务不同),而在于海报是否真的在努力解决问题,或者他是否只希望有人丢弃代码。因此,我的答案大多是正确的(除非这是一个非常具体的问题)。@scravy显然这是家庭作业(除了老师,还有谁会对“C BNF语法的子集”感兴趣?)。问题不在于它是否是家庭作业(为什么家庭作业与工作任务不同),而在于海报是否真的在努力解决问题,或者他是否只希望有人丢弃代码。因此,我的回答大多是一些正确方向的线索(除非这是一个非常具体的问题)。