Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer.

Lignende præsentationer


Præsentationer af emnet: "VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer."— Præsentationens transcript:

1 VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer

2 VPG/Otto Knudsen2 Tråde Tråd (lightweight process) Enkel sekventiel kontrolsekvens i et program Deler fælles data

3 VPG/Otto Knudsen3 Trådning Fordele Overvågningssystemer med flere uafhængige opgaver Muliggør brugerinteraktion via BGF Muliggør serverhåndtering af flere samtidige klienter Udnytter flerprocessor-systemer optimalt

4 VPG/Otto Knudsen4 Tråde Ulemper Trådene afvikles uafhængigt af hverandre Afviklingsrækkefølgen er vilkårlig Samspillet mellem tråde er ofte meget kompleks Problemer med safety og liveness

5 VPG/Otto Knudsen5 Instantiering af tråde Tråde kan skabes på 2 måder: Arve fra Thread -klassen Implemetere Runnable -interfacet

6 VPG/Otto Knudsen6 Tråde

7 VPG/Otto Knudsen7 Thread-klassen Skabe en tråd vha. Thread extends Thread-klassen Overskriv run-metoden Lav en instans af trådklassen Kald metoden start() på denne instans

8 VPG/Otto Knudsen8 Thread-klassen class Tråd extends Thread { public void run() { kode } }... new Tråd().start();

9 VPG/Otto Knudsen9 Runnable-interfacet Implements Runnable-interfacet implementér run-metoden Lav en instans af trådklassen Lav en ny Thread -instans med Runnable -objektet som argument Kald metoden start() på denne instans

10 VPG/Otto Knudsen10 Runnable-interfacet class Tråd implements Runnable { public void run() { kode } }... new Thread(new Tråd()).start();

