こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

構文図についての問題です。

全然分からなく困っています。どうか解答、解説をよろしくお願いします。問題は、以下です。
以下のプログラムは、整数の数式を入力して、式の値を求めて表示するプログラムである。このプログラムが対象とする数式の構文を、BNFか構文図で書け。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

static int ch;

void error(char *s)
{
fprintf(stderr, "%s\n", s);
exit(EXIT_FAILURE);
}

void nextch()
{
do {
if ((ch = getchar()) == EOF) return;
}while (ch == ' ' || ch == '\t');
}

double number()
{
double x, a;
int sign = '+';

if (ch == '+' || ch == '-') {
sign = ch; nextch();
}
if (! isdigit(ch)) error("Not a number or '(' is required.");
x = ch - '0'; nextch();
while (isdigit(ch)) {
x = 10 * x + ch - '0';
nextch();
}
if (ch == '.') {
a = 1; nextch();
while (isdigit(ch)) {
x += (a /= 10) * (ch - '0');
nextch();
}
}
return sign == '-' ? -x : x;
}

double expression();

double factor()
{
double x;

if (ch != '(') return number();
nextch(); x = expression();
if (ch != ')') error("')' is required,");
nextch(); return x;
}

double term() {
double x, y;

x = factor();
while (1) {
if (ch == '*') {
nextch(); x *= factor();
} else if (ch == '/') {
nextch(); y = factor();
if (y == 0) error("Zero division");
x /= y;
} else break;
}
return x;
}

double expression()
{
double x;

x = term();
while (1) {
if (ch == '+') {
nextch(); x += term();
} else if (ch == '-') {
nextch(); x -= term();
} else break;
}
return x;
}

int main()
{
double x;

nextch(); x = expression();
if (ch != '\n') error("Syntax error");
printf("%g\n", x);
return EXIT_SUCCESS;
}

投稿日時 - 2013-01-12 17:02:36

QNo.7888229

すぐに回答ほしいです

質問者が選んだベストアンサー

とりあえず number() だけ拡張バッカス記法で書いてみます.残りはnumber()より単純なので,この応用で分かるでしょう.

<sign> ::= '+' | '-'
<digit> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<integer> ::= <digit> { <digit> }
<real> ::= <integer> | <integer> '.' { <digit> }
<number> ::= <sign> <real> | <real>


number()の最初は if (ch == '+' || ch == '-') で始まるので,頭に符号が付く場合と何も付かない場合があります.符号が付く場合が <number> の記述の <sign> <real> に,付かない場合が <real> のみに対応します.

符号 <sign> は,+または-で,'+' | '-' の記述に対応します.

number()の最後が if (ch == '.') { (略) } で終わるので,末尾に小数点以下が付く場合と付かない場合があります.小数点以下が付かない場合が実数 <real> の記述の <integer> のみに,小数点が付く場合が <integer> '.' { <digit> } に対応します.小数点以下は0個以上の数字の繰り返しです.

number()の中ほどに if (! isdigit(ch)) error(); ... while (isdigit(ch)) となっているので,これは一つ以上の数字の繰り返しです.これが整数 <integer> の記述の <digit> { <digit> } に対応します.

投稿日時 - 2013-01-12 20:20:20

お礼

ありがとうございます。助かりました。

投稿日時 - 2013-01-22 18:18:26

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問