Antlr4 «πρωτόγονη» αναδρομή

ψήφοι
0

Ακολουθώντας http://blog.ptsecurity.com/2016/06/theory-and-practice-of-source-code.html#java--and-java8-grammars , προσπαθώ να μειώσει αριστερή αναδρομή κατά τη γνώμη μου αρκετά σύνθετη γραμματική. Από ό, τι καταλαβαίνω, η μη πρωτόγονη μορφή αναδρομή μπορεί να οδηγήσει σε προβλήματα απόδοσης, τόσο όσον αφορά τη μνήμη και τη διαδικασία του χρόνου.

Γι 'αυτό και προσπαθώ να refactor οι κανόνες αυτοί στη γραμματική μου να χρησιμοποιούν μόνο «πρωτόγονη» αναδρομή. Φυσικά, η θέση blog είναι η μόνη φορά που έχω δει τη φράση «πρωτόγονη» αναδρομή σε ό, τι αφορά ANTLR. Είμαι, λοιπόν, μόλις μαντέψουν σε έννοια / την πρόθεσή της. Μου φαίνεται ότι σημαίνει έναν κανόνα που αναφέρεται στον εαυτό του ως LHS για το πολύ ένα μόνο υποκατάστημα κανόνα. Σωστός?

Αυτή τη στιγμή έχω έναν κανόνα έκφρασης όπως:

expression
    : expression DOUBLE_PIPE expression         # ConcatenationExpression
    | expression PLUS expression                # AdditionExpression
    | expression MINUS expression               # SubtractionExpression
    | expression ASTERISK expression            # MultiplicationExpression
    | expression SLASH expression               # DivisionExpression
    | expression PERCENT expression             # ModuloExpression
    ...
    ;

Το ...περιλαμβάνει αρκετά επιμέρους κανόνες που αναφέρονται επίσης πίσω expression. Αλλά αυτά είναι τα μόνα με άμεση αναδρομή.

Αν κατάλαβα καλά, refactoring αυτά να είναι «πρωτόγονες» αναδρομή θα δούμε κάτι σαν:

expression
    : binaryOpExpression                        # BinaryOpExpression
    ...
    ;

binaryOpExpression
    : expression DOUBLE_PIPE expression         # ConcatenationExpression
    | expression PLUS expression                # AdditionExpression
    | expression MINUS expression               # SubtractionExpression
    | expression ASTERISK expression            # MultiplicationExpression
    | expression SLASH expression               # DivisionExpression
    | expression PERCENT expression             # ModuloExpression
    ;

Κατ 'αρχάς, είναι ότι η σωστή refactoring;

Δεύτερον, θα βοηθήσει πραγματικά ότι απόδοσης; Στο τέλος της ημέρας είναι ακόμα οι ίδιες αποφάσεις, οπότε δεν είμαι πραγματικά την κατανόηση του πώς αυτό βοηθά απόδοσης (εκτός από ίσως και παράγουν λιγότερα αντικείμενα ATNConfig).

Ευχαριστώ

Δημοσιεύθηκε 09/10/2019 στις 19:01
πηγή χρήστη
Σε άλλες γλώσσες...                            


1 απαντήσεις

ψήφοι
0

Δεν έχω ακούσει «πρωτόγονη αναδρομή» πριν σε αυτό το πλαίσιο και ο συγγραφέας μάλλον σημαίνει μόνο να αναφέρουμε μια συγκεκριμένη μορφή αναδρομών στο ANTLR4.

Γεγονός είναι ότι υπάρχουν 3 σχετικά έντυπα των αναδρομών στο ANTLR4:

  • Άμεση αριστερά αναδρομή: αναδρομή από την πρώτη αναφορά κανόνα σε έναν κανόνα (στον ίδιο κανόνα). Για παράδειγμα:a: ab | c;
  • Έμμεση αριστερά αναδρομή: αριστερά αναδρομή όχι απευθείας από τον ίδιο κανόνα. Για παράδειγμα:a: b | c; b: c | d; c: a | e;
  • Δεξιά αναδρομή: οποιοδήποτε άλλο αναδρομή σε έναν κανόνα. Για παράδειγμα: a: ba | c;. Το όνομα «δικαίωμα αναδρομή» είναι όμως σωστό μόνο σε περιπτώσεις δυαδική έκφραση, αλλά χρησιμοποιείται συχνά για να διαφοροποιηθούν από τα αριστερά επαναλήψεις.

Αφού είπε ότι γίνεται σαφές ότι ξαναγράψει σας είναι λάθος, καθώς θα δημιουργούσε έμμεση αριστερά αναδρομή, η οποία ANLTR4 δεν υποστηρίζει. Άμεση αριστερή αναδρομή δεν είναι συνήθως ένα πρόβλημα (από τη μνήμη ή την απόδοση σκοπιά), επειδή ANTLR4 τα μετατρέπει σε μη-αναδρομική γραφήματα κανόνα ATN.

Τι μπορεί να γίνει ένα πρόβλημα είναι σωστό επαναλήψεις, επειδή υλοποιούνται από τον κωδικό αναδρομή (αναδρομική συνάρτηση καλεί το χρόνο εκτέλεσης), η οποία μπορεί να qickly εξαντλήσει τη στοίβα CPU. Έχω δει περιπτώσεις με μεγάλες εκφράσεις που δεν θα μπορούσε να αναλυθεί σε ένα ξεχωριστό νήμα, γιατί δεν μπορούσα να ρυθμίσετε το μέγεθος νήμα στοίβα σε μια μεγαλύτερη τιμή (το βασικό μέγεθος νήμα στοίβα συνήθως μπορούν να ρυθμιστούν μέσω των ρυθμίσεων σύνδεσης).

Η μόνη λύση για την τελευταία αυτή περίπτωση, η οποία έχω βρεθεί χρήσιμο, είναι να μειώσει τον αριθμό των κανόνων αναλυτή στη γραμματική που καλούν ο ένας τον άλλο. Φυσικά αυτό είναι ένα θέμα δομής, αναγνωσιμότητα κλπ να θέσει ορισμένα στοιχεία έκφρασης σε διαφορετικούς κανόνες (για παράδειγμα andExpression, orExpression, bitExpressionκλπ), αλλά αυτό μπορεί να οδηγήσει σε πολύ βαθιά στοίβες επίκληση, η οποία μπορεί να εξαντλήσει τη στοίβα CPU και / ή απαιτούν πολύ του χρόνου για την επεξεργασία τους.

Απαντήθηκε 10/10/2019 στις 10:28
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more