Υλοποίηση Ψευδογλώσσας

Ξεκίνησε από komni, 27 Νοε 2020, 01:27:39 ΜΜ

« προηγούμενο - επόμενο »

Βοηθάει η ύπαρξη διερμηνευτή για την Ψευδογλώσσα τον μαθητή;

Ναι
19 (95%)
Όχι
1 (5%)

Σύνολο ψηφοφόρων: 20

geochatz

Παράθεση από: komni στις 19 Ιαν 2021, 03:26:10 ΜΜ
Ευχαριστώ! Δεν την έχω ξανακούσει αυτή τη συνάρτηση.. Υπάρχει πουθενά στο σχολικό;
Η αλήθεια είναι ότι δεν αναφέρεται στο σχολικό αλλά είναι κρίμα που δεν υπάρχει.
Εδώ και μια παλαιότερη συζήτηση επί του θέματος.
Θα μου πεις, βέβαια, άμα προσθέταμε όποια συνάρτηση του κατέβει του καθενός, θα χάναμε τη μπάλα...

pgrontas

Παράθεση από: komni στις 19 Ιαν 2021, 01:35:00 ΜΜ
Καλησπέρα λέει κάτι το σχολικό πάνω σε αυτό; Στις γλώσσες που γράφω εγώ το όχι έχει μεγαλύτερη προτεραιότητα από τους συγκρητικούς.

Ναι, και στην ΓΛΩΣΣΑ και στην ΨΕΥΔΟΓΛΩΣΣΑ, οι λογικοί τελεστές (άρα και το όχι) έπονται των συγκριτικών (σελ. 139 Γ Λυκείου και σελ 35 Β Λυκείου).
Με την ευκαιρία,  Κομνηνέ τι τάξη πας (φυσικά αν θες απαντάς).
Programs must be written for people to read, and only incidentally for machines to execute - Harold Abelson

bugman

Πάλι έσβησαν την απάντησή μου!
Έδωσα την λύση στο πρόβλημα και αυτός που το έσβησε απλά δεν το κατάλαβε!

komni

Παράθεση από: geochatz στις 19 Ιαν 2021, 03:54:02 ΜΜ
Η αλήθεια είναι ότι δεν αναφέρεται στο σχολικό αλλά είναι κρίμα που δεν υπάρχει.
Εδώ και μια παλαιότερη συζήτηση επί του θέματος.
Θα μου πεις, βέβαια, άμα προσθέταμε όποια συνάρτηση του κατέβει του καθενός, θα χάναμε τη μπάλα...

Ναι, θα προτιμούσα να μην υλοποιήσω συνάρτηση που δεν είναι δεκτή στις πανελλήνιες για να μην κάψω κανέναν μαθητή που ίσως την έγραφε.

Παρόλα αυτά είναι πολύ εύκολο για κάποιον να κάνει extend τον διερμηνευτή μου και να βάλει δικές του συναρτήσεις με λίγες γνώσεις Javascript/Typescript(π.χ. εδώ η υλοποίηση του Τ_Ρ). Ίσως βάλω επιλογή να γίνεται αυτό από το web interface για να μην χρειάζεται clone και redeploy.

Παράθεση από: pgrontas στις 19 Ιαν 2021, 03:54:40 ΜΜ
Ναι, και στην ΓΛΩΣΣΑ και στην ΨΕΥΔΟΓΛΩΣΣΑ, οι λογικοί τελεστές (άρα και το όχι) έπονται των συγκριτικών (σελ. 139 Γ Λυκείου και σελ 35 Β Λυκείου).
Με την ευκαιρία,  Κομνηνέ τι τάξη πας (φυσικά αν θες απαντάς).

Οκ δεκτό! Θα το αλλάξω αύριο το πρωί πριν τις 8.
Γ λυκείου πάω σε (ιδιωτικό πλέον..) ΓΕΛ στον Άλιμο.

Παράθεση από: bugman στις 19 Ιαν 2021, 04:53:51 ΜΜ
Πάλι έσβησαν την απάντησή μου!
Έδωσα την λύση στο πρόβλημα και αυτός που το έσβησε απλά δεν το κατάλαβε!

Δεν νομίζω να σου σβήνει κανείς τις απαντήσεις.. Κάποιο bug θα ήταν.

Παράθεση από: bugman
Το Όχι λειτουργεί όπως και το μείον στις αριθμητικές εκφράσεις. Εφαρμόζεται στο πρώτο όρο που γυρίζει τύπο λογικό.
Για να το πετύχεις αυτό θες ένα flag το οποίο μόνο το Όχι θα το κάνει true. Όταν λοιπόν το flag είναι true τότε η διερμηνεία εκτελείται μέχρι εκεί που η έκφραση δίνει το πρώτο λογικό αποτέλεσμα.

