1 / 21

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

Ö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();

zaria
Download Presentation

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

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Syntax Prioritetskö Hemtal

  3. Syntax

  4. 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(); 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: CH4 CH1 (COOH)2 (COOH))2 Ag ag Tillhör språket Tillhör EJ språket

  5. BNF notation (ett sätt att uttrycka en grammatik) J. W. Backus P. Noor

  6. 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}

  7. Rekursiv medåkning (ett sätt att kontrollera om en grammatik efterföljs) 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"); } }

  8. <Mening> ::= <Sats> | <Sats> <Konj> <Mening> <Sats> ::= <Subj> <Pred> <Subj> ::= JAG | DU <Pred> ::= VET | TROR <Konj> ::= ATT | OCH <Mening> <Sats> <Konj> <Mening> <Subj> <Pred> <Konj> <Mening> JAG <Pred> <Konj> <Mening> JAG TROR <Konj> <Mening> JAG TROR OCH <Mening> JAG TROR OCH <Sats> JAG TROR OCH <Subj> <Pred> JAG TROR OCH JAG <Pred> JAG TROR OCH JAG VET JAG VET ATT DU VET OCH DU TROR ATT JAG VET

  9. Rekursiv medåkning (ett sätt att kontrollera om en grammatik efterföljs) 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"); } }

  10. 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()); } }

  11. Testning

  12. Andemeningen (021019:6) Hemsökarnas utbildningsutskott (HUU) vill lära ut det korrekta sättet för väsen att 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ända andemeningar är: BU BUUUU HÖHÖHÖ HAHAHIHI Skriv en syntax för en andemening. (6p) <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 | Å | Ä | Ö

  13. Syntax för prydnadsjämförelser (020110:7) 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) <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

  14. Prioritetskö

  15. Prioritetskö Stack stack.push(1); stack.push(3); stack.push(2); x = stack.pop(); // x blir 2 Kö queue.enqueue(1); queue.enqueue(3); queue.enqueue(2); x = queue.dequeue(); // x blir 1 Prioritetskö pq.put(1); pq.put(3); pq.put(2); x = pq.get(); // x blir 3

  16. Heap (används oftast för prioritetskö) 24 1 18 16 2 3 9 6 1 10 4 5 6 7 3 7 5 8 9 10 1 3 5 7 9 0 2 4 6 8 10 24 18 16 9 6 1 10 3 7 5

  17. Hämta det som har högst prioritet (get) 24 1 18 16 2 3 9 6 1 10 4 5 6 7 3 7 5 5 8 9 10 1 3 5 7 9 0 2 4 6 8 10 24 18 5 5 18 9 16 7 9 5 6 1 10 3 7 5 5

  18. Sätta in (put) 18 1 9 16 2 3 7 6 1 10 4 5 6 7 3 5 14 8 9 10 1 3 5 7 9 0 2 4 6 8 10 24 18 5 5 14 18 9 16 9 7 5 6 9 14 1 10 3 7 5 14 6 5

  19. - 4 * 4 + 4 - * - * - + + + * 4 4 4 4 4 4 4 4 4 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 0 8 16 -4 4 0 4 12 32 12 20 64

  20. - - - - + + + + * * * * 4 4 4 4 4 4 4 4 4 4 4 4 Problem: Erhåll talet (100) med hjälp av talet fyra (4) och de tre räknesätten addition (+), subtraktion (-) och multiplikation (*). 4 96 4 96 0 100 8 92 16 84 16 84 12 88 20 80 64 36 64 36 60 40 68 32 68 32 256 156 64 36 72 28 72 28 272 172

  21. Sätt in elementen i heapen (put). • 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()); } }

More Related