聯系方式

您當前位置:首頁 >> Java編程Java編程

日期:2019-12-23 08:53

Assessed Exercise 2, Task 3

Implement codegenTask3 for the whole language.

PROG → DEC | DEC; PROG

DEC → def ID (VARDEC) = E

VARDEC → ε | VARDECNE

VARDECNE → ID | VARDECNE, ID

ID → ... (identifiers)

INT → ... (Integers)

E → INT

| ID

| if E COMP E then E else E endif

| (E BINOP E)

| (E)

| skip

| (E; E)

| while E COMP E do E endwhile

| repeat E until E COMP E endrepeat

| ID := E

| ID(ARGS)

| break

| continue

ARGS → ε | ARGSNE

ARGSNE → E | ARGSNE, E

COMP → == | < | > | <= | >=

BINOP → + | - | * | /

Recall that the relevant definitions are here, here and here (and in the Zip file / Github given on the

parent page). If you don't want to implement a feature, simply throw CodegenException when

the code generator encounters this feature.

This task is more difficult than the previous two in the sense that we have not discussed how to

implement division, break and continue in the lectures. The actual changes to the code

generator are small and simple. Note that / is integer division, i.e. remainders are ignored (e.g.

17/5 = 3).

Meaning of break and continue. The commands break and continue work just as the

eponymous statements do in Java, see e.g. here in their unlabelled versions). They always occur

within a while or repeat loop. This is checked by semantic analysis. You can assume that the

test suite will only contain correct uses of break and continue.

When inside a loop, break will immediately break out of the innermost containing loop and

execute the command following that innermost loop. For example consider the following

declaration.

def f ( x ) = (

while x > 0 do

if x > 500 then

break

else

x := (x-1)

endif

endwhile;

x )

With this definition, f ( 1000 ) will return 1000, while f ( 432 ) will return 0. Relatedly, the

outer loop in

while x > 0 do (

repeat (

break; x := (x+1) )

until x > 0 endrepeat;

x := (x-1) )

endwhile

will be executed exactly x times (assuming x ≥ 0).

When inside a loop, continue will immediately abandon the current round of the innermost

containing loop and go to checking the condition. So the following loop never terminates whenever

x ≥ 0.

repeat

( continue; x = ( x - 1 ) )

until x < 0 endrepeat

Both, break and continue, can leave anything in the accumulator.

Important side-condition. The grammar allows us to have expressions like 1 + break. You do

not have to cater for this. All uses of break and continue will be 'normal', subject to the

restrictions break and continue must meet in Java.


版權所有:編程輔導網 2018 All Rights Reserved 聯系方式:QQ:99515681 電子信箱:[email protected]
免責聲明:本站部分內容從網絡整理而來,只供參考!如有版權問題可聯系本站刪除。

25选5一等奖多少钱