Les 3 en 4 - Grammatica's

Grammatica's
Beschrijven van taal
met grammatica
1 / 47
next
Slide 1: Slide
InformaticaMiddelbare schoolhavo, vwoLeerjaar 4-6

This lesson contains 47 slides, with interactive quizzes and text slides.

time-iconLesson duration is: 50 min

Items in this lesson

Grammatica's
Beschrijven van taal
met grammatica

Slide 1 - Slide

Leerdoel
Je kunt een grammatica gebruiken om een taal te beschrijven, deze noteren in Backus-Naurvorm, en vaststellen of bepaalde woorden voldoen aan een gegeven grammatica.

Slide 2 - Slide

Inleiding
In het Nederlands staat een bijvoeglijk nw. vóór een zelfstandig nw.:
  • Goed: ‘de hond’, ‘de grote hond’
  • Fout: ‘de hond grote’

Zulke grammaticale regels zijn er
ook voor programmeertalen
Deze regels zijn veel strikter
dan bij menselijke talen





Slide 3 - Slide

Waarom moet elke zin in een programmeertaal volledig duidelijk zijn?
A
Omdat mensen de code moeten begrijpen.
B
Omdat een computer de code moet kunnen uitvoeren.
C
Omdat programmeertalen geen leestekens gebruiken.
D
Omdat grammaticale fouten in programmeertalen niet hersteld kunnen worden.

Slide 4 - Quiz

De Backus-Naurvorm (BNF)
BNF is een makkelijke manier om grammaticaregels te noteren.

Je kunt ermee
beschrijven
welke regels je allemaal kunt
maken.








Slide 5 - Slide

Voorbeeld BNF: notitieregels voor berekeningen
Voorbeeld voor berekeningen:
  • Goed: 2 × 3, 4 – 2 en 8 ÷ 4.
  • Fout: 2 + ÷ 4

Een BNF hiervoor:          <berekening> ::= <getal> <operator> <getal>

Betekeniseen berekening bestaat uit een getal, dan een operator en dan weer een getal.








Let op de ::=-notitie!

Slide 6 - Slide

Een adres in Nederland bestaat uit een straatnaam, huisnummer, postcode en stad.

Bekijk de volgende grammatica's in BNF. Welke grammatica beschrijft een Nederlands adres?
A
<adres> ::= <straatnaam> <postcode> <plaatsnaam>
B
<adres> ::= <straatnaam> <getal> <postcode> <plaatsnaam>
C
<adres> ::= <getal> <straatnaam> <postcode> <plaatsnaam>
D
<adres> ::= <postcode> <plaatsnaam> <straatnaam> <getal>

Slide 7 - Quiz

BNF: langere berekeningen 
Bekijk nog eens de BNF: <berekening> ::= <getal> <operator> <getal> 
Hoe krijg je hiermee 2 x 3 + 1?

In dit geval mogelijk, maar niet handig:
 <berekening> ::= <getal> <operator> <getal> <operator> <getal>

Niet handig, want elke volgende uitbreiding, bijv. 2 x 3 + 1 : 2, wordt dan weer een probleem...








Slide 8 - Slide

BNF: langere berekeningen - een slimmere oplossing
Het laatste stuk is hetzelfde als de eerste BNF:
   <berekening> ::= <getal> <operator> <getal> <operator> <getal>
   <berekening> ::= <getal> <operator> <getal>

Een slimme BNF kan er dus als volgt uitzien:
   <berekening> ::= <getal> <operator> <berekening>









Slide 9 - Slide

BNF: langere berekeningen - oplossingen combineren
Deze twee BNF’s kun je combineren tot:
   <berekening> ::= <getal> <operator> <getal> |
                               <getal> <operator> <berekening>

Betekenis - een berekening is:
  • een getal, dan een operator en dan weer een getal OF
  • een getal, dan een operator en dan een andere berekening.

