# Αρχές Γλωσσών Προγραμματισμού (εργαστήριο 6)
### 15/4/2021
:::danger
Η συγκεκριμένη σελίδα μπορεί να χρησιμοποιηθεί για ερωτήσεις στην ώρα του μαθήματος.
:::
## Περιεχόμενο μαθήματος
Parsing είναι ο μετασχηματισμός δομημένων δεδομένων σε μορφή που επιτρέπει την εξαγωγή του νοήματος των δεδομένων.
Το parsing χωρίζεται σε 2 φάσεις τη λεκτική ανάλυση (lexing ή tokenizing ή scanning) και τη συντακτική ανάλυση (parsing).
Η λεκτική ανάλυση μετασχηματίζει τη συμβολοσειρά εισόδου σε μια ροή από tokens (λεκτικές μονάδες). Κάθε token διαθέτει τουλάχιστον δύο ειδών πληροφορίες, τον τύπο του και την τιμή του.
Η συντακτική ανάλυση διαβάζει κάθε token, ελέγχει αν συμφωνεί με ένα προκαθορισμένο σύνολο κανόνων γραμματικής και ενδεχόμενα πραγματοποιεί κάποια σημασιολογική ενέργεια.
## Πρόγραμμα μαθήματος
| Ώρα | Θέμα |
| --- | ---- |
|10:00-10:40| PLY (lexer) [31-PLY.ipynb](https://github.com/chgogos/dituoi_agp/blob/main/pl/python/notebooks/31-PLY.ipynb) |
|10:40-11:00| [Άσκηση 1](#Άσκηση-1)|
|11:10-11:40| PLY (parser) [31-PLY.ipynb](https://github.com/chgogos/dituoi_agp/blob/main/pl/python/notebooks/31-PLY.ipynb) |
|11:40-12:00| [Άσκηση 2](#Άσκηση-1) |
### Άσκηση 1
Ζητείται το parsing ενός αρχείου κειμένου που περιέχει γραμμές της μορφής
```
key = value
```
έτσι ώστε τα ζεύγη τιμών να τοποθετηθούν σε ένα λεξικό της Python ως κλειδί και τιμή αντίστοιχα.
Επιπλέον ισχύει ότι:
* Το αρχείο κειμένου μπορεί να περιέχει γραμμές σχολίων που ξεκινούν με #.
* To key να εισάγεται στο dictionary με κεφαλαία και να συμπληρώνεται με τον αριθμό γραμμής στον οποίο βρίσκεται.
* Τα κενά πριν και μετά τόσο από τα keys όσο και από τα values πρέπει να αφαιρούνται.
* Σε κάθε γραμμή που δεν είναι σχόλιο πρέπει να υπάρχει key και = αλλά μπορεί να μην υπάρχει value οπότε σε αυτή την περίπτωση θα εισάγεται στο λεξικό ως value το κείμενο "NOT FOUND".
### Άσκηση 2
**Α' ερώτημα**
Γράψτε πρόγραμμα που να υπολογίζει αριθμητικές εκφράσεις που αποτελούνται από ψηφία, παρενθέσεις, πρόσθεση και πολλαπλασιασμό χωρίς να λαμβάνει υπόψη την προτεραιότητα των πράξεων, απλά δηλαδή εκτελώντας τις πράξεις από αριστερά προς τα δεξιά. Ωστόσο, αν υπάρχουν παρενθέσεις οι πράξεις στις παρενθέσεις πρέπει να εκετελούνται πρώτες.
Για παράδειγμα η ακόλουθη έκφραση πρέπει να υπολογιστεί ως εξής:
```
1 + (2 * 3) + (4 * (5 + 6))
1 + 6 + (4 * (5 + 6))
7 + (4 * (5 + 6))
7 + (4 * 11 )
7 + 44
51
```
**Β' ερώτημα**
Υπολογίστε εκφράσεις όπως αυτές του ερωτήματος Α, δίνοντας προτεραιότητα στην πράξη της πρόσθεσης έναντι της πράξης του πολλαπλασιασμού.
Και τα 2 παραπάνω ερωτήματα της άσκησης είναι από το [Advent of Code 2020 - Problem 18](https://adventofcode.com/2020/day/18)
**Γ' Ερώτημα**
Υπολογίστε το άθροισμα εκφράσεων όπως οι παραπάνω χρησιμοποιώντας τη συνηθισμένη προτεραιότητα τελεστών.
## Ερωτήσεις και απαντήσεις
:::info
* Πάντα, κάνετε ερωτήσεις στο κάτω μέρος του εγγράφου, ακριβώς πάνω από εδώ
:::