Præsentation er lastning. Vent venligst

Præsentation er lastning. Vent venligst

SDP - Repetition Sockets Trådning Delegater Remoting Sprogteori

Lignende præsentationer


Præsentationer af emnet: "SDP - Repetition Sockets Trådning Delegater Remoting Sprogteori"— Præsentationens transcript:

1 SDP - Repetition Sockets Trådning Delegater Remoting Sprogteori
Repetition/Otto Knudsen

2 Sockets Logiske endepunkter mellem server og klient
På applikationsniveauet betragtes Sockets som pålidelige Sockets optræder parvis Til en Socket er der via en NetworkStream knyttet både en StreamReader StreamWriter Klientens StreamReader er forbundet til serverens StreamWriter og omvendt Repetition/Otto Knudsen

3 Sockets - Arkitektur Repetition/Otto Knudsen

4 Sockets - Serversiden Repetition/Otto Knudsen
Skab en TcpListener på port (fx) TcpListener server = new TcpListener(IPAddress.Any, 20001); server.Start(); Vent på forespørgsel fra klient while(true) { Socket klient = server.AcceptSocket(); } Skab StreamReader og StreamWriter ud fra Socket NetworkStream stream = new NetworkStream(klient); StreamReader reader = new StreamReader(stream); StreamWriter writer = new StreamWriter(stream); writer.AutoFlush = true; Send og modtag via StreamReader og StreamWriter reader.ReadLine(); writer.WriteLine(); Luk strømme og Sockets Repetition/Otto Knudsen

5 Sockets - Klientsiden Skab en Socket til serveren
TcpClient server = new TcpClient(”localhost”, 20001); Skab StreamReader og StreamWriter ud fra Socket NetworkStream stream = server.GetStream(); StreamReader reader = new StreamReader(stream); StreamWriter writer = new StreamWriter(stream); writer.AutoFlush = true; Send og modtag via StreamReader og StreamWriter reader.ReadLine(); writer.WriteLine(); Luk strømme og Socket Repetition/Otto Knudsen

