Obligatorisk oppgave i INF5110 v?ren 2006

Merk: Dette er en tidlig utgave. Det kan komme presiseringer.

Dette er den f?rste av to oppgaver v?ren 2006. Oblig 2 vil bygge videre p? det som gj?res i oblig 1.

Innhold

Hensikten med oppgaven

Tanken bak denne oppgaven er at man skal f? litt praktisk erfaring med f?lgende:

Verkt?y

I ?r skal dere implementere kompilatoren i Java, ved hjelp av skanner- og parser-generatoren Antlr. Vi anbefaler ogs? sterkt ? bruke Ant eller GNU make til bygging av kildekoden, slik at hele innleveringen kan bygges og testes med noen f? kommandoer.

Selve oppgaven

Oppgaven g?r ut p? ? lage et program, ved hjelp av Antlr, som skal sjekke at programmer i spr?ket Diss er syntaktisk korrekte. Spr?ket er definert i et eget notat som kan hentes her. Merk at det i oblig 1 ikke er n?dvendig ? sjekke at programmer er semantisk korrekte. Man kan trygt ignorere alt som st?r i notatet vedr?rende sjekking av semantikk og/eller har med kj?retidsforhold ? gj?re. Dette blir tatt opp seinere i oblig 2.

Det ville v?rt naturlig med en del 3 der man laget en kodegenerator for spr?ket, men vi avst?r fra dette.

Syntakstre

Man skal under parseringen av spr?ket bygge opp et abstrakt syntakstre. Man skal designe noder (og implementere dem) for dette treet. Man m? holde greie p? subtr?r til treet mens parseringen av uttrykk foreg?r. Dette kan gj?res med aksjonskode og returverdier fra produksjoner i en Antlr- grammatikk. Returverdier og midlertidige variable som holder subtr?r ved rekursiv parsering, deklareres som passende nodetyper.

Legg merke til at bare det abstrakte syntaks-treet skal lages og skrives ut. For produksjoner av typen "if_stmt ->stmt" skal det alts? ikke lages noen ny node.

Utskrift av syntakstre

N?r man har bygget opp et abstrakt syntaks-tre, skal dette skrives ut i prefiksform. Hver node i det abstrakte treet skal representeres med ett par av parenteser, og hvert "barn" av denne noden skal inng? i mellom disse parentesene. Rett etter f?rste parentes kommer navnet p? noden (som angitt i grammatikken), fulgt av attributtene (barna) til noden. Dette illustreres best ved ett eksempel:

Eksempelet kan anses som definitivt. Whitespace er valgfritt. Dog, for ? bevare egen og andres mentale helse, vil vi p? det sterkeste anbefale en layout tilsvarende den i eksempelet.

Oppgaven skal l?ses med to forskjellige grammatikker

  1. En konsis, men flertydig grammatikk. Her skal grammatikken, i sin originale form brukes s? langt som mulig, og konflikter l?ses ved ? bruke Antlrs LL(k)- egenskaper (opsjonen k=n, syntaktiske og semantiske predikater).
  2. En (mest mulig) entydig grammatikk for spr?ket som er (n?r) LL(1). For ? f? den i utgangspunktet ambisi?se EBNF-grammatikken til LL(1), m? den venstrefaktoriseres.

Merk at i begge tilfellene m? grammatikken skrives om manuelt for ? oppfylle kravene til presedens og assosiativitet. Man m? da alts? innf?re en egen ikke-terminal for hvert presedens-niv?, og gjennom grammatikken s?rger for riktig presedens og assosiativitet (og ikke-assosiativitet) for operasjonene.

Sammenlikne de to parserne: unders?k og karakteriser konfliktene i den opprinnelige grammatikken (Antlr advarer om non-determinisme), og forklar hvordan du l?ste dem. Det er tilstrekkelig ? bygge og skrive ut syntakstreet fra ?n av grammatikkfilene. Den andre grammatikken trenger derfor ingen aksjonskode, bare Antlr-grammatikk som kan generere ett program som gjenkjenner Diss-kode.

Leksikalsk analyse

Man trenger ikke gj?re noe s?rlig ut av terminaler av konstante tegnstrenger, det enkleste er ? bruke dem bokstavlig i parseren og stille inn skanneren til ? sl? dem opp ved matching av tokens fra ett supersett (f.eks. "if" ved skanning av en identifikator). Opsjonen testLiterals kan brukes til dette.

Hovedoppgavene til skanneren blir ? gjenkjenne identifikatorer og konstanter, samt ? hoppe over kommentarer og blanke tegn. Ved levering av et token fra skanneren vil metoden Token.getText() gi angi den tekstlige attributtverdien til symbolet.

Feilh?ndtering

Dersom det oppdages en syntaktisk feil i programmet skal man bare stoppe analysen av Diss-programmet, og melde at det er funnet en feil. Det er ikke krav om noen spesielt intelligent feilmelding (men det er morsomt om man kan f? til noe her).

Gjennomf?ring og levering

Man b?r arbeide i grupper p? tre personer (p? grunn av arbeidsmengden). Det som skal leveres er:

Levering

Besvarelsen leveres som ett pakket filarkiv (zip- eller tgz-format) til gruppel?rer Sven-J?rgen Karlsen. Subversion-brukere kan ogs? levere via ett repository (bare gi meg leseaksess, og kommandoen for ? lese ut prosjektet).

Ressurser

Det viktigste her er det som st?r om LL-parsing i l?reboka i kap 4, og om omskriving av flertydige grammatikker i 3.4. Bakgrunnskunnskaper om DFA-baserte skannere, som Lex, fra 2.6 i l?reboka, er nyttig, men det er viktig ? v?re klar over at skanneren til Antlr ikke er DFA-basert, men recursive descent! Noe som b?de legger til muligheter for kontekstlig analyse, og skaper nye problemer, jfr. omfatttende kapittel om skanning i ref.manualen.

Antlr-dokumentasjon

Sist oppdatert 2006-02-22 15:43
Sven-J?rgen Karlsen