Pertanyaan Javascript parser untuk Java [tutup]


Siapa pun dapat merekomendasikan parser Javascript yang layak untuk Java? Saya percaya Rhino dapat digunakan, namun tampaknya terlalu berlebihan untuk hanya melakukan parsing, atau apakah itu satu-satunya solusi yang layak? Setiap saran akan sangat dihargai. Terima kasih.


29
2018-06-28 18:47


asal


Jawaban:


Dari https://github.com/google/caja/blob/master/src/com/google/caja/parser/js/Parser.java

Tata bahasa di bawah ini adalah representasi bebas konteks dari tata bahasa ini   mengurai parser. Ia tidak setuju dengan EcmaScript 262 Edition 3 (ES3) di mana   implementasi tidak sesuai dengan ES3. Aturan untuk penyisipan titik koma dan   kemungkinan backtracking dalam ekspresi yang dibutuhkan untuk ditangani dengan benar   backtracking dikomentari secara menyeluruh dalam kode, sejak penyisipan titik koma   membutuhkan informasi dari lexer dan parser dan tidak dapat ditentukan   dengan lookahead yang terbatas.

Fitur yang perlu diperhatikan

  1. Laporkan peringatan pada antrian di mana kesalahan tidak mencegah kesalahan lebih lanjut, sehingga kami dapat melaporkan beberapa kesalahan dalam satu kompilasi pass, bukan memaksa pengembang untuk bermain whack-a-mole.
  2. Tidak mengurai gaya Firefox catch (<Identifier> if <Expression>) karena mereka tidak bekerja pada IE dan banyak penerjemah lainnya.
  3. Mengakui const karena banyak interpreter melakukan (bukan IE) tetapi memperingatkan.
  4. Memungkinkan, tetapi memperingatkan, pada trailing koma di Array dan Object konstruktor.
  5. Memungkinkan kata kunci sebagai nama pengenal tetapi memperingatkan karena penerjemah yang berbeda memiliki kumpulan kata kunci yang berbeda. Ini memungkinkan kami menggunakan kumpulan kata kunci yang luas.

Untuk mem-parse kode yang ketat, lewati a PedanticWarningMessageQueue bahwa   mengkonversi MessageLevel#WARNING dan di atas MessageLevel#FATAL_ERROR.


CajaTestCase.js menunjukkan cara menyiapkan parser, dan [fromResource] dan [fromString] di kelas yang sama menunjukkan cara mendapatkan masukan dari jenis yang tepat.


12
2018-06-28 19:34



Saat menggunakan Java V1.8, ada trik yang dapat Anda gunakan untuk mengurai implementasi Nashorn yang keluar dari kotak. Dengan melihat tes unit dalam kode sumber OpenSDK, Anda dapat melihat bagaimana menggunakan parser saja, tanpa melakukan semua kompilasi ekstra dll ...

Options options = new Options("nashorn");
options.set("anon.functions", true);
options.set("parse.only", true);
options.set("scripting", true);

ErrorManager errors = new ErrorManager();
Context context = new Context(options, errors, Thread.currentThread().getContextClassLoader());
Source source   = new Source("test", "var a = 10; var b = a + 1;" +
            "function someFunction() { return b + 1; }  ");
Parser parser = new Parser(context.getEnv(), source, errors);
FunctionNode functionNode = parser.parse();
Block block = functionNode.getBody();
List<Statement> statements = block.getStatements();

Setelah kode ini berjalan, Anda akan memiliki Abstract Syntax Tree (AST) untuk 3 ekspresi dalam daftar 'pernyataan'.

Ini kemudian dapat ditafsirkan atau dimanipulasi untuk kebutuhan Anda.

Contoh sebelumnya bekerja dengan impor berikut:

import jdk.nashorn.internal.ir.Block;
import jdk.nashorn.internal.ir.FunctionNode;
import jdk.nashorn.internal.ir.Statement;
import jdk.nashorn.internal.parser.Parser;
import jdk.nashorn.internal.runtime.Context;
import jdk.nashorn.internal.runtime.ErrorManager;
import jdk.nashorn.internal.runtime.Source;
import jdk.nashorn.internal.runtime.options.Options;

