210 likes | 457 Views
Ö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();
E N D
Övning 6 www.nada.kth.se/~mhj/tilda
Syntax Prioritetskö Hemtal
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
BNF notation (ett sätt att uttrycka en grammatik) J. W. Backus P. Noor
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}
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"); } }
<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
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"); } }
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()); } }
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 | Å | Ä | Ö
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
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
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
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
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
- 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
- - - - + + + + * * * * 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
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()); } }