0

割り当て、if-else、およびブロック ステートメントのない while ステートメントを含む複数のステートメントをサポートする、C のサブセット用の単純な BNF 文法を記述します。非終端記号には意味のある名前を使用してください (不可解な文字に対して)。変数は 1 文字で表され、整数であると仮定します。演算子 *、/、+、-、および括弧に標準の優先順位規則が適用されると想定します。関係演算子 (==、!=、<、>、>=、および <=) を必ず含めてください。以下は、あなたの文法に有効なプログラムです:

 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 に答える