Les 3 en 4 - Grammatica's

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

In deze les zitten 47 slides, met interactieve quizzen en tekstslides.

time-iconLesduur is: 50 min

Onderdelen in deze les

Grammatica's
Beschrijven van taal
met grammatica

Slide 1 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Quizvraag

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 - Tekstslide

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 - Tekstslide

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 - Quizvraag

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

BNF: berekeningen - grammatica gebruiken ter controle

Slide 13 - Tekstslide

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

Slide 14 - Sleepvraag

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

Grammatica's
Verschillende soorten
grammatica's

Slide 21 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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





Slide 25 - Tekstslide

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 - Tekstslide

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 - Tekstslide

Grammatica voor programmeertalen
Bijvoorbeeld een grammatica
voor een toekenning

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

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

Slide 28 - Tekstslide

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 - Quizvraag

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 - Tekstslide

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 - Quizvraag

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 - Tekstslide

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

Slide 33 - Tekstslide

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 - Tekstslide

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

Slide 35 - Quizvraag

Grammatica voor programmeertalen

Onze grammatica:

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

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

Slide 36 - Tekstslide

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 - Tekstslide

Grammatica voor een uitdrukking
Een grammatica voor deze uitdrukking:

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



Slide 38 - Tekstslide

Grammatica voor een toekenning

Slide 39 - Tekstslide

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 - Tekstslide

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 - Tekstslide

Hoeveel transities heb je minimaal nodig voor deze automaat?

Slide 42 - Open vraag

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


Slide 43 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide

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 - Tekstslide