Download præsentationen
Præsentation er lastning. Vent venligst
Offentliggjort afLene Johnsen Redigeret for ca. et år siden
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
Lignende præsentationer
© 2024 SlidePlayer.dk Inc.
All rights reserved.