解答例

学籍番号
学年
年
氏名
第 5 章 制約検査 (6/1〆切)
レポート課題
解答例
1. 以下の式で左辺値を持つものを全て選べ
(1)
abc
(2)
main
(3) a+b
(4) x12
(7)
a[12]
(8) a[12+24] (9) a[12]+b[24] (10)
(a)
(5)
(11)
main12 (6)
-b
a [b*c] (12) ++i
2. 以下に示す制約検査プログラム(の一部)の、空欄(1)~(7)に当てはまる命令を記入せよ。
ただし、Token 型変数 token には現在解析中のトークン、VarTable 型変数 varTable に
は 変 数 表 が 入 っ て い る と し 、 NAME, INTEGER は そ れ ぞ れ 変 数 名 ( 型 は INT と
ARRAYOFINT のみ), 整数を表す終端記号とする。また、式の解析では左辺値の有無を
返り値として返すとする。
(ア) <Decl> ::= “int” NAME “;”
void parseDecl() {
if (token == “int”) token = nextToken(); else syntaxError();
if (token == NAME) {
String name = (1)
token.getName();
;
token = nextToken();
} else syntaxError();
if ((2)
varTable.exist (name)
) syntaxError(“二重登録”);
varTable.registerNewVariable ((3) Type.INT, name, 1
);
if (token.checkSymbol (Symbol.SEMICOLON)) token = nextToken(); else syntaxError();
}
(イ) <Unsigned> ::= NAME | INTEGER
boolean parseUnsigned() {
if (token.checkSymbol (Symbol.NAME)) {
String name = token.getName();
token = nextToken();
if ((4) !varTable.exist (name) ) syntaxError(“未定義”);
q1
if ((5) A,B,...,Z
!vatTalbe.checkTypea,b,...,z
(name, Type.INT) ) syntaxError(“型不一致”);
return (6) true
;
} else if (token.checkSymbol (Symbol.INTEGER)) {
q0
q2
a,b,...,z
token = nextToken();
a,b,...,z
return (7) false ;
} else syntaxError();
}