問6
次の C プログラムの説明及びプログラムを読んで,設問に答えよ。
〔プログラムの説明〕
簡単な構造をもつ文字列を解析して,要素に分解するプログラムを作成した。
(1) タグ付き文字列の構文規則を,次のように定義する。 ここで,構文の記述に用いる記号の意味を,表 1 のように定める。 また,<,> 及び / は,字句要素である。
、 表1 構文の記述に用いる記号の意味
記号
意味
::=
|
{ }*
タグ付き文字列 ::= {タグ構造}*
タグ構造 ::= 開始タグ タグの値 {タグ構造}* 終了タグ
開始タグ ::= <タグ名>
終了タグ ::= </タグ名>
タグ名 ::= <,>,/ 及び“\0”を含まない文字列
タグの値 ::= <,>,/ 及び“\0”を含まない文字列 | 空文字列
文字列 ::= {文字}*
(2) プログラムの仕様は,次のとおりである。
関数 parse_ml_string は,与えられたタグ付き文字列 mlstr を要素に分解して,開始タグの出現順に要素配列 elmtbl に格納する。 要素数は,変数 elmnumに格納する。 ここで,要素は次の構造体で表す。
typedef struct {
char *tag; /* タグ名 */
int depth; /* 入れ子の深さ(1,2,…) */
char *value; /* タグの値 */
} ELEMENT;
タグ付き文字列に含まれるタグの要素数が,256 を超えることはない。
与えられるタグ付き文字列に,構文の誤りはない。
(3) タグ構造が,別のタグ構造を含むこともある(図 1 参照)。
(4) 入れ子の深さは,最上位のタグ構造を 1 として, 上位から下位に向かって,1,2,3,… とする。
(5) 図 2 のタグ付き文字列に対するプログラムの実行結果は, 表 2 のとおりである。
図2 タグ付き文字列 mlstr の値
表2 要素配列 elmtbl
タグ名 tag
入れ子の深さ depth
タグの値 value
1
2
3
〔プログラム〕
#define MAXELMNUM 256 typedef struct { char *tag; int depth; char *value; } ELEMENT; char *parse_ml_data(char *, int); ELEMENT elmtbl[MAXELMNUM]; int elmnum = 0; void parse_ml_string(char *mlstr) { while (*mlstr != '\0') { mlstr = parse_ml_data(mlstr + 1, 1); } } char *parse_ml_data(char *mlstr, int level) { /* 開始タグ処理 */ elmtbl[elmnum].tag = ; elmtbl[elmnum].depth = level; for (; *mlstr != '>'; mlstr++); *mlstr = '\0'; /* タグの値処理 */ elmtbl[elmnum].value = ; for (mlstr++; *mlstr != '<'; mlstr++); *mlstr = '\0'; ; /* 下位のタグ構造処理 */ while ( ) mlstr = parse_ml_data(mlstr + 1, level + 1); /* 終了タグ処理 */ for (mlstr += 2; *mlstr != '>'; mlstr++); return mlstr + 1; }
設問 プログラム中の に入れる正しい答えを,解答群の中から選べ。
a,b に関する解答群
ア mlstr イ ++mlstr ウ mlstr + 1
エ *mlstr オ *(++mlstr) カ *mlstr++
キ *(mlstr + 1)
c に関する解答群
ア elmnum++ イ level++ ウ mlstr++
エ *elmnum++ オ *level++ カ *mlstr++
d に関する解答群
ア *(mlstr + 1) == '<' イ *(mlstr + 1) != '<'
ウ *(mlstr + 1) == '/' エ *(mlstr + 1) != '/'
オ *(mlstr + 1) == '>' カ *(mlstr + 1) != '>'