View
95
Download
0
Category
Preview:
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
Övning 6
www.nada.kth.se/~mhj/tilda
Syntax
Prioritetskö
Hemtal
Syntax
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
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}
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)
<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
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)
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()); } }
Testning
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 | Å | Ä | Ö
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
Prioritetskö
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
Kö
Prioritetskö
// x blir 3
// x blir 2
// x blir 1
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
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
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
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
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
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()); }
}
Recommended