Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

Skanning – del I 4/4/2017.

Liknende presentasjoner


Presentasjon om: "Skanning – del I 4/4/2017."— Utskrift av presentasjonen:

1 Skanning – del I 4/4/2017

2 Skanning: innhold (begge forelesningene)
Hva gjør en skanner? Input: Programteksten. Output: Ett og ett token fra programteksten (sekvensielt). Regulære uttrykk/definisjoner. For å beskrive de ulike tokenklassene. Deterministiske automater (DFAer). For å kjenne igjen de enkelt tokens. Implementasjon av DFAer. Ikke-deterministiske automater (NFAer). For enklere overgang fra regulære uttrykk. Overgang fra NFAer til DFAer. 4/4/2017

3 Hva skanneren gjør Hovedmål
Lage et program (funksjon, prosedyre, metode) som leverer ett og ett token, med all nødvendig informasjon Vanlige regler Hvert token skal gjøres så langt som mulig innenfor beskrivelsen Dersom et token kan passe med flere beskrivelser må det finnes regler om valg: Typisk: Kan det være både nøkkelord og navn, så skal det ansees som nøkkelord Blank, linjeskift, TAB og kommentar angir skille mellom tokens, men skal forøvrig fjernes (”white space”) Delimeters – white space abc=def: = skilletegn mellem to identifiers, fordi = ikke er lov I identifiers 4/4/2017

4 Hva scanneren gjør Vanlig invariant: Pilen peker på første tegn etter det siste token som ble lest. Ved + skal da denne pekeren flyttes! Tegnet pilen peker på ligger gjerne i en gitt variabel ’curChar’ e-lign. 4/4/2017

5 Fortran – spesielle regler for oppdeling i tokens
Mellomrom (whitespace) uten betydning Ingen reserverte ord I F ( X 2 . EQ. 0) THE N IF(X2.EQ.0)THEN IF(IF.EQ.0)THENTHEN=1.0 DO99I=1,10 DO99I=1.10 DO 99 I=1,10 - 99 CONTINUE 4/4/2017

6 Klassifisering Hva som er en god klassifisering blir ikke klart før senere i kompilatoren Mulig regel: Det som skal behandles likt under syntaktisk analyse skal i samme klasse. Selve tokenet angir klassen hvilket leksem det er angis ved attributter Det enkleste er å angi selve teksten (f.eks. string value) som attributt Men ofte vil scanneren også: Sette navn i tabell, og gi med indeksen som attributt Sette tekst-konstanter i tabell, og angi indeksen som attributt beregne tallkonstanter, og angi verdien som attributt 4/4/2017

7 En mulig klassifisering
Navn (identifikator): abc25 Heltallskonstant: Reell konstant: E3 Boolsk konstant: true false Tekst-konstant: ”dette er en tekstkonstant” Aritmetisk operator: * / Relasjons-operator: < <= >= > = <> Logisk operator: and or not Alle andre tokens i hver sin gruppe, f.eks.: nøkkelord ( ) [ ] { } := , ; . MEN: Langt fra klart at denne blir den beste …… 4/4/2017

8 C-typer som kan representere et token
Hovedklassifikasjonen Selve teksten, eller verdien Hvis man vil lagre bare ett attributt: 4/4/2017

9 En scanner er ikke stor og vanskelig
De forskjellige token-klassene kan lett beskrives i prosa-tekst Ut fra det kan en scanner skrives rett fram, uten særlig teori Kan typisk ta noen hundre linjer, der det samme prinsippet stadig går igjen Men, man kan ønske seg: Å angi token-klassene i en passelig formalisme Ut fra denne å automatisk få laget et scanner-program Det er dette kapittel 2 handler mest om Den scanneren for SIMUALA som vi tok over var skrevet rett frem, med utstrakt bruk av labels og gotos 4/4/2017

10 Framgangsmåte for automatisk å lage en scanner
Beskriv de forskjellige token-klassene som regulære uttrykk Eller litt mer fleksibelt, som regulære definisjoner Omarbeid dette til en NFA (Nondeterministic Finite Automaton) Er veldig rett fram Omarbeid dette til en DFA (Deterministic Finite Automaton) Dette kan gjøres med en kjent, grei algoritme En DFA kan uten videre gjøres om til et program Det er hele veien et kompliserende element at vi: ikke bare skal finne ett token, men en sekvens av token hvert token skal være så langt som mulig Vi skal se på dette i følgende rekkefølge: (1) Regulære uttrykk (2) DFAer (3) NFAer 4/4/2017

11 Definisjon av regulære uttrykk
Og det språket de definerer = mengden av strenger Presedens: *, konkatenering,| 4/4/2017

12 Eksempler - I S={a,b,c} Strenger som har nøyaktig en b
Strenger som har maks en b Strenger som har formen aaaabaaaa (dvs like mange a-er) (a | c)* b (a | c)* (a | c)* | (a | c)* b (a | c)* (a | c)* (b | e) (a | c)* (an b an) ? Toeren bruker den første, med nøyaktig een b, satt sammen med et alternativ, som gir ingen b Treren ikke mulig - regulære uttrykk husker ikke, og de kan heller ikke rekursive. 4/4/2017

