21
Övning 6 www.nada.kth.se/~mhj/tilda

Övning 6 nada.kth.se/~mhj/tilda

  • Upload
    zaria

  • View
    90

  • Download
    0

Embed Size (px)

DESCRIPTION

Övning 6 www.nada.kth.se/~mhj/tilda. Syntax Prioritetskö Hemtal. Syntax. Iden med syntax. Mio mio = new Mio(); String s; do { System.out.println( ”Vill du spela igen?” ); s = mio.getLine(); } while (s.compareTo( ”ja” )!=0 && s.compareTo( ”nej” )!=0);. Mio mio = new Mio(); - PowerPoint PPT Presentation

Citation preview

Page 1: Övning 6 nada.kth.se/~mhj/tilda

Övning 6

www.nada.kth.se/~mhj/tilda

Page 2: Övning 6 nada.kth.se/~mhj/tilda

Syntax

Prioritetskö

Hemtal

Page 3: Övning 6 nada.kth.se/~mhj/tilda

Syntax

Page 4: Övning 6 nada.kth.se/~mhj/tilda

Iden med syntaxMio mio = new Mio();String s;do { System.out.println(”Vill du spela igen?”); s = mio.getLine();} while (s.compareTo(”ja”)!=0 && s.compareTo(”nej”)!=0);

Mio mio = new Mio();String s;do { System.out.println(”Ange en kemisk formel, t.ex. (Si(C3(COOH)2)4(H2O)7”); s = mio.getLine();} while (???);

Lösning: Definiera ett språk med en syntax (grammatik) så att:

Ag

CH4(COOH)2

Tillhör språket Tillhör EJ språket

ag

CH1(COOH))2

Page 5: Övning 6 nada.kth.se/~mhj/tilda

BNF notation (ett sätt att uttrycka en grammatik)

J. W. Backus P. Noor

Page 6: Övning 6 nada.kth.se/~mhj/tilda

BNF notation (ett sätt att uttrycka en grammatik)

<Sats> ::= <Subj> <Pred>

<Subj> ::= JAG | DU

<Pred> ::= VET | TROR

<Sats> <Subj> <Pred> JAG <Pred>

JAG TROR

{JAG VET, JAG TROR, DU VET, DU TROR}

Page 7: Övning 6 nada.kth.se/~mhj/tilda

class Ex1RekursivMedakning { private static Mio mio = new Mio();

public static void main(String [] args) { try { System.out.print("Ange en sats: "); System.out.flush(); läsSats(); if (!mio.eoln()) throw new SyntaxErrorException("Fel i slutet"); System.out.println("Din sats följer syntaxen"); } catch (SyntaxErrorException e) { System.out.println(e); } } private static void läsSats() throws SyntaxErrorException { läsSubjekt(); // JAG DU läsPredikat(); // VET TROR }

private static void läsSubjekt() throws SyntaxErrorException String ord = mio.getWord(); if (ord.equals("JAG") || ord.equals("DU")) return; else throw new SyntaxErrorException("Subjektfel"); }

private static void läsPredikat() throws SyntaxErrorException String ord = mio.getWord(); if (ord.equals("VET") || ord.equals("TROR")) return; else throw new SyntaxErrorException("Predikatfel");} }

Rekursiv medåkning (ett sätt att kontrollera om en grammatik efterföljs)

Page 8: Övning 6 nada.kth.se/~mhj/tilda

<Sats> ::= <Subj> <Pred><Subj> ::= JAG | DU<Pred> ::= VET | TROR

<Mening> <Sats> <Konj>

<Mening> ::= <Sats> | <Sats> <Konj> <Mening>

<Konj> ::= ATT | OCH

<Mening><Pred> <Konj> <Mening><Subj>

<Pred> <Konj> <Mening>JAGTROR <Konj> <Mening>JAGTROR OCH <Mening>JAGTROR OCH <Sats>JAGTROR OCH <Subj>JAG <Pred>TROR OCH JAGJAG <Pred>TROR OCH JAGJAG VET

JAG VET ATT DU VET OCH DU TROR ATT JAG VET

Page 9: Övning 6 nada.kth.se/~mhj/tilda