Met deze BNF kun je oneindig lange berekeningen maken!

| betekent of

Slide 10 - Slide

BNF: langere berekeningen - een complete oplossing
Om de oplossing compleet te maken moeten we nog aangeven welke operatoren we gebruiken:


<berekening> ::= <getal> <operator> <getal> |
                            <getal> <operator> <berekening>
<operator>      ::= + | – | × | ÷

Slide 11 - Slide

BNF: berekeningen - grammatica gebruiken ter controle
Hoe weet je of 2 × 3 en 2 × 3 + 1 correcte berekeningen zijn?
  • Begin met <berekening>
  • Vervang het stapsgewijs door wat volgende BNF mag



Slide 12 - Slide

BNF: berekeningen - grammatica gebruiken ter controle

Slide 13 - Slide

Vraag – Bewijs dat  5 × 3 + 1 een berekening is.
<getal>
<operator>
x
3
<getal>

Slide 14 - Drag question

Werken met grammatica's
Met de vervangingsstappen hebben we laten zien dat 2 × 3 + 1 inderdaad een berekening is volgens de gekozen grammaticaregels: 
  • Deze grammaticaregels noemen we  'een grammatica'. 
  • De drie regels die we hebben gebruikt, kunnen we dus 'een   grammatica voor berekeningen' noemen.
  • Grammatica’s moeten altijd zo kort mogelijk zijn, want zo zijn   ze duidelijk en overzichtelijk.

Slide 15 - Slide