13 Eksempler - II Strenger som ikke inneholder to b-er etter hverandre
(b (a | c))* en a eller c etter hver b ((a | c)* | (b (a | c))*)* kombinert med (a | c)* ((a | c) | (b (a | c)))* forenklet (a | c | ba | bc)* enda mer forenklet (a | c | ba | bc)* (b | e) får med b på slutten (notb | b notb)* (b | e) hvor notb = a | c 4/4/2017

14 Mer rasjonelle skrivemåter
r+ = rr* r? = r | e Spesielle skrivemåter for tegnmengder [0-9] [a-z] ~a ikke a ~(a | b) hverken a eller b hele S * en vilkårlig streng Gi regulære uttrykk navn (regulære definisjoner), og så bruke disse navnene videre i regulære uttrykk: digit = [0-9] nat = digit+ signedNat = (+|-)nat number = signedNat (”.” nat)?(E signedNat)? Legg merke til at højresiden på en def ikke kan inneholde venstresiden, mens dette gjerne kan være tilfellet med grammatikker. 4/4/2017

15 Deterministisk Endelig Automat
En DFA (Deterministic Finite Automaton) M består av: Σ, et alfabet S, et sett med tilstander T: S x Σ → S, en transisjons-funksjon s0 ∈ S, en start-tilstand A ⊂ S, et sett med aksepterende tilstander L(M) er språket akseptert av M, dvs alle strenger c1c2...cn med ci ∈ Σ slik at det eksisterer tilstander s1=T(s0,c1), s2=T(s1,c2), ..., sn=T(sn-1,cn) og sn ∈ A. Eksempel 4/4/2017

16 DFA identifier = letter (letter | digit )*
Funksjonen T: SxS -> S er ikke fullstendig definert Denne utvidelsen (med en feiltilstand) er underforstått Pay attention to that letter represents the set of letters, so there are really just as many transitions as there are members in this set. The error state is usually implied, and other means all characters not covered by other transitions Note that this machine does not tell what to do in each transition and what to do in accepting states – and it does not give the longest possible token. We will come back to that in a while. 4/4/2017

17 DFA for tall . . Regulære definisjoner digit = [0-9] nat = digit+
signedNat = (+|-)? nat number = signedNat (”.”nat)?(E signedNat)? . . 4/4/2017

18 DFA for kommentarer Pascal type C, C++, Java type
The first kind of comments is easily handled by regular expressions, while the second is not – therefore often treated specially. As you see it is easy to put up directly a DFA for it. This also illustrates that ‘other’ may mean different thing in different states. 4/4/2017

19 ikke flytt til neste tegn
Implementasjon 1 av DFA ikke flytt til neste tegn 1 2 3 This assures that the longest token is found – the accepting state is now moved to the state to which other makes a transition. er neste tegn et siffer: tall er neste tegn {+,-,*,/}: arit. operator ... 4/4/2017

20 hvis det bare er navn vi leter etter
Implementasjon 2 av DFA Tilstanden eksplisitt representert ved et tall hvis det bare er navn vi leter etter hvis vi også aksepterer tall, vil siffer føre oss til en ny lovlig tilstand 4/4/2017

21 Implementasjon 3 av DFA Har et fast program
Automaten ligger i en tabell 1 2 3 Fixed program, the state machines is in a table And this is how scanner generators work 4/4/2017

22 Ikke-deterministisk Endelig Automat
4/4/2017

23 NFA vs DFA Kan ofte være lett å sette opp, spesielt ut fra et regulært uttrykk Kan ses på som syntaks-diagrammer NFA DFA In order to get from regular expressions to DFA, the way around non-determistic state machines is a good idea, and you shall see why. Today we shall see how to get a NFA from REGexp. Next week we shall see how to get a DFA from a NFA. Same language: ab+ / ab* / b* ikke greit å gjøre til algoritme beskriver samme språk 4/4/2017

24 Motivasjon for å innføre NFA-er (1)
DFA-er for de enkelte token Siden de starter forskjellig går det greit å slå dem sammen, men de opprindelige automater er der ikke lenger 4/4/2017

25 Motivasjon for å innføre NFA-er (2)
Med disse token-definisjoner går det ikke med en enkel sammenslåing, da dette ikke er en DFA I dette tilfellet går det an å slå sammen på første tegn, men dette er ikke altid mulig 4/4/2017

26 Motivasjon for å innføre NFA-er (3)
Ville være greiere generelt å gjøre det slik Derfor (1) Innfører e-kant (2) Fjerner kravet om bare én a-kant ut fra hver tilstand 4/4/2017

27 Thomson-konstruksjon I
(Ethvert regulært uttrykk skal bli automat på denne formen: a a: e e: rs: 4/4/2017

28 Thomson-konstruksjon II
r | s: r*: 4/4/2017

29 Eksempel Thomson-konstruksjon
ab | a 4/4/2017


Laste ned ppt "Skanning – del I 4/4/2017."

Liknende presentasjoner


Annonser fra Google