
Μπορεί οι άνθρωποι μου δείχνουν πόρους για Lexing, την ανάλυση και tokenising με Python;


Κάνω λίγο hacking για ένα έργο ανοικτού πηγαίου κώδικα ( [hotwire](http://www.hotwire-shell.org/) ) και ήθελα να κάνω μερικές αλλαγές στον κώδικα που [lexes](http://code.google.com/p/hotwire-shell/source/browse/trunk/hotwire/externals/shlex.py) , [αναλύει και tokenises](http://code.google.com/p/hotwire-shell/source/browse/trunk/hotwire/command.py) τις εντολές τέθηκε σε αυτό. Όπως είναι πραγματικό κώδικα εργασίας είναι αρκετά πολύπλοκη και λίγο δύσκολο να λειτουργήσει.


Δεν έχω εργαστεί στην κώδικα για να lex / ανάλυσης / tokenise πριν, έτσι σκεφτόμουν μία προσέγγιση θα ήταν να εργαστούν με ένα σεμινάριο ή δύο για το θέμα αυτό. Ελπίζω να μάθω αρκετά για να περιηγηθείτε γύρω από τον κωδικό που πραγματικά θέλουν να αλλάξει. Υπάρχει κάτι κατάλληλο εκεί έξω; (Ιδανικά θα μπορούσε να γίνει σε ένα απόγευμα χωρίς να χρειάζεται να αγοράσετε και να διαβάσετε το βιβλίο δράκος πρώτο ...)


**Επεξεργασία:** (7 Οκτ του 2008) Καμία από τις παρακάτω απαντήσεις δώσει ακριβώς αυτό που θέλω. Μαζί τους θα μπορούσε να δημιουργήσει προγράμματα ανάλυσης από το μηδέν, αλλά θέλω να μάθω πώς να γράψω τη δική μου βασική μονάδα ανάλυσης από το μηδέν, δεν χρησιμοποιούν lex και yacc ή παρόμοια εργαλεία. Αφού γίνει αυτό, τότε μπορώ να καταλάβω τον υπάρχοντα κώδικα καλύτερο. 


Έτσι, θα μπορούσε κάποιος να μου το σημείο σε ένα φροντιστήριο όπου μπορώ να οικοδομήσουμε ένα βασικό πρόγραμμα ανάλυσης από το μηδέν, χρησιμοποιώντας μόνο Python;

 
Πόροι για Lexing, tokenising και ανάλυσης σε python
===================================================



Ρίξτε μια ματιά στην τυπική μονάδα [shlex](http://docs.python.org/lib/module-shlex.html) και να τροποποιήσετε ένα αντίγραφο από αυτό για να ταιριάζει με τη σύνταξη που χρησιμοποιείτε για το κέλυφος σας, είναι ένα καλό σημείο εκκίνησης


Αν θέλετε όλη τη δύναμη της μια ολοκληρωμένη λύση για Lexing / την ανάλυση, [ANTLR](http://www.antlr.org/wiki/display/ANTLR3/Antlr3PythonTarget) μπορεί να δημιουργήσει python πάρα πολύ.

 

Προτείνω <http://www.canonware.com/Parsing/> , δεδομένου ότι είναι καθαρό python και δεν χρειάζεται να μάθουν γραμματική, αλλά δεν χρησιμοποιείται ευρέως, και έχει συγκριτικά ελάχιστη τεκμηρίωση. Η βαρέων βαρών είναι ANTLR και PyParsing. ANTLR μπορεί να δημιουργήσει java και C ++ parsers πάρα πολύ, και περιπατητές AST, αλλά θα πρέπει να μάθουν αυτό που ισοδυναμεί με μια νέα γλώσσα.

 

Είμαι ευτυχής χρήστης του [PLY](http://www.dabeaz.com/ply/) . Είναι μια καθαρή, Python εφαρμογή του Lex & Yacc, με πολλά μικρά λεπτότητα που το καθιστούν αρκετά Pythonic και εύκολο στη χρήση. Από Lex & Yacc είναι τα πιο δημοφιλή Lexing και ανάλυσης εργαλεία και χρησιμοποιούνται για τα περισσότερα έργα, PLY έχει το πλεονέκτημα του να στέκεται στους ώμους γιγάντων. Πολλοί γνώση υπάρχει στο διαδίκτυο σχετικά με Lex & Yacc, και μπορείτε να εφαρμόσετε ελεύθερα να Ply.


PLY έχει επίσης μια καλή [σελίδα τεκμηρίωσης](http://www.dabeaz.com/ply/ply.html) με μερικά απλά παραδείγματα για να ξεκινήσετε.


Για μια λίστα με τα μέρη της Python ανάλυσης εργαλείων, δείτε [αυτό](http://nedbatchelder.com/text/python-parsers.html) .

 

[pygments](http://pygments.org/) είναι ένα πηγαίο κώδικα σύνταξη highlighter γραμμένο σε python. Έχει lexers και διαμορφωτές, και μπορεί να είναι ενδιαφέρον να κρυφοκοιτάζει στην πηγή.

 

Για μεσαίου σύμπλοκο γραμματικές, [PyParsing](http://pyparsing.wikispaces.com/) είναι λαμπρή. Μπορείτε να ορίσετε γραμματικές απευθείας στον κωδικό Python, χωρίς την ανάγκη για παραγωγή κώδικα:



```
>>> from pyparsing import Word, alphas
>>> greet = Word( alphas ) + "," + Word( alphas ) + "!" # <-- grammar defined here
>>> hello = "Hello, World!"
>>>> print hello, "->", greet.parseString( hello )
Hello, World! -> ['Hello', ',', 'World', '!']

```

(Παράδειγμα που λαμβάνονται από την αρχική σελίδα PyParsing).


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


Υπάρχουν πολλές βοηθητικές λειτουργίες που συμπυκνώνουν επαναλαμβανόμενα μοτίβα, όπως ιεραρχίες χειριστή, εισαγωγικά, φωλιάζουν ή C-style σχόλια.

 

Εδώ είναι μερικά πράγματα για να ξεκινήσετε (περίπου από την πιο απλή μέχρι την πιο σύνθετα, τουλάχιστον μέχρι την πλέον ισχυρή):


<http://en.wikipedia.org/wiki/Recursive_descent_parser>


<http://en.wikipedia.org/wiki/Top-down_parsing>


<http://en.wikipedia.org/wiki/LL_parser>


<http://effbot.org/zone/simple-top-down-parsing.htm>


<http://en.wikipedia.org/wiki/Bottom-up_parsing>


<http://en.wikipedia.org/wiki/LR_parser>


<http://en.wikipedia.org/wiki/GLR_parser>


Όταν έμαθα αυτά τα πράγματα, ήταν σε ένα εξάμηνο βίου 400-επίπεδο πανεπιστημιακών σπουδών. Κάναμε μια σειρά από θέσεις στις οποίες κάναμε την ανάλυση με το χέρι? αν θέλετε να καταλάβετε πραγματικά τι συμβαίνει κάτω από το καπό, θα ήθελα να συστήσει την ίδια προσέγγιση.


Αυτό δεν είναι το βιβλίο που χρησιμοποιείται, αλλά είναι αρκετά καλό: [Αρχές Μεταγλωττιστές](http://rads.stackoverflow.com/amzn/click/0201000229) .


Ας ελπίσουμε ότι αυτό είναι αρκετό για να ξεκινήσετε :)

 

Αυτή η ερώτηση είναι αρκετά παλιό, αλλά ίσως η απάντησή μου θα βοηθήσει κάποιον που θέλει να μάθει τα βασικά. Θεωρώ ότι αυτός ο πόρος είναι πολύ καλή. Είναι ένας απλός διερμηνέας γραμμένο σε python χωρίς τη χρήση οποιωνδήποτε εξωτερικών βιβλιοθηκών. Έτσι, αυτό θα βοηθήσει όποιον θα ήθελε να κατανοήσει την εσωτερική λειτουργία της ανάλυσης, Lexing και tokenising:


"Μια απλή Intepreter από το μηδέν σε Python:" [Μέρος 1](http://www.jayconrod.com/posts/37/a-simple-interpreter-from-scratch-in-python-part-1) , [Μέρος 2](http://www.jayconrod.com/posts/38/a-simple-interpreter-from-scratch-in-python-part-2) ,
 [Μέρος 3](http://www.jayconrod.com/posts/39/a-simple-interpreter-from-scratch-in-python-part-3) , και [το Μέρος 4](http://www.jayconrod.com/posts/40/a-simple-interpreter-from-scratch-in-python-part-4) .

 

Frederico Tomassetti είχε μια καλή (αλλά μικρή) συνοπτική write-up σε όλα τα πράγματα που σχετίζονται από BNF σε δυαδική αποκρυπτογράφηση για:


* λεξιλογικός,
* parser,
* δέντρο αφηρημένη-συντακτικό (AST), και
* Κατασκεύασμα / code-γεννήτρια.


Ανέφερε ακόμη τη νέα Γραμματική ανάλυση εκφράσεων (PEG).


<https://tomassetti.me/parsing-in-python/>

 