EBNF description of the Modula 2 language Use this descripti
EBNF description of the Modula- 2 language. Use this description to answer the question
State whether or not each of the following language constructs is syntactically valid. For each invalid construct, give the number of the syntax rule that is violated.
(a) Declaration:
CONST mask = BITSET{9..11}; divisor = 512;
(b) Declaration:
PROCEDURE LessThan(addr1, addr2: ADDRESS): BOOLEAN;
VAR r1, r2: POINTER TO REAL;
BEGIN
r1 := addr1;
r2 := addr2;
RETURN r1^ < r2^
END;
(c) Statement:
LOOP
Position(pattern, source, index, found);
IF NOT found THEN EXIT END;
Delete(source, index, Length(pattern), success);
Insert(replacement, source, index, success);
IF NOT success THEN Error(\"Buffer overflow in Replace\");
END
END
(d)
IF queue = NIL THEN
temp^.next := temp;
temp^.previous := temp;
queue := temp
ELSE
temp^.next := queue;
temp^.previous := queue^.previous;
queue^.previous^.next := temp;
queue^.previous := temp
END
Solution
There are three invalid statements found mentioned in comment section
(a) Declaration:
CONST mask = BITSET{9..11}; divisor = 512;
Comment 1: BITSET is invalid keyword
(b) Declaration:
PROCEDURE LessThan(addr1, addr2: ADDRESS): BOOLEAN;
VAR r1, r2: POINTER TO REAL;
BEGIN
r1 := addr1;
r2 := addr2;
RETURN r1^ < r2^
END;
Comment 2: LessThan is invalid
(c) Statement:
LOOP
Position(pattern, source, index, found);
IF NOT found THEN EXIT END;
Delete(source, index, Length(pattern), success);
Insert(replacement, source, index, success);
IF NOT success THEN Error(\"Buffer overflow in Replace\");
END
END
Comment 3: Only one END required to stop one LOOP
(d)
IF queue = NIL THEN
temp^.next := temp;
temp^.previous := temp;
queue := temp
ELSE
temp^.next := queue;
temp^.previous := queue^.previous;
queue^.previous^.next := temp;
queue^.previous := temp
END

