added Folien und Übungen für Vorlesung 4
This commit is contained in:
parent
a4c41ef424
commit
1d19a78036
BIN
Folien/vorlesung4.pdf
Normal file
BIN
Folien/vorlesung4.pdf
Normal file
Binary file not shown.
155
Übungen/Blatt4.md
Normal file
155
Übungen/Blatt4.md
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
# Übungsblatt 4
|
||||||
|
|
||||||
|
## Vorwort
|
||||||
|
|
||||||
|
Wir haben uns in der vergangenen Vorlesung Parser näher angeschaut. In den praktischen Übungen soll es weniger um das "erfinden" eines neuen Parser-Kombinators gehen, als um die Anwendung.
|
||||||
|
|
||||||
|
## Set-Up
|
||||||
|
|
||||||
|
Da wir nun zum ersten mal mit externen dependencies arbeiten, müssen wir diese zunächst installieren. Dies ist ein sehr wichtiger Schritt, da nahezu alle weiteren Übungszettel dieses Vorgehen voraussetzen.
|
||||||
|
|
||||||
|
Als erstes sollten Sie die Quellen von `stack` mit einem `stack update` aktualisieren. Anschließend erstellen sie ein neues Stack-Projekt mittels `stack new <Projektname>`. Sie erhalten ein Verzeichnis mit dem Projektnamen, in dem ein kleines "Hello World" liegt. Als erstes sollte man immer über die `projektname.cabal` drüber schauen. Hier werden nachher auch alle dependencies eingetragen.
|
||||||
|
|
||||||
|
Bei mir sieht das z.B. so aus (Projekt heisst "parser"):
|
||||||
|
|
||||||
|
```
|
||||||
|
name: parser
|
||||||
|
version: 0.1.0.0
|
||||||
|
synopsis: Initial project template from stack
|
||||||
|
description: Please see README.md
|
||||||
|
homepage: https://github.com/githubuser/parser#readme
|
||||||
|
license: BSD3
|
||||||
|
license-file: LICENSE
|
||||||
|
author: Author name here
|
||||||
|
maintainer: example@example.com
|
||||||
|
copyright: 2016 Author name here
|
||||||
|
category: Web
|
||||||
|
build-type: Simple
|
||||||
|
-- extra-source-files:
|
||||||
|
cabal-version: >=1.10
|
||||||
|
|
||||||
|
library
|
||||||
|
hs-source-dirs: src
|
||||||
|
exposed-modules: Lib
|
||||||
|
build-depends: base >= 4.7 && < 5
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
executable parser-exe
|
||||||
|
hs-source-dirs: app
|
||||||
|
main-is: Main.hs
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
build-depends: base
|
||||||
|
, parser
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
test-suite parser-test
|
||||||
|
type: exitcode-stdio-1.0
|
||||||
|
hs-source-dirs: test
|
||||||
|
main-is: Spec.hs
|
||||||
|
build-depends: base
|
||||||
|
, parser
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
source-repository head
|
||||||
|
type: git
|
||||||
|
location: https://github.com/githubuser/parser
|
||||||
|
```
|
||||||
|
|
||||||
|
Generell sollte man hier ordentliche Angaben machen, da viele tools dieses automatisch lesen und überall eintragen. Insbesondere sollte man nicht seine private Email-Adresse nehmen, sondern z.b. die Techfak-Adresse, die Studiumsbezogen ist.
|
||||||
|
|
||||||
|
Wir haben hier 3 Bereiche: `library`, `parsers-exe` und `test-suite`. Library ist das, was wir meistens schreiben - eine Sammlung von Funktionen, die das eigentlich tun. Dann haben wir die executable; diese enthält die `main` und ruft meist in wenig Code unsere library auf, nachdem sie z.b. Parameter/Dateien/... gelesen hat und kümmert sich um die Ausgabe. Somit können wir für spätere Zwecke (Projekte) die Library 1:1 wiederverwenden.
|
||||||
|
Die test-suite ignorieren wir für den Moment. Wir kommen in einer separaten Vorlesung noch einmal auf Tests zu sprechen.
|
||||||
|
|
||||||
|
Eine editierte Variante könnte etwa so aussehen:
|
||||||
|
|
||||||
|
```
|
||||||
|
name: parser
|
||||||
|
version: 0.1.0.0
|
||||||
|
synopsis: A little parser for generic CSV-Files
|
||||||
|
description: Please see README.md
|
||||||
|
homepage: https://github.com/Drezil/FFPiHaskell_parser#readme
|
||||||
|
license: BSD3
|
||||||
|
license-file: LICENSE
|
||||||
|
author: Stefan Dresselhaus
|
||||||
|
maintainer: sdressel@techfak.uni-bielefeld.de
|
||||||
|
copyright: 2016 Stefan Dresselhaus
|
||||||
|
category: Tool
|
||||||
|
build-type: Simple
|
||||||
|
-- extra-source-files:
|
||||||
|
cabal-version: >=1.10
|
||||||
|
|
||||||
|
library
|
||||||
|
hs-source-dirs: src
|
||||||
|
exposed-modules: Lib
|
||||||
|
build-depends: base >= 4.7 && < 5
|
||||||
|
, attoparsec
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
executable parser-exe
|
||||||
|
hs-source-dirs: app
|
||||||
|
main-is: Main.hs
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
build-depends: base
|
||||||
|
, parser
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
test-suite parser-test
|
||||||
|
type: exitcode-stdio-1.0
|
||||||
|
hs-source-dirs: test
|
||||||
|
main-is: Spec.hs
|
||||||
|
build-depends: base
|
||||||
|
, parser
|
||||||
|
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||||
|
default-language: Haskell2010
|
||||||
|
|
||||||
|
source-repository head
|
||||||
|
type: git
|
||||||
|
location: https://github.com/Drezil/FFPiHaskell_parser
|
||||||
|
```
|
||||||
|
|
||||||
|
Änderungen die gemacht wurden:
|
||||||
|
|
||||||
|
- Daten ausgefüllt
|
||||||
|
- attoparsec als dependency der library hinzugefügt
|
||||||
|
- github-links angepasst (sofern man github verwendet)
|
||||||
|
|
||||||
|
Nachdem man das ganze nun gespeichert hat, reicht ein `stack build` um alle dependencies herunterzuladen, kompilieren und installieren. Anschließend kann man mit `stack exec parser-exe` das Programm ausführen.
|
||||||
|
|
||||||
|
## Ein simpler CSV-Parser
|
||||||
|
|
||||||
|
Sie sollten aus ihrem Studium bereits die EBNF kennen. Eine (simple) CSV-Datei besitzt folgende EBNF:
|
||||||
|
|
||||||
|
```
|
||||||
|
csv-file = { row }
|
||||||
|
row = field-list, eol
|
||||||
|
field-list = field, [ ",", field-list ]
|
||||||
|
field = [ whitespace ], field-value, [ whitespace ]
|
||||||
|
field-value = quoted-string | bare-string
|
||||||
|
quoted-string = '"', quoted-content, '"'
|
||||||
|
quoted-content = { quoted-char }
|
||||||
|
quoted-char = (any char except '"' or eol)
|
||||||
|
bare-string = { bare-char }
|
||||||
|
bare-char = (any char except ',' or eol without whitespace at beginning/end)
|
||||||
|
whitespace = space-char, { space-char }
|
||||||
|
space-char = " " | "\t"
|
||||||
|
eol = "\n"
|
||||||
|
```
|
||||||
|
|
||||||
|
Kurzes recap: `{ .. }` bedeutet 1 oder mehr, `[ .. ]` sind optional, `A | B` heißt, entweder A oder B, `A, B, C` bedeutet zunächst A, dann B, dann C.
|
||||||
|
|
||||||
|
### Datenstrukturen
|
||||||
|
|
||||||
|
Überlegen sie sich zunächst, wie eine Datenstruktur aussehen könnte und definieren sie diese. Inhalt sind vorerst nur Strings. Sie brauchen keine Zahlen/Daten/... zu erkennen.
|
||||||
|
|
||||||
|
### Parser
|
||||||
|
|
||||||
|
Schreiben sie einen Parser, der einen CSV-String in diese Datenstruktur parsed und geben sie diese aus (`deriving Show` auf der Datenstruktur reicht). Ein paar Testbeispiele für CSV-Dateien finden sie auf github/im Lernraum.
|
||||||
|
|
||||||
|
### Bonus
|
||||||
|
|
||||||
|
Natürlich ist das nur ein simpler CSV-Parser. Folgende Features wären für einen echten Einsatz noch Wünschenswert:
|
||||||
|
|
||||||
|
- sicherstellen, dass alle "rows" gleich lang sind und ggf. mit Fehlermeldung abbrechen
|
||||||
|
- einen "Header" mit einlesen, der die einzelnen Spalten beschreibt
|
||||||
|
- Quotation nicht nur als "blabla'bla", sondern auch als 'blabla"bla' zulassen, "bla \" bla" auch entsprechend parsen.
|
BIN
Übungen/Blatt4.pdf
Normal file
BIN
Übungen/Blatt4.pdf
Normal file
Binary file not shown.
1001
Übungen/Blatt4_data/CSV_Dummy_hard.csv
Normal file
1001
Übungen/Blatt4_data/CSV_Dummy_hard.csv
Normal file
File diff suppressed because it is too large
Load Diff
11
Übungen/Blatt4_data/CSV_Dummy_problematic.csv
Normal file
11
Übungen/Blatt4_data/CSV_Dummy_problematic.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
first_name,last_name,saying
|
||||||
|
Phillip,Bennett,1
|
||||||
|
Dorothy,Roberts,"<>?:""{}|_+"
|
||||||
|
Walter,Cook,-1.00
|
||||||
|
William,Moreno,̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕
|
||||||
|
Helen,Burke,1
|
||||||
|
Carol,Daniels,⁰⁴⁵
|
||||||
|
Anna,Richards,
|
||||||
|
Wanda,Fox,""""""
|
||||||
|
Anne,Kelley,(。◕ ∀ ◕。)
|
||||||
|
Craig,Armstrong,'
|
|
11
Übungen/Blatt4_data/CSV_Dummy_simple.csv
Normal file
11
Übungen/Blatt4_data/CSV_Dummy_simple.csv
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
first_name,last_name,email,grade
|
||||||
|
Fred,Rivera,frivera0@amazon.co.uk,2.9
|
||||||
|
Wayne,Hansen,whansen1@ucoz.com,1.3
|
||||||
|
Carlos,Edwards,cedwards2@ucla.edu,3.8
|
||||||
|
Benjamin,Reid,breid3@mozilla.com,1.8
|
||||||
|
Susan,Alexander,salexander4@addtoany.com,3.4
|
||||||
|
Philip,Hansen,phansen5@123-reg.co.uk,2.4
|
||||||
|
Jack,Riley,jriley6@gravatar.com,2.6
|
||||||
|
Cynthia,Grant,cgrant7@tmall.com,3.0
|
||||||
|
Patrick,Jenkins,pjenkins8@dagondesign.com,2.4
|
||||||
|
Lori,Davis,ldavis9@patch.com,2.4
|
|
Loading…
Reference in New Issue
Block a user