2012-02-23 3 views
13

Python ithalat süzgeci veya önişlemci, özellikle Python olan ve ekstra dil öğeleri olan bir kaynak dosya yazmak istiyorum. Amaç, kaynak dosyayı okumak, soyut bir sözdizim ağacına dönüştürmek, dilin yeni bölümlerini uygulamak için bazı dönüşümleri uygulamak ve daha sonra CPython tarafından tüketilebilecek geçerli bir Python kaynağı yazmaktır. Bu şeyi Python'da yazmak istiyorum ve görev için en iyi ayrıştırıcıyı arıyorum.Python'a benzer dil için Python ayrıştırıcısı

Python'da yerleşik çözümleyici uygun değildir, çünkü kaynak dosyaların gerçek Python olmasını gerektirir, bunlar olmayacaktır. Python ile çalışacak tonlarca parser (ya da ayrıştırıcı jeneratörü) var, ama bir sürü araştırma yapmadan ihtiyaçlar için hangisinin en iyisi olduğunu söylemek zor.

Özetle, benim gereksinimleri:

  1. Ayrıştırıcı Python ile yazılmış veya Python bağlarını sahiptir.
  2. Yapabileceğim bir Python dilbilgisi ile birlikte gelir veya başka bir yerde (http://docs.python.org/reference/grammar.html gibi) kullanılabilir bir tweakable Python dilbilgisini kolayca tüketebilir.
  3. dönüştürülmesi sonrasında AST yeniden serialize. API-wise ile çalışmak için çok korkunç olmamalıdır.

Herhangi bir öneriniz var mı?

+0

parser Daha açıkçası zaten var: Eğer ayrıştırmak istediğiniz dil saf Python olarak bile * ayrıştırma * yapar. Doğru? –

+0

PyYAML'a bakmayı düşündünüz mü? – inspectorG4dget

+0

@SvenMarnach: Bu doğru. – kindall

cevap

9

Akla ilk gelen şey lib2to3. Bir Python ayrıştırıcısının tam bir Python uygulamasıdır. Bir Python dilbilgisi dosyasını okur ve bu dilbilgisine göre Python kaynak dosyalarını ayrıştırır. AST manipülasyonlarını gerçekleştirmek ve güzel biçimlendirilmiş Python kodunu yazmak için harika bir altyapı sunar - her şeyden sonra, biraz farklı dilbilgisi olan iki Python benzeri dil arasında dönüşüm yapmaktır.

Maalesef bu belge eksiktir ve sabit bir arabirimi garanti etmemektedir. Bununla birlikte, lib2to3 üzerine inşa edilen projeler var ve source code oldukça okunabilir. API kararlılığı bir sorun ise, sadece çatal.

+1

İyi nokta! "Her şeyden sonra, iki farklı dilbilgisi ile iki Python benzeri dil arasında dönüşüm yapmaktır" –

+0

Burada iki büyük cevaplar var, ama bu açıkça ilk denemesi gereken bir yaklaşım. – kindall

2

SimpleParse çok hoşuma gitti, ama ben asla Python grammar (BTW, deterministik bir dilbilgisi mi?) Beslemeye çalıştım. Eğer boğulursa, PLY işi yapacak.

Python ayrıştırma araçları hakkında bu compilation konusuna bakın.

+0

* BTW, deterministik bir dilbilgisi * Evet (ve dikkat çekici derecede basit olanı). –

1

Benim kütüphane kontrol etmenizi öneriyoruz: Bu TÜM bağlam bağımsız gramerler ayrıştırabileceğiniz

, otomatik (satır & sütun numaraları ile) bir AST oluşturur ve bir EBNF biçiminde dilbilgisi kabul

https://github.com/erezsh/lark standardı kabul etti.

Python gibi bir dili kolayca ayrıştırabilir ve Python'da yazılmış diğer tüm ayrıştırma kitaplıklarından daha hızlı yapabilir.

Aslında, bir example python grammar ve