Skip to content

Tekst ontleden

Bart Jacobs edited this page Feb 16, 2018 · 8 revisions

Tekst ontleden

Basis

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 hulpfunctie tekens_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" en zonder_spaties_vooraan "Daag" evalueert tot "Daag".

Tekstvoorstellingen van uitdrukkingen ontleden

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"].

Tekenbomen

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']) en splits_tekenboom_van_tekens ['('; 'a'; 'b'; ')'; 'c'] evalueert tot (Vertakking (Blad 'a', Blad 'b'), ['c']).

Stambomen

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 hulpfunctie splits_afstamming_van, die gegeven een lijst van tekens, een paar teruggeeft met een beknopte tekstvoorstelling van een afstamming en de overblijvende tekens. Gebruik hierbij splits_eerste_woord_van.

Tekstvoorstellingen van uitdrukkingen

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.)