Anda mungkin perlu menambahkan aturan akses untuk membuatnya jdk/nashorn/internal/** dapat diakses.


Dalam konteks saya, saya menggunakan Java Script sebagai bahasa ekspresi untuk Domain Specific Language (DSL) saya sendiri yang kemudian akan dikompilasi ke kelas Java saat waktu proses dan digunakan. AST memungkinkan saya menghasilkan kode Java yang sesuai yang menangkap maksud dari ekspresi Java Script.


Nashorn tersedia dengan Java SE 8.

Tautan ke informasi tentang mendapatkan kode sumber Nashorn ada di sini: https://wiki.openjdk.java.net/display/Nashorn/Building+Nashorn 


11
2018-06-19 12:13



Jawaban sebelumnya menjelaskan cara untuk mendapatkan di bawah sampul JDK 8 untuk mengurai javascript. Mereka sekarang main-main di Jawa 9. Bagus!

Ini berarti Anda tidak perlu menyertakan pustaka, sebaliknya kami dapat mengandalkan implementasi resmi dari orang-orang java. Mengarsipkan javascript secara terprogram jauh lebih mudah dicapai tanpa melangkah ke area tabu kode java.

Aplikasi ini mungkin di mana Anda ingin menggunakan javascript untuk mesin aturan yang akan diuraikan dan dikompilasi ke dalam beberapa bahasa lain saat runtime. AST memungkinkan Anda 'memahami' logika seperti yang tertulis dalam bahasa javascript ringkas dan kemudian menghasilkan logika yang lebih sedikit di beberapa bahasa atau kerangka kerja lain untuk eksekusi atau evaluasi.

http://openjdk.java.net/jeps/236

Ringkasan dari tautan di atas:

Tentukan API yang didukung untuk pohon sintaks abstrak ECMAScript Nashorn.

Tujuan

  • Sediakan kelas antarmuka untuk merepresentasikan simpul pohon sintaks Nashorn.
  • Berikan pabrik untuk membuat instance parser yang dikonfigurasi, dengan konfigurasi yang dilakukan dengan mengirimkan opsi baris perintah Nashorn melalui API.
  • Berikan API pola pengunjung untuk mengunjungi node AST.
  • Berikan contoh / uji program untuk menggunakan API.

Non-Sasaran

  • Node AST akan mewakili gagasan dalam spesifikasi ECMAScript sejauh mungkin, tetapi mereka tidak akan persis sama. Jika memungkinkan, antarmuka API pohon javac akan diadopsi untuk ECMAScript.
  • Tidak ada parser / pohon standar eksternal atau API yang akan digunakan.
  • Tidak akan ada parser API tingkat-naskah. Ini adalah Java API, meskipun skrip dapat memanggil ke Java dan karenanya menggunakan API ini.

4
2018-03-06 15:20



Ini ada dua ANTLR lebih atau kurang berfungsi atau melengkapi (lihat komentar di posting ini) tata bahasa untuk EcmaScript:

Dari Pengantar ANTLR 5 menit:

ANTLR membaca file deskripsi bahasa yang disebut tata bahasa dan menghasilkan sejumlah file kode sumber dan file tambahan lainnya. Sebagian besar penggunaan ANTLR menghasilkan setidaknya satu (dan cukup sering keduanya) dari alat-alat ini:

  • Lexer: Ini membaca karakter masukan atau aliran byte (yaitu karakter, data biner, dll.), Membaginya menjadi token menggunakan pola yang Anda tetapkan, dan menghasilkan aliran token sebagai output. Hal ini juga dapat menandai beberapa token seperti spasi dan komentar sebagai tersembunyi menggunakan protokol yang otomatis dipahami dan dipatuhi parser ANTLR.

  • A Parser: Ini membaca aliran token (biasanya dihasilkan oleh lexer), dan mencocokkan frasa dalam bahasa Anda melalui aturan (pola) yang Anda tentukan, dan biasanya melakukan beberapa aksi semantik untuk setiap frasa (atau sub-frase) yang cocok. Setiap pertandingan dapat memanggil tindakan kustom, menulis beberapa teks melalui StringTemplate, atau menghasilkan Abstrak Sintaks Pohon untuk pemrosesan tambahan.


2
2018-06-28 18:50



Bagi saya, solusi terbaik menggunakan acorn - https://github.com/marijnh/acorn di bawah badak.

Saya hanya tidak berpikir caja mendapatkan perhatian lagi.


1
2018-02-26 15:25



EcmaScript 5 Parser untuk java https://github.com/DigiArea/es5-model


0
2017-12-05 16:47