class Ex1RekursivMedakning { private static Mio mio = new Mio();

public static void main(String [] args) { try { System.out.print("Ange en mening: "); System.out.flush(); läsMening(); System.out.println("Din mening följer syntaxen"); } catch (SyntaxErrorException e) { System.out.println(e); } }

private static void läsMening() throws SyntaxErrorException { läsSats(); if (!mio.eoln()) { läsKonjugat(); // ATT OCH läsMening(); } } private static void läsSats() throws SyntaxErrorException { läsSubjekt(); // JAG DU läsPredikat(); // VET TROR }

private static void läsKonjugat() throws SyntaxErrorException String ord = mio.getWord(); if (ord.equals(”ATT") || ord.equals(”OCH")) return; else throw new SyntaxErrorException(”Konjugatfel"); }

private static void läsSubjekt() throws SyntaxErrorException String ord = mio.getWord(); if (ord.equals("JAG") || ord.equals("DU")) return; else throw new SyntaxErrorException("Subjektfel"); }

private static void läsPredikat() throws SyntaxErrorException String ord = mio.getWord(); if (ord.equals("VET") || ord.equals("TROR")) return; else throw new SyntaxErrorException("Predikatfel"); } }

Rekursiv medåkning (ett sätt att kontrollera om en grammatik efterföljs)

Page 10: Övning 6 nada.kth.se/~mhj/tilda

Testning

/** * <b>COhkP4(COO(OH)2)5</b> testas i * testFelMedFleraGemenaIRad. * Förväntat resultat: Misslyckat, endast COh läses * varefter SyntaxError kastas. */ public void testFelMedFleraGemenaIRad() { String testformel = "COhkP4(COO(OH)2)5"; formelkoll.mio = new MioWithInput(testformel); try { formelkoll.readFormel(); fail("SyntaxError förväntades"); } catch (SyntaxError e) { assertEquals("COh", formelkoll.formel.toString()); } }

Page 11: Övning 6 nada.kth.se/~mhj/tilda

Testning

Page 12: Övning 6 nada.kth.se/~mhj/tilda

Hemsökarnas utbildningsutskott (HUU) vill lära ut det korrekta sättet för väsenatt väsnas på. Det finns endast två korrekta andemeningar: vrål, som börjar påB, följt av valfritt antal U, och skratt, som består av en tvåbokstavskombination(H följt av en valfri vokal) upprepad valfritt antal gånger. Exempel på godkändaandemeningar är:BUBUUUUHÖHÖHÖHAHAHIHISkriv en syntax för en andemening. (6p)

Andemeningen (021019:6)

<mening> ::= <vrål> | <skratt><vrål> ::= B<un><un> ::= U | U<un><skratt> ::= H<vokal> | H<vokal><skratt><vokal> ::= A | E | I | O | U | Y | Å | Ä | Ö

Page 13: Övning 6 nada.kth.se/~mhj/tilda

Prydnad 42, 6, 11 och 17 är värdefullare än prydnad 7.Prydnad 17 och 5 är värdefullare än prydnad 1, 4 och 8.

Skriv en kontextfri grammatik i BNF-form för jämförelser av denna typ. Glöm inte punkten som avslutar jämförelsen! (6p)

Syntax för prydnadsjämförelser (020110:7)

<mening> ::= Prydnad <lista> är värdefullare än prydnad <lista>.

<lista> ::= <tal> | <talföljd> och <tal>

<talföljd> ::= <tal> | <tal>, <talföljd>

<tal> ::= <1..9> | <tal> <1..9> | <tal> 0

<1..9> ::= 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 14: Övning 6 nada.kth.se/~mhj/tilda

Prioritetskö

Page 15: Övning 6 nada.kth.se/~mhj/tilda

Prioritetskö

pq.put(1);pq.put(3);pq.put(2);x = pq.get();

queue.enqueue(1);queue.enqueue(3);queue.enqueue(2);x = queue.dequeue();

stack.push(1);stack.push(3);stack.push(2);x = stack.pop();

Stack

Prioritetskö

// x blir 3

// x blir 2

// x blir 1

Page 16: Övning 6 nada.kth.se/~mhj/tilda

Heap (används oftast för prioritetskö)

24

18 16

9 16 10

3 57

1

2 3

4 5 6 7

8 9 10

1 2 3 4 5 6 7 8 9 100

24 18 16 9 6 1 10 3 7 5

Page 17: Övning 6 nada.kth.se/~mhj/tilda

Hämta det som har högst prioritet (get)

24

16

16 10

3 5

1

2 3

4 5 6 7

8 9 10

1 2 3 4 5 6 7 8 9 100

24 18 16 9 6 1 10 3 7 5

5

9

18

7

5 5 5 518 9 7

Page 18: Övning 6 nada.kth.se/~mhj/tilda

Sätta in (put)

18

16

1 10

3

1

2 3

4 5 6 7

8 9 10

1 2 3 4 5 6 7 8 9 100

24 18 16 9 6 1 10 3 7 5

7

5

5 5 5 518 9 7

6

14

9

1414 6914

Page 19: Övning 6 nada.kth.se/~mhj/tilda

Problem:Erhåll talet (100) på kortast sätt med hjälp av talet fyra (4) och de tre räknesätten addition (+), subtraktion (-) och multiplikation (*).

Exempel: 4 * 4 + 4 + 4 * 4 + 4 = 100

Problemträd:

4

8 160

12 324 20 64124 0-4

44 4

4 4 4 4 4 4 4 4 4

Page 20: Övning 6 nada.kth.se/~mhj/tilda

Problem:Erhåll talet (100) med hjälp av talet fyra (4) och de tre räknesätten addition (+), subtraktion (-) och multiplikation (*).

496

892

1684

0100

2080

6436

1288

44 4

6832

256156

6040

4 4 4

7228

272172

6436

4 4 4

44 4

1684

6436

6832

496

7228

Page 21: Övning 6 nada.kth.se/~mhj/tilda

1. Sätt in elementen i heapen (put).2. Plocka ut elementen (get).

Heapsort

class Heapsort {

public static void main(String[] args) { Heap heap = new Heap(100); Mio mio = new Mio(); System.out.print(”Ange de ord som ska sorteras: "); System.out.flush(); while (!mio.eoln()) heap.put(mio.getWord()); while (!heap.isEmpty()) System.out.println(heap.get()); }

}