11 VPG/Otto Knudsen11 Runnable-interfacet class Tråd implements Runnable { public void run() { kode } public void start() { new Thread(this).start(); }... new Tråd().start();

12 VPG/Otto Knudsen12 Trådes livscyklus

13 VPG/Otto Knudsen13 Trådsikre klasser Problem: Hvis en tråd afbrydes, medens den arbejder på et objekt, er der risiko for, at objektet efterlades i en inkonsistent tilstand. Dette kan give problemer, når en anden tråd forsøger at få tilgang til objektet

14 VPG/Otto Knudsen14 Trådsikre klasser Løsning: Løsningen er at forhindre mere end én tråd ad gangen i at få tilgang til de kritiske områder i koden Vha. synkronisering opnår en tråd eneret på et objekt (lås) Låsen frigives, når tråden forlader det kritiske område eller ved kald af metoden wait() på objektet. Kritiske områder på samme objekt deler samme lås!

15 VPG/Otto Knudsen15 Liveness problemer Starvation (udhungring): En tråd, som er i tilstanden ready, får aldrig lejlighed til at køre, fordi der findes andre tråde med højere prioritet Dormancy (dvale): En tråd, som er i tilstanden blocked on wait, vækkes aldrig med notify() Deadlock (hårdknude): To eller flere tråde kæmper om flere fælles ressourcer, og hver tråd efterspørger på samme tid disse ressourcer Premature Termination (for tidlig død): En tråd termineres for tidligt og hindrer derved andre tråde i at blive vækket. (Evig dvale)

16 VPG/Otto Knudsen16 volatile vs. synchronized Anvend volatile på en attribut, hvis denne kan tilgås af flere tråde; med mindre at alle trådene tilgår attributten gennem synkroniserede metoder (kodeblokke) Hvis flere tråde samtidigt kan tilgå en attribut, og mindst én af disse kan ændre i attributtens værdi, så er det generelt en god idé at anvende synchronized til at styre tilgangen Hvis kun én tråd kan tilgå attributten, så er brugen af synchronized overflødig og sløver programafviklingen

17 VPG/Otto Knudsen17 Brug af synchronized Nødvendig, hvis man vil lave "trådsikre klasser" Ej omkostningsfrit: Kræver CPU-kraft  langsommere programafvikling "Hellere for mange synkroniserede blokke end for få!" MEN - pas på deadlocks

18 VPG/Otto Knudsen18 Monitor En monitor indkapsler fælles ressourcer som private attributter og sikrer trådene enetilgang vha. synchronized metoder til de kritiske områder Formål: Overvågning af trådes adgang til fælles ressourcer Objekt, hvor de fælles ressourcer er samlet (attributter) Der er udelelig adgang til monitorens metoder (mutex) Én monitor-metode pr. kritisk sektion

19 VPG/Otto Knudsen19 Missed notification Problem notify sendes før wait Konsekvens notify mistes og wait -tråden bliver ved med at vente Løsning Sørg for kun at gå i wait, hvis notify endnu ikke er sendt. Sæt evt. en boolsk variabel, når notify sendes, og gå kun i wait, hvis denne variabel er sat Konklusion Sørg for at samle én begivenhed i ét synkroniseret monitorkald

20 VPG/Otto Knudsen20 Early notification Problem notify sendes før betingelserne for wait er opfyldt Konsekvens wait -tråden vækkes før tid Løsning Check (igen) betingelserne for wait, når wait -tråden vækkes Konklusion Anvend altid while (i stedet for if ) i forbindelse med check af wait -betingelser

21 VPG/Otto Knudsen21 Early notification 1. Bufferen er tom! 2. C1-tråden er i wait-tilstand 3. P-tråden generer et nyt element og kalder monitorens synkroniserede put-metode 4. C1-tråden underrettes via notify, og tråden går i ready-tilstand 5. P-tråden forlader monitorens put-metode og slipper objekt-låsen på monitoren 6. Bufferen indeholder nu ét element! 7. Trådskifte! 8. C2-tråden trækker et element fra bufferen ved at kalde monitorens get-metode 9. C2-tråden forlader monitorens get-metode og slipper objekt- låsen på monitoren 10. Der er ingen elementer i bufferen! 11. Trådskifte! 12. C1 fortsætter nu fra wait i monitorens get-metode i forsøget på at trække endnu et element fra bufferen … Dette er ikke muligt!

22 VPG/Otto Knudsen22 Guarded Suspension public synchronized void put(String data) throws InterruptedException { while (buffer.isFull()) // while i stedet for if this.wait(); if (buffer.isEmpty()) this.notify(); buffer.add(data); } public synchronized String get() throws InterruptedException { while (buffer.isEmpty()) // while i stedet for if this.wait(); if (buffer.isFull()) this.notify(); String data = (String)buffer.remove(); return data; }

23 VPG/Otto Knudsen23 Observer Pattern

24 VPG/Otto Knudsen24 Distribueret Programmering Sockets RMI CORBA (ej pensum) JDBC (ej pensum)

25 VPG/Otto Knudsen25 Sockets Sockets er logiske endepunkter i en forbindelse mellem server og klient På applikationsniveauet betragtes Sockets som ”pålidelige”, dvs. data som sendes fra den ene ende af forbindelsen modtages i den anden ende i samme rækkefølge, som de er sendt, og uden tab Sockets optræder parvis – klienten har en Socket til serveren og omvendt En Socket er tilknyttet både en InputStream OutputStream Klientens OutputStream er forbundet til serverens InputStream og omvendt

26 VPG/Otto Knudsen26 Sockets - Arkitektur

27 VPG/Otto Knudsen27 Sockets - Serversiden 1. Skab en ServerSocket på portnr 2000 (fx) try { ServerSocket s = new ServerSocket(2000); } catch (IOException e) {} 2. Vent på forespørgsel fra klient while (true) { Socket socket = s.accept(); } 3. Skab InputStream og OutputStream ud fra Socket BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); 4. Send og modtag via InputStream og OutputStream in.read(); out.println(); 5. Luk strømme og Sockets

28 VPG/Otto Knudsen28 Sockets - Klientsiden 1. Skab en Socket til serveren vha. hostname og portnr try { Socket s = new Socket(”localhost”, 2000); } catch(IOException e) {} 2. Skab InputStream og OutputStream ud fra Socket BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(s.getOutputStream(), true); 3. Send og modtag via InputStream og OutputStream in.read(); out.println(); 4. Luk strømme og Socket

29 VPG/Otto Knudsen29 Sockets - Strømme

30 VPG/Otto Knudsen30 Flere samtidige klienter Server class Server { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(2000); while (true) { // Vent på anmodning fra klient... Socket socket = s.accept(); // Instantiér klienttråd - og start den... new ClientHandler(socket).start(); } } catch (IOException e) {} }

31 VPG/Otto Knudsen31 Flere samtidige klienter ClientHandler class ClientHandler extends Thread { private Socket incoming; public ClientHandler(Socket incoming) { this.incoming = incoming; } public void run() { try { // Instantiér ind- og ud-strøm while (true) { // Kommunikér } } catch (IOException e) {} }

32 VPG/Otto Knudsen32 RMI RMI (Remote Method Invocation) Kald af metoder på serverobjekt fra klient Filosofi Objekter på serveren gøres tilgængelige på klienten Abstraktionsniveau Højere abstraktionsniveau end Sockets Objektorienteret – Syntaksen svarer til almindelig Java Fælles data og funktionalitet Transparens – Der arbejdes med serverobjekterne, som om de lå på klienten Miljø RMI findes kun til Java

33 VPG/Otto Knudsen33 RMI - Arkitektur

34 VPG/Otto Knudsen34 RMI - Arkitektur 1. Kald af metoden server.metode() fra klienten udføres som et metodeklad på stub’en: stub.metode() 2. Stub’en arrangerer argumenterne i metodekaldet, (marshalling), og sender dem til skeleton’en på serveren tillige med information om kaldet 3. Skeleton’en afkoder argumenterne samt informationen om kaldet, (demarshalling), og kalder metoden på serveren: server.metode() 4. Serverobjektet eksekverer metodekaldet og sender eventuel en returværdi til skeleton’en 5. Skeleton’en arrangerer returværdien, (marshalling), og sender resultatet til stub’en 6. Stub’en afkoder, (demarshalling), returværdien og returnerer den til klienten

35 VPG/Otto Knudsen35 RMI – Begreber Marshalling Arrangering af information om metodekald, dvs. objekt-id, metodenavn, argumenter og returværdier Lokale objekter Objekter, som kun kan tilgås lokalt, enten på serveren eller på klienten. Lokale objekter, der overføres som argumenter eller returværdier skal implementere markør-interfacet Serializable Remote objekter Objekter, som er tilgængelige fra andre maskiner/processer. Remote objekter skal implementere markør-interfacet Remote Remote reference Reference til et objekt, der fysisk er placeret på en anden maskine/proces. Referencen indeholder ip-adresse, portnr samt objekt- id på serverobjektet Remote metodekald Kald af servermetode fra klient. Ved remote metodekald overføres lokale objekter by value og remote objekter by reference

36 VPG/Otto Knudsen36 RMI – Proxy-mønsteret

37 VPG/Otto Knudsen37 RMI - Serversiden import java.rmi.*; public interface Konto extends Remote {... // metodeerklæringer public double indsaet(double beloeb) throws RemoteException; } import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class KontoServer extends UnicastRemoteObject implements Konto {... // attributter double saldo; public KontoServer() throws RemoteException { super(); saldo = 0.0; }... // metodeimplementeringer public double indsaet(double beloeb) throws RemoteException { saldo += beloeb; return saldo; }

38 VPG/Otto Knudsen38 RMI - Kontoeksemplet

39 VPG/Otto Knudsen39 Forløbet af et RMI-kald (1) 1. Definér et interface (kontrakt) til et remote objekt public interface Konto extends java.rmi.Remote {... public double indsaet(double beloeb) throws RemoteException; } 2. Implementér ovenstående interface på serversiden public class KontoServer extends java.rmi.server.UnicastRemoteObject implements Konto {... public double indsaet(double beloeb) throws RemoteException; }

40 VPG/Otto Knudsen40 Forløbet af et RMI-kald (2) 3. Skab en instans af NameServer-objektet på en given port (fx 1099) vha. LocateRegistry java.rmi.registry.LocateRegistry.createRegistry(1099); 4. Skab en instans af serveren og registrér serveren i RMI- registry Konto server = new KontoServer(); java.rmi.Naming.rebind("Konto", server); 5. Generér stub og skeleton class-filer vha. RMI-compile Filerne får navnene KontoServer_Stub.class og KontoServer_Skeleton.class Stub-klassen implementerer også Konto-interfacet

41 VPG/Otto Knudsen41 Forløbet af et RMI-kald (3) 6. Lokalisér remote objektet – konto er nu en instans af stub- klassen, som implementerer Konto-interfacet Konto konto = (Konto)java.rmi.Naming.lookup("//localhost:1099/Konto") 7. Lav en klient, som anvender metoderne på konto-objektet: konto.indsaet(100);

42 VPG/Otto Knudsen42 RMI – MathInterface package math; import java.rmi.*; public interface MathInterface extends Remote { public int add(int a, int b) throws RemoteException; public int sub(int a, int b) throws RemoteException; public int mul(int a, int b) throws RemoteException; public int div(int a, int b) throws RemoteException, ArithmeticException; }

43 VPG/Otto Knudsen43 RMI - MathServer package math; import java.rmi.*; import java.rmi.server.*; public class MathServer extends UnicastRemoteObject implements MathInterface { public MathServer() throws RemoteException {} public int add(int a, int b) throws RemoteException{return a + b;} public int sub(int a, int b) throws RemoteException{return a - b;} public int mul(int a, int b) throws RemoteException{return a * b;} public int div(int a, int b) throws RemoteException, ArithmeticException {return a / b;} }

44 VPG/Otto Knudsen44 RMI - Server package math; import java.rmi.*; import java.rmi.registry.*; public class Server { public static void main(String[] args) { try { LocateRegistry.createRegistry(1099); Naming.bind("Math", new MathServer()); System.out.println("Serveren er registreret"); } catch (RemoteException e) {System.exit(1);} }

45 VPG/Otto Knudsen45 RMI - Klient package math; import java.rmi.*; public class MathClient { public static void main(String[] args) { MathInterface math = null; try { math = (MathInterface)Naming.lookup("Math"); System.out.println("1 + 2 = " + math.add(1, 2)); System.out.println("3 + 4 = " + math.add(3, 4)); System.out.println("5 + 6 = " + math.add(5, 6)); System.out.println("7 + 8 = " + math.add(7, 8)); } catch (Exception e) {System.exit(1);} }

46 VPG/Otto Knudsen46 Sproghistorie Syntaks (struktur) Semantik (Indhold)

47 VPG/Otto Knudsen47 Sproghistorie Sprog Lavniveau (maskinkode) Højniveau (C#, Java, Pascal, osv.) Maskinuafhængig kode, som omsættes til maskinkode via kompilering, fortolkning eller en mellemting af disse

48 VPG/Otto Knudsen48 Sprogteori – Kompiler Kompiler Kildekode –> Kompiler –> Binær kode

49 VPG/Otto Knudsen49 Sprogteori – Kompiler Kompilertyper Single Pass Multi Pass Load and go Debugging Optimering

50 VPG/Otto Knudsen50 Sprogteori – Kompiler Kompiler Analyse (nedbryde) Leksikalsk analyse Scanning, Tokenizing Syntaksanalyse – Parsing Hierarkisk analyse, Semantisk analyse Syntese (sammensætte)

51 VPG/Otto Knudsen51 Sprogteori – EBNF BNF Backus-Naur-Form EBNF Extended Backus-Naur-Form Udvidet med { } og [ ] Findes i flere varianter

52 VPG/Otto Knudsen52 Sprogteori - Analyse Leksikalsk analyse Opsplitning af input i brikker Syntaksanalyse – Parsing Samling af brikker til sætninger, som opfylder en velbeskrevet struktur (mønster)

53 VPG/Otto Knudsen53 EBNF – Elementer En EBNF-grammatik består af Terminaler Nonterminaler Startsymbol Produktionsregler

54 VPG/Otto Knudsen54 EBNF – Produktionsregler Produktionsregler Afsluttes med punktum | betegner valgmuligheder { } betegner nul eller flere gentagelser [ ] betegner nul eller én forekomst ( ) anvendes til at samle enheder

55 VPG/Otto Knudsen55 EBNF – Eksempel Medlemsliste-EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] ";". navn = bogstav {bogstav}. fødselsår = ciffer, ciffer, ciffer, ciffer. kategori = "junior"|"senior". bogstav = "a"|...|"å"|"A"...|"Å". ciffer = "0"|...|"9"|.

56 VPG/Otto Knudsen56 EBNF EBNF-grammatikken Syntaktiske regler Beskriver, hvordan ”byggeklodserne” sammensættes Semantiske regler Beskriver hvilke sammensætninger, der giver mening

57 VPG/Otto Knudsen57 EBNF Semantiske krav i EBNF-grammatikken Kan komplicere i unødig grad Undgå derfor: at inddrage semantiske krav, hvis det går ud over overskueligheden at rense helt for semantiske krav, hvis det går ud over forståeligheden Balancér overskuelighed og forståelighed!

58 VPG/Otto Knudsen58 Syntaksstyret indlæsning Kontrol af, hvorvidt inddata overholder de syntaktiske krav beskrevet i EBNF- grammatikken 2 metoder Regelstyret indlæsning Tabelstyret indlæsning Single Symbol Lookahead

59 VPG/Otto Knudsen59 Syntaksstyret indlæsning Metode: Indlæsning af brikker Haves: Abstrakt beskrivelse af, hvorledes inddata skal se ud (EBNF) Konkret inddata-strøm Mål: Kontrol af overensstemmelse mellem konkret inddata og abstrakt beskrivelse (EBNF) Strategi: Konkretisér EBNF’en og abstrahér over inddata

60 VPG/Otto Knudsen60 Syntaksstyret indlæsning Begreber Brik: Udeleligt sprogelement. Følge af tegn, som har selvstændig betydning i forhold til inddata Leksem: Den originale streng, som indeholder en brik. Det er som regel det længste leksem, der afgør en brik

61 VPG/Otto Knudsen61 Syntaksstyret indlæsning Konkretisering af EBNF Fjern alle produktionsregler, hvor en brik findes på venstresiden Fjern derved overflødiggjorte produktionsregler Indsæt de valgte brikker på pladserne svarende til terminalerne

62 VPG/Otto Knudsen62 EBNF – Eksempel 1 Medlemsliste-EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] ";". navn = bogstav {bogstav}. fødselsår = ciffer, ciffer, ciffer, ciffer. kategori = "junior"|"senior". bogstav = "a"|...|"å"|"A"...|"Å". ciffer = "0"|...|"9"|. Konkretiseret EBNF medlemsliste = medlem {medlem}. medlem = navn fødselsår [kategori] semikolon. kategori = junior|senior. Valgte brikker semikolon, navn, fødselsår, junior, senior, andet, slut

63 VPG/Otto Knudsen63 EBNF – Eksempel 2 Talfølge-EBNF talfølge = tal {"," tal}. tal = [fortegn] ciffer {ciffer} ["." ciffer {ciffer}]. ciffer = "0" |... | "9". fortegn = "+" | "-". Konkretiseret EBNF talfølge = tal {komma tal}. tal = [fortegn] heltal [punktum heltal]. fortegn = plus | minus. Valgte brikker komma, heltal, punktum, plus, minus, andet, slut

64 VPG/Otto Knudsen64 EBNF – Produktionsregler Typer af produktionsregler Rekursiv Regel, der beskrives vha. sig selv Regulær Regel med gentagelser { } Simpel Alle andre regler

65 VPG/Otto Knudsen65 EBNF-grammatikker Typer af EBNF-grammatikker Direkte rekursiv Gramatik, der indeholder en rekursiv produktionsregel Indirekte rekursiv Grammatik, der indeholder en produktionsregel, der anvender en non-terminal, der andetsteds direkte eller indirekte refererer til reglen Regulær Ej-rekursiv grammatik, der indeholder regulære produktionsregler Simpel Alle andre grammatikker

66 VPG/Otto Knudsen66 Regelstyret indlæsning Betegnelser f, f 1, f 2, …, f n betegner en følge af brikker og non-terminaler n betegner en non-terminal b betegner en brik s betegner en non-terminal eller en brik  betegner den tomme mængde  betegner den tomme følge

67 VPG/Otto Knudsen67 Regelstyret indlæsning first Mængden af brikker, som følgen kan starte med follow Mængden af brikker, som kan efterfølge en given non-terminal eller brik

68 VPG/Otto Knudsen68 first first(b) = {b} first(  ) =  n = f 1 f 2 first(n) = first(f 1 f 2 ) = first(f 1 ), f 1 ≠  first(n) = first(f 1 f 2 ) = first(f 1 )  first(f 2 ) n = f 1 |f 2 first(n) = first(f 1 |f 2 ) = first(f 1 )  first(f 2 ) n 1 = [f 1 ] first(n 1 ) = first(  |f 1 ) = first(f 1 ) n 2 = {f 1 } first(n 2 ) = first(  |f 1 n 2 ) = first(f 1 )

69 VPG/Otto Knudsen69 first Buttom-up-strategi first(navn) = {navn}... osv. med alle brikkerne first(kategori) = first(junior|senior) = first(junior)  first(senior) = {junior, senior} first(medlem) = first(navn fødselsår [kategori] semikolon) = first(navn) = {navn} first(medlemsliste) = first(medlem {medlem}) = first(medlem) = {navn}

70 VPG/Otto Knudsen70 follow follow(startsymbol) =  n = f 1 sf 2 n = f 1 [s]f 2 n = f 1 {s}f 2 follow(s) indeholder first(f 2 ) follow(s) indeholder follow(n), hvis f 2 kan være  n = f 1 {s} follow(s) indeholder first(s)

71 VPG/Otto Knudsen71 follow Top-down-strategi follow(medlemsliste) =  follow(medlem) = first({medlem}) = first(medlem) = {navn} follow(medlem) = follow(medlemsliste) =  follow(medlem) = {navn} follow(navn) = first(fødselsår) = {fødselsår} follow(fødselsår) = first([kategori] semikolon) = {junior, senior, semikolon} follow(kategori) = first(semikolon) = {semikolon} follow(semikolon) = follow(medlem) = {navn} follow(junior) = follow(kategori) = {semikolon} follow(senior) = follow(kategori) = {semikolon}

72 VPG/Otto Knudsen72 Eksempel – first / follow Sportsklub-EBNF sportsklub = medlem {medlem}. medlem = navn junior semikolon | navn senior semikolon. Brikker: navn, junior, senior, semikolon Bottom-up: first(navn) = {navn} first(junior) = {junior} first(senior) = {senior} first(semikolon) = {semikolon} first(medlem) = {navn} first(sportsklub) = {navn} Top-down: follow(sportsklub) = Ø follow(medlem) = {navn} follow(navn) = {junior, senior} follow(junior) = {semikolon} follow(senior) = {semikolon} follow(semikolon) = {navn}

73 VPG/Otto Knudsen73 Krav til EBNF-grammatikken Krav 1 Lad n = f1|f2 så må der gælde, at first(f1)  first(f2) =  En EBNF opfylder krav 1, hvis alle produktionsregler med valgmuligheder opfylder krav 1

74 VPG/Otto Knudsen74 Krav til EBNF-grammatikken Krav 2 Hvis n kan være den tomme følge  så må der gælde, at first(n)  follow(n) =  En EBNF opfylder krav 2, hvis alle produktionsregler, der kan være tomme opfylder krav 2

75 VPG/Otto Knudsen75 Krav til EBNF-grammatikken Hvis krav 1 og 2 ikke er opfyldte Omskriv EBNF’en vha. venstrefaktorisering Lav ny EBNF

76 VPG/Otto Knudsen76 Venstrefaktorisering Givet n = ff 1 | ff 2 |... | ff n | andet (valgmulighed med fælles præfix f ) Erstat n med følgende: n = f tmp | andet tmp = f 1 | f 2 |... | f n Gentag indtil alle produktionsregler er renset for valgmuligheder med fælles præfix Bemærk, at produktionsregler med { } og [ ] implicit indeholder en valgmulighed

77 VPG/Otto Knudsen77 Regelstyret indlæsning Baserer sig på 7 regler: Erklær en metode for hver produktionsregel/non-terminal [ ] medfører en if-sætning { } medfører en while-sætning | medfører en if-elseif-konstruktion Kan håndtere rekursive grammatikker

78 VPG/Otto Knudsen78 Tabelstyret indlæsning Gør brug af tilstandstabel Gør brug af aktionstabel Gør brug af ”Single Symbol Lookahead” Krav 1 og 2 stilles til grammatikkerne Kan ikke håndtere rekursive grammatikker

79 VPG/Otto Knudsen79 Tabelstyret indlæsning Tilstandstabel Indeholder tilstandsovergange Tilstandsovergange beskriver, hvilke tilstande der efterfølger den aktuelle tilstand ved givent inddata Aktionstabel Indeholder aktioner Aktioner beskriver, hvad programmet skal udføre i en given tilstand ved givent inddata


Download ppt "VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer."

Lignende præsentationer


Annoncer fra Google