首页 > > 详细

辅导Github留学生、讲解Java程序语言、辅导Java调试Matlab程序|解析R语言编程

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.

联系我们 - QQ: 99515681 微信:codinghelp
程序辅导网!