-
Notifications
You must be signed in to change notification settings - Fork 0
Tekst ontleden
Een waarde van type string
is gelijkaardig aan een array: je kan er de lengte van opvragen met String.length
en je kan het teken op positie N van een tekst s
opvragen met s.[N]
.
Oefening:
- Definieer de functie
tekens_van
die, gegeven een stuk tekst, de lijst van de tekens van deze tekst berekent. Bijvoorbeeld:tekens_van "Hallo"
evalueert tot['H'; 'a'; 'l'; 'l'; 'o']
. Je hebt hiervoor een hulpfunctietekens_van_vanaf
nodig, die de lijst van de tekens van een gegeven tekst vanaf een gegeven positie berekent.
De match
-uitdrukking kan toegepast worden op tekens. De volgende functie berekent bijvoorbeeld of een gegeven letter een hoofdletter is:
let is_hoofdletter letter =
match letter with
'A'..'Z' -> true
| _ -> false
Het patroon _
matcht eender welke waarde. Een match
-uitdrukking mag meerdere clausules hebben die eenzelfde waarde matchen. De eerste clausule waarvan het patroon de gegeven waarde matcht, bepaalt de waarde van de match
-uitdrukking.
Oefening:
- Definieer de functie
allemaal_hoofdletters
die, gegeven een stuk tekst,true
teruggeeft als en slechts als de tekst volledig uit hoofdletters bestaat.
Een lijst van tekens omzetten naar een stuk tekst is nogal complex:
let string_of_chars cs =
let a = Array.of_list cs in
String.init (Array.length a) (fun i -> a.(i))
Oefening:
- Definieer de functie
zonder_spaties_vooraan
die het gegeven stuk tekst teruggeeft, maar dan zonder de spaties vooraan. Bijvoorbeeld:zonder_spaties_vooraan " Hallo"
evalueert tot"Hallo"
enzonder_spaties_vooraan "Daag"
evalueert tot"Daag"
.
Oefening:
- Definieer de functie
eerste_woord_van
die, gegeven een lijst van tekens, een lijst met de tekens van het eerste woord van deze tekst teruggeeft. Woorden worden gescheiden door spaties. Bijvoorbeeld:eerste_woord_van ['I'; 'k'; ' '; 'b'; 'e'; 'n']
evalueert tot['I'; 'k']
.
Oefening:
- Definieer de functie
splits_eerste_woord_van
die, gegeven een lijst van tekens, een paar teruggeeft met daarin de lijst met de tekens van het eerste woord van deze tekst en de lijst met de tekens van de rest van de tekst. Woorden worden gescheiden door spaties. Bijvoorbeeld:splits_eerste_woord_van ['I'; 'k'; ' '; 'b'; 'e'; 'n']
evalueert tot(['I'; 'k'], [' '; 'b'; 'e'; 'n'])
.
Oefening:
- Definieer de functie
woorden_van
die, gegeven een lijst van tekens, een lijst berekent met alle woorden van deze tekst. Woorden worden gescheiden door spaties. Bijvoorbeeld:woorden_van ['I'; 'k'; ' '; 'b'; 'e'; 'n']
evalueert tot["Ik"; "ben"]
.
Oefening:
- Definieer de functie
tokens_van
die, gegeven een tekstvoorstelling van een uitdrukking, de lijst van de tokens van deze tekstvoorstelling berekent. Bijvoorbeeld:tokens_van "(42 + 3) * 2"
evalueert tot["("; "42"; "+"; "3"; ")"; "*"; "2"]
.
We definiëren de notie van bomen van tekens, waarbij elk blad van de boom een teken bevat:
type tekenboom =
Blad of char
| Vertakking of tekenboom * tekenboom
Een beknopte notatie voor tekenbomen is als volgt: ((ab)c)
stelt de tekenboom Vertakking (Vertakking (Blad 'a', Blad 'b'), Blad 'c')
voor.
Oefening:
- Definieer de functie
splits_tekenboom_van_tekens
die, gegeven een lijst van tekens die begint met een beknopte notatie van een tekenboom, een paar teruggeeft met de tekenboom en een lijst met de overblijvende tekens. Bijvoorbeeld:splits_tekenboom_van_tekens ['a'; 'b']
evalueert tot(Blad 'a', ['b'])
ensplits_tekenboom_van_tekens ['('; 'a'; 'b'; ')'; 'c']
evalueert tot(Vertakking (Blad 'a', Blad 'b'), ['c'])
.
We kunnen onze afstamming als volgt noteren:
type afstamming =
Ongekend
| Gekend of string * afstamming * afstamming
Stel: Jan kent zijn ouders, Anton en Lea. Hij kent ook de ouders van zijn vader: Achilles en Maria, en die van zijn moeder: Charles en Elisabeth. Hij kent ook de vader Henri van Achilles, maar geen andere overgrootouders. Dan kan Jan zijn afstamming als volgt noteren:
Gekend ("Jan",
Gekend("Anton",
Gekend ("Achilles",
Gekend ("Henri", Ongekend, Ongekend),
Ongekend),
Gekend ("Maria", Ongekend, Ongekend)),
Gekend ("Lea",
Gekend ("Charles", Ongekend, Ongekend),
Gekend ("Elisabeth", Ongekend, Ongekend)))
Een beknoptere notatie hiervoor is als volgt:
Jan(Anton(Achilles(Henri,),Maria(,)),Lea(Charles(,),Elisabeth(,)))
Oefening:
- Definieer een functie
afstamming_van
, die gegeven een beknopte tekstvoorstelling van een afstamming, de afstamming berekent. Hint: definieer een hulpfunctiesplits_afstamming_van
, die gegeven een lijst van tekens, een paar teruggeeft met een beknopte tekstvoorstelling van een afstamming en de overblijvende tekens. Gebruik hierbijsplits_eerste_woord_van
.
Oefening:
- Definieer een functie
splits_uitdrukking_van
, die gegeven een lijst van tokens (zie hierboven) die begint met een voorstelling van een uitdrukking waarbij elke complexe deel-uitdrukking (dus elke deel-uitdrukking die geen getal-uitdrukking is) tussen haakjes staat, een paar teruggeeft met die uitdrukking en de lijst van de overblijvende tokens. Bijvoorbeeld:splits_uitdrukking_van ["("; "42"; "+"; "3"; ")"; "+"; "5"]
evalueert tot(SomUitdrukking (GetalUitdrukking 42, GetalUitdrukking 3), ["+"; "5"])
. (Merk op dat we (42 + 3) + 5 voor deze oefening niet als een uitdrukking beschouwen omdat de buitenste optelling niet tussen haakjes staat.)