6 Flere samtidige klienter
Server class Server { public static void) { TcpListener server = new TcpListener(IPAddress.Any, 20001) server.Start(); while (true) { Socket klient = server.AcceptSocket(); new Thread(new ThreadStart(new ClientHandler(klient).Run)).Start(); } Repetition/Otto Knudsen

7 Flere samtidige klienter
ClientHandler class ClientHandler { private Socket incoming; public ClientHandler(Socket incoming) { this.incoming = incoming; } public void Run() { // Instantiér ind- og ud-strøm while (true) { // Kommunikér Repetition/Otto Knudsen

8 Hvorfor trådning? Performance Responsivness Repetition/Otto Knudsen

9 Succeskriterier Forbedring af performance Forbedring af responsivness
Opgaverne skal være uafhængige Jo flere afhængige opgaver, jo mindre forbedring Forbedring af responsivness Responsivness er et spørgsmål om oplevelse Jo længere tid en opgave tager, jo mindre virksom opleves applikationen, hvis brugeren ikke har noget at lave eller se på Repetition/Otto Knudsen

10 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 Repetition/Otto Knudsen

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

12 Trådskifte CPU’en skifter til en ny tråd …
Efter et givent tidsrum, eller Når en tråd venter på færdiggørelsen af en opgave, fx en I/O-operation … Repetition/Otto Knudsen

13 Processer vs. Tråde Der er mindst to former for samtidighed:
Multiprocessing Multithreading Repetition/Otto Knudsen

14 Multiprocessing Samtidighed på tværs af applikationer
Til heavy-weight opgaver (IIS, SQL, Server, …) Hver proces eksekverer én enkelt tråd Repetition/Otto Knudsen

15 Multithreading Samtidighed i applikationer
Forskellige tråde udfører forskellige opgaver Perfekt til light-weight opgaver (Metodekald, UI-opdateringer, …) Repetition/Otto Knudsen

16 Multithreading Samtidighed i .NET Tråde håndteres af CLR
Tråde har deres egen stak (locals), men deler globals og heap Repetition/Otto Knudsen

17 Instantiering af tråde
Tråde kaldes ikke, de startes … Man kan derfor ikke medsende parametre, modtage returværdi og fange exceptions på sædvanlig vis Trådet kode skal håndtere fejl … Uhåndterede fejl vil terminere applikationen Gør designet simpelt … Trådning er et minefelt – fælles ressourcer giver anledning til kritiske sektioner, race conditions, deadlock, … Repetition/Otto Knudsen

18 Instantiering af tråde
public static void Main() { Thread t; t = new Thread(new ThreadStart(Run)); t.Start() } public static void Run() { // kode Repetition/Otto Knudsen

19 Trådes livscyklus Repetition/Otto Knudsen

20 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 Repetition/Otto Knudsen

21 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 Repetition/Otto Knudsen

22 Single Threaded Execution
Vha. lock(obj) opnår en tråd eneret på et objekt – en lås Låsen frigives, når tråden forlader det kritiske område eller ved kald af metoden Monitor.Wait(obj) på objektet. Kritiske områder på samme objekt deler samme lås! Repetition/Otto Knudsen

23 Liveness problemer Starvation (udhungring) Dormancy (dvale)
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 Monitor.Pulse() 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) Repetition/Otto Knudsen

24 Brug af lock() 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 Repetition/Otto Knudsen

25 lock vs. Monitor.Enter/Exit
lock(obj) er et alias for: try { Monitor.Enter(obj); // kode ... Monitor.Exit(obj); } catch { } finally { Repetition/Otto Knudsen

26 Monitor Monitor Formål
indkapsler fælles ressourcer som private attributter og sikrer trådene enetilgang vha. lock() til de kritiske områder Formål Overvågning af trådes adgang til fælles ressourcer Repetition/Otto Knudsen

27 Monitor Objekt, hvor de fælles ressourcer er samlet som attributter
Der er udelelig adgang til monitorens kritiske områder Én monitor-lock pr. kritisk område Repetition/Otto Knudsen

28 Early notification Problem Konsekvens Løsning Konklusion
Monitor.Pulse() sendes før betingelserne for Monitor.Wait er opfyldt Konsekvens Wait-tråden vækkes før tid Løsning Gentjek betingelserne for Monitor.Wait, når Wait-tråden vækkes Konklusion Anvend altid while (i stedet for if) i forbindelse med check af wait-betingelser Repetition/Otto Knudsen

29 Early notification Repetition/Otto Knudsen Bufferen er tom!
C1-tråden er i Wait-tilstand P-tråden generer et nyt element og kalder monitorens synkroniserede put-metode C1-tråden underrettes via Pulse, og tråden går i ready-tilstand P-tråden forlader monitorens put-metode og slipper objekt-låsen på monitoren Bufferen indeholder nu ét element! Trådskifte! C2-tråden trækker et element fra bufferen ved at kalde monitorens get-metode C2-tråden forlader monitorens get-metode og slipper objekt-låsen på monitoren Der er ingen elementer i bufferen! 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! Repetition/Otto Knudsen

30 Guarded Suspension public void Put(int data) { lock(this) {
while (queue.Full) Monitor.Wait(this); if (queue.Empty) Monitor.PulseAll(this); this.queue.Enqueue(data); } Repetition/Otto Knudsen

31 Guarded Suspension public void Get(int data) { lock(this) {
while (queue.Empty) Monitor.Wait(this); if (queue.Full) Monitor.PulseAll(this); this.queue.Dequeue(data); } Repetition/Otto Knudsen

32 Design af trådet applikation
Anvend Producer-Consumer mønstret Anvend de 10 gode trådråd Husk den gyldne regel Repetition/Otto Knudsen

33 10 gode trådråd Bestem tråde Bestem trådmetoder
Bestem fælles ressourcer Bestem monitorer - Én monitor for hver uafhængig fælles ressource Bestem monitor-klasser Bestem kritiske sektioner Bestem Wait/Pulse – Et par for hver tilstand, som kræver, at en tråd venter på en anden Fordel Wait og Pulse (Husk ”Guarded Suspension”-mønstret) Lav pseudo-kode for monitor-klassernes metoder Lav pseudo-kode for tråd-klassernes run-metoder Repetition/Otto Knudsen

34 Den gyldne UI-regel UI-baserede .NET-applikationer
Den tråd, som har skabt UI’en ejer UI’en – Ingen anden tråd må tilgå UI’ens kontrolelementer … Repetition/Otto Knudsen

35 Delegater Delegater er objekter, der refererer til en metode – tænk ”funktionspointer” delegate private void MinMethod(...) { . } - med delegater kan man kalde en underliggende metode på en typesikker måde - med delegater kan man arbejde med metodereferencer på en objektorienteret facon Repetition/Otto Knudsen

36 Window Forms Hvordan ved en knap, hvilken metode den skal kalde ved et click-event? Det ved den heller ikke! Den kalder metoden bagved delegaten … Button Click: delegate private void btnAdd_Click(object sender, EventArgs e) { int i, j, k; i = int.Parse(this.txtNumber1.Text); j = int.Parse(this.txtNumber2.Text); k = i + j; System.Windows.Forms.MessageBox.Show("Sum = " + k); } Repetition/Otto Knudsen

37 Delegat-baseret kode i VS
. this.btnAdd = new Button(); this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); Repetition/Otto Knudsen

38 Remoting Klienten ser serveren som en assembly (dll)
Client.exe (.NET) Server.exe (.NET) Klienten ser serveren som en assembly (dll) Referencen sættes på sædvanlig vis … Serveren gør dll’en tilgængelig på flg. måder Tjeneste på en server, der svarer på kald fra klienter. Effektivt! Integreret i en web-tjeneste, der kaldes via URL. ”Firewall-venligt”! Repetition/Otto Knudsen

39 Komponent-dll MBR-objekter arver fra MarshalByRefObject
MBV-objekter skal være Serializable namespace Komponent { public class Beregningsobjekt : System.MarshalByRefObject { private static int Objekttæller = 0; private int ObjektID; // Konstruktør public Beregningsobjekt() { this.ObjektID = ++Objekttæller; } public DataObjekt HentDataObject() { return new DataObjekt(); namespace Komponent { [System.Serializable()] public class DataObjekt { . } Repetition/Otto Knudsen

40 Remoting - arkitektur Generel arkitektur
Proxy, stub, formattering og channel kan ændres. Fx er en binær formattering, der både understøttes af TCP og HTTP, mere effektiv end en tekstbaseret (XML) Server stub remoting formatter listener Client proxy remoting formatter channel Repetition/Otto Knudsen

41 Remoting - Design Designbeslutning: MBRO eller MBVO? Gængs praksis:
Med andre ord: ”Hvor skal objekterne leve?” MBRO lever på serveren MBVO lever på klienten Gængs praksis: Beregninger sker på serveren  MBRO Fx søgning og køb på en ehandel Tilstande bevares på klienten  MBVO Fx indkøbskurv på en ehandel håndteres af klienten Repetition/Otto Knudsen

42 MBRO - muligheder Server-activated object (SAO) også betegnet ”Wellknown objects” Singleton: Ét serverobjekt til alle klienter Trådproblemer SingleCall: Ét objekt pr. metodekald Nemmeste løsning; men mindst effektivt Tilstand opretholdes vha. filer eller database Client-activated object (CAO) Activated: Ét objekt pr. klient Levetidsproblem – Leasing understøttes ikke af IIS Repetition/Otto Knudsen

43 MBVO - muligheder Egenudviklede klasser .NET collection og db-klasser
Kan udføre special-opgaver på klienten .NET collection og db-klasser Eksempelvis DataSet er en meget brugbar klasse til at overføre data … Repetition/Otto Knudsen

44 Minimér udrulning på klienten
Hvad skal udrulles på klienten? Som udgangspunkt: Konkrete implementationer af alle MBRO- og MBVO-klasser Dette vil vi som regel gerne minimere … Mulige tilgange: Definér MBRO vha. interfaces og udrul Interface.dll Definér MBVO vha. .NET-klasser som fx DataSet Repetition/Otto Knudsen

45 Design - Server Minimér antal kald fra klient til server, da:
Ethvert kald går via netværket Ethvert kald er et potentielt nyt server-objekt Ethvert kald involverer marshalling Enhver reference til en property er også et kald Svartider er uforudsigelige … Retningslinjer: Færre og større metoder Metoder er transaktioner – Commit/Rollback før return Repetition/Otto Knudsen

46 Design - Klient Anvend factory-klasser og .config-filen
Factory-klasser skjuler instantieringslogik Konfigurationsfilen kan specificere URL, formattering, channels, osv. Konfigurationsfilen kan redirigere new til at instantiere på serveren Repetition/Otto Knudsen

47 MathLibrary.dll namespace MathLibrary {
public class SimpleMath : MarshalByRefObject { private static int classCount = 0; private int instanceCount; public SimpleMath() { this.instanceCount = ++SimpleMath.classCount; } public int Add(int a, int b) { return a + b; public int Sub(int a, int b) { return a - b; public int Count { get { return this.instanceCount; } } Repetition/Otto Knudsen

48 SAO - Wellknown Objects
namespace MathServer { class Program { static void Main(string[] args) { ChannelServices.RegisterChannel(new HttpChannel(20001), false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleMath), "SimpleMath.soap", WellKnownObjectMode.SingleCall); } namespace MathKlient { class Program { static void Main(string[] args) { RemotingConfiguration.RegisterWellKnownClientType(typeof(SimpleMath), " SimpleMath math = new SimpleMath(); } Repetition/Otto Knudsen

49 SAO – Activator.GetObject
namespace MathServer { class Program { static void Main(string[] args) { ChannelServices.RegisterChannel(new HttpChannel(20001), false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(SimpleMath), "SimpleMath.soap", WellKnownObjectMode.SingleCall); } namespace MathKlient { class Program { static void Main(string[] args) { ISimpleMath math = (ISimpleMath)(Activator.GetObject( typeof(ISimpleMath), " } Repetition/Otto Knudsen

50 Remoting gennem interface
namespace IMathLibrary { public interface ISimpleMath { int Add(int a, int b); int Sub(int a, int b); int Count {get;} } namespace MathLibrary { public class SimpleMath : MarshalByRefObject, IMathLibrary.ISimpleMath private static int classCount = 0; private int instanceCount; public SimpleMath() {this.instanceCount = ++SimpleMath.classCount; } public int Add(int a, int b) {return a + b;} public int Sub(int a, int b) {return a - b;} public int Count { get { return this.instanceCount; } } } Repetition/Otto Knudsen

51 CAO namespace MathServer { class Program {
static void Main(string[] args) { ChannelServices.RegisterChannel(new HttpChannel(20001), false); RemotingConfiguration.RegisterActivatedServiceType(typeof(SimpleMath)); } namespace MathKlient { class Program { static void Main(string[] args) { RemotingConfiguration.RegisterActivatedClientType(typeof(SimpleMath), " SimpleMath math = new SimpleMath(); } Repetition/Otto Knudsen

52 Serveropsætning med .config-filen
Konfigurér og start serveren vha: RemotingConfiguration.Configure("???.exe.config", false); <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" objectUri="SimpleMath.soap" type="MathLibrary.SimpleMath, MathLibrary" /> <!-- <activated type="MathLibrary.SimpleMath, MathLibrary" /> --> </service> <channels> <channel ref="http" port="20001" /> </channels> </application> </system.runtime.remoting> Repetition/Otto Knudsen

53 Klientopsætning med .config-filen
Konfigurér klient vha. nedenstående og skab remote-objekt med new: RemotingConfiguration.Configure("???.exe.config", false); </system.runtime.remoting> <application> <client displayName="MathKlientConfig"> <wellknown type="SimpleMath, MathLibrary" url=" /> </client> <channels> <channel ref="http" /> </channels> <!-- <client url=" <activated type="SimpleMath, MathLibrary"></activated> --> </application> Repetition/Otto Knudsen

54 Remoting med web-server
Den letteste måde at lave remoting er vha. IIS: IIS .DLL Klient.exe URL Server Repetition/Otto Knudsen

55 Hvordan? Der er fire punkter … Lav en komponent-dll til remoting
Lav en web-applikation til at host’e dll’en Konfigurér web-serveren På klienten refereres til dll’en og objekterne skabes på serveren Repetition/Otto Knudsen

56 Design af web-serveren
Beregningsobjekter lever på serveren Ét objekt pr. klient Dataobjekter overføres til klienten Marshalling Klient Data Data Beregn kald Proxy Stub Server Repetition/Otto Knudsen

57 Terminologi Beregningsobjekter er single-call MBRO
Hvert RPC genererer et nyt beregningsobjekt på serveren Dataobjekter er MBVO De serialiseres og flyttes fysisk til klienten Repetition/Otto Knudsen

58 Konfiguration af web-serveren
Tilføj følgende til web.config: Konfigurér IIS til at mappe til URL’ens extension, (.rem), til remoting URL-forespørgslen mappes nu til MathLibrary.SimpleMath <system.runtime.remoting> <application> <service> <wellknown mode="SingleCall" objectUri="SimpleMath.rem" type="MathLibrary.SimpleMath, MathLibrary"> </wellknown> </service> </application> </system.runtime.remoting> Repetition/Otto Knudsen

59 Konfiguration af klienten
Sæt referencen til dll’en på sædvanlig vis tilgå objektet vha. RegisterWellKnownClientType() og new eller Activator.GetObject() eller konfigurér vha. .config-filen herunder: <system.runtime.remoting> <application> <client> <wellknown type="MathLibrary.SimpleMath, MathLibrary" url=" </wellknown> </client> </application> </system.runtime.remoting> Repetition/Otto Knudsen

60 Bemærk Hosting på IIS forsimpler udviklingen
Nyt objekt for hvert kald forsimpler håndtering af hukommelse Nyt objekt for hvert kald forhindrer bevarelse af tilstand – mere skalérbart, men tilstande skal nu bevares i en fil, database eller på klienten … Repetition/Otto Knudsen

61 Sproghistorie Syntaks (struktur) Semantik (Indhold)
Repetition/Otto Knudsen

62 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 Repetition/Otto Knudsen

63 Sprogteori – Kompiler Kompiler
Kildekode –> Kompiler –> Binær kode Repetition/Otto Knudsen

64 Sprogteori – Kompiler Kompilertyper Single Pass Multi Pass Load and go
Debugging Optimering Repetition/Otto Knudsen

65 Sprogteori – Kompiler Kompiler Analyse (nedbryde)
Leksikalsk analyse Scanning, Tokenizing Syntaksanalyse – Parsing Hierarkisk analyse Semantisk analyse Syntese (sammensætte) Repetition/Otto Knudsen

66 Sprogteori – EBNF BNF EBNF Backus-Naur-Form
Extended Backus-Naur-Form Udvidet med { } og [ ] Findes i flere varianter Repetition/Otto Knudsen

67 Sprogteori - Analyse Leksikalsk analyse Syntaksanalyse – Parsing
Opsplitning af input i brikker Syntaksanalyse – Parsing Sammensætning af brikker til sætninger, som opfylder en velbeskrevet struktur (mønster) Repetition/Otto Knudsen

68 EBNF – Elementer En EBNF-grammatik består af Produktionsregler
Terminaler Nonterminaler Startsymbol Repetition/Otto Knudsen

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

70 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"|. Repetition/Otto Knudsen

71 EBNF EBNF-grammatikken
Syntaktiske regler Beskriver, hvordan ”byggeklodserne” sammensættes … Semantiske regler Beskriver hvilke sammensætninger, der giver mening … Repetition/Otto Knudsen

72 EBNF Semantiske krav i EBNF-grammatikken Undgå derfor:
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! Repetition/Otto Knudsen

73 Syntaksstyret indlæsning
Kontrol af, hvorvidt inddata overholder de syntaktiske krav beskrevet i EBNF-grammatikken 3 metoder Regelstyret indlæsning Tabelstyret indlæsning State Pattern "Single Symbol Lookahead" Repetition/Otto Knudsen

74 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 Repetition/Otto Knudsen

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

76 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 Repetition/Otto Knudsen

77 EBNF – Eksempel 1 Medlemsliste-EBNF Konkretiseret EBNF Valgte brikker
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 medlem = navn fødselsår [kategori] semikolon. kategori = junior|senior. Valgte brikker semikolon, navn, fødselsår, junior, senior, andet, slut Repetition/Otto Knudsen

78 EBNF – Eksempel 2 Talfølge-EBNF Konkretiseret EBNF Valgte brikker
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 Repetition/Otto Knudsen

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

80 EBNF-grammatikker Typer af EBNF-grammatikker
Direkte rekursiv Grammatik, 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 Repetition/Otto Knudsen

81 Regelstyret indlæsning
Betegnelser f, f1, f2, … , fn 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 Repetition/Otto Knudsen

82 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 Repetition/Otto Knudsen

83 first n = f1f2 n = f1|f2 n1 = [f1] n2 = {f1} first(b) = {b}
first(n) = first(f1f2) = first(f1), f1 ≠  first(n) = first(f1f2) = first(f1)  first(f2) n = f1|f2 first(n) = first(f1|f2) = first(f1)  first(f2) n1 = [f1] first(n1) = first(|f1) = first(f1) n2 = {f1} first(n2) = first(|f1n2) = first(f1) Repetition/Otto Knudsen

84 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} Repetition/Otto Knudsen

85 follow n = f1sf2 n = f1[s]f2 n = f1{s}f2 n = f1{s}
follow(startsymbol) =  n = f1sf2 n = f1[s]f2 n = f1{s}f2 follow(s) indeholder first(f2) follow(s) indeholder follow(n), hvis f2 kan være  n = f1{s} follow(s) indeholder first(s) Repetition/Otto Knudsen

86 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} Repetition/Otto Knudsen

87 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} Repetition/Otto Knudsen

88 Krav til EBNF-grammatikken
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 Repetition/Otto Knudsen

89 Krav til EBNF-grammatikken
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 Repetition/Otto Knudsen

90 Krav til EBNF-grammatikken
Hvis krav 1 og 2 ikke er opfyldte Omskriv EBNF’en vha. venstrefaktorisering Lav ny EBNF … Repetition/Otto Knudsen

91 Venstrefaktorisering
Givet n = ff1 | ff2| ... | ffn | andet (valgmulighed med fælles præfix f) Erstat n med følgende: n = f tmp | andet tmp = f1 | f2 | ... | fn Gentag indtil alle produktionsregler er renset for valgmuligheder med fælles præfix Bemærk, at produktionsregler med { } og [ ] implicit indeholder en valgmulighed Repetition/Otto Knudsen

92 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 Repetition/Otto Knudsen

93 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 Repetition/Otto Knudsen

94 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 Repetition/Otto Knudsen


Download ppt "SDP - Repetition Sockets Trådning Delegater Remoting Sprogteori"

Lignende præsentationer


Annoncer fra Google