Mendapatkan kesalahan Sintaks yang berarti dari parser antlr

Saya telah membuat Penerjemah Skrip untuk .Net menggunakan Antlr. Ini berfungsi dengan baik, tetapi Kesalahan Sintaks yang dihasilkannya sangat buruk. Perpustakaan dalam tahap pengembangan awal dapat ditemukan di sini dan tata bahasa yang digunakan adalah berdasarkan tata bahasa ecma-Script ini.

Sekarang masalah besarnya adalah, ketika saya memiliki file skrip yang besar dan saya memiliki definisi objek yang menyatakan

obj = { var1 = "hello"
        var2 = "world};

Saya mengharapkan pesan yang mengatakan "Kesalahan Sintaks pada baris xyz ',' diharapkan. Namun sebaliknya, dapatkan daftar ratusan alternatif yang tidak layak di xyz untuk setiap kesalahan tindak lanjut yang disebabkan oleh koma saya yang hilang.

Apakah ada cara untuk mendapatkan kesalahan yang disebabkan oleh koma yang hilang? itu juga akan baik-baik saja, jika ia mengeluh tentang token var2 yang tidak terduga.


person Matt W    schedule 31.03.2017    source sumber


Jawaban (1)


Anda dapat menggunakan 2 pendekatan untuk ini:

  • Anda memeriksa apakah Anda mengenali kesalahan yang kemungkinan besar akan menyebabkan banyak "kesalahan" berikut dan menyembunyikan semua kesalahan setelahnya agar tidak ditampilkan. Jadi, Anda harus memperbaiki kesalahan itu terlebih dahulu sebelum mendapatkan kesalahan lebih lanjut. Namun ini tidak akan mengubah pesan rahasia yang dihasilkan ANTLR...
  • Anda menambahkan beberapa alternatif kesalahan umum langsung ke tata bahasa Anda dan memberi tahu pemroses kesalahan saat kesalahan tersebut dipanggil. Dengan itu Anda dapat menentukan sendiri pesan kesalahannya. Untuk referensi lebih lanjut mengenai topik ini, Anda dapat merujuk ke Definitive ANTLR 4 reference yang memiliki bab tentang ini atau Anda dapat melihat tata bahasa saya yang menggunakan pendekatan ini untuk tanda kurung tidak seimbang.

Saat menggunakan pendekatan kedua, Anda juga harus menghilangkan "kesalahan" yang salah produksi berikut ini karena tata bahasanya berhasil mencocokkan masukan yang diberikan dan oleh karena itu dapat dilanjutkan dengan benar.
Oleh karena itu saya sangat menyarankan pendekatan kedua kepada Anda

person Raven    schedule 05.04.2017
comment
Terima kasih banyak. Saya sudah mencoba menggunakan pendekatan pertama. Masalahnya adalah, tidak mungkin mendapatkan kesalahan awal yang menyebabkan kesalahan lainnya begitu saja. Bagaimanapun, pendekatan kedua Anda berfungsi dengan baik dan saya dapat mengingatkan kesalahan sintaksis yang paling umum secara bermakna dengan Metode yang Anda jelaskan dalam Tata Bahasa Anda. - person Matt W; 06.04.2017