Ini adalah parser PHP tahap awal yang dirancang, dari awal, untuk skenario penggunaan IDE (lihat Tujuan Desain untuk lebih jelasnya). Masih banyak pekerjaan yang harus diselesaikan, jadi saat ini, repo ini sebagian besar berfungsi sebagai eksperimen dan awal percakapan.
Ini adalah cabang v0.1, yang mengubah struktur data untuk mendukung sintaksis yang ditambahkan setelah baris rilis awal 0.0.x.
Setelah Anda mengonfigurasi mesin, Anda dapat menggunakan parser untuk menghasilkan dan bekerja dengan Pohon Sintaks Abstrak (AST) melalui API yang ramah.
<?php// Pemuatan otomatis kelas yang diperlukan memerlukan __DIR__ . "/vendor/autoload.php";gunakan MicrosoftPhpParser{DiagnosticsProvider, Node, Parser, PositionUtilities};// Buat instance parser baru$parser = new Parser();// Kembalikan dan cetak AST dari isi string$astNode = $parser ->parseSourceFile('<?php /* comment */ echo "hi!"');var_dump($astNode);// Mengambil dan mencetak kesalahan dari AST Node. Parser menangani kesalahan dengan baik,// sehingga dapat digunakan dalam skenario penggunaan IDE (di mana kode sering kali tidak lengkap).$errors = DiagnosticsProvider::getDiagnostics($astNode);var_dump($errors);// Melintasi semua turunan Node dari $astNodeforeach ($astNode->getDescendantNodes() sebagai $descendant) {if ($descendant instanceof NodeStringLiteral) {// Cetak Teks node (tanpa spasi atau komentar)var_dump($descendant->getText());// Semua Node ditautkan kembali ke induknya, sehingga mudah untuk menavigasi pohon.$grandParent = $descendant->getParent()->getParent ();var_dump($grandParent->getNodeKindName());// AST sepenuhnya mewakili, dan dapat dibalik ke sumber aslinya.// Hal ini memungkinkan konsumen membangun perangkat yang andal alat pemformatan dan pemfaktoran ulang.var_dump($grandParent->getLeadingCommentAndWhitespaceText()); }// Selain mengambil semua anak atau turunan dari sebuah Node,// Node mengekspos properti khusus untuk tipe Node.if ($descendant instanceof NodeExpressionEchoExpression) {$echoKeywordStartPosition = $descendant->echoKeyword->getStartPosition();// Untuk mengurangi konsumsi memori, posisi direpresentasikan sebagai bilangan bulat// indeks tunggal ke dalam dokumen, namun posisi garis dan karakternya mudah diambil.$lineCharacterPosition = PositionUtilities::getLineCharacterPositionFromPosition($echoKeywordStartPosition,$descendant->getFileContents() );echo "baris: $lineCharacterPosition->baris, karakter: $lineCharacterPosition->karakter"; } }
Catatan: API ini belum selesai, jadi harap ajukan masalah, beri tahu kami fungsi apa yang ingin Anda ungkapkan, dan kami akan lihat apa yang bisa kami lakukan! Harap laporkan juga bug apa pun dengan perilaku tidak terduga di pohon parse. Kami masih dalam tahap awal, dan masukan apa pun yang Anda berikan sangat kami hargai.
Desain yang toleran terhadap kesalahan - dalam skenario IDE, kode, menurut definisi, tidak lengkap. Jika kode yang dimasukkan tidak valid, parser masih dapat memulihkan dan menghasilkan pohon yang valid + lengkap, serta diagnostik yang relevan.
Cepat dan ringan (harus mampu mengurai beberapa MB kode sumber per detik, untuk memberikan ruang bagi fitur lainnya).
Struktur data hemat memori
Izinkan penguraian tambahan di masa mendatang
Mematuhi spesifikasi bahasa PHP, mendukung tata bahasa PHP5 dan PHP7
AST yang dihasilkan menyediakan properti (mewakili sepenuhnya, dll.) yang diperlukan untuk operasi semantik dan transformasional, yang juga harus berkinerja baik.
Sepenuhnya representatif dan dapat di-tripp kembali ke teks asal penguraiannya (semua spasi dan komentar "trivia" disertakan dalam pohon penguraian)
Memungkinkan untuk dengan mudah melintasi pohon melalui node induk/anak
Waktu respons UI < 100 mdtk, sehingga setiap operasi server bahasa harus < 50 mdtk untuk memberikan ruang bagi semua hal lain yang terjadi secara paralel.
Sederhana dan mudah dikelola seiring berjalannya waktu - parser cenderung menjadi sangat membingungkan, sangat cepat, sehingga keterbacaan dan kemampuan debug adalah prioritas utama.
Dapat diuji - parser harus menghasilkan pohon parse yang terbukti valid. Kami mencapai hal ini dengan mendefinisikan dan terus menguji serangkaian invarian tentang pohon.
API yang ramah dan deskriptif untuk memudahkan orang lain mengembangkannya.
Ditulis dalam PHP - memudahkan komunitas PHP untuk mengkonsumsi dan berkontribusi.
Untuk memastikan tingkat kebenaran yang memadai di setiap langkah, parser dikembangkan menggunakan pendekatan tambahan berikut:
Fase 1: Tulis lexer yang tidak mendukung tata bahasa PHP, tetapi mendukung EOF dan token Tidak Dikenal. Tulis tes untuk semua invarian.
Fase 2: Mendukung tata bahasa leksikal PHP, banyak tes
Tahap 3: Tulis parser yang tidak mendukung tata bahasa PHP, tetapi menghasilkan pohon Node Kesalahan. Tulis tes untuk semua invarian.
Fase 4: Mendukung tata bahasa sintaksis PHP, banyak tes
Fase 5 (sedang berlangsung): Validasi dan pengoptimalan dunia nyata
Kebenaran: memvalidasi bahwa tidak ada kesalahan yang dihasilkan pada basis kode sampel, melakukan benchmark terhadap parser lain (selidiki setiap contoh ketidaksepakatan), pengujian fuzz
Kinerja: profil, tolok ukur terhadap aplikasi PHP besar
Fase 6: Menyelesaikan API agar dapat dikonsumsi semudah mungkin oleh masyarakat.
Beberapa konstruksi tata bahasa PHP (yaitu ekspresi hasil, dan string templat) belum didukung dan terdapat juga berbagai bug lainnya. Namun, karena parser toleran terhadap kesalahan, kesalahan ini ditangani dengan baik, dan pohon yang dihasilkan juga lengkap. Untuk mendapatkan gambaran yang lebih holistik tentang keberadaan kami, Anda dapat menjalankan rangkaian pengujian "validasi" (lihat Pedoman Berkontribusi untuk informasi lebih lanjut tentang menjalankan pengujian). Atau sederhananya, lihat hasil uji validasi saat ini.
Meskipun kami belum memulai tahap optimalisasi kinerja, sejauh ini kami telah melihat hasil yang menjanjikan, dan masih banyak ruang untuk perbaikan. Lihat Cara Kerjanya untuk detail tentang pendekatan kami saat ini, dan jalankan Uji Kinerja pada mesin Anda untuk melihatnya sendiri.
Sasaran Desain - pelajari tentang sasaran desain proyek (fitur, metrik kinerja, dan banyak lagi).
Dokumentasi - pelajari cara mereferensikan parser dari proyek Anda, dan cara melakukan operasi pada AST untuk menjawab pertanyaan tentang kode Anda.
Alat Visualizer Sintaks - dapatkan nuansa AST yang lebih nyata. Jadilah kreatif - lihat apakah Anda bisa memecahkannya!
Status dan Pendekatan Saat Ini - seberapa banyak tata bahasa yang didukung? Pertunjukan? Ingatan? Stabilitas API?
Cara kerjanya - pelajari tentang arsitektur, keputusan desain, dan pengorbanannya.
Lexer dan Parser
Strategi Toleransi Kesalahan
Penguraian Tambahan
Pertanyaan Terbuka
Strategi Validasi
Menyumbang! - pelajari cara terlibat, lihat beberapa petunjuk mengenai komitmen pendidikan yang akan membantu Anda meningkatkan basis kode (bahkan jika Anda belum pernah mengerjakan parser sebelumnya), dan merekomendasikan alur kerja yang membuatnya lebih mudah untuk diulang.
Proyek ini telah mengadopsi Kode Etik Sumber Terbuka Microsoft. Untuk informasi lebih lanjut lihat FAQ Pedoman Perilaku atau hubungi [email protected] jika ada pertanyaan atau komentar tambahan.