Το όχι ψευδής και όχι ψευδής
λειτουργεί ως (όχι ψευδής) ή (όχι ψευδής) δηλαδή δίνει αληθής
και όχι ως
όχι (ψευδής ή όχι ψευδής)
που θα έδινε ψευδής
Δεν καταλαβαίνω που χρησιμοποιείς τα flags στην συντακτική ανάλυση.. Ο διερμηνευτής μου κάνει μια απλή αναδρομούλα(βλ. συνακτική ανάλυση για το unary +).

Το παράδειγμα που έδωσες νομίζω είναι ασάφεια γιατί δεν προσδιορίζει το σχολικό προτεραιότητα ανάμεσα στους λογικούς συντελεστής( @alkisg ισχύει;)

bugman

Εκ παραδρομής το ΚΑΙ πρέπει να γίνει Ή εδώ: Το όχι ψευδής Ή όχι ψευδής

λειτουργεί ως (όχι ψευδής) ή (όχι ψευδής) δηλαδή δίνει αληθής
και όχι ως
όχι (ψευδής ή όχι ψευδής)
που θα έδινε ψευδής

Δεν είναι ασάφεια. Δες τις παρενθέσεις και θα το καταλάβεις!

bugman

Κοίταξα τον κώδικά σου:
Έχεις το private atom(): AST.AST {  .... }
Στο οποίο παίζουν μόνο δυο unary τελεστές, οι οποίοι γυρνούν ενδιάμεσα AST, όπως το   AST.UnaryPlusAST(atom).inheritPositionFrom(....) και το   AST.UnaryMinusAST(atom).inheritPositionFrom(...)

Ομοίως πρέπει να γίνει για το Not που το έχει return new AST.NotAST(this.atom()).inheritPositionFrom(savedToken)
(το flag πρέπει να κόβει το ενδιάμεσο AST όταν ολοκληρώσει μια λογική έκφραση )


komni

Παράθεση από: bugman στις 19 Ιαν 2021, 05:38:46 ΜΜ
Εκ παραδρομής το ΚΑΙ πρέπει να γίνει Ή εδώ: Το όχι ψευδής Ή όχι ψευδής

λειτουργεί ως (όχι ψευδής) ή (όχι ψευδής) δηλαδή δίνει αληθής
και όχι ως
όχι (ψευδής ή όχι ψευδής)
που θα έδινε ψευδής

Δεν είναι ασάφεια. Δες τις παρενθέσεις και θα το καταλάβεις!

Αυτό εννοώ ασάφεια. Η έκφραση "όχι ψευδής Ή όχι ψευδής" έχει δύο ερμηνίες:
1) (όχι ψευδής) ή (όχι ψευδής)    <-- το όχι έχει μεγαλύτερη προτεραιότητα από το η
2) όχι (ψευδής ή όχι ψευδής)      <-- το η έχει μεγαλύτερη προτεραιότητα από το όχι
Και από όσο ξέρω το σχολικό δεν ορίζει προτεραιότητα μεταξύ όχι και η

Παράθεση από: bugman στις 19 Ιαν 2021, 05:49:59 ΜΜ
Κοίταξα τον κώδικά σου:
Έχεις το private atom(): AST.AST {  .... }
Στο οποίο παίζουν μόνο δυο unary τελεστές, οι οποίοι γυρνούν ενδιάμεσα AST, όπως το   AST.UnaryPlusAST(atom).inheritPositionFrom(....) και το   AST.UnaryMinusAST(atom).inheritPositionFrom(...)

Ομοίως πρέπει να γίνει για το Not που το έχει return new AST.NotAST(this.atom()).inheritPositionFrom(savedToken)
Ναι ακριβώς

Παράθεση από: bugman στις 19 Ιαν 2021, 05:49:59 ΜΜ
(το flag πρέπει να κόβει το ενδιάμεσο AST όταν ολοκληρώσει μια λογική έκφραση )
Όχι δεν χρειάζεται κανένα flag, μόνο του το απο πάνω δουλεύει.

bugman

Το NOT προηγείται γιατί είναι unary operator.

komni

Παράθεση από: bugman στις 19 Ιαν 2021, 06:05:25 ΜΜ
Το NOT προηγείται γιατί είναι unary operator.

Που το γράφει αυτό το σχολικό;;

Για προτεραιότητα λέει σελ. 167
"Η ιεραρχία των λογικών τελεστών είναι μικρότερη των αριθμητικών."
"Ακόμη, οι λογικοί τελεστές έχουν χαμηλότερη ιεραρχία από τους συγκριτικούς."
Δεν μιλάει όμως για προτεραιότητα μεταξύ ή και όχι.

bugman