Uitbreiding: Grammatica voor berekeningen met haakjes
Bij berekeningen met haakjes geldt dat er na elk openingshaakje ook altijd een keer een sluithaakje volgt. 2 × (3 + 1 is dan dus niet correct.

 De haakjesregel kunnen we als volgt verwerken in de grammatica:
<berekening>  ::=  <getal> <operator> <getal> |
                              <getal> <operator> <berekening> |                                                              <berekening> <operator> <getal> |                                                              (<berekening>) 
<operator>      ::=  + | – | × | ÷

Slide 16 - Slide

Uitbreiding: Grammatica voor berekeningen met haakjes
Met deze uitbreiding is 2 × (3 + 1) ook een correcte berekening.

Bewijs
<berekening>
<getal> <operator> <berekening>
2 × (<berekening>)
2 × (<getal> <operator> <getal>)
2 × (3 + 1)

Slide 17 - Slide

Zelf werken met grammatica's
Maak uit Fundament:
  •  Vraag 1 en 2 van 3.4
  •  Vraag 1 en 2 van 3.5


Ter illustratie doen we de eerste
opgave klassikaal.

Tip: gebruik het interactieve element.

Slide 18 - Slide

Leerdoel gehaald?
Je kunt een grammatica gebruiken om een taal te beschrijven, deze noteren in Backus-Naurvorm, en vaststellen of bepaalde woorden voldoen aan een gegeven grammatica.

Slide 19 - Slide

Voor de volgende les
Fundament

  • Lees B4 - hoofdstuk
     3.1 t/m 3.5
     door.
  • Maak vraag 1 en 2
     van hoofdstuk 3.4.
  • Maak vraag 1 en 2

     van hoofdstuk 3.5.

Slide 20 - Slide

Grammatica's
Verschillende soorten
grammatica's

Slide 21 - Slide

Leerdoel
Je kunt de BNF's voor verschillende soorten grammatica's uitleggen en gebruiken. Ook ben in je in staat om een grammatica aan te passen en uit te breiden. Tenslotte kun je uitleggen wanneer je een BNF gebruikt en wanneer een eindige automaat.

Slide 22 - Slide

Terugblik: Grammatica voor berekeningen met haakjes
Vorige les hebben we een grammatica behandeld voor berekeningen waarin haakjes voor kunnen komen:

<berekening>  ::=  <getal> <operator> <getal> |
                              <getal> <operator> <berekening> |                                                              <berekening> <operator> <getal> |                                                              (<berekening>) 
<operator>      ::=  + | – | × | ÷

Slide 23 - Slide

Terugblik: Grammatica voor berekeningen met haakjes
Met deze grammatica is bijv. 2 × (3 + 1) ook een correcte berekening.

Bewijs
<berekening>
<getal> <operator> <berekening>
2 × (<berekening>)
2 × (<getal> <operator> <getal>)
2 × (3 + 1)

Slide 24 - Slide

Soorten grammatica's
We gaan ons blik nu richten op grammatica's voor:
  • Getallen
  • Programmeertalen
  • Variabelenamen
  • Toekenningen





Slide 25 - Slide

Grammatica voor getallen
Getallen zijn opgebouwd uit de cijfers 0 t/m 9. Dat kun je zo noteren:
<cijfer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9                of als volgt:
<cijfer> ::= 0 | 1 | … | 9

Positieve gehele getallen zijn opgebouwd uit een of meer cijfers:
<positief geheel getal> ::= <cijfer> |
                                          <cijfer><positief geheel getal>
<cijfer>                          ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9


Slide 26 - Slide

Grammatica voor programmeertalen
Hoe maak je een grammatica
voor deze code?



Je hebt regels nodig voor het noteren van het gebruik van if en elif, de voorwaarde, het inspringen en voor de toekenning.

Slide 27 - Slide

Grammatica voor programmeertalen
Bijvoorbeeld een grammatica
voor een toekenning

<toekenning>  ::=  <variabele> = <uitdrukking>

  • Eerst een grammatica voor variabele
  • Daarna een grammatica voor uitdrukking

Slide 28 - Slide

Welk codevoorbeeld is er sprake van een toekenning, volgens de grammatica in de tekst:

<toekenning> ::= <variabele> = <uitdrukking>
A
prijs = 5, btw = 1.21
B
som += huidig
C
totaal = prijs * btw
D
return False

Slide 29 - Quiz

Grammatica voor een variabelenaam
Een variabelenaam mag bestaan uit hoofdletters, kleine letters, cijfers en underscores ( _ ). keywords (if, elif en else) zijn niet toegestaan. 

<variabele>  ::=  <teken> |
                           <teken><variabele>        
behalve if, elif en else
<teken>       ::=  _ |
                         <letter> |
                         <cijfer>

Slide 30 - Slide

Ook mag een variabelenaam niet beginnen met een cijfer. Waarom niet?
A
Omdat variabelen altijd met een letter moeten beginnen.
B
Omdat programmeertalen geen cijfers toestaan in variabelen.
C
Omdat dit verwarring kan veroorzaken met numerieke waarden.
D
Omdat het de code moeilijker leesbaar maakt voor mensen.

Slide 31 - Quiz

Begin variabelenaam geen cijfer?
Een variabelenaam mag niet beginnen met een cijfer omdat je dan een variabelenaam kunt maken die helemaal uit cijfers bestaat. En dan kun je niet meer zien of je met een variabele of met een getal te maken hebt.

Een variabelenaam moet dus altijd ten minste een letter of underscore
( _ ) bevatten. Vrijwel alle programmeertalen hebben als regel dat er aan het begin een letter of underscore moet staan. 

Slide 32 - Slide

Complete grammatica voor een variabelenaam
<variabele>       ::=  <letter> | _ |
                                <letter><tekenreeks> | _<tekenreeks>      
                                behalve if, elif en else
<tekenreeks>    ::= <teken> |
                               <teken><tekenreeks>
<teken>             ::=  _ |
                               <letter> |
                               <cijfer>

Slide 33 - Slide

Complete grammatica voor een variabelenaam
Welke variabele is geldig volgens deze grammatica? _h4ll0, 32test, the_end? of $tartUp?

<variabele>       ::=  <letter> | _ |
                                <letter><tekenreeks> | _<tekenreeks>      
                                behalve if, elif en else
<tekenreeks>    ::= <teken> |
                               <teken><tekenreeks>
<teken>             ::=  _ |
                               <letter> |
                               <cijfer>



Slide 34 - Slide

Welke variabele is geldig volgens de grammatica?
A
_h4ll0
B
32test
C
the_end?
D
$tartUp

Slide 35 - Quiz

Grammatica voor programmeertalen

Onze grammatica:

<toekenning>  ::=  <variabele> = <uitdrukking>

  • We hebben al een grammatica voor variabele
  • Nu nog een grammatica voor uitdrukking

Slide 36 - Slide

Grammatica voor een uitdrukking
Er zijn heel veel soorten uitdrukkingen, we beperken ons hier tot:

  • een losse waarde, bijvoorbeeld
     prijsMetKorting = 4.20
  • een losse variabele, bijvoorbeeld
     prijsMetKorting = prijs
  • een combinatie daarvan, bijvoorbeeld
     prijsMetKorting = prijs * 0.95 – 0.20


Slide 37 - Slide

Grammatica voor een uitdrukking
Een grammatica voor deze uitdrukking:

<uitdrukking>  ::= <waarde> |
                             <variabele> |
                             <uitdrukking> <operator> <uitdrukking> |                                                     (<uitdrukking>)
<operator>     ::=  + | – | * | /
<waarde>       ::=  <kommagetal> | <geheel getal>



Slide 38 - Slide

Grammatica voor een toekenning

Slide 39 - Slide

BNF en eindige automaten
Grammatica voor variabelenaam is best uitgebreid:

<variabele>       ::=  <letter> | _ |
                                <letter><tekenreeks> | _<tekenreeks>      
                                behalve if, elif en else
<tekenreeks>    ::= <teken> |
                               <teken><tekenreeks>
<teken>             ::=  _ |
                               <letter> |
                               <cijfer>

Slide 40 - Slide

Opdracht: BNF en eindige automaten
Teken een automaat die de grammatica van een variabele zo goed mogelijk beschrijft.

<variabele>       ::=  <letter> | _ |
                                <letter><tekenreeks> | _<tekenreeks>      
                                behalve if, elif en else
<tekenreeks>    ::= <teken> |
                               <teken><tekenreeks>
<teken>             ::=  _ |
                               <letter> |
                               <cijfer>

Slide 41 - Slide

Hoeveel transities heb je minimaal nodig voor deze automaat?

Slide 42 - Open question

Antwoord: BNF en eindige automaten
Soms kan het een stuk korter als een eindige automaat. Vergelijk het voortgaande eens met:


Slide 43 - Slide

Vergelijk tussen BNF en eindige automaat 
<variabele>       ::=  <letter> | _ |
                                <letter><tekenreeks> | _<tekenreeks>      behalve if, elif en else
<tekenreeks>    ::= <teken> |
                               <teken><tekenreeks>
<teken>             ::=  _ |
                               <letter> |
                               <cijfer>

Slide 44 - Slide

Vergelijk tussen BNF en eindige automaat
  • Er moet nog wel bij dat if, elif en else niet mogen
  • Op woordniveau zijn automaten soms handiger dan een BNF
  • Op zinsniveau is een BNF vrijwel altijd het handigst



Slide 45 - Slide

Leerdoel gehaald?
Je kunt de BNF's voor verschillende soorten grammatica's uitleggen en gebruiken. Ook ben in je in staat om een grammatica aan te passen en uit te breiden. Tenslotte kun je uitleggen wanneer je een BNF gebruikt en wanneer een eindige automaat.

Slide 46 - Slide

Voor de volgende les
Fundament

  • Lees B4 - hoofdstuk
     3.6 t/m 3.10
     door.
  • Maak vraag 2 van hoofdstuk 3.8.
  • Maak vraag 1 en 2 van
     hoofdstuk 3.9.

Slide 47 - Slide