Kommentering af kodegenerering

Vi har valgt at generere kode til et free-standing/stand-alone Java program, da vi mente, der var alt for mange problemer med applets. Vi genererer JDK 1.1 kode og selv nyeste version af de mest udbredte browsere (Microsoft Internet Explorer 4.0 og Netscape Communicator 4.0) kunne ikke vise denne Java-version (begge bruger JDK 1.0).


Java-kodens filnavn (*.java)

Navnet på klassen der oprettes, er navnet på Svendsk programmet, fx vil

  SVENDSK HelloWorld

oprette følgende Java-kode:

  public class HelloWorld {

Det vil medføre, at filen med Java-kode skal have navnet HelloWorld.java, da Java compileren ellers nægter at oversætte filen. Vi havde først brugt rename(), som er en standardfunktion i C, men eftersom den ikke understøtter lange filnavne, blev vi nødt til at fuske lidt.

Vi bruger i stedet DOS-kommandoerne del (delete) og ren (rename). Grunden til at vi bruger del er, at man ikke kan rename til en fil der eksisterer i forvejen.


Kompilerings-vanskeligheder

Den genererede Java-kode kan godt være ukompilérbar. Det skyldes, at Svendsk ikke tager højde for, om programmøren har lavet uendelige løkker. Java tager højde for dette og nægter at kompilere programmet hvis det er tilfældet. Vi regnede kun med, at Java-compileren (javac) ville vise en advarsel (warning), men da koden skulle kompileres, genererede den i stedet en fejl (error). Det har ikke været muligt for os, at finde en option i javac der kunne fjerne dette check.


Formatering af den genererede kode

Da vores compiler henvender sig til nybegyndere, var det et mål for os, at lave den genererede Java-kode letlæselig vha. indrykninger og mellemrum. Dette lykkedes også godt for os et langt stykke af vejen, men ved generering af en hvis...ellers-sætning fik vi problemer.

Med én sætning efter en hvis, burde sætningen indrykkes med to mellemrum:

  if(udtryk)
    sætning
Med flere sætninger efter en hvis, skal en blok startes. En blok tager selv højde for indrykninger:
  if(udtryk)
  {
    sætning1
    sætning2
    sætningN-1
    sætningN
  }
Problemet var, at finde ud af om der kom én eller flere sætninger efter hvis. Vi prøvede fx at sammenligne næste token med FELT_START (>>), men det lykkedes os desværre ikke at få det til at virke.

Vi har konkluderet, at dette problem ikke har kunnet løses tilfredstillende. Resultatet er, at vi ikke indrykker efter hvis...ellers med kun én efterfølgende sætning.