Ας μην το λέει, εδώ δεν έχουμε προτεραιότητα μεταξύ τελεστών, αλλά το τι είναι unary operator και πώς τον χειριζόμαστε.
ρίξε μια ματιά εδώ https://en.wikipedia.org/wiki/Unary_operation
Η ασάφεια έχει να κάνει με τα Η και ΚΑΙ και όχι με το ΌΧΙ.
Το όχι παίρνει λογική έκφραση και μόνο, αλλά αν η έκφραση έχει δυο ή περισσότερους όρους, όπως κάθε unary operator εφαρμόζεται στο πρώτο όρο.
Πχ στο -2*3 το - είναι μοναδιαίος τελεστής και εφαρμόζεται στο 2. Ομοίως το -2*-3 έχει δυο μοναδιαίους και εφαρμόζονται πριν τον τελεστή *.
Ασφαλώς μπορεί κανείς να μην έχει στο διερμηνευτή μια τόσο συγκροτημένη εκτέλεση εκφράσεων και να βάζει παντού παρενθέσεις. Νομίζω όμως ότι η αιτιολογημένη άποψη, ότι το Όχι είναι μοναδιαίος τελεστής (κάτι που δεν φαίνεται στο κώδικά σου), θα έλυνε το πρόβλημα της μη καθορισμένης αναφοράς στο βιβλίο περί των προτεραιοτήτων των τελεστών Ή, ΚΑΙ, ΌΧΙ.


komni

#40
@bugman

Δεν ισχύει τίποτα απ' όσα έχεις γράψει.

Παρόλο που στο -2*-3 έχει παραπάνω προτεραιότητα το -, στο -obj.prop (στην C) έχει παραπάνω προτεραιότητα ο τελεστής . και διερμηνεύεται σαν -(obj.prop) και όχι σαν (-obj).prop.

Εννοείται πως υπάρχει προτεραιότητα ανάμεσα και στους unary operators.

Όσον αφορά την υλοποίηση μου λες ότι δεν έχω υλοποιήσει το Νot ως unary operator ενώ ένα ποστ πριν ανέφερες το παρακάτω κομμάτι κώδικά μου:
AST.NotAST(this.atom()).inheritPositionFrom(savedToken)
Εδώ βλέπουμε πως το AST node του Not παίρνει ένα AST node ως παράμετρο και όχι 2 άρα είναι unary operator. Δεν ξέρω καν πως μπορείς να υλοποιήσεις το Not και να μην είναι unary δεν βγάζει λογική.

alkisg

@bugman, αφού έχουμε πει τόσες φορές ότι δεν πρέπει να δίνεις συμβουλές για τα μαθήματα, γιατί επιμένεις; Δεν είναι ένα τεχνολογικό φόρουμ σαν το insomnia όπου ο καθένας λέει το μακρύ και το κοντό του, εδώ υπάρχουν διακριτοί ρόλοι, οι καθηγητές και οι μαθητές, και αυτά που γράφονται πρέπει να είναι υπεύθυνα γιατί μπορεί να επηρεάσουν το μέλλον των μαθητών. Οι σκέψεις σου μπορεί να ισχύουν σε Visual Basic κλπ, αλλά μπορεί να είναι τελείως λάθος στα πλαίσια των μαθημάτων που διδάσκουμε.

@komni, γενικά μην επηρεάζεσαι από αυτά που γράφει ο bugman, δεν είναι καθηγητής. Η προτεραιότητα των τελεστών έχει πλέον διευκρινιστεί: https://alkisg.mysch.gr/steki/index.php?topic=7661.msg84995#msg84995
Αυτά που γράφει ο pgrontas ισχύουν και στον Διερμηνευτή μου και στην Python, οπότε ναι αν έχεις όρεξη καλό είναι να το διορθώσεις.

Κώδικας: Python
$ python3 -c "import math; print('α'>'β' or not 7 // 5 > math.sqrt(4))"
True

bugman

το -obj δεν έχει καμία έννοια, επειδή το - δεν εφαρμόζεται στο αντικείμενο.
Ομοίως το Όχι 7 mod 5 > Α_Ρ(4) δεν μπορεί να είναι (Όχι 7) ούτε (Όχι 7 mod 5)... κ.ο.κ. Πρέπει η δεξιά έκφραση να είναι τύπου λογικός. Το ζήτημα είναι μέχρι που; Δηλαδή αν το Όχι 7 mod 5>Α_Ρ(4) είχε συνέχεια το Και (....) το ΚΑΙ θα ήταν μέσα ή όχι στην δεξιά έκφραση του Όχι; Κατά την γνώμη δεν είναι. Όπως πχ στο -3-4 το πρώτο - είναι unary, ενώ το δεύτερο (-) δεν είναι, οπότε έχουμε (-3)-(4) και όχι -(3-(4))

Στο δεύτερο σκέλος συμφωνείς ότι το Όχι δεν μπορεί να μην είναι unary, αλλά δεν δείχνεις αν χρειάζεται έναν όρο την ελάχιστη έκφραση που θα δίνει λογικό αποτέλεσμα) για να ολοκληρωθεί όταν απουσιάζουν οι παρενθέσεις.

Alkis, εδώ συζητάμε για ένα λάθος στο διερμηνευτή και αυτό είναι τεχνικό θέμα. Αυτό που δείχνεις με την python, είναι σωστό, όπως και αν το έβαζες και στη Μ2000, αλλά στο διερμηνευτή του komni, βγαίνει λάθος!

komni


bugman